帖子

[业务介绍] 【业务能力介绍系列】在线语音合成

[复制链接]
  • TA的每日心情
    开心
    2017-12-29 09:56
  • 签到天数: 46 天

    [LV.5]常住居民I

    696617  楼主| 王水 发表于 2016-4-1 15:58:17 1#
    在线语音合成就是在联网的场景下将文字转换成声音,实现机器向人的声音交互。这个概念应该是比较好理解的,下面就结合官网的Android在线合成的Demo讲解一下合成的流程以及大家经常遇到的一些问题。
    到官网SDK下载中心(http://www.xfyun.cn/sdk/dispatcher)下载在线命令词识别SDK(这里以Android版本为例)后,可以发现压缩包里面的目录结构和听写的非常类似,还记得我在《【业务能力介绍系列】在线命令词识别》帖子中也说过在线命令词AndroidDemo的目录结构和听写的非常类似吗?
    这里告诉大家一个小秘密:

    QQ截图20160****51426.jpg

    在官网下载Android的这三个选项下载的SDK包是一模一样的,为什么会这样呢?因为听写、在线合成、在线命令词三个功能在我们平台是放在一个SDK包里的,版本也是做统一维护,SDK包里的demo自然也是集合了这个三个功能的演示功能(当然还包含一些其他功能,如语义理解、评测),如下图所示:
    QQ截图20160****52256.jpg

    红框中的java文件从上到下依次是:命令词识别子demo、听写子demo、评测子Demo、Demo主入口界面、SpeechUtility初始化、合成子Demo、语义理解子Demo。可能有人注意到,其中命令词识别子demo、听写子demo、合成子Demo都有对应本地功能,这些本地功能是有语记APP提供的,而不是离线SDK提供的,所以如果你的手机上没有安装语记APP,你在demo里看到的这些本地功能是用不了的(报错语音组件未安装21001),这部分想有更进一步的了解见帖子:
    21001问题详解
    http://bbs.xfyun.cn/forum.php?mo ... 11724&fromuid=33982
    (出处: 语音云社区)

    下面看一下TtsDemo.java里面的调用流程,注意在这之前一定别忘了SpeechApp.java里面的SpeechUtility初始化。
    360手机助手截图0401_15_42_01.png
    • 首先是初始化合成对象

                    mTts = SpeechSynthesizer.createSynthesizer(TtsDemo.this, mTtsInitListener);

    mTtsInitListener是初始化监听器,比较保险的做法是在初始化回调成功后再进行下面的操作。

    • 然后是设置相关合成参数
                    // 清空参数
                    mTts.setParameter(SpeechConstant.PARAMS, null);
                    // 根据合成引擎设置相应参数
                    if(mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {
                            mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
                            // 设置在线合成发音人
                            mTts.setParameter(SpeechConstant.VOICE_NAME, voicer);
                            if(!"neutral".equals(emot)){
                                    // 当前仅发音人“小艾”支持设置情感
                                    // “小艾”发音人需要付费使用,具体请联系:msp_support@iflytek.com
                                    mTts.setParameter(SpeechConstant.EMOT, emot);
                            }
                    //设置合成语速
                    mTts.setParameter(SpeechConstant.SPEED, mSharedPreferences.getString("speed_preference", "50"));
                    //设置合成音调
                    mTts.setParameter(SpeechConstant.PITCH, mSharedPreferences.getString("pitch_preference", "50"));
                    //设置合成音量
                    mTts.setParameter(SpeechConstant.VOLUME, mSharedPreferences.getString("volume_preference", "50"));


                    //设置播放器音频流类型
                    mTts.setParameter(SpeechConstant.STREAM_TYPE, mSharedPreferences.getString("stream_preference", "3"));
                    // 设置播放合成音频打断音乐播放,默认为true
                    mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");
                    // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
                    // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
                    mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
                    mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/tts.wav");

    相关参数的作用在注释中已经说的比较详细了。

    • 最后开始合成
                    mTts.startSpeaking(text, mTtsListener);

    其中text就是你需要合成的文本,mTtsListener是合成监听器,里面包含了合成进度、合成完成等等非常有用的回调。

    常见问题及解答:
    • 发音人参数可以设置成哪些发音人呢?
    目前支持的在线发音人列表见下面的帖子
    【官方】合成发音人在线、离线支持情况
    http://bbs.xfyun.cn/forum.php?mo ... 2&fromuid=33982
    (出处: 语音云社区)
    • 一次可以合成多长的文本呢?我要合成文本超长了怎么办?
    合成文本是有长度限制的,一次最长合成8192个字节的文本,你可能根据你的文本的编码格式换算出支持的最长字符数。如果你要合成的文本超长了,你可以将他按照长度限制进行切分,分多次合成后再依次进行音频数据的合并或者播放。


    • 在线合成的音频数据是没有经过压缩的吗?会不会非常耗费流量?
    和听写时音频数据的上传类似,合成是服务器返回的音频数据是经过”speex编码“压缩过的,压缩比约为1:10,也就是时候服务端将合成的音频进行1:10的压缩,然后客户端SDK接收到音频后再解码成非压缩的原始音频,那么按照16K采样率16位采样精度单声道的音频来计算,1秒钟的音频压缩后的大小大约为3K左右,并不是非常的大。另外上面提到的speex编码并不是普通的speex编码,因此这两种方式压缩出来的音频也不能通用。





    zhuGeYanHuang 发表于 2016-4-9 09:35:56
    推荐
    本地合成语音是乍回事的?
    使用道具 举报 回复
    荆小荆 发表于 2016-4-5 11:02:01
    3#
    抢沙发~~~
    使用道具 举报 回复
    iflytek-小黑 发表于 2016-4-8 11:18:27
    4#
    666
    使用道具 举报 回复
    463622761@qq.co 发表于 2016-4-12 10:05:12
    5#
    超长的文本切分后,有什么影响?会不会影响效果?
    使用道具 举报 回复
     楼主| 王水 发表于 2016-4-13 08:52:48
    6#
    zhuGeYanHuang 发表于 2016-4-9 09:35
    本地合成语音是乍回事的?

    后面有时间会更新离线合成的帖子
    使用道具 举报 回复
     楼主| 王水 发表于 2016-4-13 08:53:42
    7#
    463622761@qq.co 发表于 2016-4-12 10:05
    超长的文本切分后,有什么影响?会不会影响效果?

    不会有什么影响,建议文本尽量切割在自然断句的地方。
    使用道具 举报 回复
    463622761@qq.co 发表于 2016-4-13 10:03:11
    8#
    王水 发表于 2016-4-13 08:53
    不会有什么影响,建议文本尽量切割在自然断句的地方。

    机智,这样就算有间隔也可能听不太出来
    使用道具 举报 回复
    毛豆 发表于 2016-4-14 21:17:51
    9#
    我可不可以要一下你做的这个的源代码啊?跪求啊,没弄明白呢
    使用道具 举报 回复
     楼主| 王水 发表于 2016-4-15 17:56:18
    10#
    毛豆 发表于 2016-4-14 21:17
    我可不可以要一下你做的这个的源代码啊?跪求啊,没弄明白呢

    上面讲的就是官网下载的demo:http://www.xfyun.cn/sdk/dispatcher
    使用道具 举报 回复