语音云开放平台是科大讯飞股份有限公司旗下的全球首个面向互联网开发者的智能语音交互平台,为开发者免费开放语音识别、语音合成、智能语义等服务。自2010年首度在北京香格里拉饭店发布以来,吸引了各个领域的优秀APP的加盟,目前已经为数以亿计的终端提供了智能语音交互的服务。本文主要讲述其两个比较常用的功能,语音识别与文本朗读,这两个功能可以方便地嵌入各开发者的应用中。
1.搭建开发环境
1.1 在Eclipse中建立你的Android工程,如MyiFly。
1.2 将Msc.jar、Sunflower.jar以及armeabi复制到新建工程的libs目录中,并将导进来的jar包Build Path(如下图示)。
1.3 将所需的资源文件放进assets文件夹中(如下图所示)。
1.4 在AndroidManifest.xml配置如下权限
<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_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1.5 在application节点下配置meta-data,value值为自己在讯飞语音云的应用秘钥
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="IFLYTEK_APPKEY"
android:value="myappkey" />
<activity
android:name=".MainActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden |navigation|orientation|screenLayout|fontScale"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
2.应用界面
EditText下。当用户在EditText输好文本点击朗读时即可将文本转为语音
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.myifly.MainActivity" >
<EditText
android:id="@+id/content_rec"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="识别内容" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:onClick="startRec"
android:text="识别" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignParentRight="true"
android:onClick="read"
android:text="朗读" />
</RelativeLayout>
3.主要代码
3.1初始化,验证用户秘钥,// 创建语音听写对象,听写UI和音合成对象
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//用于验证应用的key
SpeechUtility.createUtility(MainActivity.this, "appid=548ee912");
// 创建语音听写对象
mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
// 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer
// 创建语音听写UI
iatDialog = new RecognizerDialog(this, mInitListener);
// 创建语音合成对象
mTts = SpeechSynthesizer.createSynthesizer(this, mInitListener);
mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
mResultText = ((EditText) findViewById(R.id.content_rec));
}
// mInitListener为验证用户秘钥的回调方法
private InitListener mInitListener = new InitListener() {
@Override
public void onInit(int code) {
Log.d(TAG, "SpeechRecognizer init() code = " + code);
if (code != ErrorCode.SUCCESS) {
showTip("初始化失败,错误码:" + code);
}
}
};
public void startRec(View view) {
mResultText.setText(null);
setParam();
boolean isShowDialog = true;
if (isShowDialog) {
// 显示听写对话框
iatDialog.setListener(recognizerDialogListener);
iatDialog.show();
// showTip("begin");
} else {
// 不显示听写对话框
ret = mIat.startListening(recognizerListener);
if (ret != ErrorCode.SUCCESS) {
// showTip("听写失败,错误码:" + ret);
} else {
// showTip("begin");
}
}
}
//注意,在使用语音听写对象要为其设置好参数,在setParam()方法中进行
public void setParam() {
// 清空参数
mIat.setParameter(SpeechConstant.PARAMS, null);
// 设置语言
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
// 设置语言区域
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
// 设置语音前端点
mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
// 设置语音后端点
mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
// 设置标点符号 1为有标点 0为没标点
mIat.setParameter(SpeechConstant.ASR_PTT, "0");
// 设置音频保存路径
mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,
Environment.getExternalStorageDirectory()
+ "/iflytek/wavaudio.pcm");
}
当用户点击识别时会弹出下图UI
/**
* 听写UI监听器,用户倾听用于语音,在onResult方法中获得服务器返回的识别结果
*/
private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() {
public void onResult(RecognizerResult results, boolean isLast) {
String text = JsonParser.parseIatResult(results.getResultString());
mResultText.append(text);
mResultText.setSelection(mResultText.length());
}
/**
* 识别回调错误.
*/
public void onError(SpeechError error) {
showTip(error.getPlainDescription(true));
}
};
本文用UI返回结果所以将isShowDialog 设为 true,如果你不用的话就使用下面的识别方式
/**
* 听写监听器。
*/
private RecognizerListener recognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
showTip("开始说话");
}
@Override
public void onEndOfSpeech() {
showTip("结束说话");
}
@Override
public void onResult(RecognizerResult results, boolean isLast) {
String text = JsonParser.parseIatResult(results.getResultString());
mResultText.append(text);
mResultText.setSelection(mResultText.length());
if (isLast) {
// TODO 最后的结果
}
}
@Override
public void onVolumeChanged(int volume) {
showTip("当前正在说话,音量大小:" + volume);
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
}
@Override
public void onError(SpeechError arg0) {
// TODO Auto-generated method stub
}
};
3.3朗读功能
public void read(View view) {
String text = mResultText.getText().toString();
// 设置参数
setParam2();
//朗读
int code = mTts.startSpeaking(text, mTtsListener);
if (code != ErrorCode.SUCCESS) {
if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {
// 未安装则跳转到提示安装页面
} else {
showTip("语音合成失败,错误码: " + code);
}
}
}
setParam2()为语音合成对象设置如下参数
/**
* 参数设置
*
* @param param
* @return
*/
private void setParam2() {
// 设置合成
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
// 设置发音人
mTts.setParameter(SpeechConstant.VOICE_NAME, voicer);
// 设置语速
mTts.setParameter(SpeechConstant.SPEED, "50");
// 设置音调
mTts.setParameter(SpeechConstant.PITCH, "50");
// 设置音量
mTts.setParameter(SpeechConstant.VOLUME, "50");
// 设置播放器音频流类型
mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
}
mTtsListener为合成语音对象回调监听,监听内容看监听方法名称即可知道
/**
*
*/
private SynthesizerListener mTtsListener = new SynthesizerListener() {
@Override
public void onSpeakBegin() {
showTip("开始播放");
}
@Override
public void onSpeakPaused() {
showTip("暂停播放");
}
@Override
public void onSpeakResumed() {
showTip("继续播放");
}
@Override
public void onBufferProgress(int percent, int beginPos, int endPos,
String info) {
mPercentForBuffering = percent;
showTip(String.format(getString(R.string.tts_toast_format),
mPercentForBuffering, mPercentForPlaying));
}
@Override
public void onSpeakProgress(int percent, int beginPos, int endPos) {
mPercentForPlaying = percent;
showTip(String.format(getString(R.string.tts_toast_format),
mPercentForBuffering, mPercentForPlaying));
}
@Override
public void onCompleted(SpeechError error) {
if (error == null) {
showTip("播放完成");
} else if (error != null) {
showTip(error.getPlainDescription(true));
}
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
}
};
4.
结语
至此,整个讯飞语音云的语音识别与文本朗读功能介绍完毕,希望对大家有帮助。