利用科大讯飞实现的文本转语音,语音转文本

时间:2024-02-21 11:01:14

工程目录如下:

源码下载本地语句的方法,下载了才能使用本地听写

/**
 * 选择本地听写 判断是否安装语记,未安装则跳转到提示安装页面  源码:
 */
if (!SpeechUtility.getUtility().checkServiceInstalled()) {
       mInstaller.install();// 语记安装助手类
} else {
      String result = FucUtil.checkLocalResource();
      if (!TextUtils.isEmpty(result)) {
           showTip(result);
      }
}

1.语音转文字,注意这里需要联网,如果是本地听写需要下载... MainActivity.java: 

import java.util.List;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
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.SpeechUtility;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;

public class MainActivity extends Activity {

    private RecognizerDialog iatDialog; //带UI界面显示的对话框
    private SpeechRecognizer mIat;//不带UI界面的语音识别器
    private ImageView image;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化
        SpeechUtility.createUtility(this, SpeechConstant.APPID +"=57e79517");
        image = (ImageView) findViewById(R.id.image);
    }

    public void btnClick(View view){
        switch (view.getId()) {
        case R.id.button1://使用讯飞自带的语音倾听的UI界面
            beUiVoice();
            break;
        case R.id.button2://使用自己的倾听语音的UI界面(这里我使用的帧动画)
            noUIVoice();
            break;
        }
    }
    
    /**
     * 使用讯飞自带的UI倾听界面
     */
    private void beUiVoice(){
        //初始化有交互动画的语音识别器  
        iatDialog = new RecognizerDialog(MainActivity.this, new InitListener() {
            @Override
            public void onInit(int arg0) {
                Toast.makeText(MainActivity.this, "初始化失败,错误码:" + arg0, 0).show();  
            }
        });  
        //设置监听,实现听写结果的回调  
        iatDialog.setListener(new RecognizerDialogListener() {  
            String resultJson = "[";//放置在外边做类的变量则报错,会造成json格式不对(?) 
            @Override  
            public void onResult(RecognizerResult recognizerResult, boolean isLast) {  
                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();  
                    }  
                    System.out.println("结果:"+result);
                    Toast.makeText(MainActivity.this, result, 1).show();
                }  
                System.out.println("调用onResult方法:"+recognizerResult.getResultString());
            }  

            @Override  
            public void onError(SpeechError speechError) {  
                //自动生成的方法存根  
                speechError.getPlainDescription(true);  
            }  
        });  
        //开始听写,需将sdk中的assets文件下的文件夹拷入项目的assets文件夹下(没有的话自己新建)  
        iatDialog.show();   
    }
    
    /**
     * 使用自己的UI界面
     */
    private void noUIVoice(){
        //1.创建语音识别器对象,第二个参数:本地听写时传InitListener    
        mIat= SpeechRecognizer.createRecognizer(MainActivity.this, null);    
        //2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类    
        mIat.setParameter(SpeechConstant.DOMAIN, "iat");//短信和日常用语的引擎
        mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//汉语 
        mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");//设置为普通话
        // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
        mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
                
        // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
        mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
                
        // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
        mIat.setParameter(SpeechConstant.ASR_PTT, "1");
        
        //设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限(有需要)
        //注:AUDIO_FORMAT参数语记需要更新版本才能生效
        //mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
        //mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");
        
        //3.开始监听听写   mIat.startListening(mRecoListener);    
        mIat.startListening(mRecoListener);
    }
    
    private RecognizerListener mRecoListener = new RecognizerListener() {
        String resultJson = "[";
        private AnimationDrawable ad;//自定义的倾听UI界面动画对象
        // 听写结果回调接口(返回Json格式结果,用户可参见附录12.1);
        // 一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
        // 关于解析Json的代码可参见MscDemo中JsonParser类;
        // isLast等于true时会话结束。
        public void onResult(RecognizerResult results, boolean isLast) {
            if (!isLast) {  
                resultJson += results.getResultString() + ",";  
            } else {  
                resultJson += results.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();  
                }  
                System.out.println("结果:"+result);
                Toast.makeText(MainActivity.this, result, 1).show();//输出结果
                //将光标定位到文字最后,以便修改  
                //etText.setSelection(result.length());
            }  
            System.out.println("调用onResult方法:"+results.getResultString());
        }

        // 会话发生错误回调接口
        public void onError(SpeechError error) {
            error.getPlainDescription(true); // 获取错误码描述
            ad.stop();
            image.setVisibility(View.GONE);//隐藏图片
        }

        // 开始录音
        public void onBeginOfSpeech() {
            // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
            image.setBackgroundResource(R.drawable.anim_iconset);//加载图片xml文件
            ad=(AnimationDrawable) image.getBackground();//将图片转化成动画
            image.setVisibility(View.VISIBLE);//显示图片
            ad.start();//开启动画
        }

        // 结束录音
        public void onEndOfSpeech() {
            // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
            ad.stop();
            image.setVisibility(View.GONE);//隐藏图片
        }

        // 扩展用接口
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
        }

        // 音量值0~30
        @Override
        public void onVolumeChanged(int arg0, byte[] arg1) {
            //("当前正在说话,音量大小:" + arg0);
        }
    };
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 退出时释放连接
        mIat.cancel();
        mIat.destroy();
    }

}

