百度语音实现笔记

转发请注明出处: http://blog.csdn.net/qq_36145843/article/details/65698509 (谢谢~!)

我准备分享一个快速入门的例子。话不多说我们进入正题:

实现分为几个步骤:

  1. 安装ndk,配置ndk环境。
  2. 按照官方要求接入官方的资源。
  3. 配置AndroidManifest
  4. 用代码实现语音功能

第一安装ndk:
下载地址
下载后直接安装就好了。然后打开File->Project Structure
这里写图片描述

然后在目录中寻找你装的ndk路径:
这里写图片描述

最后在sdk中下载一个插件,这样就算好了。File->settings->System Settings->Android SDK:
这里写图片描述

第二按照官方要求接入官方的资源。
我们先下载官方资源。官方地址 (离在线语音融合SDK)

下载成功后可以看到有一下目录:
这里写图片描述

接下来我们需要将libs和res导入新建的项目。这个过程请自行完成。(如果libs目录里有v4包请删除不然会和项目冲突)

在这里我们就要用到ndk了。在gradle中配置:

    sourceSets{  
        main{  
            jniLibs.srcDirs=['libs']  
        }  
    }  

这里写图片描述

此时就会在项目目录中产生jniLibs目录:
这里写图片描述

第三配置AndroidManifest

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- begin: baidu speech sdk-->
        <!-- 请填写应用实际的APP_ID -->
        <meta-data android:name="com.baidu.speech.APP_ID" android:value="000000"/>
        <!-- 请填写应用实际的API_KEY -->
        <meta-data android:name="com.baidu.speech.API_KEY" android:value="SwGOgbZLjuBqGv4ylMOBwQ19"/>
        <!-- 请填写应用实际的SECRET_KEY -->
        <meta-data android:name="com.baidu.speech.SECRET_KEY" android:value="330d66299eeee32509a8d8f90e80681b"/>

        <service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />

        <activity
            android:name="com.baidu.voicerecognition.android.ui.BaiduASRDigitalDialog"
            android:configChanges="orientation|keyboardHidden|screenLayout"
            android:theme="@android:style/Theme.Dialog"
            android:exported="false"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="com.baidu.action.RECOGNIZE_SPEECH" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

在上面的代码中请自行填写申请的语音项目中相应的东西。按照下方的方式查看:
这里写图片描述

配置的时候有可能一开始VoiceRecognitionService这个类会出错。有可能就是ndk没有配置好。检查一下,然后等一会会儿就应该好了。(这里有的人可能会问包名填什么:就是AndroidManifest中的package的内容)

第四用代码实现语音功能

首先先创建一个Manager类来管理我们的语音功能。

public class BaiduVoiceManager  implements RecognitionListener{

    public static final int ERROR = 10000;
    public static final int SUCCESS = 20000;
    public static final int TEMPORARY = 30000;

    private Context mContext;

    private SpeechRecognizer mSpeechRecognizer;

    private ResultsAction mResultsAction;


    //创建一个接口供返回调用
    public interface ResultsAction{
        void results(String results, int type);
    }

    public BaiduVoiceManager(Context context , ResultsAction resultsAction) {
        this.mContext = context;
        this.mResultsAction = resultsAction;
        //创建语音识别实例
        mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(context,
                new ComponentName(mContext, VoiceRecognitionService.class));
        //设置监听器
        mSpeechRecognizer.setRecognitionListener(this);
    }

    //开始启动语音
    public void startRecognize(){
        //此时这个intent 可以绑定参数 详情参见官网
        Intent intent = new Intent();

        mSpeechRecognizer.startListening(intent);
    }

    //停止语音
    public void stopRecognize(){
        mSpeechRecognizer.stopListening();
    }

    //销毁识别语音实例
    public void destory(){
        mSpeechRecognizer.stopListening();
        mSpeechRecognizer.destroy();
        mSpeechRecognizer = null;
    }


    //只有当此方法回调之后才能开始说话,否则会影响识别结果。
    @Override
    public void onReadyForSpeech(Bundle params) {
        Toast.makeText(mContext, "请开始说话", Toast.LENGTH_SHORT).show();
    }

    //当用户开始说话,会回调此方法。
    @Override
    public void onBeginningOfSpeech() {

    }

    //引擎将对每一帧语音回调一次该方法返回音量值。
    //简单来说就是来处理音量变化
    @Override
    public void onRmsChanged(float rmsdB) {

    }

