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

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

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" />


然后还要在Manifest中添加

<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) {}
}


MainActivity的类实现为:

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

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







Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