【问题标题】:Google Speech to Text does not return resultsGoogle Speech to Text 不返回结果
【发布时间】:2021-02-14 07:26:00
【问题描述】:

我希望 Google Speech to text API 在我按下按钮后识别一个短语。所以我想出了以下代码。但它一直没有返回任何结果。我很困惑,那里有结果(缓冲区等),麦克风运行良好并且在模拟器中启用。 Google 控制台也不会显示错误。

这是我的代码。 点击开始录音的监听器:

val clicker: View.OnClickListener = View.OnClickListener {
        Log.d(TAG, "Starting record thread")
        mAudioRecorder.record(LISTEN_TIME_MILLIS)
    }
    mReadButton.setOnClickListener(clicker)

这是一个广播接收器,它处理结果并尝试将它们发送给 Google:

private val broadCastReceiver = object : BroadcastReceiver() {
    override fun onReceive(contxt: Context?, intent: Intent?) {
        if (intent!!.getBooleanExtra(RECORDING_SUCCESS, false)) {
            val byteArrayExtra = intent.getByteArrayExtra(RECORDING_AUDIO)
            val audioResultByteString: ByteString = ByteString.copyFrom(byteArrayExtra)

            if (audioResultByteString.size() > 0) {
                val audio: RecognitionAudio = RecognitionAudio.newBuilder()
                    .setContent(audioResultByteString).build()

                val resultsList = mSpeechClient.recognize(config, audio).resultsList

                if (resultsList.size > 0) {                       
                    for (result in resultsList) {
                        val resultText = result.alternativesList[0].transcript
                    }
                }
                Log.d(TAG, "- Done recognition. Result Qty: ${resultsList.size}")
            }
        }
    }
}

这里是 AudioRecorder 类函数,它进行录音:

fun record(listenTimeMillis: Long) {
    val byteString: ByteString = ByteString.EMPTY
    mAudioRecorder = initAudioRecorder()
    val mBuffer = ByteArray(4 * AudioRecord.getMinBufferSize(SAMPLE_RATE_HZ, CHANNEL, ENCODING))
    mAudioRecorder!!.startRecording()

    Thread {
        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)
        Thread.sleep(listenTimeMillis)

        val read = mAudioRecorder!!.read(mBuffer, 0, mBuffer.size, AudioRecord.READ_NON_BLOCKING)
        val intent = Intent(RECORDING_COMPLETED_INTENT)
        try {
            if (read > 0) {
                intent.putExtra(RECORDING_AUDIO, mBuffer)
                intent.putExtra(RECORDING_SUCCESS, true)
            }

            LocalBroadcastManager.getInstance(context).sendBroadcast(intent)
        } catch (e: Exception) {
            Log.e(TAG, e.stackTrace.toString())
        }

        releaseAudioRecorder()
    }.start()
}

【问题讨论】:

    标签: android kotlin google-speech-api


    【解决方案1】:

    我解决了这个问题。应该归咎于缓冲区太小。所以识别服务器实际上得到了它显然无法识别的半秒音频记录。

     val mBuffer = ByteArray(4 * AudioRecord.getMinBufferSize(SAMPLE_RATE_HZ, CHANNEL, ENCODING))
    

    我放了 200 而不是 4 而不是 AudioRecord.READ_NON_BLOCKING 我放了 AudioRecord.READ_BLOCKING 并且我在循环中读取缓冲区并在每次迭代中增加偏移量。然后它开始工作了。

    val startTime = System.currentTimeMillis()
            var deltaTime = 0L
            var offset = 0
            val intent = Intent(RECORDING_COMPLETED_INTENT)
            val readChunk = 512
    
            while (deltaTime < listenTimeMillis && offset < mBuffer.size) {
                val read = mAudioRecord!!.read(mBuffer, offset, readChunk, AudioRecord.READ_BLOCKING)
    
                if (read < 0) {
                    intent.putExtra(RECORDING_SUCCESS, false)
                    break; //if read with error, end here
                }
    
                deltaTime = System.currentTimeMillis() - startTime //startTime is a while loop breaking condition so it lestens only for specified amount of time
                offset += readChunk
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2020-04-07
      相关资源
      最近更新 更多