Android学习笔记---集成百度语音合成的坑与坑

每天一个小目标,早晚单车变摩托

今天本小菜遇到一个问题,就是项目中使用了科大讯飞的语音合成,由于没有审核,每天只有500次,但是远远不够用于测试,每天一上午就用完啦,于是乎,决定把科大讯飞的语音合成替换为百度语音合成,百度的免费次数又多,而且语音也比科大讯飞的好听 哈哈,下面进入正题(真的比科大讯飞的好听)

首先我们要先去百度语音开放平台 http://yuyin.baidu.com/ 我们去注册一个账号然后创建应用

Android学习笔记---集成百度语音合成的坑与坑_第1张图片


选择咱们自己需要的服务即可
Android学习笔记---集成百度语音合成的坑与坑_第2张图片

创建完应用之后点击查看key

Android学习笔记---集成百度语音合成的坑与坑_第3张图片

记住KEY之后 我们点击SDK下载
Android学习笔记---集成百度语音合成的坑与坑_第4张图片


下载到本地 接下来的就是集成了

打开APP目录

Android学习笔记---集成百度语音合成的坑与坑_第5张图片



在自己的项目的配置文件中加入以下权限



android:name="android.permission.INTERNET" />
android:name="android.permission.ACCESS_NETWORK_STATE" />
android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
android:name="android.permission.WRITE_SETTINGS" />
android:name="android.permission.READ_PHONE_STATE" />
android:name="android.permission.ACCESS_WIFI_STATE" />
android:name="android.permission.CHANGE_WIFI_STATE" />

然后把jar包已经assets,jniLibs下面的东西都复制到咱们自己的项目

然后在项目中的build.gradle里面引用百度语音合成的jar包

Android学习笔记---集成百度语音合成的坑与坑_第6张图片


之后我们就来写代码咯

先来用到一个工具类
转自:http://blog.csdn.net/aquarius_seven/article/details/76850292

TTSUtils.java

package com.th.hecheng;
import android.content.Context;
import android.os.Environment;
import android.util.Log;

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 java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by As on 2017/8/7
 */

public class TTSUtils implements SpeechSynthesizerListener {

    private static final String TAG = "TTSUtils";
    private static volatile TTSUtils instance = null;
    private SpeechSynthesizer mSpeechSynthesizer;

    private static final String SAMPLE_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + "/baiduTTS/";
    private static final String SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female.dat";
    private static final String TEXT_MODEL_NAME = "bd_etts_text.dat";
    //===========================需要替换的部分========================================
    private static final String APIKEY = "EOLInCg8QSnGx4GRHYngRQMj";
    private static final String SECRETKEY = "ba86210f1cc6028d18884db928995e76";
    private static final String APPID = "10261021";

    //===========================需要替换的部分结束===========================================
    private TTSUtils() {
    }

    public static TTSUtils getInstance() {
        if (instance == null) {
            synchronized (TTSUtils.class) {
                if (instance == null) {
                    instance = new TTSUtils();
                }
            }
        }
        return instance;
    }

