一、语音识别 1.下载SDK(地址:http://www.xfyun.cn/sdk/dispatcher),选择语音听写SDK(如下图) ,下载前会让你先创建应用,创建应用后会得到一个appid。然后点立即开通去开通语音识别功能,之后就会跳出SDK下载的页面,然后就可以下载了(未注册账号的
一、语音识别
1.下载SDK(地址:http://www.xfyun.cn/sdk/dispatcher),选择语音听写SDK(如下图) ,下载前会让你先创建应用,创建应用后会得到一个appid。然后点“立即开通”去开通“语音识别”功能,之后就会跳出“SDK下载”的页面,然后就可以下载了(未注册账号的要先注册一个账号)。


2.将下载好的SDK中 libs 目录下的 Msc.jar包引入到工程中(参见http://blog.csdn.net/highboys/article/details/51549679,此外,因为本Demo中会用到json的东西,所以还得自己去网上下一个Gson的jar包,一并引进去)。之后在main目录下新建一个jniLibs目录,将 SDK中 libs 目录下的armeabi 拷进去,如下图所示(第④个先不用管):

3.科大讯飞为我们提供了一套语音听写时的UI,即听写的时候会有一个动画效果(如下图),这个时候我们需要 先将 SDK 资源包 assets 路径下的资源文件拷贝至 Android 工程asstes 目录下(没有的话自己新建),参照第2步图的④。

4.接下来就是代码的实现了。首先在Manifest中添加一下权限
-
-
<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.说完了有动画效果的,下面就来说说没有动画效果的(也比较简单)。
-
-
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回调中的代码拷过来就行了。如此,简单的语音听写功能就实现了。
二、语音合成
1.语音合成也需要创建语音配置对象:
-
SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=578f1af7");
2.创建用于语音合成的对象并设置参数,进行语音合成
-
-
SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(MainActivity.this, null);
-
-
-
-
-
-
-
-
mTts.setParameter(SpeechConstant.PARAMS, null);
-
-
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
-
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
-
mTts.setParameter(SpeechConstant.SPEED, "50");
-
-
mTts.setParameter(SpeechConstant.PITCH, "50");
-
mTts.setParameter(SpeechConstant.VOLUME, "80");
-
mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
-
-
mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");
-
-
-
-
-
-
-
-
int code = mTts.startSpeaking("在这里放置需要进行合成的文本", mSynListener);
-
-
if (code != ErrorCode.SUCCESS) {
-
if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {
-
-
Toast.makeText(MainActivity.this, "语音组件未安装", Toast.LENGTH_LONG).show();
-
} else {
-
Toast.makeText(MainActivity.this, "语音合成失败,错误码: " + code, Toast.LENGTH_LONG).show();
-
}
-
}
-
-
合成时需要一个SynthesizerListener类型的合成监听器作参数,定义如下
-
-
private SynthesizerListener mSynListener = new SynthesizerListener() {
-
-
public void onCompleted(SpeechError error) {
-
}
-
-
-
-
public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
-
}
-
-
-
public void onSpeakBegin() {
-
}
-
-
-
public void onSpeakPaused() {
-
}
-
-
-
-
public void onSpeakProgress(int percent, int beginPos, int endPos) {
-
}
-
-
-
public void onSpeakResumed() {
-
}
-
-
-
public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
-
}
-
};
Android开发集成科大讯飞语音识别+语音合成功能转载http://www.codesocang.com/anzhuoyuanma/boke/33861.html