Android使用百度语音识别

辛苦堆砌,转载请注明出处,谢谢!

考虑很多读者反馈的问题,对文章进行了修正,由于百度语音有些变化,有一些配置上需要变化。文章变动主要体现在几个方面:

1.配置方式改变;

2.使用Kotlin实现;

3.附github代码地址。


按照百度官网的配置说明,将百度语音相关的so放置在app\src\main\jniLibs目录下(armeabi等目录一起拷贝过去),这个目录是默认的Android放置NDK的so的目录,然后将jar文件,放置在app\libs


Manifest文件中添加权限

[html]  view plain  copy
  1. <uses-permission android:name="android.permission.RECORD_AUDIO" />  
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  3. <uses-permission android:name="android.permission.INTERNET" />  
  4. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  


然后还要在Manifest中添加

[html]  view plain  copy
  1. <meta-data android:name="com.baidu.speech.APP_ID" android:value="Your APP_ID" />  
  2. <meta-data android:name="com.baidu.speech.API_KEY" android:value="Your API_KEY" />  
  3. <meta-data android:name="com.baidu.speech.SECRET_KEY" android:value="Your SECRET_KEY" />  
  4.   
  5. <service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />  
其中的APP ID,API_KEY和SECRET_KEY替换为你申请的内容。


我们封装了一个工具类,用来使用语音识别

[java]  view plain  copy
  1. package com.example.yjp.baiduspeechdemo  
  2.   
  3. import android.content.ComponentName  
  4. import android.content.Context  
  5. import android.content.Intent  
  6. import android.os.Bundle  
  7. import android.speech.RecognitionListener  
  8. import android.speech.SpeechRecognizer  
  9. import android.widget.Toast  
  10.   
  11. import com.baidu.speech.VoiceRecognitionService  
  12.   
  13. class SpeechRecognizerTool(private val mContext: Context) : RecognitionListener {  
  14.   
  15.     private var mSpeechRecognizer: SpeechRecognizer? = null  
  16.   
  17.     private var mResultsCallback: ResultsCallback? = null  
  18.   
  19.     interface ResultsCallback {  
  20.         fun onResults(result: String)  
  21.     }  
  22.   
  23.     @Synchronized  
  24.     fun createTool() {  
  25.         if (null == mSpeechRecognizer) {  
  26.   
  27.             // 创建识别器  
  28.             mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(mContext,  
  29.                     ComponentName(mContext, VoiceRecognitionService::class.java))  
  30.   
  31.             // 注册监听器  
  32.             mSpeechRecognizer!!.setRecognitionListener(this)  
  33.         }  
  34.     }  
  35.   
  36.     @Synchronized  
  37.     fun destroyTool() {  
  38.         mSpeechRecognizer!!.stopListening()  
  39.         mSpeechRecognizer!!.destroy()  
  40.         mSpeechRecognizer = null  
  41.     }  
  42.   
  43.     // 开始识别  
  44.     fun startASR(callback: ResultsCallback) {  
  45.         mResultsCallback = callback  
  46.   
  47.         val intent = Intent()  
  48.         bindParams(intent)  
  49.         mSpeechRecognizer!!.startListening(intent)  
  50.     }  
  51.   
  52.     //停止识别  
  53.     fun stopASR() {  
  54.         mSpeechRecognizer!!.stopListening()  
  55.     }  
  56.   
  57.     private fun bindParams(intent: Intent) {  
  58.         // 设置识别参数  
  59.     }  
  60.   
  61.     override fun onReadyForSpeech(params: Bundle) {  
  62.         // 准备就绪  
  63.         Toast.makeText(mContext, "请开始说话", Toast.LENGTH_SHORT).show()  
  64.     }  
  65.   
  66.     override fun onBeginningOfSpeech() {  
  67.         // 开始说话处理  
  68.     }  
  69.   
  70.     override fun onRmsChanged(rmsdB: Float) {  
  71.         // 音量变化处理  
  72.     }  
  73.   
  74.     override fun onBufferReceived(buffer: ByteArray) {  
  75.         // 录音数据传出处理  
  76.     }  
  77.   
  78.     override fun onEndOfSpeech() {  
  79.         // 说话结束处理  
  80.     }  
  81.   
  82.     override fun onError(error: Int) {}  
  83.   
  84.     override fun onResults(results: Bundle) {  
  85.   
  86.         // 最终结果处理  
  87.         if (mResultsCallback != null) {  
  88.             val text = results.get(SpeechRecognizer.RESULTS_RECOGNITION)!!  
  89.                     .toString().replace("]""").replace("[""")  
  90.             mResultsCallback!!.onResults(text)  
  91.         }  
  92.     }  
  93.   
  94.     override fun onPartialResults(partialResults: Bundle) {  
  95.         // 临时结果处理  
  96.     }  
  97.   
  98.     override fun onEvent(eventType: Int, params: Bundle) {}  
  99. }  


