半杯可乐
半杯可乐
  • 发布:2015-11-02 21:26
  • 更新:2022-09-01 16:16
  • 阅读:12543

Android插件,TTS语音合成(文字转化语音)。

分类:5+ SDK

相关介绍

概念介绍

语音合成是实现人机语音交互,建立一个有听和讲能力的交互系统所必需的关键技术。随着语音技术的发展,百度自主研发了语音合成系统(TTS),功能是接受用户发送的文本,生成语音发送给用户。
对本文中将提到的概念约定如下:
语音合成:将文本合成为语音,即声音文件。
合成引擎:将文本合成为语音的核心模块。
TTS:Text To Speech,即“从文本到语音”。
BDTTSClient:语音合成 SDK 简称,详见下条。
语音合成 SDK:即本开发包,文中简称为 BDTTSClient。BDTTSClient 是一个封装了网络收发、音频播放功能的语音合成解决方案。借助 BDTTSClient 可以快速地在应用程序中集成语音合成功能。
百度语音

合成方式

1.离在线语音合成
2.在线语音合成(本文使用方式)

应用场景

我们团队的应用场景是在推送消息后,需要播放推送消息。

准备事项

1.下载Android 平台 HTML5+ SDK 。
2.注册百度开发者,创建应用,开通服务,请参考集成指南
3.下载在线语音合成SDK_Android版。

实现步骤

1.先导入5+SDK就不多说了,参考Android平台第三方插件开发指导
2.添加BDTTSClient到工程(将开发包中的 libs 目录整体拷贝到工程目录,libs 目录包括了各平台的 SO 库,开发者视应用需要可以进行删减。galaxy_lite.jar 是百度 Android 公共基础库。)
3.权限声明(需要在 AndroidManifest.xml 文件,增加以上三个权限)

<uses-permission android:name="android.permission.INTERNET" />  
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

4.集成java代码

import org.json.JSONArray;  
import com.baidu.speechsynthesizer.SpeechSynthesizer;  
import com.baidu.speechsynthesizer.SpeechSynthesizerListener;  
import com.baidu.speechsynthesizer.publicutility.SpeechError;  
import android.media.AudioManager;  
import android.util.Log;  
import io.dcloud.common.DHInterface.IWebview;  
import io.dcloud.common.DHInterface.StandardFeature;  
import io.dcloud.common.util.JSUtil;  
public class baidutts extends StandardFeature implements SpeechSynthesizerListener{  
    private IWebview iwv ;  
    private String text;  
    private SpeechSynthesizer speechSynthesizer;  
    private static final String TAG = "zlz";  
    public void speak(IWebview pWebview, JSONArray array)  
    {  
        iwv = pWebview;  
        String CallBackID = array.optString(0);  
        JSONArray newArray = new JSONArray();  
        newArray.put(array.optString(1));  
        //前台传过来的文本信息  
        text = array.optString(1);  
        //Log.i(TAG, text);  
        initialTts();  
        JSUtil.execCallback(pWebview, CallBackID, newArray, JSUtil.OK, false);  
    }  
    //百度TTS初始化  
    private void initialTts() {  
        speechSynthesizer = new SpeechSynthesizer(iwv.getContext(),  
                "holder", this);  
        // 此处需要将setApiKey方法的两个参数替换为你在百度开发者中心注册应用所得到的apiKey和secretKey  
        speechSynthesizer.setApiKey("your-apiKey", "your-secretKey");  
        speechSynthesizer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
        //setVolumeControlStream(AudioManager.STREAM_MUSIC);  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                setParams();  
                int ret = speechSynthesizer.speak(text);  
                if (ret != 0) {  
                    Log.i(TAG,"开始合成器失败" );  
                }  
            }  
        }).start();  

    }  
    private void setParams() {  
        speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");  
        speechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "5");  
        speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");  
        speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");  
        speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_ENCODE, SpeechSynthesizer.AUDIO_ENCODE_AMR);  
        speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_RATE, SpeechSynthesizer.AUDIO_BITRATE_AMR_15K85);  
    }  
    @Override  
    public void onBufferProgressChanged(SpeechSynthesizer arg0, int arg1) {}  
    @Override  
    public void onCancel(SpeechSynthesizer arg0) {}  
    @Override  
    public void onError(SpeechSynthesizer arg0, SpeechError arg1) {}  
    @Override  
    public void onNewDataArrive(SpeechSynthesizer arg0, byte[] arg1, boolean arg2) {}  
    @Override  
    public void onSpeechFinish(SpeechSynthesizer arg0) {}  
    @Override  
    public void onSpeechPause(SpeechSynthesizer arg0) {}  
    @Override  
    public void onSpeechProgressChanged(SpeechSynthesizer arg0, int arg1) {}  
    @Override  
    public void onSpeechResume(SpeechSynthesizer arg0) {}  
    @Override  
    public void onSpeechStart(SpeechSynthesizer arg0) {}  
    @Override  
    public void onStartWorking(SpeechSynthesizer arg0) {}  
    @Override  
    public void onSynthesizeFinish(SpeechSynthesizer arg0) {}  
}