用来接收转换 语音听写结果的类

/** 
 * 解析 语音听写返回结果Json格式字符串 的模板类(多重嵌套Json) 
 * 
 * 语音识别结果Json数据格式(单条数据): 
 * {"sn":1,"ls":true,"bg":0,"ed":0,"ws":[ 
 * {"bg":0,"cw":[{"w":"今天","sc":0}]}, 
 * {"bg":0,"cw":[{"w":"的","sc":0}]}, 
 * {"bg":0,"cw":[{"w":"天气","sc":0}]}, 
 * {"bg":0,"cw":[{"w":"怎么样","sc":0}]}, 
 * {"bg":0,"cw":[{"w":"。","sc":0}]} 
 * ]} 
 * 
 * sn  number :第几句 
 * ls   boolean: 是否最后一句 
 * bg  number :开始 
 * ed  number :结束 
 * ws  array :词 
 * cw   array :中文分词 
 * w  string :单字 
 * sc  number :分数 
 */  
public class DictationResult {  
    private String sn;  
    private String ls;  
    private String bg;  
    private String ed;  
  
    private List<Words> ws;  
  
    public static class Words {  
        private String bg;  
        private List<Cw> cw;  
  
        public static class Cw {  
            private String w;  
            private String sc;  
  
            public String getW() {  
                return w;  
            }  
  
            public void setW(String w) {  
                this.w = w;  
            }  
  
            public String getSc() {  
                return sc;  
            }  
  
            public void setSc(String sc) {  
                this.sc = sc;  
            }  
  
            @Override  
            public String toString() {  
                return w;  
            }  
        }  
  
        public String getBg() {  
            return bg;  
        }  
  
        public void setBg(String bg) {  
            this.bg = bg;  
        }  
  
        public List<Cw> getCw() {  
            return cw;  
        }  
  
        public void setCw(List<Cw> cw) {  
            this.cw = cw;  
        }  
  
        @Override  
        public String toString() {  
            String result = "";  
            for (Cw cwTmp : cw) {  
                result += cwTmp.toString();  
            }  
            return result;  
        }  
    }  
  
    public String getSn() {  
        return sn;  
    }  
  
    public void setSn(String sn) {  
        this.sn = sn;  
    }  
  
    public String getLs() {  
        return ls;  
    }  
  
    public void setLs(String ls) {  
        this.ls = ls;  
    }  
  
    public String getBg() {  
        return bg;  
    }  
  
    public void setBg(String bg) {  
        this.bg = bg;  
    }  
  
    public String getEd() {  
        return ed;  
    }  
  
    public void setEd(String ed) {  
        this.ed = ed;  
    }  
  
    public List<Words> getWs() {  
        return ws;  
    }  
  
    public void setWs(List<Words> ws) {  
        this.ws = ws;  
    }  
  
    @Override  
    public String toString() {  
        String result = "";  
        for (Words wsTmp : ws) {  
            result += wsTmp.toString();  
        }  
        return result;  
    }  
} 

自定义的UI界面动画:anim_iconset.xml

 

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="false">
    <!-- oneshot为false代表重复播放动画       这里作为倾听说话时的动画-->
    <item android:drawable="@drawable/voice_empty" android:duration="500"/>
    <item android:drawable="@drawable/voice_full" android:duration="500"/>

</animation-list>

2.语音的合成:将文本转换为语音:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化
        SpeechUtility.createUtility(this, SpeechConstant.APPID +"=57e79517");
        
        //1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener  
        SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null);  
        //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类  
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人  
        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卡权限  
        //如果不需要保存合成音频,注释该行代码  
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");  
        //3.开始合成  
        int code = mTts.startSpeaking("在这里放置需要进行合成的文本", mSynListener);  
        if (code != ErrorCode.SUCCESS) {  
            if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {  
                //上面的语音配置对象为初始化时:  
                Toast.makeText(MainActivity.this, "语音组件未安装", Toast.LENGTH_LONG).show();  
            } else {  
                Toast.makeText(MainActivity.this, "语音合成失败,错误码: " + code, Toast.LENGTH_LONG).show();  
            }  
        }  
        
    }
    
    // 合成监听器
    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) {
        }
    };

}