百度语音实现笔记
来源:互联网 发布:java程序设计高级证书 编辑:程序博客网 时间:2024/06/12 01:46
转发请注明出处: http://blog.csdn.net/qq_36145843/article/details/65698509 (谢谢~!)
我准备分享一个快速入门的例子。话不多说我们进入正题:
实现分为几个步骤:
- 安装ndk,配置ndk环境。
- 按照官方要求接入官方的资源。
- 配置AndroidManifest
- 用代码实现语音功能
第一安装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 (同时感谢博主热心解答)
- 百度语音实现笔记
- python实现百度语音之语音识别
- html5录音+百度语音实现语音识别
- 使用百度语音平台实现语音合成(tts)
- 百度语音
- Unity接入百度语音识别与语音合成,实现语音交互
- VUI-百度语音之Rest接口python学习笔记0
- 百度语音助手实现多回合回话的技术分析
- 百度语音API使用(python实现之二)
- 实现百度地图导航Demo的语音播报功能
- 利用百度tts 实现文字转语音(node)
- 【Python】调用百度REST API实现语音识别
- 【Python】调用百度REST API实现语音识别
- 利用百度语言识别API实现语音识别python
- 百度语音识别服务 —— 语音识别 REST API 开发笔记
- VUI-百度语音之Rest接口python学习笔记2-语音识别
- VUI-百度语音之Rest接口python学习笔记3-语音合成
- 语音学习笔记2------matlab实现傅里叶变换
- 决策树原理实例(python代码实现)
- 用py2exe打包成一个exe文件
- epoll简介
- “arcgis desktop 遇到严重的应用程序错误,无法继续”的解决方案
- PHP使用CURL详解
- 百度语音实现笔记
- 解决oracle11G安装84%报错 出现Error in invoking target
- 实现bubble_sort<冒泡法>
- PHP json_encode里面经常用到的 JSON_UNESCAPED_UNICODE和JSON_UNESCAPED_SLASHES
- GC-谈谈“生死”
- Latex插入GIF动态图片
- Android中如何不缓存fragment
- 1002. 写出这个数 (20)
- iOS Provisioning Profile(Certificate)与Code Signing详解