5.前台javascript代码

document.addEventListener( "plusready",  function()  
{  
    var _BARCODE = 'kxdPlugins',  
        B = window.plus.bridge;  
    var kxdPlugins =   
    {  
        // 声明异步返回方法  
        speak : function (Argus, successCallback, errorCallback )   
        {  
            var success = typeof successCallback !== 'function' ? null : function(args)   
            {  
                successCallback(args);  
            },  
            fail = typeof errorCallback !== 'function' ? null : function(code)   
            {  
                errorCallback(code);  
            };  
            callbackID = B.callbackId(success, fail);  
            // 通知Native层plugintest扩展插件运行”speak”方法  
            return B.exec(_BARCODE, "speak", [callbackID, Argus]);  
        }  
    };  
    window.plus.kxdPlugins = kxdPlugins;  
}, true );

使用方式

和普通的API调用方式一样:plus.kxdPlugins.speak("这是语音播放的文字内容");

注意事项

1.在/assets/data/properties.xml中添加插件权限。
2.在/assets/apps/appid/www/manifest.json 中添加对应插件权限。
3.在/AndroidManifest.xml 文件中添加对应的百度语音合成权限。

7 关注 分享
DCloud_heavensoft BoredApe 闪闪 thyiad 五叶神 蔡繁荣 eachann

要回复文章请先登录注册

FullStack

FullStack

离线文本转语音、支持生成音频、下载或播放状态监听(ios) :[https://ext.dcloud.net.cn/plugin?id=9286](https://ext.dcloud.net.cn/plugin?id=9286)
2022-09-01 16:16
小权

小权

这种语音播报方案只适用于app在运行的场景。大部分时候,我们推送的消息是离线消息(app是没有运行的)。不知道这种场景下要通过什么方式实现语音播报?
2020-03-09 11:18
FYC

FYC

又get到了新知识,感谢楼主!
2018-06-15 11:37
1***@qq.com

1***@qq.com

看了这个,感触很大,学习了
2018-01-28 10:08
学习了

学习了

你好,可以说详细点吗。我没有过这杨的开发。谢谢
2016-07-09 11:09
阿佳

阿佳

换一个角度考虑,在服务器端将文本转成音频,然后移动端下载这个音频文件再播放。这样就可以在线打包啦。
2015-12-10 10:25
半杯可乐

半杯可乐 (作者)

回复 thyiad :
就目前而言,自己开发了插件,需要离线打包了。
但是不排除以后官方出了自定义插件的标准,那样以后只需要上传自定义插件jar就可以了。
2015-11-04 10:20
thyiad

thyiad

自己开发了插件,是不是只能离线打包了
2015-11-04 10:13