Android科大语音输入和语音合成

news/2024/7/4 13:28:37

第一步:导入libs包和jnilbs包 和

第二步:初始化(=一定不能删除)

SpeechUtility.createUtility(this, SpeechConstant.APPID + "=id");

第三步:布局

<?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: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:orientation="vertical"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.atguigu.speechdemo2.MainActivity">

    <EditText
        android:id="@+id/et_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容" />

    <Button
        android:id="@+id/btn_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="语音输入" />

    <Button
        android:id="@+id/btn_speechtext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取文字" />
</LinearLayout>


第四步: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();
   }
}
第五步:代码

public class MainActivity extends Activity implements View.OnClickListener {

    private EditText et_input;
    private Button btn_start;
    private Button btn_speechtext;

    // 用HashMap存储听写结果
    private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 将“12345678”替换成您申请的 APPID,申请地址: http://www.xfyun.cn
// 请勿在“ =” 与 appid 之间添加任务空字符或者转义符
        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=5795c210");
        setContentView(R.layout.activity_main);
        et_input = (EditText) findViewById(R.id.et_input);
        btn_start = (Button) findViewById(R.id.btn_start);
        btn_speechtext = (Button) findViewById(R.id.btn_speechtext);
        //设置点击事件
        btn_start.setOnClickListener(this);
        btn_speechtext.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start://语音输入
                showDialog();
                break;
            case R.id.btn_speechtext://语音合成
                speechText();
                break;
        }
    }

    private void speechText() {
        //1.创建 SpeechSynthesizer 对象, 第二个参数: 本地合成时传 InitListener
        SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null);
//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类
//设置发音人(更多在线发音人,用户可参见 附录13.2
        mTts.setParameter(SpeechConstant.VOICE_NAME, "vixr"); //设置发音人
        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(), mSynListener);

    }


    //合成监听器
    private SynthesizerListener mSynListener = new SynthesizerListener(){
        //会话结束回调接口,没有错误时, error为null
        public void onCompleted(SpeechError error) {}
//缓冲进度回调
//percent为缓冲进度0~100, beginPos为缓冲音频在文本中开始位置, endPos表示缓冲音频在
        //文本中结束位置, info为附加信息。
        public void onBufferProgress(int percent, int beginPos, int endPos, String info) {}
        //开始播放
        public void onSpeakBegin() {}
        //暂停播放
        public void onSpeakPaused() {}
//播放进度回调
//percent为播放进度0~100,beginPos为播放音频在文本中开始位置, endPos表示播放音频在文
        //本中结束位置.
        public void onSpeakProgress(int percent, int beginPos, int endPos) {}
        //恢复播放回调接口
        public void onSpeakResumed() {}
        //会话事件回调接口
        public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {}
    };


    private void showDialog() {
        //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 recognizerResult
         * @param b                是否说话结束
         */
        @Override
        public void onResult(RecognizerResult recognizerResult, boolean b) {
            String result = recognizerResult.getResultString();
            Log.e("MainActivity", "result ==" + result);
            String text = JsonParser.parseIatResult(result);
            //解析好的
            Log.e("MainActivity", "text ==" + text);

            String sn = null;
            // 读取json结果中的sn字段
            try {
                JSONObject resultJson = new JSONObject(recognizerResult.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());

        }

        /**
         * 出错了
         *
         * @param speechError
         */
        @Override
        public void onError(SpeechError speechError) {
            Log.e("MainActivity", "onError ==" + speechError.getMessage());

        }
    }


    class MyInitListener implements InitListener {

        @Override
        public void onInit(int i) {
            if (i != ErrorCode.SUCCESS) {
                Toast.makeText(MainActivity.this, "初始化失败", Toast.LENGTH_SHORT).show();
            }
        }
    }
}




http://www.niftyadmin.cn/n/3649194.html

相关文章

IDEA数据加密算法介绍

IDEA数据加密算法及实现作者&#xff1a;成晓旭IDEA对称数据加密算法&#xff0c;是我2000年刚毕业&#xff0c;工作需要进行数据加密时&#xff0c;学习、实现的第一个标准数据加密算法&#xff0c;并且此后就深深地迷上了数据加密这个方面&#xff0c;以后连续两年潜心学习和…

Python+Django+Ubuntu+Apache+Nginx架设服务器成功记

是看一个国外网站一步一步照着来的&#xff0c;复制过来 http://www.ventanazul.com/webzine/tutorials/django-deployment-guide-ubuntu Theres a time when every Django developer has to think about deployment scenarios, when I first did it last year I thought that…

Android实战技术:启动另一个App/apk中的Activity

Android提供了在一个App中启动另一个App中的Activity的能力&#xff0c;这使我们的程序很容易就可以调用其他程序的功能&#xff0c;从而就丰富了我们App的功能。比如在微信中发送一个位置信息&#xff0c;对方可以点击这个位置信息启动腾讯地图并导航。这个场景在现实中作用很…

Android studio的安装和配置

1.下载&#xff1a;到 https://developer.android.com/sdk/index.html 去下载Android Stuido 2.安装步骤1、2、 红色箭头依次说明: Android Studio: 强制选项&#xff0c;为IDE工具部分_ Android SDK: 可选选项&#xff0c;为SDK工具包部分_ Android Virtual De…

nestjs_NestJS入门

nestjs介绍 (Introduction) If you’ve worked on a Node.js application, you may have noticed that it became more difficult to maintain over time. The more you add new features to the application, the larger the codebase becomes. 如果您使用的是Node.js应用程序…

Django 上传文件出现 OSError Permission denied的解决办法

我的服务器在Ubuntu上&#xff0c;使用了ApacheNginx做App Server&#xff0c;DjangoPython开发&#xff0c;今天上传文件时候出现了OSError的错误&#xff0c;具体原因为Permission denied 一看发现是因为上传文件的文件夹可能没有被赋予www-data用户&#xff08;Apache和Ngi…

[收藏]你就不是我们所需要的那种层次的领导

引用自&#xff1a;21世纪领导者的挑战&#xff0d;多样性(http://www.mindmeters.com/blogind.asp?id4)看了《Ready to Leader》&#xff0c;一个领导力故事。山姆&#xff08;故事中的公司董事长&#xff0c;领导力典范&#xff09;说&#xff0c;“如果你想改变这个世界&am…

使用Android系统自带的下拉刷新控件

首先布局: <?xml version"1.0" encoding"utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"andro…