android - 安卓,科特林。SpeechRecognizer 由于某种原因无法正常工作
问题描述
我正在使用名为SpeechRecognizer的 android 语音 API试图将语音翻译成文本,但由于某种原因,只要我点击按钮 - 我就会看到消息“暂时无法访问 GOOGLE”,然后窗口关闭无需等待我的演讲。或者声音只是结结巴巴,没有任何反应。
class MainActivity : AppCompatActivity() {
var voiceButton: Button? = null
var textView: TextView? = null
var listener: Listener? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initializeView()
initializeListeners()
}
fun initializeView() {
voiceButton = findViewById(R.id.voiceButton)
textView = findViewById(R.id.textView)
listener = Listener()
}
fun initializeListeners() {
voiceButton?.setOnClickListener {
val speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this)
speechRecognizer.setRecognitionListener(listener)
val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault())
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,5);
speechRecognizer.startListening(intent)
if (intent.resolveActivity(packageManager) != null) {
startActivityForResult(intent, 10)
} else {
Toast.makeText(this, "Unfortunately device not supported", Toast.LENGTH_SHORT).show()
}
}
}
只是为什么?这段代码有什么问题?我认为这段代码应该可以工作,因为对其他人来说它可以正常工作。也许这个 API 不支持我的模拟器(Nexus One API 22 )?我只是不知道有什么问题。
也许你知道如何解决它?谢谢,我会感谢你的帮助!
如果有人突然遇到类似的问题,这就是我在一段时间后解决这个问题的方法:
您需要打开虚拟麦克风使用主机音频输入。转到:更多(右侧的“...”)->麦克风->打开“虚拟麦克风使用主机音频输入”。此外,您的模拟器必须有更新的更新版本,否则语音识别将无法工作。
解决方案
我认为您的听众是问题所在,您不能只初始化listener = Listener()
并将其传递给 SpeechRecognizer。它需要接收一种RecognitionListener
具有许多回调的听众,您可以使用这些回调,onResults
这表明您的听众每次捕捉到语音和更多回调。尝试将您的侦听器更改为listener = object : RecognitionListener{ HERE OVERRIDE THE METHODS }
最终看起来像这样:
listener = object :RecognitionListener {
override fun onReadyForSpeech(params: Bundle?) {
TODO("Not yet implemented")
}
override fun onRmsChanged(rmsdB: Float) {
TODO("Not yet implemented")
}
override fun onBufferReceived(buffer: ByteArray?) {
TODO("Not yet implemented")
}
override fun onPartialResults(partialResults: Bundle?) {
TODO("Not yet implemented")
}
override fun onEvent(eventType: Int, params: Bundle?) {
TODO("Not yet implemented")
}
override fun onBeginningOfSpeech() {
TODO("Not yet implemented")
}
override fun onEndOfSpeech() {
TODO("Not yet implemented")
}
override fun onError(error: Int) {
TODO("Not yet implemented")
}
override fun onResults(results: Bundle?) {
TODO("Not yet implemented")
}
}
您可以阅读任何回调以利用您自己的需求希望它有所帮助