注:本文最后更新时间:2018/08/26,测试环境切换为 macOS
测试环境
Android Studio 3.1.4
macOS 10.13.6
测试讯飞语音的 语音听写
和 在线语音合成
功能,使用讯飞默认 UI。
下载讯飞 SDK
去科大讯飞开发平台下载 相关的SDK。
解压后的文件目录如下:
Android_xxx_xxx_xxxxxx
|-- assets // 讯飞语音的资源文件夹
|-- doc // 开发文档说明
|-- libs // 核心 SDK 文件
|-- arm64-v8a // 下面是几个不同CPU架构下的平台兼容库
|-- libmsc.so
|-- armeabi
|-- ...
|-- Msc.jar // 讯飞开发库
|-- Sunflower.jar // 使用讯飞语音统计功能用到的库
|-- sample
|-- SpeechDemo
|-- ...
|-- readme.txt
|-- release.txt
导入讯飞 SDK
- 使用 Android Studio 新建一个 Android 工程,为了方便,我在这里所有设置均为默认。
- 将工程视图切换至 Project 结构,然后将讯飞文档中对应的文件夹复制到 Android 中,如没有相应的文件夹则需要手动新建,具体如下:
讯飞文档 | Android 工程 |
---|---|
/assets | /app/src/main/assets/ |
/libs/ | /app/libs |
此时,查看 /app/build.gradle,确保会多出下面一行:
buildTypes {
...
}
// 下面这一行 需要手动添加,以加载 .so 动态库及其他第三方库
sourceSets {
main {
jniLibs.srcDirs = ["libs"]
}
}
为使 /libs/xxx/libmsc.so 文件生效,需要在 /gradle.properties 中加入下面一行(为什么?):
# 更新,新版 AS 貌似可以不加入这一行了。
android.useDeprecatedNdk = true
- 在
AndroidManifest.xml
中添加相关权限:
...
测试讯飞 SDK
我们在主页面中加入一个 textView 和 button,点击 button 则会开始语音听写,同时会将听写结果显示到 textView 中,非常简单。
activity_main.xml
代码如下:
MainActivity.java
代码如下:
package com.example.cn_pa.myapplication;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;
public class MainActivity extends AppCompatActivity {
private SpeechRecognizer mIat;
private RecognizerDialog mIatDialog;
private RecognizerDialogListener mRListener;
private Button button;
private TextView tv;
private String result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID +"=XXXXXX"); // 这里要替换成自己申请的 AppID
mRListener = new RecognizerDialogListener() {
@Override
public void onResult(RecognizerResult results, boolean isLast) {
String text = parseIatResult(results.getResultString());
result += text;
tv.setText(result);
if (isLast) {
result = "";
}
}
@Override
public void onError(SpeechError speechError) {
}
};
mIatDialog = new RecognizerDialog(MainActivity.this, null);
mIatDialog.setListener(mRListener);
button = (Button)findViewById(R.id.button);
tv = (TextView)findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setIatParam("zph");
mIatDialog.show();
}
});
}
private void setIatParam(String filename) {
// 清空参数
mIatDialog.setParameter(SpeechConstant.PARAMS, null);
// 设置听写引擎
mIatDialog.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
// 设置返回结果格式
mIatDialog.setParameter(SpeechConstant.RESULT_TYPE, "json");
// 设置语言
mIatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
// 设置语言区域
mIatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
mIatDialog.setParameter(SpeechConstant.VAD_BOS, "4000");
// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
mIatDialog.setParameter(SpeechConstant.VAD_EOS, "2000");
// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
mIatDialog.setParameter(SpeechConstant.ASR_PTT, "1");
// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
mIatDialog.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
mIatDialog.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/MyApplication/" + filename + ".wav");
}
public static String parseIatResult(String json) {
StringBuffer ret = new StringBuffer();
try {
JSONTokener tokener = new JSONTokener(json);
JSONObject joResult = new JSONObject(tokener);
JSONArray words = joResult.getJSONArray("ws");
for (int i = 0; i < words.length(); i++) {
// 转写结果词,默认使用第一个结果
JSONArray items = words.getJSONObject(i).getJSONArray("cw");
JSONObject obj = items.getJSONObject(0);
ret.append(obj.getString("w"));
}
} catch (Exception e) {
e.printStackTrace();
}
return ret.toString();
}
}
以上代码很粗糙,但完成了基本功能演示, 希望对你有所帮助 :)