讯飞文字转语音

官方文档:https://doc.xfyun.cn/msc_android/index.html

Demo:

1.创建应用,获取AppId

2.下载SDK,集成

3.11

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 class MainActivity extends Activity implements View.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.  
    protected void onCreate(Bundle savedInstanceState) {
  39.  
    super .onCreate(savedInstanceState) ;
  40.  
    initView() ;
  41.  
    initSpeech() ;
  42.  
    }
  43.  
     
  44.  
    private void initView() {
  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.  
    btn_startspeech .setOnClickListener(this) ;
  50.  
    btn_startspeektext .setOnClickListener(this) ;
  51.  
    }
  52.  
     
  53.  
    private void initSpeech() {
  54.  
    // 将“12345678”替换成您申请的 APPID,申请地址: http://www.xfyun.cn
  55.  
    // 请勿在 “ =”与 appid 之间添加任务空字符或者转义符
  56.  
    SpeechUtility. createUtility( this, SpeechConstant. APPID + "=56ffe0ae" );
  57.  
    }
  58.  
     
  59.  
    @Override
  60.  
    public void onClick(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.  
    private void speekText() {
  73.  
    //1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListener
  74.  
    SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);
  75.  
    //2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类
  76.  
    //设置发音人(更多在线发音人,用户可参见 附录 13.2
  77.  
    mTts.setParameter(SpeechConstant. VOICE_NAME, "vixyun" ); // 设置发音人
  78.  
    mTts.setParameter(SpeechConstant. SPEED, "50" );// 设置语速
  79.  
    mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100
  80.  
    mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端
  81.  
    //设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”
  82.  
    //保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限
  83.  
    //仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码
  84.  
    mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );
  85.  
    //3.开始合成
  86.  
    mTts.startSpeaking( et_input.getText().toString(), new MySynthesizerListener()) ;
  87.  
     
  88.  
    }
  89.  
     
  90.  
    class MySynthesizerListener implements SynthesizerListener {
  91.  
     
  92.  
    @Override
  93.  
    public void onSpeakBegin() {
  94.  
    showTip(" 开始播放 ");
  95.  
    }
  96.  
     
  97.  
    @Override
  98.  
    public void onSpeakPaused() {
  99.  
    showTip(" 暂停播放 ");
  100.  
    }
  101.  
     
  102.  
    @Override
  103.  
    public void onSpeakResumed() {
  104.  
    showTip(" 继续播放 ");
  105.  
    }
  106.  
     
  107.  
    @Override
  108.  
    public void onBufferProgress(int percent, int beginPos, int endPos ,
  109.  
    String info) {
  110.  
    // 合成进度
  111.  
    }
  112.  
     
  113.  
    @Override
  114.  
    public void onSpeakProgress(int percent, int beginPos, int endPos) {
  115.  
    // 播放进度
  116.  
    }
  117.  
     
  118.  
    @Override
  119.  
    public void onCompleted(SpeechError error) {
  120.  
    if (error == null) {
  121.  
    showTip("播放完成 ");
  122.  
    else if (error != null ) {
  123.  
    showTip(error.getPlainDescription( true));
  124.  
    }
  125.  
    }
  126.  
     
  127.  
    @Override
  128.  
    public void onEvent(int eventType, int arg1 , int 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.  
    private void startSpeechDialog() {
  139.  
    //1. 创建RecognizerDialog对象
  140.  
    RecognizerDialog mDialog = new RecognizerDialog(this, new MyInitListener()) ;
  141.  
    //2. 设置accent、 language等参数
  142.  
    mDialog.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 设置中文
  143.  
    mDialog.setParameter(SpeechConstant. ACCENT, "mandarin" );
  144.  
    // 若要将UI控件用于语义理解,必须添加以下参数设置,设置之后 onResult回调返回将是语义理解
  145.  
    // 结果
  146.  
    // mDialog.setParameter("asr_sch", "1");
  147.  
    // mDialog.setParameter("nlp_version", "2.0");
  148.  
    //3.设置回调接口
  149.  
    mDialog.setListener( 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.  
    public void onResult(RecognizerResult results, boolean isLast) {
  162.  
    String result = results.getResultString(); //为解析的
  163.  
    showTip(result) ;
  164.  
    System. out.println(" 没有解析的 :" + result);
  165.  
     
  166.  
    String text = JsonParser.parseIatResult(result) ;//解析过后的
  167.  
    System. out.println(" 解析后的 :" + text);
  168.  
     
  169.  
    String sn = null;
  170.  
    // 读取json结果中的 sn字段
  171.  
    try {
  172.  
    JSONObject resultJson = new JSONObject(results.getResultString()) ;
  173.  
    sn = resultJson.optString("sn" );
  174.  
    catch (JSONException e) {
  175.  
    e.printStackTrace();
  176.  
    }
  177.  
     
  178.  
    mIatResults .put(sn, text) ;//没有得到一句,添加到
  179.  
     
  180.  
    StringBuffer resultBuffer = new StringBuffer();
  181.  
    for (String key : mIatResults.keySet()) {
  182.  
    resultBuffer.append(mIatResults .get(key));
  183.  
    }
  184.  
     
  185.  
    et_input.setText(resultBuffer.toString());// 设置输入框的文本
  186.  
    et_input .setSelection(et_input.length()) ;//把光标定位末尾
  187.  
    }
  188.  
     
  189.  
    @Override
  190.  
    public void onError(SpeechError speechError) {
  191.  
     
  192.  
    }
  193.  
    }
  194.  
     
  195.  
    class MyInitListener implements InitListener {
  196.  
     
  197.  
    @Override
  198.  
    public void onInit(int code) {
  199.  
    if (code != ErrorCode.SUCCESS) {
  200.  
    showTip("初始化失败 ");
  201.  
    }
  202.  
     
  203.  
    }
  204.  
    }
  205.  
     
  206.  
    /**
  207.  
    * 语音识别
  208.  
    */
  209.  
    private void startSpeech() {
  210.  
    //1. 创建SpeechRecognizer对象,第二个参数: 本地识别时传 InitListener
  211.  
    SpeechRecognizer mIat = SpeechRecognizer.createRecognizer( this, null); //语音识别器
  212.  
    //2. 设置听写参数,详见《 MSC Reference Manual》 SpeechConstant类
  213.  
    mIat.setParameter(SpeechConstant. DOMAIN, "iat" );// 短信和日常用语: iat (默认)
  214.  
    mIat.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 设置中文
  215.  
    mIat.setParameter(SpeechConstant. ACCENT, "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.  
    public void onResult(RecognizerResult results, boolean isLast) {
  228.  
    Log.e (TAG, results.getResultString());
  229.  
    System.out.println(results.getResultString()) ;
  230.  
    showTip(results.getResultString()) ;
  231.  
    }
  232.  
     
  233.  
    // 会话发生错误回调接口
  234.  
    public void onError(SpeechError error) {
  235.  
    showTip(error.getPlainDescription(true)) ;
  236.  
    // 获取错误码描述
  237.  
    Log. e(TAG, "error.getPlainDescription(true)==" + error.getPlainDescription(true ));
  238.  
    }
  239.  
     
  240.  
    // 开始录音
  241.  
    public void onBeginOfSpeech() {
  242.  
    showTip(" 开始录音 ");
  243.  
    }
  244.  
     
  245.  
    //volume 音量值0~30, data音频数据
  246.  
    public void onVolumeChanged(int volume, byte[] data) {
  247.  
    showTip(" 声音改变了 ");
  248.  
    }
  249.  
     
  250.  
    // 结束录音
  251.  
    public void onEndOfSpeech() {
  252.  
    showTip(" 结束录音 ");
  253.  
    }
  254.  
     
  255.  
    // 扩展用接口
  256.  
    public void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {
  257.  
    }
  258.  
    };
  259.  
     
  260.  
    private void showTip (String data) {
  261.  
    Toast.makeText( 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.  
        StringBuffer ret = new StringBuffer() ;
      12.  
        try {
      13.  
        JSONTokener tokener = new JSONTokener(json) ;
      14.  
        JSONObject joResult = new JSONObject(tokener) ;
      15.  
         
      16.  
        JSONArray words = joResult.getJSONArray("ws" );
      17.  
        for (int i = 0; i < words.length(); i++) {
      18.  
        // 转写结果词,默认使用第一个结果
      19.  
        JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
      20.  
        JSONObject obj = items.getJSONObject(0 );
      21.  
        ret.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.  
        e.printStackTrace();
      31.  
        }
      32.  
        return ret.toString();
      33.  
        }
      34.  
         
      35.  
        public static String parseGrammarResult(String json) {
      36.  
        StringBuffer ret = new StringBuffer() ;
      37.  
        try {
      38.  
        JSONTokener tokener = new JSONTokener(json) ;
      39.  
        JSONObject joResult = new JSONObject(tokener) ;
      40.  
         
      41.  
        JSONArray words = joResult.getJSONArray("ws" );
      42.  
        for (int i = 0; i < words.length(); i++) {
      43.  
        JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
      44.  
        for (int j = 0; j < items.length() ; j++)
      45.  
        {
      46.  
        JSONObject obj = items.getJSONObject(j);
      47.  
        if (obj.getString("w").contains( "nomatch"))
      48.  
        {
      49.  
        ret.append( "没有匹配结果.") ;
      50.  
        return ret.toString();
      51.  
        }
      52.  
        ret.append( "【结果】" + obj.getString("w" ));
      53.  
        ret.append("【置信度】 " + obj.getInt("sc" ));
      54.  
        ret.append("\n ");
      55.  
        }
      56.  
        }
      57.  
        } catch (Exception e) {
      58.  
        e.printStackTrace();
      59.  
        ret.append(" 没有匹配结果 .");
      60.  
        }
      61.  
        return ret.toString();
      62.  
        }
      63.  
         
      64.  
        public static String parseLocalGrammarResult(String json) {
      65.  
        StringBuffer ret = new StringBuffer() ;
      66.  
        try {
      67.  
        JSONTokener tokener = new JSONTokener(json) ;
      68.  
        JSONObject joResult = new JSONObject(tokener) ;
      69.  
         
      70.  
        JSONArray words = joResult.getJSONArray("ws" );
      71.  
        for (int i = 0; i < words.length(); i++) {
      72.  
        JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
      73.  
        for (int j = 0; j < items.length() ; j++)
      74.  
        {
      75.  
        JSONObject obj = items.getJSONObject(j);
      76.  
        if (obj.getString("w").contains( "nomatch"))
      77.  
        {
      78.  
        ret.append( "没有匹配结果.") ;
      79.  
        return ret.toString();
      80.  
        }
      81.  
        ret.append( "【结果】" + obj.getString("w" ));
      82.  
        ret.append("\n ");
      83.  
        }
      84.  
        }
      85.  
        ret.append("【置信度】 " + joResult.optInt("sc" ));
      86.  
         
      87.  
        } catch (Exception e) {
      88.  
        e.printStackTrace();
      89.  
        ret.append(" 没有匹配结果 .");
      90.  
        }
      91.  
        return ret.toString();
      92.  
        }
      93.  
posted @ 2018-08-08 10:32  冷月舞痕  阅读(976)  评论(0编辑  收藏  举报