    //此方法会被回调多次,buffer是当前帧对应的PCM语音数据,拼接后可得到完整的录音数据。
    @Override
    public void onBufferReceived(byte[] buffer) {

    }

    //当用户停止说话后,将会回调此方法。
    @Override
    public void onEndOfSpeech() {

    }

    //识别出错,将会回调此方法,调用该方法之后将不再调用onResults方法。
    @Override
    public void onError(int error) {
        switch (error) {
            case SpeechRecognizer.ERROR_AUDIO:
                Toast.makeText(mContext, "音频出错啦!!", Toast.LENGTH_SHORT).show();
                break;
            case SpeechRecognizer.ERROR_CLIENT:
                Toast.makeText(mContext, "其他客户端错误!!!", Toast.LENGTH_SHORT).show();
                break;
            case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
                Toast.makeText(mContext, "权限不足,请查询后重试!!!!", Toast.LENGTH_SHORT).show();
                break;
            case SpeechRecognizer.ERROR_NETWORK:
                Toast.makeText(mContext, "网络错误!!!", Toast.LENGTH_SHORT).show();
                break;
            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                Toast.makeText(mContext, "网络超时!!!", Toast.LENGTH_SHORT).show();
                break;
            case SpeechRecognizer.ERROR_NO_MATCH:
                Toast.makeText(mContext, "匹配错误!!!", Toast.LENGTH_SHORT).show();
                break;
            case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
                Toast.makeText(mContext, "识别繁忙!!!", Toast.LENGTH_SHORT).show();
                break;
            case SpeechRecognizer.ERROR_SERVER:
                Toast.makeText(mContext, "服务端错误!!!!", Toast.LENGTH_SHORT).show();
                break;
            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                Toast.makeText(mContext, "没有语音输入!!!", Toast.LENGTH_SHORT).show();
                break;
            default:
                Toast.makeText(mContext, "其他错误!!!", Toast.LENGTH_SHORT).show();
        }

        mResultsAction.results("出错误啦!!!" ,ERROR);

    }

    //返回最终识别结果,将会回调此方法。
    @Override
    public void onResults(Bundle results) {
        String result = results.get(SpeechRecognizer.RESULTS_RECOGNITION).toString();
        mResultsAction.results(result , SUCCESS);
    }

    //返回临时识别结果,将会回调此方法。
    @Override
    public void onPartialResults(Bundle partialResults) {
        String temporary = partialResults.get(SpeechRecognizer.RESULTS_RECOGNITION).toString();
        mResultsAction.results(temporary,TEMPORARY);
    }

    //返回识别事件,将会回调此方法。
    @Override
    public void onEvent(int eventType, Bundle params) {

    }
}

由于我是一个新手,代码有可能写的不是特别好,大家讲究看一下。

然后就是在MainActivity来运用:

public class MainActivity extends AppCompatActivity implements BaiduVoiceManager.ResultsAction{

    private TextView mBufferText;
    private TextView mResultText;
    private Button mButton;
    private BaiduVoiceManager mBaiduVoiceManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBaiduVoiceManager = new BaiduVoiceManager(this, this);

        mBufferText = (TextView) findViewById(R.id.bufferText);
        mResultText = (TextView) findViewById(R.id.resultText);
        mButton = (Button) findViewById(R.id.button);

        mButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        mResultText.setText("");
                        mBufferText.setText("");
                        mButton.setText("说话中.....");
                        mBaiduVoiceManager.startRecognize();
                        break;
                    case MotionEvent.ACTION_UP:
                        mButton.setText("识别中....");
                        mBaiduVoiceManager.stopRecognize();
                        break;
                    default:
                }
                return true;
            }
        });
    }


    @Override
    public void results(String results , int type) {
        if (type == BaiduVoiceManager.ERROR) {
            mResultText.setText(results);
            mButton.setText("点我开始");
        } else if (type == BaiduVoiceManager.SUCCESS){
            //设置返回的结果
            mResultText.setText("Results: "+ results +"\n");
            mButton.setText("点我开始");
        } else if (type == BaiduVoiceManager.TEMPORARY) {
            mBufferText.setText("临时识别结果: " +results + "\n");
        }

    }
}

这是一个十分简单的实例,大家理解了可以自行扩展。

源码地址
参考文章:http://blog.csdn.net/yjp19871013/article/details/56280314 (同时感谢博主热心解答)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值