转载:https://blog.csdn.net/chenli_001/article/details/73603917
html
1、语音识别java
1.下载SDK(地址:http://www.xfyun.cn/sdk/dispatcher),选择语音听写SDK(以下图) ,下载前会让你先建立应用,建立应用后会获得一个appid。而后点“当即开通”去开通“语音识别”功能,以后就会跳出“SDK下载”的页面,而后就能够下载了(未注册帐号的要先注册一个帐号)。android
2.将下载好的SDK中 libs 目录下的 Msc.jar包引入到工程中(参见http://blog.csdn.net/highboys/article/details/51549679,此外,由于本Demo中会用到json的东西,因此还得本身去网上下一个Gson的jar包,一并引进去)。以后在main目录下新建一个jniLibs目录,将 SDK中 libs 目录下的armeabi 拷进去,以下图所示(第④个先不用管): json
3.科大讯飞为咱们提供了一套语音听写时的UI,即听写的时候会有一个动画效果(以下图),这个时候咱们须要 先将 SDK 资源包 assets 路径下的资源文件拷贝至 android 工程asstes 目录下(没有的话本身新建),参照第2步图的④。网络
4.接下来就是代码的实现了。首先在Manifest中添加一下权限
app
-
- <uses-permission android:name="android.permission.INTERNET" />
-
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
-
- <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_NETWORK_STATE" />
-
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
-
-
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
其次是java代码(逻辑上是点击了某个Button以后,才执行下面的代码)。
-
- private RecognizerDialog iatDialog;
-
-
- SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=578f1af7");
-
-
- iatDialog = new RecognizerDialog(MainActivity.this, mInitListener);
-
- iatDialog.setListener(new RecognizerDialogListener() {
- String resultJson = "[";
-
- @Override
- public void onResult(RecognizerResult recognizerResult, boolean isLast) {
- System.out.println("----------------- onResult -----------------");
- if (!isLast) {
- resultJson += recognizerResult.getResultString() + ",";
- } else {
- resultJson += recognizerResult.getResultString() + "]";
- }
-
- if (isLast) {
-
- Gson gson = new Gson();
- List<DictationResult> resultList = gson.fromJson(resultJson,
- new TypeToken<List<DictationResult>>() {
- }.getType());
- String result = "";
- for (int i = 0; i < resultList.size() - 1; i++) {
- result += resultList.get(i).toString();
- }
- etText.setText(result);
-
- etText.requestFocus();
-
- etText.setSelection(result.length());
- }
- }
-
- @Override
- public void onError(SpeechError speechError) {
-
- speechError.getPlainDescription(true);
- }
- });
-
- iatDialog.show();
其中的mInitListener定义以下:
- public static final String TAG = "MainActivity";
- private InitListener mInitListener = new InitListener() {
- @Override
- public void onInit(int code) {
- Log.d(TAG, "SpeechRecognizer init() code = " + code);
- if (code != ErrorCode.SUCCESS) {
- Toast.makeText(MainActivity.this, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();
- }
- }
- };
上面的代码用到了一个DictationResult类(一个用来接收转换 语音听写结果的类),须要本身新建,定义以下
如此,即可实现语音听写了。这个过程可能会遇到各类各样的问题,具体错误码参见
http://www.xfyun.cn/doccenter/faq
5.说完了有动画效果的,下面就来讲说没有动画效果的(也比较简单)。ide
-
- SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(context, null);
-
- mIat.setParameter(SpeechConstant.DOMAIN,"iat");
- mIat.setParameter(SpeechConstant.LANGUAGE,"zh_cn");
- mIat.setParameter(SpeechConstant.ACCENT,"mandarin ");
-
-
- mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/mIat.wav");
-
- mIat.startListening(mRecoListener);
-
- private RecognizerListener mRecoListener = new RecognizerListener() {
-
-
-
-
- public void onResult(RecognizerResult results, boolean isLast) {
- Log.d(TAG, "result:" + results.getResultString());
- }
-
-
- public void onError(SpeechError error) {
-
- Log.d(TAG, "error:" + error.getPlainDescription(true))
- }
-
-
- public void onBeginOfSpeech() {
- }
-
-
- public void onVolumeChanged(int volume, byte[] data) {
- }
-
-
- public void onEndOfSpeech() {
- }
-
-
- public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
- }
- };
能够看到上面的onResult回调方法跟有动画效果时的onResult回调方法是同样的,因此主要的处理仍是在这个方法中,将有动画的那个onResult回调中的代码拷过来就好了。如此,简单的语音听写功能就实现了。(动画
//在最后必须从新设置一下,不是json格式就会报错
resultJson="[";
)this