唤醒流程更新,修复重复唤醒的问题

This commit is contained in:
2025-09-29 14:11:33 +08:00
parent 5be50b4dbb
commit ba73d6d780
5 changed files with 36 additions and 25 deletions

View File

@@ -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()
}
}
}
}

View File

@@ -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()
}
}

View File

@@ -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?) {