唤醒流程更新,修复重复唤醒的问题
This commit is contained in:
@@ -51,13 +51,31 @@ class AudioRecorder(private val recognizer: Recognizer,
|
||||
while (isRecording()) {
|
||||
val nread = audioRecord?.read(buffer, 0, buffer.size) ?: 0
|
||||
if (nread > 0) {
|
||||
Log.i(TAG, "Read $nread bytes from AudioRecord")
|
||||
// 判断是否有完整的识别结果
|
||||
val ac = recognizer.acceptWaveForm(buffer, nread)
|
||||
Log.i(TAG, "Recognizer acceptWaveForm returned: $ac")
|
||||
if (ac) {
|
||||
listener.onResult(recognizer.result)
|
||||
} else {
|
||||
listener.onPartialResult(recognizer.partialResult)
|
||||
val partialResultText = recognizer.partialResult
|
||||
val resultText = recognizer.result
|
||||
val pRes1 = VoskRecognizer.parsePartialResult(partialResultText)
|
||||
val pRes2 = VoskRecognizer.parseFinalResult(partialResultText)
|
||||
val finalResult = VoskRecognizer.parseFinalResult(resultText)
|
||||
val partialResult = pRes1.ifEmpty { pRes2.ifEmpty { "" } }
|
||||
// Log.i(TAG, "Partial: $partialResultText, Parsed: $partialResult; Final: $resultText, Parsed: $finalResult; Accepted: $ac")
|
||||
if (partialResult.isNotBlank() || finalResult.isNotBlank()) {
|
||||
Log.i(
|
||||
TAG,
|
||||
"Partial result: ${partialResult}, Final result: $finalResult"
|
||||
)
|
||||
// 去除 [unk] 的影响
|
||||
if (partialResult == "[unk]" || finalResult == "[unk]") {
|
||||
continue
|
||||
}
|
||||
if (ac) {
|
||||
listener.onResult(resultText)
|
||||
recognizer.reset()
|
||||
} else {
|
||||
listener.onPartialResult(partialResultText)
|
||||
// recognizer.reset()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ class WakewordDetector(private val wakeWords: ArrayList<String>) {
|
||||
val jsonArray = JSONArray()
|
||||
wakeWords.forEach { jsonArray.put(it) }
|
||||
// 添加 [unk] 允许识别唤醒词之外的其他词语
|
||||
// jsonArray.put("[unk]")
|
||||
jsonArray.put("[unk]")
|
||||
return jsonArray.toString()
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,6 @@ import org.vosk.Recognizer
|
||||
import org.vosk.android.RecognitionListener
|
||||
import org.vosk.android.StorageService
|
||||
import java.io.IOException
|
||||
import kotlin.collections.contentToString
|
||||
|
||||
class WakewordService: Service(), RecognitionListener {
|
||||
|
||||
@@ -231,18 +230,10 @@ class WakewordService: Service(), RecognitionListener {
|
||||
private fun broadcastWake(word: String, now: Long, source: String) {
|
||||
lastWakeWord = word
|
||||
lastDetectTs = now
|
||||
recognizer?.reset()
|
||||
Log.i(TAG, "Wake word detected($source): $word")
|
||||
EventReceiver.broadcastWakeWord(this, word)
|
||||
// 重置识别器状态,为下一次唤醒做准备
|
||||
recognizer?.reset()
|
||||
// 可选:重建 recognizer 减少同一发音尾部抖动:
|
||||
// try {
|
||||
// val grammar = wakeWordDetector?.getVoskGrammar()
|
||||
// recognizer?.close()
|
||||
// recognizer = Recognizer(model, 16000.0f, grammar)
|
||||
// } catch (e: Exception) {
|
||||
// Log.w(TAG, "Recognizer reset failed: ${e.message}")
|
||||
// }
|
||||
}
|
||||
|
||||
override fun onError(e: Exception?) {
|
||||
|
||||
Reference in New Issue
Block a user