MainActivity的类实现为:

[html]  view plain  copy
  1. package com.example.yjp.baiduspeechdemo  
  2.   
  3. import android.Manifest  
  4. import android.content.pm.PackageManager  
  5. import android.os.Bundle  
  6. import android.support.v4.app.ActivityCompat  
  7. import android.support.v4.content.ContextCompat  
  8. import android.support.v7.app.AppCompatActivity  
  9. import android.view.MotionEvent  
  10. import kotlinx.android.synthetic.main.activity_main.*  
  11.   
  12.   
  13. class MainActivity : AppCompatActivity(), SpeechRecognizerTool.ResultsCallback {  
  14.   
  15.     private val mSpeechRecognizerTool = SpeechRecognizerTool(this)  
  16.   
  17.     override fun onCreate(savedInstanceState: Bundle?) {  
  18.         super.onCreate(savedInstanceState)  
  19.         setContentView(R.layout.activity_main)  
  20.   
  21.         initPermission()  
  22.   
  23.         startSpeechButton.setOnTouchListener {  
  24.             view, event ->  
  25.             val action = event.action  
  26.             when (action) {  
  27.                 MotionEvent.ACTION_DOWN -> {  
  28.                     mSpeechRecognizerTool.startASR(this@MainActivity)  
  29.                 }  
  30.                 MotionEvent.ACTION_UP -> {  
  31.                     mSpeechRecognizerTool.stopASR()  
  32.                 }  
  33.                 else -> return@setOnTouchListener false  
  34.             }  
  35.   
  36.             return@setOnTouchListener true  
  37.         }  
  38.     }  
  39.   
  40.     override fun onStart() {  
  41.         super.onStart()  
  42.         mSpeechRecognizerTool.createTool()  
  43.     }  
  44.   
  45.     override fun onStop() {  
  46.         super.onStop()  
  47.         mSpeechRecognizerTool.destroyTool()  
  48.     }  
  49.   
  50.     override fun onResults(result: String) {  
  51.         [email protected] { speechTextView!!.text = result }  
  52.     }  
  53.   
  54.     private fun initPermission() {  
  55.         val permissions = arrayOf<String>(Manifest.permission.RECORD_AUDIO,  
  56.                 Manifest.permission.ACCESS_NETWORK_STATE,  
  57.                 Manifest.permission.INTERNET,  
  58.                 Manifest.permission.READ_PHONE_STATE,  
  59.                 Manifest.permission.WRITE_EXTERNAL_STORAGE)  
  60.   
  61.         val toApplyList = ArrayList<String>()  
  62.   
  63.         for (perm in permissions) {  
  64.             if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {  
  65.                 toApplyList.add(perm)  
  66.                 //进入到这里代表没有权限.  
  67.   
  68.             }  
  69.         }  
  70.         val tmpList = arrayOfNulls<String>(toApplyList.size)  
  71.         if (!toApplyList.isEmpty()) {  
  72.             ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123)  
  73.         }  
  74.     }  
  75. }  

可以运行看一下效果,感觉识别率还是不错的。代码在这里。

你可能感兴趣的:(Android使用百度语音识别)