辛苦堆砌,转载请注明出处,谢谢!
考虑很多读者反馈的问题,对文章进行了修正,由于百度语音有些变化,有一些配置上需要变化。文章变动主要体现在几个方面:
1.配置方式改变;
2.使用Kotlin实现;
3.附github代码地址。
按照百度官网的配置说明,将百度语音相关的so放置在app\src\main\jniLibs目录下(armeabi等目录一起拷贝过去),这个目录是默认的Android放置NDK的so的目录,然后将jar文件,放置在app\libs
Manifest文件中添加权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<meta-data android:name="com.baidu.speech.APP_ID" android:value="Your APP_ID" />
<meta-data android:name="com.baidu.speech.API_KEY" android:value="Your API_KEY" />
<meta-data android:name="com.baidu.speech.SECRET_KEY" android:value="Your SECRET_KEY" />
<service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />
其中的APP ID,API_KEY和SECRET_KEY替换为你申请的内容。
我们封装了一个工具类,用来使用语音识别
package com.example.yjp.baiduspeechdemo
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.speech.RecognitionListener
import android.speech.SpeechRecognizer
import android.widget.Toast
import com.baidu.speech.VoiceRecognitionService
class SpeechRecognizerTool(private val mContext: Context) : RecognitionListener {
private var mSpeechRecognizer: SpeechRecognizer? = null
private var mResultsCallback: ResultsCallback? = null
interface ResultsCallback {
fun onResults(result: String)
}
@Synchronized
fun createTool() {
if (null == mSpeechRecognizer) {
// 创建识别器
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(mContext,
ComponentName(mContext, VoiceRecognitionService::class.java))
// 注册监听器
mSpeechRecognizer!!.setRecognitionListener(this)
}
}
@Synchronized
fun destroyTool() {
mSpeechRecognizer!!.stopListening()
mSpeechRecognizer!!.destroy()
mSpeechRecognizer = null
}
// 开始识别
fun startASR(callback: ResultsCallback) {
mResultsCallback = callback
val intent = Intent()
bindParams(intent)
mSpeechRecognizer!!.startListening(intent)
}
//停止识别
fun stopASR() {
mSpeechRecognizer!!.stopListening()
}
private fun bindParams(intent: Intent) {
// 设置识别参数
}
override fun onReadyForSpeech(params: Bundle) {
// 准备就绪
Toast.makeText(mContext, "请开始说话", Toast.LENGTH_SHORT).show()
}
override fun onBeginningOfSpeech() {
// 开始说话处理
}
override fun onRmsChanged(rmsdB: Float) {
// 音量变化处理
}
override fun onBufferReceived(buffer: ByteArray) {
// 录音数据传出处理
}
override fun onEndOfSpeech() {
// 说话结束处理
}
override fun onError(error: Int) {}
override fun onResults(results: Bundle) {
// 最终结果处理
if (mResultsCallback != null) {
val text = results.get(SpeechRecognizer.RESULTS_RECOGNITION)!!
.toString().replace("]", "").replace("[", "")
mResultsCallback!!.onResults(text)
}
}
override fun onPartialResults(partialResults: Bundle) {
// 临时结果处理
}
override fun onEvent(eventType: Int, params: Bundle) {}
}
package com.example.yjp.baiduspeechdemo
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.support.v7.app.AppCompatActivity
import android.view.MotionEvent
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity(), SpeechRecognizerTool.ResultsCallback {
private val mSpeechRecognizerTool = SpeechRecognizerTool(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initPermission()
startSpeechButton.setOnTouchListener {
view, event ->
val action = event.action
when (action) {
MotionEvent.ACTION_DOWN -> {
mSpeechRecognizerTool.startASR(this@MainActivity)
}
MotionEvent.ACTION_UP -> {
mSpeechRecognizerTool.stopASR()
}
else -> return@setOnTouchListener false
}
return@setOnTouchListener true
}
}
override fun onStart() {
super.onStart()
mSpeechRecognizerTool.createTool()
}
override fun onStop() {
super.onStop()
mSpeechRecognizerTool.destroyTool()
}
override fun onResults(result: String) {
this@MainActivity.runOnUiThread { speechTextView!!.text = result }
}
private fun initPermission() {
val permissions = arrayOf<String>(Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
val toApplyList = ArrayList<String>()
for (perm in permissions) {
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
toApplyList.add(perm)
//进入到这里代表没有权限.
}
}
val tmpList = arrayOfNulls<String>(toApplyList.size)
if (!toApplyList.isEmpty()) {
ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123)
}
}
}
可以运行看一下效果,感觉识别率还是不错的。代码在这里。