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