    public void init(Context context) {
        File file = new File(SAMPLE_DIR);
        if (!file.exists()) {
            file.mkdirs();
        }
        File textModelFile = new File(SAMPLE_DIR + TEXT_MODEL_NAME);
        if (!textModelFile.exists()) {
            copyAssetsFile2SDCard(context, TEXT_MODEL_NAME, SAMPLE_DIR + TEXT_MODEL_NAME);
        }
        File speechModelFile = new File(SAMPLE_DIR + SPEECH_FEMALE_MODEL_NAME);
        if (!speechModelFile.exists()) {
            copyAssetsFile2SDCard(context, SPEECH_FEMALE_MODEL_NAME, SAMPLE_DIR + SPEECH_FEMALE_MODEL_NAME);
        }
        // 获取语音合成对象实例
        mSpeechSynthesizer = SpeechSynthesizer.getInstance();
        // 设置context
        mSpeechSynthesizer.setContext(context);
        // 设置语音合成状态监听器
        mSpeechSynthesizer.setSpeechSynthesizerListener(this);
        mSpeechSynthesizer.setApiKey(APIKEY, SECRETKEY);
        // 设置离线语音合成授权,需要填入从百度语音官网申请的app_id
        mSpeechSynthesizer.setAppId(APPID);
        // 设置语音合成文本模型文件
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, SAMPLE_DIR + TEXT_MODEL_NAME);
        // 设置语音合成声音模型文件
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, SAMPLE_DIR + SPEECH_FEMALE_MODEL_NAME);
        // 发音人(在线引擎),可用参数为0,1,2,3。。。(服务器端会动态增加,各值含义参考文档,以文档说明为准。0--普通女声,1--普通男声,2--特别男声,3--情感男声。。。)
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");
        // 设置Mix模式的合成策略
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);
        // 初始化tts
        mSpeechSynthesizer.initTts(TtsMode.MIX);
    }

    //需要合成的msg长度不能超过1024个GBK字节。
    public void speak(String msg) {
        int result = mSpeechSynthesizer.speak(msg);
        if (result < 0) {
            Log.e(TAG, "error,please look up error code = " + result + " in doc or URL:http://yuyin.baidu.com/docs/tts/122 ");
        }
    }

    public void pause() {
        mSpeechSynthesizer.pause();
    }

    public void resume() {
        mSpeechSynthesizer.resume();
    }

    public void stop() {
        mSpeechSynthesizer.stop();
    }

    public void release() {
        if (null != mSpeechSynthesizer) {
            mSpeechSynthesizer.release();
        }
    }

    @Override
    public void onSynthesizeStart(String s) {
        // 监听到合成开始,在此添加相关操作
    }

    @Override
    public void onSynthesizeDataArrived(String s, byte[] bytes, int i) {
        // 监听到有合成数据到达,在此添加相关操作
    }

    @Override
    public void onSynthesizeFinish(String s) {
        // 监听到合成结束,在此添加相关操作
    }

    @Override
    public void onSpeechStart(String s) {
        // 监听到合成并播放开始,在此添加相关操作
    }

    @Override
    public void onSpeechProgressChanged(String s, int i) {
        // 监听到播放进度有变化,在此添加相关操作
    }

    @Override
    public void onSpeechFinish(String s) {
        // 监听到播放结束,在此添加相关操作
    }

    @Override
    public void onError(String s, SpeechError speechError) {
        // 监听到出错,在此添加相关操作
    }

    public static void copyAssetsFile2SDCard(Context context, String fileName, String path) {
        try {
            InputStream is = context.getAssets().open(fileName);
            FileOutputStream fos = new FileOutputStream(new File(path));
            byte[] buffer = new byte[1024];
            int byteCount = 0;
            while ((byteCount = is.read(buffer)) != -1) {// 循环从输入流读取buffer字节
                fos.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流
            }
            fos.flush();// 刷新缓冲区
            is.close();
            fos.close();
        } catch (IOException e) {
            Log.e(TAG, "copyAssetsFile2SDCard: " + e.toString());
        }
    }
}


其中需要替换的部分大家替换成自己的APPID和KEY即可

MainActivity.java

package com.th.hecheng;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化百度语音合成
        TTSUtils.getInstance().init(this);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TTSUtils.getInstance().speak("欢迎使用百度语音合成");
            }
        });
    }
}

好了 我们来运行一下看看 已经可以说话了

下面说一下一个错误

Android学习笔记---集成百度语音合成的坑与坑_第7张图片

解决方案1:出现此本地百度得到的信息是找不到so文件,只需要检查jniLibs目录下的So文件即可
解决方案2:在项目中的build.gradle中添加以下两句话

repositories {
    flatDir {
        dir 'libs'
    }
}


android {
    sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }
    }


整体图

Android学习笔记---集成百度语音合成的坑与坑_第8张图片


好了 百度语音合成到这里就结束了,希望能帮助到大家


demo下载地址
http://download.csdn.net/download/crackgmkey/10030522


你可能感兴趣的:(Anndroid学习笔记)