Android 科大讯飞第三方SDK集成
来源:互联网 发布:自制简易linux操作系统 编辑:程序博客网 时间:2024/05/17 06:19
一、语音识别
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的依赖包,一并引进去)。之后在main目录下新建一个jniLibs目录,将 SDK中 libs 目录下的armeabi 拷进去,如下图所示(第④个先不用管):
3.科大讯飞为我们提供了一套语音听写时的UI,即听写的时候会有一个动画效果(如上图),这个时候我们需要 先将 SDK 资源包 assets 路径下的资源文件拷贝至 Android 工程asstes 目录下(没有的话自己新建),参照上图。
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" /> <!--获取当前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" />
5.其次是mainActivity代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private RecognizerDialog iatDialog; private EditText etText; private Button b1, b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etText = (EditText) findViewById(R.id.ed); b1 = (Button) findViewById(R.id.yu); b2 = (Button) findViewById(R.id.tx); b2.setOnClickListener(this); b1.setOnClickListener(this); SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=59f856b2"); } private void spec() { // ②初始化有交互动画的语音识别器 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(); } etText.setText(result); //获取焦点 etText.requestFocus(); //将光标定位到文字最后,以便修改 etText.setSelection(result.length()); } } @Override public void onError(SpeechError speechError) { //自动生成的方法存根 speechError.getPlainDescription(true); } }); //开始听写,需将sdk中的assets文件下的文件夹拷入项目的assets文件夹下(没有的话自己新建) iatDialog.show(); } 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(); } } }; @Override public void onClick(View v) { switch (v.getId()) { case R.id.yu: spec(); break; case R.id.tx: text(); break; } } private void text(){ //1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListener SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(this, null);//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类//设置发音人(更多在线发音人,用户可参见 附录 13.2 mTts.setParameter(SpeechConstant.VOICE_NAME, "vixyun"); // 设置发音人 mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速 mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围 0~100 mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端//设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限//仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码 mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");//3.开始合成 mTts.startSpeaking(etText.getText().toString(), new MySynthesizerListener()); } class MySynthesizerListener implements 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) { // 合成进度 } @Override public void onSpeakProgress(int percent, int beginPos, int endPos) { // 播放进度 } @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) { // 以下代码用于获取与云端的会话 id,当业务出错时将会话 id提供给技术支持人员,可用于查询会话日志,定位出错原因 // 若使用本地能力,会话 id为null //if (SpeechEvent.EVENT_SESSION_ID == eventType) { // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); // Log.d(TAG, "session id =" + sid); //} } } private void showTip (String data) { Toast.makeText( this, data, Toast.LENGTH_SHORT).show() ; }}
上面的代码用到了一个DictationResult类(一个用来接收转换 语音听写结果的类),需要自己新建,定义如下
/** * 解析 语音听写返回结果Json格式字符串 的模板类(多重嵌套Json) * * 语音识别结果Json数据格式(单条数据): * {"sn":1,"ls":true,"bg":0,"ed":0,"ws":[ * {"bg":0,"cw":[{"w":"今天","sc":0}]}, * {"bg":0,"cw":[{"w":"的","sc":0}]}, * {"bg":0,"cw":[{"w":"天气","sc":0}]}, * {"bg":0,"cw":[{"w":"怎么样","sc":0}]}, * {"bg":0,"cw":[{"w":"。","sc":0}]} * ]} * * sn number :第几句 * ls boolean: 是否最后一句 * bg number :开始 * ed number :结束 * ws array :词 * cw array :中文分词 * w string :单字 * sc number :分数 */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; }}
最后是XML中的:一个输入框两个按钮
<?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="test.bwie.com.myspeech.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/ed"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/yu" android:text="语音转文字"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/text" android:text="文字转语音"/></LinearLayout>
以上就是语言听写的实现,注意一定要把app id改成自己的!!!
阅读全文
0 0
- Android 科大讯飞第三方SDK集成
- android studio SDK 集成 一键分享 第三方登录:
- android app集成第三方SDK--没有说明文档
- Android 集成第三方SDK 友盟+统计 浓缩版
- 集成第三方sdk验证短信校验
- Android中第三方SDK集成之百度地图集成(入门篇)
- Android中第三方SDK集成之高德地图集成指南(入门篇)
- Android中第三方SDK集成之腾讯Bugly热更新集成指南
- Android中第三方SDK集成之ZXing二维码扫一扫集成指南
- Android中第三方SDK集成之百度地图集成(案例一)
- android 集成第三方库
- Android 第三方分享集成
- android集成第三方支付
- Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送
- android eclipese 和源码SDk上集成成第三方jar包及.so动态库
- Android FrameWork集成第三方SDK的jar包和so库
- iOS开发-即时通讯第三方-环信SDK集成
- 第三方资源收集(GitHub)及SDK集成
- 每日一练 20171030
- Docker 安装 Redis
- 如何开发一个Servlet
- Typescript
- Asp.net SignalR快速入门--网络版与WPF版
- Android 科大讯飞第三方SDK集成
- 【剑指offer】二维数组中的查找
- WAMP配置虚拟域名
- 类与对象--cookbook读书笔记
- fcn网络voc2007数据制作样例
- 图片文件在html5页面和android编程中的处理方式
- 每日一练20171031
- 常见问题_2
- python3抓取百度图片