百度语音实现笔记

来源:互联网 发布:java程序设计高级证书 编辑:程序博客网 时间:2024/06/12 01:46

转发请注明出处: 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 (同时感谢博主热心解答)

0 0
原创粉丝点击