• 讯飞语音开发集成地址http://www.xfyun.cn/解压后的doc文件夹下的msc develop 文件中有详细集成步骤 AppId: 1.先要注册开发者账户, 添加我的应用 , 下载sdk 2.下载后将sdk解压, 把案例导入工程中运行看看效果 ...

    讯飞语音开发集成地址http://www.xfyun.cn/ 解压后的doc文件夹下的msc develop 文件中有详细集成步骤 
    这里写图片描述 
    AppId:

    这里写图片描述 
    1.先要注册开发者账户, 添加我的应用 , 下载sdk

    这里写图片描述

    2.下载后将sdk解压, 把案例导入工程中运行看看效果 
    这里写图片描述

    3.将libs下的两个jar包添加到libs目录下, 将同路径下的其它 .so文件(与c进行交互)复制到main路径下新建的 jniLibs(L要大写)目录下(别忘了jar包要add) , 将assert目录拷贝到main目录下 
    注意 : 这些都是自己创建的应用生成的, 在申请appid时就与自己的应用绑定了, 拷贝别人的是没有用的

    这里写图片描述

    4.添加权限

    <!--连接网络权限,用于执行云端语音能力 -->
    <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"/>
    <!--读取联系人权限,上传联系人需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <!--外存储写权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--外存储读权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <!--配置权限,用来记录应用配置信息 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
    <!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
    <uses-permission android:name="android.permission.CAMERA" />
    

    5.创建类 , 以下是代码: initSpeech()方法下的APPID需要改成上面介绍中自己应用生成的appId

    
     
    1. package atguigu.com.speechdemo2;

    2.  
    3. import android.app.Activity ;

    4. import android.os.Bundle ;

    5. import android.util.Log ;

    6. import android.view.View ;

    7. import android.widget.Button ;

    8. import android.widget.EditText ;

    9. import android.widget.Toast ;

    10.  
    11. import com.iflytek.cloud.ErrorCode ;

    12. import com.iflytek.cloud.InitListener ;

    13. import com.iflytek.cloud.RecognizerListener ;

    14. import com.iflytek.cloud.RecognizerResult ;

    15. import com.iflytek.cloud.SpeechConstant ;

    16. import com.iflytek.cloud.SpeechError ;

    17. import com.iflytek.cloud.SpeechRecognizer ;

    18. import com.iflytek.cloud.SpeechSynthesizer ;

    19. import com.iflytek.cloud.SpeechUtility ;

    20. import com.iflytek.cloud.SynthesizerListener ;

    21. import com.iflytek.cloud.ui.RecognizerDialog ;

    22. import com.iflytek.cloud.ui.RecognizerDialogListener ;

    23.  
    24. import org.json.JSONException ;

    25. import org.json.JSONObject ;

    26.  
    27. import java.util.HashMap ;

    28. import java.util.LinkedHashMap ;

    29.  
    30. public class MainActivity extends Activity implements View.OnClickListener {

    31.  
    32. private static final String TAG = MainActivity.class .getSimpleName();

    33. private EditText et_input;

    34. private Button btn_startspeech, btn_startspeektext ;

    35.  
    36. // 用HashMap存储听写结果

    37. private HashMap<String, String> mIatResults = new LinkedHashMap<String , String>();

    38.  
    39. @Override

    40. protected void onCreate(Bundle savedInstanceState) {

    41. super .onCreate(savedInstanceState) ;

    42. initView() ;

    43. initSpeech() ;

    44. }

    45.  
    46. private void initView() {

    47. setContentView(R.layout.activity_main) ;

    48. et_input = (EditText) findViewById(R.id.et_input );

    49. btn_startspeech = (Button) findViewById(R.id.btn_startspeech );

    50. btn_startspeektext = (Button) findViewById(R.id.btn_startspeektext );

    51. btn_startspeech .setOnClickListener(this) ;

    52. btn_startspeektext .setOnClickListener(this) ;

    53. }

    54.  
    55. private void initSpeech() {

    56. // 将“12345678”替换成您申请的 APPID,申请地址: http://www.xfyun.cn

    57. // 请勿在 “ =”与 appid 之间添加任务空字符或者转义符

    58. SpeechUtility. createUtility( this, SpeechConstant. APPID + "=56ffe0ae" );

    59. }

    60.  
    61. @Override

    62. public void onClick(View v) {

    63. switch (v.getId()) {

    64. case R.id.btn_startspeech: //语音识别(把声音转文字)

    65. startSpeechDialog();

    66. break;

    67. case R.id. btn_startspeektext:// 语音合成(把文字转声音)

    68. speekText();

    69. break;

    70. }

    71.  
    72. }

    73.  
    74. private void speekText() {

    75. //1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListener

    76. SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);

    77. //2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类

    78. //设置发音人(更多在线发音人,用户可参见 附录 13.2

    79. mTts.setParameter(SpeechConstant. VOICE_NAME, "vixyun" ); // 设置发音人

    80. mTts.setParameter(SpeechConstant. SPEED, "50" );// 设置语速

    81. mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100

    82. mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端

    83. //设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”

    84. //保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限

    85. //仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码

    86. mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );

    87. //3.开始合成

    88. mTts.startSpeaking( et_input.getText().toString(), new MySynthesizerListener()) ;

    89.  
    90. }

    91.  
    92. class MySynthesizerListener implements SynthesizerListener {

    93.  
    94. @Override

    95. public void onSpeakBegin() {

    96. showTip(" 开始播放 ");

    97. }

    98.  
    99. @Override

    100. public void onSpeakPaused() {

    101. showTip(" 暂停播放 ");

    102. }

    103.  
    104. @Override

    105. public void onSpeakResumed() {

    106. showTip(" 继续播放 ");

    107. }

    108.  
    109. @Override

    110. public void onBufferProgress(int percent, int beginPos, int endPos ,

    111. String info) {

    112. // 合成进度

    113. }

    114.  
    115. @Override

    116. public void onSpeakProgress(int percent, int beginPos, int endPos) {

    117. // 播放进度

    118. }

    119.  
    120. @Override

    121. public void onCompleted(SpeechError error) {

    122. if (error == null) {

    123. showTip("播放完成 ");

    124. } else if (error != null ) {

    125. showTip(error.getPlainDescription( true));

    126. }

    127. }

    128.  
    129. @Override

    130. public void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {

    131. // 以下代码用于获取与云端的会话 id,当业务出错时将会话 id提供给技术支持人员,可用于查询会话日志,定位出错原因

    132. // 若使用本地能力,会话 id为null

    133. //if (SpeechEvent.EVENT_SESSION_ID == eventType) {

    134. // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);

    135. // Log.d(TAG, "session id =" + sid);

    136. //}

    137. }

    138. }

    139.  
    140. private void startSpeechDialog() {

    141. //1. 创建RecognizerDialog对象

    142. RecognizerDialog mDialog = new RecognizerDialog(this, new MyInitListener()) ;

    143. //2. 设置accent、 language等参数

    144. mDialog.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 设置中文

    145. mDialog.setParameter(SpeechConstant. ACCENT, "mandarin" );

    146. // 若要将UI控件用于语义理解,必须添加以下参数设置,设置之后 onResult回调返回将是语义理解

    147. // 结果

    148. // mDialog.setParameter("asr_sch", "1");

    149. // mDialog.setParameter("nlp_version", "2.0");

    150. //3.设置回调接口

    151. mDialog.setListener( new MyRecognizerDialogListener()) ;

    152. //4. 显示dialog,接收语音输入

    153. mDialog.show() ;

    154. }

    155.  
    156. class MyRecognizerDialogListener implements RecognizerDialogListener {

    157.  
    158. /**

    159. * @param results

    160. * @param isLast 是否说完了

    161. */

    162. @Override

    163. public void onResult(RecognizerResult results, boolean isLast) {

    164. String result = results.getResultString(); //为解析的

    165. showTip(result) ;

    166. System. out.println(" 没有解析的 :" + result);

    167.  
    168. String text = JsonParser.parseIatResult(result) ;//解析过后的

    169. System. out.println(" 解析后的 :" + text);

    170.  
    171. String sn = null;

    172. // 读取json结果中的 sn字段

    173. try {

    174. JSONObject resultJson = new JSONObject(results.getResultString()) ;

    175. sn = resultJson.optString("sn" );

    176. } catch (JSONException e) {

    177. e.printStackTrace();

    178. }

    179.  
    180. mIatResults .put(sn, text) ;//没有得到一句,添加到

    181.  
    182. StringBuffer resultBuffer = new StringBuffer();

    183. for (String key : mIatResults.keySet()) {

    184. resultBuffer.append(mIatResults .get(key));

    185. }

    186.  
    187. et_input.setText(resultBuffer.toString());// 设置输入框的文本

    188. et_input .setSelection(et_input.length()) ;//把光标定位末尾

    189. }

    190.  
    191. @Override

    192. public void onError(SpeechError speechError) {

    193.  
    194. }

    195. }

    196.  
    197. class MyInitListener implements InitListener {

    198.  
    199. @Override

    200. public void onInit(int code) {

    201. if (code != ErrorCode.SUCCESS) {

    202. showTip("初始化失败 ");

    203. }

    204.  
    205. }

    206. }

    207.  
    208. /**

    209. * 语音识别

    210. */

    211. private void startSpeech() {

    212. //1. 创建SpeechRecognizer对象,第二个参数: 本地识别时传 InitListener

    213. SpeechRecognizer mIat = SpeechRecognizer.createRecognizer( this, null); //语音识别器

    214. //2. 设置听写参数,详见《 MSC Reference Manual》 SpeechConstant类

    215. mIat.setParameter(SpeechConstant. DOMAIN, "iat" );// 短信和日常用语: iat (默认)

    216. mIat.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 设置中文

    217. mIat.setParameter(SpeechConstant. ACCENT, "mandarin" );// 设置普通话

    218. //3. 开始听写

    219. mIat.startListening( mRecoListener);

    220. }

    221.  
    222.  
    223. // 听写监听器

    224. private RecognizerListener mRecoListener = new RecognizerListener() {

    225. // 听写结果回调接口 (返回Json 格式结果,用户可参见附录 13.1);

    226. //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;

    227. //关于解析Json的代码可参见 Demo中JsonParser 类;

    228. //isLast等于true 时会话结束。

    229. public void onResult(RecognizerResult results, boolean isLast) {

    230. Log.e (TAG, results.getResultString());

    231. System.out.println(results.getResultString()) ;

    232. showTip(results.getResultString()) ;

    233. }

    234.  
    235. // 会话发生错误回调接口

    236. public void onError(SpeechError error) {

    237. showTip(error.getPlainDescription(true)) ;

    238. // 获取错误码描述

    239. Log. e(TAG, "error.getPlainDescription(true)==" + error.getPlainDescription(true ));

    240. }

    241.  
    242. // 开始录音

    243. public void onBeginOfSpeech() {

    244. showTip(" 开始录音 ");

    245. }

    246.  
    247. //volume 音量值0~30, data音频数据

    248. public void onVolumeChanged(int volume, byte[] data) {

    249. showTip(" 声音改变了 ");

    250. }

    251.  
    252. // 结束录音

    253. public void onEndOfSpeech() {

    254. showTip(" 结束录音 ");

    255. }

    256.  
    257. // 扩展用接口

    258. public void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {

    259. }

    260. };

    261.  
    262. private void showTip (String data) {

    263. Toast.makeText( this, data, Toast.LENGTH_SHORT).show() ;

    264. }

    265. }

     

    6.json解析类:

     

    
     
    1. package atguigu.com.speechdemo2;

    2.  
    3. import org.json.JSONArray ;

    4. import org.json.JSONObject ;

    5. import org.json.JSONTokener ;

    6.  
    7. /**

    8. * Json结果解析类

    9. */

    10. public class JsonParser {

    11.  
    12. public static String parseIatResult(String json) {

    13. StringBuffer ret = new StringBuffer() ;

    14. try {

    15. JSONTokener tokener = new JSONTokener(json) ;

    16. JSONObject joResult = new JSONObject(tokener) ;

    17.  
    18. JSONArray words = joResult.getJSONArray("ws" );

    19. for (int i = 0; i < words.length(); i++) {

    20. // 转写结果词,默认使用第一个结果

    21. JSONArray items = words.getJSONObject(i).getJSONArray("cw" );

    22. JSONObject obj = items.getJSONObject(0 );

    23. ret.append(obj.getString("w" ));

    24. // 如果需要多候选结果,解析数组其他字段

    25. // for(int j = 0; j < items.length(); j++)

    26. // {

    27. // JSONObject obj = items.getJSONObject(j);

    28. // ret.append(obj.getString("w"));

    29. // }

    30. }

    31. } catch (Exception e) {

    32. e.printStackTrace();

    33. }

    34. return ret.toString();

    35. }

    36.  
    37. public static String parseGrammarResult(String json) {

    38. StringBuffer ret = new StringBuffer() ;

    39. try {

    40. JSONTokener tokener = new JSONTokener(json) ;

    41. JSONObject joResult = new JSONObject(tokener) ;

    42.  
    43. JSONArray words = joResult.getJSONArray("ws" );

    44. for (int i = 0; i < words.length(); i++) {

    45. JSONArray items = words.getJSONObject(i).getJSONArray("cw" );

    46. for (int j = 0; j < items.length() ; j++)

    47. {

    48. JSONObject obj = items.getJSONObject(j);

    49. if (obj.getString("w").contains( "nomatch"))

    50. {

    51. ret.append( "没有匹配结果.") ;

    52. return ret.toString();

    53. }

    54. ret.append( "【结果】" + obj.getString("w" ));

    55. ret.append("【置信度】 " + obj.getInt("sc" ));

    56. ret.append("\n ");

    57. }

    58. }

    59. } catch (Exception e) {

    60. e.printStackTrace();

    61. ret.append(" 没有匹配结果 .");

    62. }

    63. return ret.toString();

    64. }

    65.  
    66. public static String parseLocalGrammarResult(String json) {

    67. StringBuffer ret = new StringBuffer() ;

    68. try {

    69. JSONTokener tokener = new JSONTokener(json) ;

    70. JSONObject joResult = new JSONObject(tokener) ;

    71.  
    72. JSONArray words = joResult.getJSONArray("ws" );

    73. for (int i = 0; i < words.length(); i++) {

    74. JSONArray items = words.getJSONObject(i).getJSONArray("cw" );

    75. for (int j = 0; j < items.length() ; j++)

    76. {

    77. JSONObject obj = items.getJSONObject(j);

    78. if (obj.getString("w").contains( "nomatch"))

    79. {

    80. ret.append( "没有匹配结果.") ;

    81. return ret.toString();

    82. }

    83. ret.append( "【结果】" + obj.getString("w" ));

    84. ret.append("\n ");

    85. }

    86. }

    87. ret.append("【置信度】 " + joResult.optInt("sc" ));

    88.  
    89. } catch (Exception e) {

    90. e.printStackTrace();

    91. ret.append(" 没有匹配结果 .");

    92. }

    93. return ret.toString();

    94. }

    95. }

    7.布局文件: 

    
     
    1. <? xml version="1.0" encoding= "utf-8"?>

    2. <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"

    3. android :layout_width="match_parent"

    4. android :layout_height="match_parent"

    5. android :orientation="vertical"

    6. >

    7.  
    8. <EditText

    9. android :id="@+id/et_input"

    10. android :layout_margin="10dp"

    11. android :layout_width="match_parent"

    12. android :layout_height="80dp"

    13. android :hint="请输入文本信息 ..." />

    14.  
    15.  
    16. <Button

    17. android :id="@+id/btn_startspeech"

    18. android :text="点击按钮语音输入 "

    19. android :layout_width="match_parent"

    20. android :layout_height="wrap_content" />

    21.  
    22. <Button

    23. android :id="@+id/btn_startspeektext"

    24. android :text="语音合成(把文字转声音) "

    25. android :layout_width="match_parent"

    26. android :layout_height="wrap_content" />

    27.  
    28.  
    29. </LinearLayout>

    展开全文
  • 实现android语音识别一、准备工作科大讯飞开放云平台:http://www.xfyun.cn,自行注册。...将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。 在工程 AndroidManifes

    #实现android语音识别


    下载地址:
    https://download.csdn.net/download/huosanghuakai1995/10348660

    ##一、准备工作

    科大讯飞开放云平台:http://www.xfyun.cn,自行注册。

    • 注册完毕后下载科大讯飞云平台提供的SDK,勾选下面的服务选择android平台后,下载SDK。

    这里写图片描述


    • 按照提示完成SDK配置和权限添加工作
    • 将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。
    • 在工程 AndroidManifest.xml 文件中添加权限:

    <!--连接网络权限,用于执行云端语音能力 -->
    <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"/>
    <!--读取联系人权限,上传联系人需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <!--外存储写权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--外存储读权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <!--配置权限,用来记录应用配置信息 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
    <!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
    <uses-permission android:name="android.permission.CAMERA" />
    

    • 初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:

    SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");//APPID是你自己注册的APPID,可以自己去查看
    

    ##二、开始新建android工程

    • java代码:
      主activity
    package com.demo.voice;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import sina.CreAmazing.voice.R;
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.os.Bundle;
    import android.text.NoCopySpan.Concrete;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    import android.widget.ToggleButton;
    import com.iflytek.speech.RecognizerResult;
    import com.iflytek.speech.SpeechError;
    import com.iflytek.speech.SynthesizerPlayer;
    import com.iflytek.ui.RecognizerDialog;
    import com.iflytek.ui.RecognizerDialogListener;
    import com.iflytek.ui.SynthesizerDialog;
    import com.iflytek.ui.SynthesizerDialogListener;
    
    public class VoiceRecognize extends Activity {
    
        // 声明控件
        private EditText et;
        private Button bt1;
        private Button bt2;
        private Button bt3;
        private ToggleButton tb;
        private PackageManager pm;
        // 全局只设一个String,因为String为final类型,这样做节省内存
        String text = "";
        private static final String APPID = "appid=11111111";//定义一个常量APPPID,我自己的不便公开需要修改为你自己的;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            //这是后台朗读,实例化一个SynthesizerPlayer
            SynthesizerPlayer player = SynthesizerPlayer.createSynthesizerPlayer(VoiceRecognize.this, APPID);
            //设置语音朗读者,可以根据需要设置男女朗读,具体请看api文档和官方论坛
            player.setVoiceName("vivixiaoyan");//在此设置语音播报的人选例如:vivixiaoyan、vivixiaomei、vivixiaoqi
            player.playText("hello world", "ent=vivi21,bft=5",null);
    
    
            bt1 = (Button) findViewById(R.id.bt_recognize);
            bt2 = (Button) findViewById(R.id.bt_speek);
            bt3 = (Button) findViewById(R.id.bt_speek_bg);
            et = (EditText) findViewById(R.id.et);
            tb = (ToggleButton) findViewById(R.id.tb);
            // 初始化监听器
            initListener();
    
        }
    
        private void initListener() {
            bt1.setOnClickListener(myListener);
            bt2.setOnClickListener(myListener);
            bt3.setOnClickListener(myListener);
    
        }
    
        OnClickListener myListener = new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // 根据不同View的id调用不同方法
                switch (v.getId()) {
                    case R.id.bt_recognize:
                        // 这是语言识别部分,最重要的实例化一个
                        // RecognizerDialog并把在官方网站申请的appid填入进去,非法id不能进行识别
                        RecognizerDialog isrDialog = new RecognizerDialog(VoiceRecognize.this, APPID);
    
                        /*
                         * 设置引擎目前支持五种 ”sms”:普通文本转写 “poi”:地名搜索 ”vsearch”:热词搜索
                         * ”video”:视频音乐搜索 ”asr”:命令词识别
                         */
                        isrDialog.setEngine("sms", null, null);
                        isrDialog.setListener(recoListener);
                        isrDialog.show();
                        break;
    
                    case R.id.bt_speek:
                        // 这是语言合成部分 同样需要实例化一个SynthesizerDialog ,并输入appid
                        SynthesizerDialog syn = new SynthesizerDialog(VoiceRecognize.this, APPID);
                        syn.setListener(new SynthesizerDialogListener() {
    
                            @Override
                            public void onEnd(SpeechError arg0) {
    
                            }
                        });
                        // 根据EditText里的内容实现语音合成
                        syn.setText(et.getText().toString(), null);
                        syn.show();
                        break;
    
    
                    case R.id.bt_speek_bg:
                        //这是后台朗读,实例化一个SynthesizerPlayer
                        SynthesizerPlayer player = SynthesizerPlayer.createSynthesizerPlayer(VoiceRecognize.this, APPID);
                        //设置语音朗读者,可以根据需要设置男女朗读,具体请看api文档和官方论坛
                        player.setVoiceName("vivixiaoyan");//在此设置语音播报的人选例如:vivixiaoyan、vivixiaomei、vivixiaoqi
                        player.playText(et.getText().toString(), "ent=vivi21,bft=5",null);
                        break;
                    default:
                        break;
                }
    
            }
        };
        public  void openApp(String str){  
            //应用过滤条件,intent启动是应用的顶层  
            Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
            PackageManager mPackageManager =getPackageManager();  
            //返回给定条件的所有ResolveInfo对象(本质为activity)
            List<ResolveInfo> mAllApps = mPackageManager.queryIntentActivities(mainIntent, 0);  
            //按包名排序  
            Collections.sort(mAllApps, new ResolveInfo.DisplayNameComparator(mPackageManager));  
            for(ResolveInfo res : mAllApps){  
                //该应用的包名和主Activity  
                String pkg = res.activityInfo.packageName;  
                String cls = res.activityInfo.name;  
                System.out.println("pkg~~~~~~" +pkg);  
                // 打开QQ pkg中包含"qq",打开微信,pkg中包含"mm"  
                if(pkg.contains(str)){  
                    ComponentName componet = new ComponentName(pkg, cls);
                    
                    Intent intent = new Intent();  
                    intent.setComponent(componet);  
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                    VoiceRecognize.this.startActivity(intent);  
                }  
            }
     }
    
        // 语言识别监听器,有两个方法
        RecognizerDialogListener recoListener = new RecognizerDialogListener() {
    
            @Override
            public void onResults(ArrayList<RecognizerResult> results,
                    boolean isLast) {
                // 新增加了一个ToggleButton tb,首先检查tb是否被按下,如果被按下才进行语言控制,没被按下就进行文字识别
                if (tb.isChecked()) {
                    // doVoice方法就是进行识别
                    doVoice(results);
                } else {
                    // 服务器识别完成后会返回集合,我们这里就只得到最匹配的那一项
                    text += results.get(0).text;
                    System.out.println(text);
                }
    
            }
    
            // 首先迭代结果,然后获取每个结果,并进行对比,如果包含有特定字符串,那么就执行相应Intent跳转。
            // 注意 凡是Intent能办到的(发邮件,跳到已安装应用,拨号,发短信,发彩信,浏览网页,播放多媒体。。。。),它就都能办到。
            private void doVoice(ArrayList<RecognizerResult> results) {
                Intent i = new Intent();
                for (RecognizerResult result : results) {
                    if (result.text.contains("天气")) {
                        // 天气界面的跳转
                        i.setClass(VoiceRecognize.this, Weather.class);
                        startActivity(i);
                    } else if (result.text.contains("QQ")) {
                        // 跳转到QQ
                    	openApp("com.tencent.mobileqq");//QQ的包名
                    } else if (result.text.contains("短信")) {
                        // 短信界面的跳转
                        i.setAction(Intent.ACTION_VIEW);
                        i.setType("vnd.android-dir/mms-sms");
                        startActivity(i);
                    } else {
                        // 如果没有相应指令就用Toast提示用户
                        Toast.makeText(VoiceRecognize.this, "无法识别",Toast.LENGTH_SHORT).show();
                    }
                }
    
            }
    
            @Override
            public void onEnd(SpeechError error) {
                if (error == null) {
                    // 完成后就把结果显示在EditText上
                    et.setText(text);
                }
            }
        };
    
    }
    
    

    demo里面的Wether是要跳转的acticity,当语言识别监听器接收到“天气”时会跳转到wether界面。

    package com.demo.voice;
    
    import sina.CreAmazing.voice.R;
    import android.app.Activity;
    import android.os.Bundle;
    
    public class Weather extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.weather);
    	}
    }
    
    
    • 下面是xml文件
      wether.xml:这是wether界面
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical" 
        android:background="#F5F5DC">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Weather"
            android:textSize="70dp" 
            android:textColor="#FF1493"/>
    </LinearLayout>
    

    main.xml:这是主界面

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <EditText
            android:id="@+id/et"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:editable="true" />
    
        <Button
            android:id="@+id/bt_recognize"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Recognize" />
    
        <Button
            android:id="@+id/bt_speek"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Speek" />
    
        <Button
            android:id="@+id/bt_speek_bg"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Speek-Background" />
    
        <TextView
            android:textColor="@android:color/white"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="语音控制开关" />
    
        <ToggleButton
            android:id="@+id/tb"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    AndroidManifest.xml:里面有权限获取以及activity的注册

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="sina.CreAmazing.voice"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <activity
                android:name="com.demo.voice.VoiceRecognize"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="com.demo.voice.Weather" >
            </activity>
            <activity android:name="com.demo.voice.News" >
            </activity>
        </application>
    
        <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" />
    
    </manifest>
    
    

    ##三、功能简介
    安装到手机上后,进入应用会朗读文本“hello world”;
    可以看到有四个按钮,点击第一个按钮会启动语音听写并加载到文本框里面,点击第二个按钮会朗读文本框里面输入的文本,点击第三个按钮能在后台朗读,点击最后一个按钮可以开关语音控制,语音控制开启后识别到“QQ”,“短信”会打开相应的应用,识别到“天气”会跳转到wether界面;

    展开全文
  • 1:讯飞开放平台注册登录:https://www.xfyun.cn/?ch=bdtg 2: 3:创建新应用获取APPID值 ...5:讲下载的sdk中libs文件下得jar包放入项目中libs文件下,...--连接网络权限,用于执行云端语音能力 --&amp;amp;gt; ...

    在这里插入图片描述
    1:讯飞开放平台注册登录:https://www.xfyun.cn/?ch=bdtg
    2:在这里插入图片描述

    3:创建新应用获取APPID值
    在这里插入图片描述

    4:注册好就可以直接在项目中使用appid值
    5:将下载的sdk中libs文件下得jar包放入项目中libs文件下,全选右键add添加一下
    在这里插入图片描述

    6:清单文件中AndroidManifest.xml加入权限

     <!--连接网络权限,用于执行云端语音能力 -->
        <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" />
        <!--读取联系人权限,上传联系人需要用到此权限 -->
        <uses-permission android:name="android.permission.READ_CONTACTS" />
        <!--外存储写权限,构建语法需要用到此权限 -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <!--外存储读权限,构建语法需要用到此权限 -->
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <!--配置权限,用来记录应用配置信息 -->
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    
    
        <application
            ***android:name=".app.App"***//记住加入这个
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
    
            <activity android:name=".StartActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".MainActivity" />
        </application>
    
    

    7:代码结构
    在这里插入图片描述

    8:App

    public class App extends Application {
    
    
        private static Context context = null;
    
        @Override
        public void onCreate() {
            super.onCreate();
            context = getApplicationContext();
            //讯飞语音播报平台--因权限申请,初始化放在StartActivity
    //        SpeechUtility.createUtility(this, "appid=");//=号后面写自己应用的APPID
    //        Setting.setShowLog(true); //设置日志开关(默认为true),设置成false时关闭语音云SDK日志打印
    //        TTSUtils.getInstance().init(); //初始化工具类
    
        }
    
        public static Context getContext() {
            return context;
        }
    }
    

    9:CourseUtils

    public class CourseUtils {
    
        public static boolean resultProcess(String pid) {
            String processName = getProcessName(App.getContext(), android.os.Process.myPid());
            return (!TextUtils.isEmpty(processName) && pid.equals(processName));
    
        }
    
        private static String getProcessName(Context cxt, int pid) {
            ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
            if (runningApps == null) {
                return null;
            }
            for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
                if (procInfo.pid == pid) {
                    return procInfo.processName;
                }
            }
            return null;
        }
    }
    
    

    10:TTSUtils

    public class TTSUtils implements InitListener, SynthesizerListener {
    
        private static volatile TTSUtils instance = null;
        private boolean isInitSuccess = false;
        private SpeechSynthesizer mTts;
    
        //单例模式
        public static TTSUtils getInstance() {
            if (instance == null) {
                synchronized (TTSUtils.class) {
                    if (instance == null) {
                        instance = new TTSUtils();
                    }
                }
            }
            return instance;
        }
    
        public TTSUtils() {
    
        }
    
        // 初始化合成对象
        public void init() {
            //判断进程是否已启动,初始化多次会报错
            //个人遇到问题:极光推送引入后,不加该条件回报错
            if (CourseUtils.resultProcess(清单文件中的项目包名,例如:"com.tech.haha")) {
    
                mTts = SpeechSynthesizer.createSynthesizer(App.getContext(), this);
                // 清空参数
                mTts.setParameter(SpeechConstant.PARAMS, null);
                // 设置在线云端
                mTts.setParameter(SpeechConstant.ENGINE_TYPE,
                        SpeechConstant.TYPE_CLOUD);
    
                // 设置发音人--发音人选择--具体见values-string
                mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi");
    
                // 设置发音语速
                mTts.setParameter(SpeechConstant.SPEED, "50");
                // 设置音调
                mTts.setParameter(SpeechConstant.PITCH, "50");
                // 设置合成音量
                mTts.setParameter(SpeechConstant.VOLUME, "100");
                // 设置播放器音频流类型
                mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
                // 设置播放合成音频打断音乐播放,默认为true
                mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");
                // 设置音频保存路径,需要申请WRITE_EXTERNAL_STORAGE权限,如不需保存注释该行代码
    //        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./sdcard/iflytek.pcm");
                Log.i("zhh", "--初始化成完成-");
            }
    
        }
    
        //开始合成
        public void speak(String msg) {
            if (isInitSuccess) {
                if (mTts.isSpeaking()) {
                    stop();
                }
                mTts.startSpeaking(msg, this);
            } else {
                init();
            }
        }
    
        // 取消合成
        public void stop() {
            mTts.stopSpeaking();
        }
    
        @Override
        public void onEvent(int eventType, int i1, int i2, Bundle bundle) {
            //以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
            if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                String sid = bundle.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
            }
        }
    
        @Override
        public void onInit(int code) {
            if (code == ErrorCode.SUCCESS) {
                isInitSuccess = true;
                Log.i("zhh", "tts初始话success");
            }
        }
    
        @Override
        public void onSpeakBegin() {
            // 监听:开始播放
        }
    
        @Override
        public void onBufferProgress(int percent, int beginPos, int endPos,
                                     String info) {
            // 合成进度
        }
    
        @Override
        public void onSpeakPaused() {
    
    

    11:StartActivity 初始化语音播报+权限申请

    public class StartActivity extends AppCompatActivity {
    
    
        private List<String> permissionList = null;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SystemClock.sleep(1000);//延时加载
            requestPermissions();
        }
    
        private void openActivity(Class<? extends AppCompatActivity> clazz) {
            initTTS();
            startActivity(new Intent(this, clazz));
            finish();
        }
    
        //权限申请
        private void requestPermissions() {
            // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                addListPermission();
                boolean isGranted = false;//是否全部授权
                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
                Iterator<String> iterator = permissionList.iterator();
                while (iterator.hasNext()) {
                    // 检查该权限是否已经获取
                    int granted = ContextCompat.checkSelfPermission(this, iterator.next());
                    if (granted == PackageManager.PERMISSION_GRANTED) {
                        iterator.remove();//已授权则remove
                    }
                }
                if (permissionList.size() > 0) {
                    // 如果没有授予该权限,就去提示用户请求
                    //将List转为数组
                    String[] permissions = permissionList.toArray(new String[permissionList.size()]);
                    // 开始提交请求权限
                    ActivityCompat.requestPermissions(this, permissions, 0x10);
                } else {
                    Log.i("zhh", "权限已申请");
                    openActivity(MainActivity.class);
                }
    
            } else {
                openActivity(MainActivity.class);
            }
        }
    
        //初始化语音合成
        private void initTTS() {
            //讯飞语音播报平台
            SpeechUtility.createUtility(this, "appid= ");//=号后面写自己创建应用的APPID
            Setting.setShowLog(true); //设置日志开关(默认为true),设置成false时关闭语音云SDK日志打印
            TTSUtils.getInstance().init(); //初始化工具类
        }
    
    
        /**
         * 权限申请返回结果
         *
         * @param requestCode  请求码
         * @param permissions  权限数组
         * @param grantResults 申请结果数组,里面都是int类型的数
         */
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case 0x10:
                    if(grantResults.length>0&&ifGrantResult(grantResults)){
                        Toast.makeText(this, "同意权限申请", Toast.LENGTH_SHORT).show();
                        openActivity(MainActivity.class);
                    }else{
                        Toast.makeText(this, "权限被拒绝了", Toast.LENGTH_SHORT).show();
                        finish();
                    }
                    break;
                default:
                    break;
            }
    
    
        }
    
        private boolean ifGrantResult(int[] grants) {
            boolean isGrant = true;
            for (int grant : grants) {
                if (grant == PackageManager.PERMISSION_DENIED) {
                    isGrant = false;
                    break;
                }
            }
            return isGrant;
        }
    
    
        //敏感权限添加
        private void addListPermission() {
            if (null == permissionList) {
                permissionList = new ArrayList<>();
                permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                permissionList.add(Manifest.permission.READ_PHONE_STATE);
                permissionList.add(Manifest.permission.RECORD_AUDIO);
            }
        }
    
    
    }
    

    12:MainActivity讯飞语音播放

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private static final String TAG = MainActivity.class.getSimpleName();
        private EditText et = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            et = findViewById(R.id.et);
            findViewById(R.id.btn0).setOnClickListener(this);
            findViewById(R.id.btn1).setOnClickListener(this);
        }
    
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn0:
                    TTSUtils.getInstance().speak("你今天怎么这么美");
                    break;
                case R.id.btn1:
                    String msg = et.getText().toString();
                    TTSUtils.getInstance().speak(TextUtils.isEmpty(msg) ? "输入信息为空" : msg);
                    break;
                default:
                    break;
            }
        }
    
        @Override
        protected void onResume() {
            //移动数据统计分析--不用可不用加入
            FlowerCollector.onResume(MainActivity.this);
            FlowerCollector.onPageStart(TAG);
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            //移动数据统计分析
            FlowerCollector.onPageEnd(TAG);
            FlowerCollector.onPause(MainActivity.this);
            super.onPause();
        }
    
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            TTSUtils.getInstance().release();//释放资源
        }
    
    
    }
    

    13:activity_main.xml布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn0"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="点击播报内容" />
    
        <EditText
            android:id="@+id/et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:hint="请输入要播报的内容!" />
    
        <Button
            android:id="@+id/btn1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="讯飞自定义播报" />
    </LinearLayout>
    
    
    展开全文
  • 讯飞语音开发集成地址http://www.xfyun.cn/ 解压后的doc文件夹下的msc develop 文件中有详细集成步骤 获取AppId1.先要注册开发者账户, 添加我的应用 , 下载sdk(语音听写)2.下载后将sdk解压, 把案例导入工程中运行看...

    讯飞语音开发集成地址http://www.xfyun.cn/ 解压后的doc文件夹下的msc develop 文件中有详细集成步骤

    获取AppId

    1.先要注册开发者账户, 添加我的应用 , 下载sdk(语音听写)

    2.下载后将sdk解压, 把案例导入工程中运行看看效果

    3.将libs下的两个jar包添加到libs目录下, 将同路径下的其它 .so文件(与c进行交互)复制到main路径下新建的 jniLibs(L要大写)目录下(别忘了jar包要add) , 将assert目录拷贝到main目录下 

    注意 : 这些都是自己创建的应用生成的, 在申请appid时就与自己的应用绑定了, 拷贝别人的是没有用的

    4.添加权限

            <!--连接网络权限,用于执行云端语音能力 -->  
            <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.创建类 , 以下是代码: initSpeech()方法下的APPID需要改成上面介绍中自己应用生成的appId

    import android.app.Activity ;
    import android.os.Bundle ;
    import android.util.Log ;
    import android.view.View ;
    import android.widget.Button ;
    import android.widget.EditText ;
    import android.widget.Toast ;
    
    import com.iflytek.cloud.ErrorCode ;
    import com.iflytek.cloud.InitListener ;
    import com.iflytek.cloud.RecognizerListener ;
    import com.iflytek.cloud.RecognizerResult ;
    import com.iflytek.cloud.SpeechConstant ;
    import com.iflytek.cloud.SpeechError ;
    import com.iflytek.cloud.SpeechRecognizer ;
    import com.iflytek.cloud.SpeechSynthesizer ;
    import com.iflytek.cloud.SpeechUtility ;
    import com.iflytek.cloud.SynthesizerListener ;
    import com.iflytek.cloud.ui.RecognizerDialog ;
    import com.iflytek.cloud.ui.RecognizerDialogListener ;
    
    import org.json.JSONException ;
    import org.json.JSONObject ;
    
    import java.util.HashMap ;
    import java.util.LinkedHashMap ;
    
    public class MainActivity extends Activity implements View.OnClickListener {
    
        private static final String TAG = MainActivity.class .getSimpleName();
        private EditText et_input;
        private Button btn_startspeech, btn_startspeektext ;
    
        // 用HashMap存储听写结果
        private HashMap<String, String> mIatResults = new LinkedHashMap<String , String>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super .onCreate(savedInstanceState) ;
            initView() ;
            initSpeech() ;
        }
    
        private void initView() {
            setContentView(R.layout.activity_main) ;
            et_input = (EditText) findViewById(R.id.et_input );
            btn_startspeech = (Button) findViewById(R.id.btn_startspeech );
            btn_startspeektext = (Button) findViewById(R.id.btn_startspeektext );
            btn_startspeech .setOnClickListener(this) ;
            btn_startspeektext .setOnClickListener(this) ;
        }
    
        private void initSpeech() {
            // 将“12345678”替换成您申请的 APPID,申请地址: http://www.xfyun.cn
            // 请勿在 “ =”与 appid 之间添加任务空字符或者转义符
            SpeechUtility. createUtility( this, SpeechConstant. APPID + "=56ffe0ae" ); 
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_startspeech: //语音识别(把声音转文字)
                    startSpeechDialog();
                    break;
                case R.id. btn_startspeektext:// 语音合成(把文字转声音)
                    speekText();
                    break;
            }
    
        }
    
        private void speekText() {
            //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( et_input.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 startSpeechDialog() {
            //1. 创建RecognizerDialog对象
            RecognizerDialog mDialog = new RecognizerDialog(this, new MyInitListener()) ;
            //2. 设置accent、 language等参数
            mDialog.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 设置中文
            mDialog.setParameter(SpeechConstant. ACCENT, "mandarin" );
            // 若要将UI控件用于语义理解,必须添加以下参数设置,设置之后 onResult回调返回将是语义理解
            // 结果
            // mDialog.setParameter("asr_sch", "1");
            // mDialog.setParameter("nlp_version", "2.0");
            //3.设置回调接口
            mDialog.setListener( new MyRecognizerDialogListener()) ;
            //4. 显示dialog,接收语音输入
            mDialog.show() ;
        }
    
        class MyRecognizerDialogListener implements RecognizerDialogListener {
    
            /**
             * @param results
             * @param isLast  是否说完了
             */
            @Override
            public void onResult(RecognizerResult results, boolean isLast) {
                String result = results.getResultString(); //为解析的
                showTip(result) ;
                System. out.println(" 没有解析的 :" + result);
    
                String text = JsonParser.parseIatResult(result) ;//解析过后的
                System. out.println(" 解析后的 :" + text);
    
                String sn = null;
                // 读取json结果中的 sn字段
                try {
                    JSONObject resultJson = new JSONObject(results.getResultString()) ;
                    sn = resultJson.optString("sn" );
                } catch (JSONException e) {
                    e.printStackTrace();
                }
    
                mIatResults .put(sn, text) ;//没有得到一句,添加到
    
                StringBuffer resultBuffer = new StringBuffer();
                for (String key : mIatResults.keySet()) {
                    resultBuffer.append(mIatResults .get(key));
                }
    
                et_input.setText(resultBuffer.toString());// 设置输入框的文本
                et_input .setSelection(et_input.length()) ;//把光标定位末尾
            }
    
            @Override
            public void onError(SpeechError speechError) {
    
            }
        }
    
        class MyInitListener implements InitListener {
    
            @Override
            public void onInit(int code) {
                if (code != ErrorCode.SUCCESS) {
                    showTip("初始化失败 ");
                }
    
            }
        }
    
        /**
         * 语音识别
         */
        private void startSpeech() {
            //1. 创建SpeechRecognizer对象,第二个参数: 本地识别时传 InitListener
            SpeechRecognizer mIat = SpeechRecognizer.createRecognizer( this, null); //语音识别器
            //2. 设置听写参数,详见《 MSC Reference Manual》 SpeechConstant类
            mIat.setParameter(SpeechConstant. DOMAIN, "iat" );// 短信和日常用语: iat (默认)
            mIat.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 设置中文
            mIat.setParameter(SpeechConstant. ACCENT, "mandarin" );// 设置普通话
            //3. 开始听写
            mIat.startListening( mRecoListener);
        }
    
    
        // 听写监听器
        private RecognizerListener mRecoListener = new RecognizerListener() {
            // 听写结果回调接口 (返回Json 格式结果,用户可参见附录 13.1);
    //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
    //关于解析Json的代码可参见 Demo中JsonParser 类;
    //isLast等于true 时会话结束。
            public void onResult(RecognizerResult results, boolean isLast) {
                Log.e (TAG, results.getResultString());
                System.out.println(results.getResultString()) ;
                showTip(results.getResultString()) ;
            }
    
            // 会话发生错误回调接口
            public void onError(SpeechError error) {
                showTip(error.getPlainDescription(true)) ;
                // 获取错误码描述
                Log. e(TAG, "error.getPlainDescription(true)==" + error.getPlainDescription(true ));
            }
    
            // 开始录音
            public void onBeginOfSpeech() {
                showTip(" 开始录音 ");
            }
    
            //volume 音量值0~30, data音频数据
            public void onVolumeChanged(int volume, byte[] data) {
                showTip(" 声音改变了 ");
            }
    
            // 结束录音
            public void onEndOfSpeech() {
                showTip(" 结束录音 ");
            }
    
            // 扩展用接口
            public void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {
            }
        };
    
        private void showTip (String data) {
            Toast.makeText( this, data, Toast.LENGTH_SHORT).show() ;
        }
    }

    6.json解析类:

    import org.json.JSONArray ;
    import org.json.JSONObject ;
    import org.json.JSONTokener ;
    
    /**
    * Json结果解析类
    */
    public class JsonParser {
    
         public static String parseIatResult(String json) {
              StringBuffer ret = new StringBuffer() ;
              try {
                  JSONTokener tokener = new JSONTokener(json) ;
                  JSONObject joResult = new JSONObject(tokener) ;
    
                  JSONArray words = joResult.getJSONArray("ws" );
                  for (int i = 0; i < words.length(); i++) {
                       // 转写结果词,默认使用第一个结果
                                           JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                       JSONObject obj = items.getJSONObject(0 );
                       ret.append(obj.getString("w" ));
    //                  如果需要多候选结果,解析数组其他字段
    //                 for(int j = 0; j < items.length(); j++)
    //                 {
    //                      JSONObject obj = items.getJSONObject(j);
    //                      ret.append(obj.getString("w"));
    //                 }
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return ret.toString();
         }
    
         public static String parseGrammarResult(String json) {
              StringBuffer ret = new StringBuffer() ;
              try {
                  JSONTokener tokener = new JSONTokener(json) ;
                  JSONObject joResult = new JSONObject(tokener) ;
    
                  JSONArray words = joResult.getJSONArray("ws" );
                  for (int i = 0; i < words.length(); i++) {
                       JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                       for (int j = 0; j < items.length() ; j++)
                       {
                            JSONObject obj = items.getJSONObject(j);
                            if (obj.getString("w").contains( "nomatch"))
                            {
                                 ret.append( "没有匹配结果.") ;
                                 return ret.toString();
                             }
                            ret.append( "【结果】" + obj.getString("w" ));
                             ret.append("【置信度】 " + obj.getInt("sc" ));
                             ret.append("\n ");
                       }
                  }
              } catch (Exception e) {
                  e.printStackTrace();
                  ret.append(" 没有匹配结果 .");
              }
              return ret.toString();
         }
    
         public static String parseLocalGrammarResult(String json) {
              StringBuffer ret = new StringBuffer() ;
              try {
                  JSONTokener tokener = new JSONTokener(json) ;
                  JSONObject joResult = new JSONObject(tokener) ;
    
                  JSONArray words = joResult.getJSONArray("ws" );
                  for (int i = 0; i < words.length(); i++) {
                       JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                       for (int j = 0; j < items.length() ; j++)
                       {
                            JSONObject obj = items.getJSONObject(j);
                            if (obj.getString("w").contains( "nomatch"))
                            {
                                 ret.append( "没有匹配结果.") ;
                                 return ret.toString();
                             }
                            ret.append( "【结果】" + obj.getString("w" ));
                             ret.append("\n ");
                       }
                  }
                  ret.append("【置信度】 " + joResult.optInt("sc" ));
    
              } catch (Exception e) {
                  e.printStackTrace();
                  ret.append(" 没有匹配结果 .");
              }
              return ret.toString();
         }
    }

    7.布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        tools:context="com.lingtian.yuyinbobao.MainActivity">
        <EditText
            android:id="@+id/et_input"
            android:layout_margin="10dp"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:hint="请输入文本信息 ..." />
    
        <Button
            android:id="@+id/btn_startspeech"
            android:text="点击按钮语音输入 "
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <Button
            android:id="@+id/btn_startspeektext"
            android:text="语音合成(把文字转声音) "
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
    
    </LinearLayout>

    展开全文
  • 一、语音识别   1.下载SDK(地址:http://www.xfyun.cn/sdk/dispatcher),选择语音听写SDK(如下图) ,下载前会让你先创建应用,创建应用后会得到一个appid。然后点“立即开通”去开通“语音识别”功能,之后就...

    一、语音识别

     

    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" />  
        <!--获取当前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" />  

     


    其次是java代码(逻辑上是点击了某个Button之后,才执行下面的代码)。

       private RecognizerDialog iatDialog;  
      
    // ①语音配置对象初始化  
                    SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=578f1af7");//将这里的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();  
                                }  
                                etText.setText(result);  
                                //获取焦点  
                                etText.requestFocus();  
                                //将光标定位到文字最后,以便修改  
                                etText.setSelection(result.length());  
                            }  
                        }  
      
                        @Override  
                        public void onError(SpeechError speechError) {  
                            //自动生成的方法存根  
                            speechError.getPlainDescription(true);  
                        }  
                    });  
                    //开始听写,需将sdk中的assets文件下的文件夹拷入项目的assets文件夹下(没有的话自己新建)  
                    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类(一个用来接收转换 语音听写结果的类),需要自己新建,定义如下

    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;  
        }  
    }  
    


    如此,便可实现语音听写了。这个过程可能会遇到各种各样的问题,具体错误码参见 http://www.xfyun.cn/doccenter/faq

     

     

    5.说完了有动画效果的,下面就来说说没有动画效果的(也比较简单)。

     SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(context, null);  
        //2.设置听写参数,详见SDK中《MSC Reference Manual》文件夹下的SpeechConstant类  
        mIat.setParameter(SpeechConstant.DOMAIN,"iat");  
        mIat.setParameter(SpeechConstant.LANGUAGE,"zh_cn");  
        mIat.setParameter(SpeechConstant.ACCENT,"mandarin ");  
      
          //保存音频文件到本地(有需要的话)   仅支持pcm和wav,且需要自行添加读写SD卡权限  
        mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/mIat.wav");  
        // 3.开始听写  
        mIat.startListening(mRecoListener);  
        //听写监听器  
        private RecognizerListener mRecoListener = new RecognizerListener() {  
            //听写结果回调接口(返回Json格式结果,用户可参见附录13.1);  
            // 一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;  
            // 关于解析Json的代码可参见Demo中JsonParser类;  
            // isLast等于true时会话结束。  
            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() {  
            }  
      
            //    volume音量值0~30,data音频数据  
            public void onVolumeChanged(int volume, byte[] data) {  
            }  
      
            //结束录音  
            public void onEndOfSpeech() {  
            }  
      
            //扩展用接口  
            public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {  
            }  
        };  

     

     

     

    可以看到上面的onResult回调方法跟有动画效果时的onResult回调方法是一样的,所以主要的处理还是在这个方法中,将有动画的那个onResult回调中的代码拷过来就行了。如此,简单的语音听写功能就实现了。(

    //在最后必须重新设置一下,不是json格式就会报错
    resultJson="[";

     

     

     

     

    展开全文
  • Android之讯飞语音-文字转语音 一、描述 在平时开发中,也许有的模块需要用到语音功能,特别是需要动态播放语音的,这时就需要把文字转换成语音进行播放了,当然如果只是固定的几个静态语音需要...
  • 讯飞语音官网给的demo是在导入android studio中经常出错,我也是反反复复搞了一个多星期终于把最简单的跑出来了....不得不说官方文档给的太太太.....如果直接是项目中需要引用讯飞语音可以直接看这个资源项目结构  ...
  • 前段时间写了一个关于百度语音唤醒文章,最近有做了一个讯飞语音的应用,在这里把学习的资料整理一下。 唤醒的整个过程如下: (图源自讯飞官网) 讯飞的语音唤醒功能实现起来挺方便的(相比百度,百度语音...
  • 讯飞语音官方自带demo导入android studio中经常报各种各样的错,上传的资源中往往很多都不能跑.....将资源中的id值改成自己的,把自己下载下来的libs里面的资源替换成自己就可以,或者参考我的项目结构,聪明如你...
  • Android自带的语音播报+讯飞语音播报封装(直接用)。 涉及功能: 1.多个权限申请 2.自带语音实现 3.讯飞语音播报封装 具体请看博客:http://blog.csdn.net/zhh_csdn_ard
  • Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成。但是android系统默认的TTS引擎:Pic TTS不支持中文。所以我们得安装自己的TTS引擎和语音包。...最后采用了讯飞语音TTS1.0,发音连贯自然,
  • 首选引擎选择“讯飞语音合成”,这里还能设置男生或女生发音">android下实现对文本的语音朗读,TTS技术,支持中文朗读。Android SDK 4.04下测试通过。 附件包含测试源代码及语音库文件 这是语音合成测试工程,如果...
  • 这次给大家带来的是项目的离线语音功能。 讯飞开放平台中的离线语音 首先创建开放平台的账号,这个不必多说 然后创建新应用 选择我的应用,如下图,注意下我打马赛克的地方...
  • Android 讯飞语音开发

    2016-11-01 14:29:33
    前段时间火了一个很牛的讯飞语音,去看官方文档,瞬间蒙逼,官方是用的eclipse,我用的Android Studio。好了,能上代码尽量不BB。 先来看看gradle里面要配置的东西。module里面:apply plugin: '...
  • 摘要: Android自带的语音播报+讯飞语音播报封装(直接用)。 涉及功能: 1.多个权限申请 2.自带语音实现 3.讯飞语音播报封装...
  • 讯飞语音识别最简demo

    2020-06-07 20:22:59
    安卓讯飞语音识别最简demo实现,只有语音识别功能,可以作为参考
  • Android 讯飞语音合成

    2016-07-18 15:17:51
    首先,需要先去科大讯飞官网申请帐号,以及创建应用,创建应用后可以进入我的应用查看APPID,并开通“讯飞语音合成”服务。然后下载对应的SDK,并进行以下步骤 http://www.xfyun.cn/Step1:导包EclipseAndroid ...
  • AndroidStudio快速开发讯飞语音听写 好久没更新了,差点就忘记这个东东了,不过好在一闲下来就赶紧更新一波 哈哈^_^到科大讯飞官网注册账号并登陆,选择单个服务SDK下载 ,选择语音听写服务、Android平台并新建一个...
  • 讯飞语音 使用步骤(针对androidStudio):语音转文字
  • 前言:最近做项目用到了讯飞语音,遂搞了一个简单的教程,供大家使用。  讯飞语音 使用步骤:语音转文字:   1,首先去讯飞开放平台( http://www.xfyun.cn/)注册,账号:   2,注册后登录: 3,点击选择...
1 2 3 4 5 ... 20
收藏数 1,890
精华内容 756
关键字:

讯飞语音android