一、引言

在《Android 4 高级编程(第3版)》第11章中,讲到了语音输出及语音识别。
对语音识别,公司项目中有用到,但是我们用的第三方的(讯飞),由于这块功能不是由我来做,所以也就没有花时间去看第三方是怎么接入的,只是粗略的扫了一下项目中这块的代码,没有难度。跟其它第三方API一样。

二、正文

1、TTS(TextToSpeech)

TextToSpeech:在android speech包下,从字面意思就不难猜到,它是把文字转换成语音读出来。
那它是什么原理呢?
其实TTS是一个语音库,在这个库里收录了指定语言的所有单词,以字为基本单元,采用波形语音生成的方法来实现。在google最开始时,只能支持很少数种语言,当然也不支持中文,因为咱华夏文明源远流长,博大精深,不是你一下子就能建一个语音库的。
因此不难猜想到,在把文本转换成语音之前,得设置:
A,用哪种语言;
B,有没有下载安装相应的语音库;
实现比较简单,下面看下具体代码:
第一步:初始化TextToSpeech

 private void initParams() {
 //这里得由Activity实现OnInitListener监听
        mTextToSpeech = new TextToSpeech(this,this);
    }

....

 @Override
    public void onInit(int status) {

        if(status == TextToSpeech.SUCCESS){
           // int result = mTextToSpeech.setLanguage(Locale.US);//美式英语发音
            int result = mTextToSpeech.setLanguage(Locale.CHINESE);//中文
            if(result == TextToSpeech.LANG_MISSING_DATA ||
                    result == TextToSpeech.LANG_NOT_SUPPORTED){
                Toast.makeText(this,"数据丢失或不支持",Toast.LENGTH_SHORT).show();
            }
        }
    }

第二步:开始把文本转语音输出

 /**
     * 开始把文字用语音读出
     * @param view
     */
    public void startTTS(View view){

        String things = mTTSEdittext.getText().toString();
        if(mTextToSpeech != null && !mTextToSpeech.isSpeaking()){
            mTextToSpeech.setPitch(0.5f);//值越大,声音越尖,必须大于0.0f
            if(TextUtils.isEmpty(things)){
                things = "Please input somethings";
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mTextToSpeech.speak(things,TextToSpeech.QUEUE_FLUSH,null,null);
            }else{
                mTextToSpeech.speak(things,TextToSpeech.QUEUE_FLUSH,null);
            }
        }

    }

第三步:记得释放资源

 @Override
    protected void onStop() {
        super.onStop();
        mTextToSpeech.stop();
        mTextToSpeech.shutdown();
    }

下面贴出layout布局文件:

<?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">

    <EditText
        android:id="@+id/tts_edittext"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimens50"
        android:hint="请随便输入"
        android:layout_margin="@dimen/dimens10"/>

    <Button
        android:id="@+id/tts_btn"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimens50"
        android:text="把输入的文字用语音读出来"
        android:layout_margin="@dimen/dimens10"
        android:onClick="startTTS"/>

</LinearLayout>

备注: 如果你发现有些手机可以发音,而有些手机不能发音时,记得在设置里面开启文本转语音输出选项。

2、RecognizerIntent语音识别

语音识别的原理,感兴趣的童鞋,可以看下知乎上的这篇文章:语音识别的技术原理是什么?
呵呵,我是看不懂,感觉里面高大上,但从TTS把文字转换成语音输出的原理来看,这里其实就是”反向侦察”。先把声音分解成一帧帧的,然后再根据12维(人耳特征)来对第一音素进行辨别,最后根据概率学与文本库里面的词进行匹配,这样就把说出的话识别成相应的字了。
下面我们就只管在Android里面怎么去运用。
它是通过隐式启动的方式来打开语音识别的界面,然后再把结果返回到源界面。
直接上菜:

 /**
     * 开始语音识别
     *
     * @param view
     */
    public void startRecognize(View view) {
        try{
            Intent recognizeActivity =
            //当用RecognizerIntent.ACTIOIN_RECOGNIZE_SPEECH的Action时,会报ActivityNotFoundException,所以需要捕捉异常,
                    //new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                    //用ACTION_WEB_SEARCH,当手机安装了语音助手后就可以打开了
                    new Intent(RecognizerIntent.ACTION_WEB_SEARCH);//通过网络检索识别的语音
            //传参
            //1:语音识别模式(语言模式、自由模式)
            recognizeActivity.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            //2:提示语音开始
            recognizeActivity.putExtra(RecognizerIntent.EXTRA_PROMPT, "Common,让我们躁起来!");
            //3:开始语音识别
            startActivityForResult(recognizeActivity, 0x01);
        }catch (ActivityNotFoundException e){
            Toast.makeText(getApplicationContext(), "找不到语音设备", Toast.LENGTH_SHORT).show();
        }
    }

.....

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == 0x01) {
                ArrayList<String > voicesList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                StringBuilder stringBuilder = new StringBuilder();
                if(voicesList != null && voicesList.size() > 0){

                    for(int i=0;i<voicesList.size();i++){
                        stringBuilder.append(voicesList.get(i));
                    }
                }else{
                    stringBuilder.append("请说话");
                }

                Toast.makeText(TTSActivity.this,stringBuilder.toString(),Toast.LENGTH_SHORT).show();
            }
        }
    }

3、扩展

目前市面上流行的第三方语音识别前几个为:科大讯飞百度语音
利用第三方库没什么技术含量,参考人家的Demo做就是。
以上。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