简单使用百度语音合成、工具类直接使用

来源:互联网 发布:矩阵的秩8个性质及证明 编辑:程序博客网 时间:2024/06/14 02:28

使用第三方百度语音合成,很简单的集成步骤
一、首先注册百度账号,注册应用,注册包名获取key这个都不用多说的了;

二、下载jar包(直接下载Demo,吧libs下文件的分别放入对应的自己的项目中)

三、下载资源文件,我们一般用的是离线语音合成发出声音需要我们加载资源,直接在Demo中assets下的 资源文件复制过来,不要改动

四、在Manifest配置

<!--百度语音相关   -->        <!-- 请填写应用实际的APP_ID  百度语音 -->       <meta-data android:name="com.baidu.speech.APP_ID" android:value="9837887"/>       <!-- 请填写应用实际的API_KEY -->       <meta-data android:name="com.baidu.speech.API_KEY" android:value="HINUDjUNzZPlZDZfBQapMih2"/>       <!-- 请填写应用实际的SECRET_KEY -->       <meta-data android:name="com.baidu.speech.SECRET_KEY" android:value="a14e79c99bb6b5386b79e618d6e3466c"/>       <service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" ></service>

、1、直接创建一个百度语音类,重写构造方法,并且初始化资源

public class BaiduSpeech implements SpeechSynthesizerListener {    public BaiduSpeech(Context context){            this.context=context;            initialEnv();//初始化语音文件             initialTts();//初始化资源文件        }

2、初始化语音文件和资源文件

private void initialTts() {    //初始化资源文件        this.mSpeechSynthesizer = SpeechSynthesizer.getInstance();        this.mSpeechSynthesizer.setContext(context);        this.mSpeechSynthesizer.setSpeechSynthesizerListener(this);     // 文本模型文件路径 (离线引擎使用)        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, mSampleDirPath + "/"                + TEXT_MODEL_NAME);        // 声学模型文件路径 (离线引擎使用)        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, mSampleDirPath + "/"                + SPEECH_FEMALE_MODEL_NAME);        // 本地授权文件路径,如未设置将使用默认路径.设置临时授权文件路径,LICENCE_FILE_NAME请替换成临时授权文件的实际路径,仅在使用临时license文件时需要进行设置,如果在[应用管理]中开通了正式离线授权,不需要设置该参数,建议将该行代码删除(离线引擎)        // 如果合成结果出现临时授权文件将要到期的提示,说明使用了临时授权文件,请删除临时授权即可。        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE, mSampleDirPath + "/"                + LICENSE_FILE_NAME);        // 请替换为语音开发者平台上注册应用得到的App ID (离线授权)        this.mSpeechSynthesizer.setAppId("0000000"/*这里只是为了让Demo运行使用的APPID,请替换成自己的id。*/);        // 请替换为语音开发者平台注册应用得到的apikey和secretkey (在线授权)        this.mSpeechSynthesizer.setApiKey("HINUDjUNzZPlZDZfBQapMih3", "a14e79c99bb6b5386b79e618d6e3465c"/*这里只是为了让Demo正常运行使用APIKey,请替换成自己的APIKey*/);        // 发音人(在线引擎),可用参数为0,1,2,3。。。(服务器端会动态增加,各值含义参考文档,以文档说明为准。0--普通女声,1--普通男声,2--特别男声,3--情感男声。。。)        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");        // 设置Mix模式的合成策略        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);        // 授权检测接口(只是通过AuthInfo进行检验授权是否成功。)        // AuthInfo接口用于测试开发者是否成功申请了在线或者离线授权,如果测试授权成功了,可以删除AuthInfo部分的代码(该接口首次验证时比较耗时),不会影响正常使用(合成使用时SDK内部会自动验证授权)//        AuthInfo authInfo = this.mSpeechSynthesizer.auth(TtsMode.MIX);////        if (authInfo.isSuccess()) {//            toPrint("auth success");//        } else {//            String errorMsg = authInfo.getTtsError().getDetailMessage();//            toPrint("auth failed errorMsg=" + errorMsg);//        }        // 初始化tts        mSpeechSynthesizer.initTts(TtsMode.MIX);        // 加载离线英文资源(提供离线英文合成功能)//        Log.e("--Main--", "英文资源的长度为"+new File(mSampleDirPath+ "/" + ENGLISH_TEXT_MODEL_NAME).length());        int result =                mSpeechSynthesizer.loadEnglishModel(mSampleDirPath + "/" + ENGLISH_TEXT_MODEL_NAME, mSampleDirPath                        + "/" + ENGLISH_SPEECH_FEMALE_MODEL_NAME);    }
private void initialEnv() {   //初始化语音文件        if (mSampleDirPath == null) {            String sdcardPath = Environment.getExternalStorageDirectory().toString();            mSampleDirPath = sdcardPath + "/" + SAMPLE_DIR_NAME;        }        makeDir(mSampleDirPath);        copyFromAssetsToSdcard(false, SPEECH_FEMALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_FEMALE_MODEL_NAME);        copyFromAssetsToSdcard(false, SPEECH_MALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_MALE_MODEL_NAME);        copyFromAssetsToSdcard(false, TEXT_MODEL_NAME, mSampleDirPath + "/" + TEXT_MODEL_NAME);        copyFromAssetsToSdcard(false, LICENSE_FILE_NAME, mSampleDirPath + "/" + LICENSE_FILE_NAME);        copyFromAssetsToSdcard(false, "english/" + ENGLISH_SPEECH_FEMALE_MODEL_NAME, mSampleDirPath + "/"                + ENGLISH_SPEECH_FEMALE_MODEL_NAME);        copyFromAssetsToSdcard(false, "english/" + ENGLISH_SPEECH_MALE_MODEL_NAME, mSampleDirPath + "/"                + ENGLISH_SPEECH_MALE_MODEL_NAME);        copyFromAssetsToSdcard(false, "english/" + ENGLISH_TEXT_MODEL_NAME, mSampleDirPath + "/"                + ENGLISH_TEXT_MODEL_NAME);    }

3、ample工程需要的资源文件拷贝到SD卡中使用

/**        * 将sample工程需要的资源文件拷贝到SD卡中使用(授权文件为临时授权文件,请注册正式授权)        *         * @param isCover 是否覆盖已存在的目标文件        * @param source        * @param dest        */       private void copyFromAssetsToSdcard(boolean isCover, String source, String dest) {           File file = new File(dest);           if (isCover || (!isCover && !file.exists())) {               InputStream is = null;               FileOutputStream fos = null;               try {                   is = context.getResources().getAssets().open(source);                   String path = dest;                   fos = new FileOutputStream(path);                   byte[] buffer = new byte[1024];                   int size = 0;                   while ((size = is.read(buffer, 0, 1024)) >= 0) {                       fos.write(buffer, 0, size);                   }               } catch (FileNotFoundException e) {                   e.printStackTrace();               } catch (IOException e) {                   e.printStackTrace();               } finally {                   if (fos != null) {                       try {                           fos.close();                       } catch (IOException e) {                           e.printStackTrace();                       }                   }                   try {                       if (is != null) {                           is.close();                       }                   } catch (IOException e) {                       e.printStackTrace();                   }               }           }       }

4、封装方法共外部传入要合成的内容

/*ss为外部要传入的内容*/public void  setData(String ss) {        this.contac=ss;        //实际朗读的操作        int result = mSpeechSynthesizer.speak(contac);            if (result < 0) {                Toast.makeText(context, "合成失败", Toast.LENGTH_SHORT).show();            }    }/*      * 监听生命其周期,释放语音资源     */    public void Destroy(){      this.mSpeechSynthesizer.release();    }    public void pause() {        this.mSpeechSynthesizer.pause();    }    public void resume() {        this.mSpeechSynthesizer.resume();    }    public void stop() {        this.mSpeechSynthesizer.stop();    }

5、外部调用,如下:

BaiduSpeech baiduSpeech=new BaiduSpeech(context);baiduSpeech.setData("恭喜您成功了");

6、一下是工具类全部代码,可直接拿去使用,记得下载jar包及assets下的资源文件:

import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import com.baidu.tts.auth.AuthInfo;import com.baidu.tts.client.SpeechError;import com.baidu.tts.client.SpeechSynthesizer;import com.baidu.tts.client.SpeechSynthesizerListener;import com.baidu.tts.client.TtsMode;import android.content.Context;import android.os.Environment;import android.util.Log;import android.widget.Toast;/* * 百度语音 * auther cgq * */public class BaiduSpeech implements SpeechSynthesizerListener {    private String mSampleDirPath;    private SpeechSynthesizer mSpeechSynthesizer;    private static final String TEXT_MODEL_NAME = "bd_etts_text.dat";    private static final String SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female.dat";    private static final String LICENSE_FILE_NAME = "temp_license";    private static final String SAMPLE_DIR_NAME = "baiduTTS";    private static final String SPEECH_MALE_MODEL_NAME = "bd_etts_speech_male.dat";    private static final String ENGLISH_SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female_en.dat";    private static final String ENGLISH_SPEECH_MALE_MODEL_NAME = "bd_etts_speech_male_en.dat";    private static final String ENGLISH_TEXT_MODEL_NAME = "bd_etts_text_en.dat";    private Context context;    private String contac="百度语音恭喜你成功了、成功了";   //要合成的文本     public BaiduSpeech(Context context){        this.context=context;        initialEnv();//初始化语音文件         initialTts();//初始化资源文件    }    private void initialTts() {        this.mSpeechSynthesizer = SpeechSynthesizer.getInstance();        this.mSpeechSynthesizer.setContext(context);        this.mSpeechSynthesizer.setSpeechSynthesizerListener(this);     // 文本模型文件路径 (离线引擎使用)        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, mSampleDirPath + "/"                + TEXT_MODEL_NAME);        // 声学模型文件路径 (离线引擎使用)        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, mSampleDirPath + "/"                + SPEECH_FEMALE_MODEL_NAME);        // 本地授权文件路径,如未设置将使用默认路径.设置临时授权文件路径,LICENCE_FILE_NAME请替换成临时授权文件的实际路径,仅在使用临时license文件时需要进行设置,如果在[应用管理]中开通了正式离线授权,不需要设置该参数,建议将该行代码删除(离线引擎)        // 如果合成结果出现临时授权文件将要到期的提示,说明使用了临时授权文件,请删除临时授权即可。        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE, mSampleDirPath + "/"                + LICENSE_FILE_NAME);        // 请替换为语音开发者平台上注册应用得到的App ID (离线授权)        this.mSpeechSynthesizer.setAppId("0000000"/*这里只是为了让Demo运行使用的APPID,请替换成自己的id。*/);        // 请替换为语音开发者平台注册应用得到的apikey和secretkey (在线授权)        this.mSpeechSynthesizer.setApiKey("HINUDjUNzZPlZDZfBQapMih3", "a14e79c99bb6b5386b79e618d6e3465c"/*这里只是为了让Demo正常运行使用APIKey,请替换成自己的APIKey*/);        // 发音人(在线引擎),可用参数为0,1,2,3。。。(服务器端会动态增加,各值含义参考文档,以文档说明为准。0--普通女声,1--普通男声,2--特别男声,3--情感男声。。。)        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");        // 设置Mix模式的合成策略        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);        // 授权检测接口(只是通过AuthInfo进行检验授权是否成功。)        // AuthInfo接口用于测试开发者是否成功申请了在线或者离线授权,如果测试授权成功了,可以删除AuthInfo部分的代码(该接口首次验证时比较耗时),不会影响正常使用(合成使用时SDK内部会自动验证授权)//        AuthInfo authInfo = this.mSpeechSynthesizer.auth(TtsMode.MIX);////        if (authInfo.isSuccess()) {//            toPrint("auth success");//        } else {//            String errorMsg = authInfo.getTtsError().getDetailMessage();//            toPrint("auth failed errorMsg=" + errorMsg);//        }        // 初始化tts        mSpeechSynthesizer.initTts(TtsMode.MIX);        // 加载离线英文资源(提供离线英文合成功能)//        Log.e("--Main--", "英文资源的长度为"+new File(mSampleDirPath+ "/" + ENGLISH_TEXT_MODEL_NAME).length());        int result =                mSpeechSynthesizer.loadEnglishModel(mSampleDirPath + "/" + ENGLISH_TEXT_MODEL_NAME, mSampleDirPath                        + "/" + ENGLISH_SPEECH_FEMALE_MODEL_NAME);    }    public void  setData(String ss) {        this.contac=ss;        int result = mSpeechSynthesizer.speak(contac);            if (result < 0) {                Toast.makeText(context, "合成失败", Toast.LENGTH_SHORT).show();            }    }    //暂停     public void bdSpeechPause(){    }    private void initialEnv() {        if (mSampleDirPath == null) {            String sdcardPath = Environment.getExternalStorageDirectory().toString();            mSampleDirPath = sdcardPath + "/" + SAMPLE_DIR_NAME;        }        makeDir(mSampleDirPath);        copyFromAssetsToSdcard(false, SPEECH_FEMALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_FEMALE_MODEL_NAME);        copyFromAssetsToSdcard(false, SPEECH_MALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_MALE_MODEL_NAME);        copyFromAssetsToSdcard(false, TEXT_MODEL_NAME, mSampleDirPath + "/" + TEXT_MODEL_NAME);        copyFromAssetsToSdcard(false, LICENSE_FILE_NAME, mSampleDirPath + "/" + LICENSE_FILE_NAME);        copyFromAssetsToSdcard(false, "english/" + ENGLISH_SPEECH_FEMALE_MODEL_NAME, mSampleDirPath + "/"                + ENGLISH_SPEECH_FEMALE_MODEL_NAME);        copyFromAssetsToSdcard(false, "english/" + ENGLISH_SPEECH_MALE_MODEL_NAME, mSampleDirPath + "/"                + ENGLISH_SPEECH_MALE_MODEL_NAME);        copyFromAssetsToSdcard(false, "english/" + ENGLISH_TEXT_MODEL_NAME, mSampleDirPath + "/"                + ENGLISH_TEXT_MODEL_NAME);    }    private void makeDir(String dirPath) {        File file = new File(dirPath);        if (!file.exists()) {            file.mkdirs();        }    }    /**        * 将sample工程需要的资源文件拷贝到SD卡中使用(授权文件为临时授权文件,请注册正式授权)        *         * @param isCover 是否覆盖已存在的目标文件        * @param source        * @param dest        */       private void copyFromAssetsToSdcard(boolean isCover, String source, String dest) {           File file = new File(dest);           if (isCover || (!isCover && !file.exists())) {               InputStream is = null;               FileOutputStream fos = null;               try {                   is = context.getResources().getAssets().open(source);                   String path = dest;                   fos = new FileOutputStream(path);                   byte[] buffer = new byte[1024];                   int size = 0;                   while ((size = is.read(buffer, 0, 1024)) >= 0) {                       fos.write(buffer, 0, size);                   }               } catch (FileNotFoundException e) {                   e.printStackTrace();               } catch (IOException e) {                   e.printStackTrace();               } finally {                   if (fos != null) {                       try {                           fos.close();                       } catch (IOException e) {                           e.printStackTrace();                       }                   }                   try {                       if (is != null) {                           is.close();                       }                   } catch (IOException e) {                       e.printStackTrace();                   }               }           }       }    // 监听到出错,在此添加相关操作    @Override    public void onError(String arg0, SpeechError arg1) {        Log.e("--Main--", arg1.toString()+"错误码"+arg0);    }    // 监听到播放结束,在此添加相关操作    @Override    public void onSpeechFinish(String arg0) {        // TODO Auto-generated method stub    }    // 监听到播放进度有变化,在此添加相关操作    @Override    public void onSpeechProgressChanged(String arg0, int arg1) {        // TODO Auto-generated method stub    }    // 监听到合成并播放开始,在此添加相关操作    @Override    public void onSpeechStart(String arg0) {        // TODO Auto-generated method stub    }    // 监听到有合成数据到达,在此添加相关操作    @Override    public void onSynthesizeDataArrived(String arg0, byte[] arg1, int arg2) {        // TODO Auto-generated method stub    }    // 监听到合成结束,在此添加相关操作    @Override    public void onSynthesizeFinish(String arg0) {        // TODO Auto-generated method stub    }    // 监听到合成开始,在此添加相关操作    @Override    public void onSynthesizeStart(String arg0) {        // TODO Auto-generated method stub    }    /*      * 释放语音资源     */    public void Destroy(){      this.mSpeechSynthesizer.release();    }    public void pause() {        this.mSpeechSynthesizer.pause();    }    public void resume() {        this.mSpeechSynthesizer.resume();    }    public void stop() {        this.mSpeechSynthesizer.stop();    }}

以上就是百度语音简单的一个使用封装,希望对第一次集成的同学能有所帮助,
感谢科技,感谢生活,感谢分享!

原创粉丝点击