您的位置:首页 > 其它

讯飞语音听写,合成读写

2017-11-01 09:10 204 查看


(本Demo的开发环境为Android Studio)。

一、语音识别

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


//对应主界面 来实现两个按钮的点击事件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
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.eightgroup.day111deme.MainActivity">

<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn1"
android:text="语音识别"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btn2"
android:text="语音合成"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

//对应相关权限
<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET" />
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--获取当前wifi状态 -->
<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" />

<!--SD卡读写的权限(如果需要保存音频文件到本地的话)-->
<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" />//下面就是对应的主页面
public class MainActivity extends AppCompatActivity {
Button btn1,btn2;
EditText edt;
//有动画效果
private RecognizerDialog iatDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
edt = (EditText)findViewById(R.id.edt);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

// ①语音配置对象初始化
SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=59f8617c");//将这里的578f1af7替换成自己申请得到的8位appid

// ②初始化有交互动画的语音识别器
iatDialog = new RecognizerDialog(MainActivity.this, mInitListener);
//③设置监听,实现听写结果的回调
iatDialog.setListener(new RecognizerDialogListener() {
String resultJson = "[";//放置在外边做类的变量则报错,会造成json格式不对(?)

@Override
public void onResult(RecognizerResult recognizerResult, boolean isLast) {
System.out.println("----------------- onResult -----------------");
if (!isLast) {
resultJson += recognizerResult.getResultString() + ",";
} else {
resultJson += recognizerResult.getResultString() + "]";
}

if (isLast) {
//解析语音识别后返回的json格式的结果
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();
}
edt.setText(result);
//获取焦点
edt.requestFocus();
//将光标定位到文字最后,以便修改
edt.setSelection(result.length());
}
}

@Override
public void onError(SpeechError speechError) {
//自动生成的方法存根
speechError.getPlainDescription(true);
}
});
//开始听写,需将sdk中的assets文件下的文件夹拷入项目的assets文件夹下(没有的话自己新建)
iatDialog.show();

}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=59f8617c");

//1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener
SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(MainActivity.this, null);

/**
2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
*
*/

// 清空参数
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");//设置音量,范围0~100
mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
// 设置播放合成音频打断音乐播放,默认为true
mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");

// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
// mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
// boolean isSuccess = mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/tts2.wav");
// Toast.makeText(MainActivity.this, "语音合成 保存音频到本地:\n" + isSuccess, Toast.LENGTH_LONG).show();
//3.开始合成
final String s = edt.getText().toString();
int code = mTts.startSpeaking(s, 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();
}
}
}
});

}

private InitListener mInitListener = new InitListener() {
@Override
public void onInit(int code) {
Log.d("mian", "SpeechRecognizer init() code = " + code);
if (code != ErrorCode.SUCCESS) {
Toast.makeText(MainActivity.this, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();
}
}
};

//合成监听器
private SynthesizerListener mSynListener = new SynthesizerListener() {
//会话结束回调接口,没有错误时,error为null
public void onCompleted(SpeechError error) {
}

//缓冲进度回调
//percent为缓冲进度0~100,beginPos为缓冲
b036
音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。
public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
}

//开始播放
public void onSpeakBegin() {
}

//暂停播放
public void onSpeakPaused() {
}

//播放进度回调
//percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置.
public void onSpeakProgress(int percent, int beginPos, int endPos) {
}

//恢复播放回调接口
public void onSpeakResumed() {
}

//会话事件回调接口
public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
}
};
}


//创建一个class
public class DictationResult {
private String sn;
private String ls;
private String bg;
private String ed;

private List<Words> ws;

public static class Words {
private String bg;
private List<Cw> cw;

public static class Cw {
private String w;
private String sc;

public String getW() {
return w;
}

public void setW(String w) {
this.w = w;
}

public String getSc() {
return sc;
}

public void setSc(String sc) {
this.sc = sc;
}

@Override
public String toString() {
return w;
}
}

public String getBg() {
return bg;
}

public void setBg(String bg) {
this.bg = bg;
}

public List<Cw> getCw() {
return cw;
}

public void setCw(List<Cw> cw) {
this.cw = cw;
}

@Override
public String toString() {
String result = "";
for (Cw cwTmp : cw) {
result += cwTmp.toString();
}
return result;
}
}

public String getSn() {
return sn;
}

public void setSn(String sn) {
this.sn = sn;
}

public String getLs() {
return ls;
}

public void setLs(String ls) {
this.ls = ls;
}

public String getBg() {
return bg;
}

public void setBg(String bg) {
this.bg = bg;
}

public String getEd() {
return ed;
}

public void setEd(String ed) {
this.ed = ed;
}

public List<Words> getWs() {
return ws;
}

public void setWs(List<Words> ws) {
this.ws = ws;
}

@Override
public String toString() {
String result = "";
for (Words wsTmp : ws) {
result += wsTmp.toString();
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: