讯飞文字转语音
官方文档:https://doc.xfyun.cn/msc_android/index.html
Demo:
1.创建应用,获取AppId
2.下载SDK,集成
3.
4.代码实现
1. import android.app.Activity ;
2.
import android.os.Bundle ;
3.
import android.util.Log ;
4.
import android.view.View ;
5.
import android.widget.Button ;
6.
import android.widget.EditText ;
7.
import android.widget.Toast ;
8.
9.
import com.iflytek.cloud.ErrorCode ;
10.
import com.iflytek.cloud.InitListener ;
11.
import com.iflytek.cloud.RecognizerListener ;
12.
import com.iflytek.cloud.RecognizerResult ;
13.
import com.iflytek.cloud.SpeechConstant ;
14.
import com.iflytek.cloud.SpeechError ;
15.
import com.iflytek.cloud.SpeechRecognizer ;
16.
import com.iflytek.cloud.SpeechSynthesizer ;
17.
import com.iflytek.cloud.SpeechUtility ;
18.
import com.iflytek.cloud.SynthesizerListener ;
19.
import com.iflytek.cloud.ui.RecognizerDialog ;
20.
import com.iflytek.cloud.ui.RecognizerDialogListener ;
21.
22.
import org.json.JSONException ;
23.
import org.json.JSONObject ;
24.
25.
import java.util.HashMap ;
26.
import java.util.LinkedHashMap ;
27.
28.
public classMainActivityextendsActivityimplementsView.OnClickListener {
29.
30.
private static final String TAG = MainActivity.class .getSimpleName();
31.
private EditText et_input;
32.
private Button btn_startspeech, btn_startspeektext ;
33.
34.
// 用HashMap存储听写结果
35.
private HashMap<String, String> mIatResults = new LinkedHashMap<String , String>();
36.
37.
@Override
38.
protectedvoidonCreate(Bundle savedInstanceState) {
39.
super .onCreate(savedInstanceState) ;
40.
initView() ;
41.
initSpeech() ;
42.
}
43.
44.
privatevoidinitView() {
45.
setContentView(R.layout.activity_main) ;
46.
et_input = (EditText) findViewById(R.id.et_input );
47.
btn_startspeech = (Button) findViewById(R.id.btn_startspeech );
48.
btn_startspeektext = (Button) findViewById(R.id.btn_startspeektext );
49.
this) ;
50.
this) ;
51.
}
52.
53.
privatevoidinitSpeech() {
54.
// 将“12345678”替换成您申请的 APPID,申请地址: http://www.xfyun.cn
55.
// 请勿在 “ =”与 appid 之间添加任务空字符或者转义符
56.
this, SpeechConstant. APPID + "=56ffe0ae" );
57.
}
58.
59.
@Override
60.
publicvoidonClick(View v) {
61.
switch (v.getId()) {
62.
case R.id.btn_startspeech: //语音识别(把声音转文字)
63.
startSpeechDialog();
64.
break;
65.
case R.id. btn_startspeektext:// 语音合成(把文字转声音)
66.
speekText();
67.
break;
68.
}
69.
70.
}
71.
72.
privatevoidspeekText() {
73.
//1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListener
74.
this, null);
75.
//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类
76.
//设置发音人(更多在线发音人,用户可参见 附录 13.2
77.
"vixyun" ); // 设置发音人
78.
"50" );// 设置语速
79.
"80" );// 设置音量,范围 0~100
80.
//设置云端
81.
//设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”
82.
//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限
83.
//仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码
84.
"./sdcard/iflytek.pcm" );
85.
//3.开始合成
86.
new MySynthesizerListener()) ;
87.
88.
}
89.
90.
class MySynthesizerListener implements SynthesizerListener {
91.
92.
@Override
93.
publicvoidonSpeakBegin() {
94.
" 开始播放 ");
95.
}
96.
97.
@Override
98.
publicvoidonSpeakPaused() {
99.
" 暂停播放 ");
100.
}
101.
102.
@Override
103.
publicvoidonSpeakResumed() {
104.
" 继续播放 ");
105.
}
106.
107.
@Override
108.
publicvoidonBufferProgress(intintint endPos ,
109.
String info) {
110.
// 合成进度
111.
}
112.
113.
@Override
114.
publicvoidonSpeakProgress(intintint endPos) {
115.
// 播放进度
116.
}
117.
118.
@Override
119.
publicvoidonCompleted(SpeechError error) {
120.
if (error == null) {
121.
"播放完成 ");
122.
else if (error != null ) {
123.
true));
124.
}
125.
}
126.
127.
@Override
128.
publicvoidonEvent(intintint arg2, Bundle obj) {
129.
// 以下代码用于获取与云端的会话 id,当业务出错时将会话 id提供给技术支持人员,可用于查询会话日志,定位出错原因
130.
// 若使用本地能力,会话 id为null
131.
//if (SpeechEvent.EVENT_SESSION_ID == eventType) {
132.
// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
133.
// Log.d(TAG, "session id =" + sid);
134.
//}
135.
}
136.
}
137.
138.
privatevoidstartSpeechDialog() {
139.
//1. 创建RecognizerDialog对象
140.
new RecognizerDialog(this, new MyInitListener()) ;
141.
//2. 设置accent、 language等参数
142.
"zh_cn" );// 设置中文
143.
"mandarin" );
144.
// 若要将UI控件用于语义理解,必须添加以下参数设置,设置之后 onResult回调返回将是语义理解
145.
// 结果
146.
// mDialog.setParameter("asr_sch", "1");
147.
// mDialog.setParameter("nlp_version", "2.0");
148.
//3.设置回调接口
149.
new MyRecognizerDialogListener()) ;
150.
//4. 显示dialog,接收语音输入
151.
mDialog.show() ;
152.
}
153.
154.
class MyRecognizerDialogListener implements RecognizerDialogListener {
155.
156.
/**
157.
*@param results
158.
*@param isLast 是否说完了
159.
*/
160.
@Override
161.
publicvoidonResult(RecognizerResult results, boolean isLast) {
162.
//为解析的
163.
showTip(result) ;
164.
" 没有解析的 :" + result);
165.
166.
//解析过后的
167.
" 解析后的 :" + text);
168.
169.
null;
170.
// 读取json结果中的 sn字段
171.
try {
172.
new JSONObject(results.getResultString()) ;
173.
"sn" );
174.
catch (JSONException e) {
175.
e.printStackTrace();
176.
}
177.
178.
//没有得到一句,添加到
179.
180.
new StringBuffer();
181.
for (String key : mIatResults.keySet()) {
182.
resultBuffer.append(mIatResults .get(key));
183.
}
184.
185.
// 设置输入框的文本
186.
//把光标定位末尾
187.
}
188.
189.
@Override
190.
publicvoidonError(SpeechError speechError) {
191.
192.
}
193.
}
194.
195.
class MyInitListener implements InitListener {
196.
197.
@Override
198.
publicvoidonInit(int code) {
199.
if (code != ErrorCode.SUCCESS) {
200.
"初始化失败 ");
201.
}
202.
203.
}
204.
}
205.
206.
/**
207.
* 语音识别
208.
*/
209.
privatevoidstartSpeech() {
210.
//1. 创建SpeechRecognizer对象,第二个参数: 本地识别时传 InitListener
211.
this, null); //语音识别器
212.
//2. 设置听写参数,详见《 MSC Reference Manual》 SpeechConstant类
213.
"iat" );// 短信和日常用语: iat (默认)
214.
"zh_cn" );// 设置中文
215.
"mandarin" );// 设置普通话
216.
//3. 开始听写
217.
mIat.startListening( mRecoListener);
218.
}
219.
220.
221.
// 听写监听器
222.
private RecognizerListener mRecoListener = new RecognizerListener() {
223.
// 听写结果回调接口 (返回Json 格式结果,用户可参见附录 13.1);
224.
//一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
225.
//关于解析Json的代码可参见 Demo中JsonParser 类;
226.
//isLast等于true 时会话结束。
227.
publicvoidonResult(RecognizerResult results, boolean isLast) {
228.
Log.e (TAG, results.getResultString());
229.
System.out.println(results.getResultString()) ;
230.
showTip(results.getResultString()) ;
231.
}
232.
233.
// 会话发生错误回调接口
234.
publicvoidonError(SpeechError error) {
235.
true)) ;
236.
// 获取错误码描述
237.
"error.getPlainDescription(true)==" + error.getPlainDescription(true ));
238.
}
239.
240.
// 开始录音
241.
publicvoidonBeginOfSpeech() {
242.
" 开始录音 ");
243.
}
244.
245.
//volume 音量值0~30, data音频数据
246.
publicvoidonVolumeChanged(intbyte[] data) {
247.
" 声音改变了 ");
248.
}
249.
250.
// 结束录音
251.
publicvoidonEndOfSpeech() {
252.
" 结束录音 ");
253.
}
254.
255.
// 扩展用接口
256.
publicvoidonEvent(intintint arg2, Bundle obj) {
257.
}
258.
};
259.
260.
privatevoidshowTip(String data) {
261.
this, data, Toast.LENGTH_SHORT).show() ;
262.
}
7.Json实体类
1. import org.json.JSONArray ;
2.
import org.json.JSONObject ;
3.
import org.json.JSONTokener ;
4.
5.
/**
6.
* Json结果解析类
7.
*/
8.
public class JsonParser {
9.
10.
public static String parseIatResult(String json) {
11.
ret = new StringBuffer() ;
12.
try {
13.
new JSONTokener(json) ;
14.
new JSONObject(tokener) ;
15.
16.
.getJSONArray("ws" );
17.
int i = 0; i < words.length(); i++) {
18.
// 转写结果词,默认使用第一个结果
19.
.getJSONObject(i).getJSONArray("cw" );
20.
.getJSONObject(0 );
21.
.append(obj.getString("w" ));
22.
// 如果需要多候选结果,解析数组其他字段
23.
// for(int j = 0; j < items.length(); j++)
24.
// {
25.
// JSONObject obj = items.getJSONObject(j);
26.
// ret.append(obj.getString("w"));
27.
// }
28.
}
29.
catch (Exception e) {
30.
.printStackTrace();
31.
}
32.
ret.toString();
33.
}
34.
35.
public static String parseGrammarResult(String json) {
36.
ret = new StringBuffer() ;
37.
try {
38.
new JSONTokener(json) ;
39.
new JSONObject(tokener) ;
40.
41.
.getJSONArray("ws" );
42.
int i = 0; i < words.length(); i++) {
43.
.getJSONObject(i).getJSONArray("cw" );
44.
int j = 0; j < items.length() ; j++)
45.
{
46.
.getJSONObject(j);
47.
.getString("w").contains( "nomatch"))
48.
{
49.
.append( "没有匹配结果.") ;
50.
ret.toString();
51.
}
52.
.append( "【结果】" + obj.getString("w" ));
53.
.append("【置信度】 " + obj.getInt("sc" ));
54.
.append("\n ");
55.
}
56.
}
57.
catch (Exception e) {
58.
.printStackTrace();
59.
.append(" 没有匹配结果 .");
60.
}
61.
ret.toString();
62.
}
63.
64.
public static String parseLocalGrammarResult(String json) {
65.
ret = new StringBuffer() ;
66.
try {
67.
new JSONTokener(json) ;
68.
new JSONObject(tokener) ;
69.
70.
.getJSONArray("ws" );
71.
int i = 0; i < words.length(); i++) {
72.
.getJSONObject(i).getJSONArray("cw" );
73.
int j = 0; j < items.length() ; j++)
74.
{
75.
.getJSONObject(j);
76.
.getString("w").contains( "nomatch"))
77.
{
78.
.append( "没有匹配结果.") ;
79.
ret.toString();
80.
}
81.
.append( "【结果】" + obj.getString("w" ));
82.
.append("\n ");
83.
}
84.
}
85.
.append("【置信度】 " + joResult.optInt("sc" ));
86.
87.
catch (Exception e) {
88.
.printStackTrace();
89.
.append(" 没有匹配结果 .");
90.
}
91.
ret.toString();
92.
}
93.