跳转至

语音合成

语音合成TTS模块

TTS模块主要是文字转语音的功能,目前支持返回音频链接直接播放合成文件

直接播放和合成文件为2.0.10.1新增功能。

TTS参数说明

TTS请求参数

TtsRequestConfig为TTS请求参数,具体说明如下:

参数 类型 是否必须 取值范围 默认值 说明
pitch int N 1-9 5 音高
volume int N 1-9 5 音量
arousal int N 1-9 5 语音波动
speed int N 1-9 5 语速
format String N MP3_16_16 - 暂不支持设置
tone String N - zhiwa 参见“tone参数说明”
ext Map N - - 扩展字段,快速扩展功能实现

tone参数说明

名称 说明 性别
zhiwa 图灵智娃 中英混合男童
aq 图灵阿Q 中英混合女童
huiting 图灵慧听 中英混合成年女声

format参数说明

Value 描述
AMR_NB amr-8khz-16bit
MP3_16_16 mp3-16khz-16kpbs
MP3_16_24 mp3-16khz-24kpbs
MP3_16_64 mp3-16khz-64kpbs
WAV_16_16 wav-16khz-16bit
PCM_16_16 pcm-16khz-16bit
PCM_8_16 pcm-8khz-16bit(目前暂时不支持)

参数优先级说明

  • TTS音色有特殊需求和定制,可以联系图灵商务;

  • 当不设置TTS音色以及音量等参数时,默认使用图灵平台云端配置的默认参数;另外每一次请求设置的参数只对该次有效,下一次请求如果不设置参数,将使用图灵平台云端配置的默认参数;

  • 可以联系图灵技术支持通过云端配置音色音量等参数,请求时可以省略TtsRequestConfig参数。

TTS请求结果

TuringOSClientListener

该接口为TTS请求结果回调接口(同其他模块的TuringOSClientListener),具体如下:


    public interface TuringOSClientListener {    
         /**
         *
         * 请求结果返回
         *
         * @param code 具体参考code说明
         * @param result 返回的json字符串
         * @param isLast Asr识别结果;last : 是否是最终结果
         * @param baseResp  返回的json字符串转换的Java对象
         *@param extension  扩展参数
         */
        void onResult(int code, String result, BaseResp baseResp, String extension);   


        /**
         * 请求发生错误的信息
         *
         * @param code
         * @param msg
         */
        void onError(int code, String msg);
    }

参数说明

  • code:具体参考code说明;
  • result :返回的json字符串;
  • baseResp :返回的json字符串转换的Java对象,具体参考TTS输出说明;
  • extension :扩展参数,当调用TTS文件合成的方式时,该值为合成的TTS文件路径。

TTS播放状态

TuringOSClientPlayListener

当使用TTS合成并播放的这种方式时,可以使用该接口监听播放状态。

public interface TuringOSClientPlayListener {
    /**
     * TTS开始播放,聊天场景种会返回即将开始播放的内容(可能是文字,也可能是音频的url)
     */
    void onPlayStart(String text);
    /**
     * TTS播放错误
     */
    void onPlayError(String message);
    /**
     * TTS播放完成
     */
    void onPlayComplete();
    /**
     * TTS播放暂停
     */
    void onPlayPaused();
    /**
     * TTS继续播放
     */
    void onPlayResumed();
}

  • onPlayStart(String text):在TTS合成场景中,onPlayStart(String text)中的text始终为空,不需要关注,为字段主要服务于语音聊天模块多种音频播放的场景,具体可参看语音对话模块。

字符切割方法

    //对用户输入的字符串长度进行切割,保证每一次请求的文字长度合法
    public static SparseArray<String> split(String text)

    //调用
    SparseArray<String> textList = turingOSClient.SparseArray(text);

TTS合成调用

TTS合成支持三种方式:

  • 文字合成音频链接,请求返回音频播放链接;
  • 文字转语音直接播放;
  • 文字合成音频文件。

一、TTS合成音频链接

  • 该方式请求TTS后返回音频的播放链接,需要开发者自行播放音频。

  • 如果输入的文字字符长度大于100时,会在内部进行切割,所以需要注意返回的SparseArray值,返回的音频链接会按照返回的值进行分段返回。

方法说明

    /** 
    * 
    * @param text 需要转语音的文字
    * @param listener TuringOSClientListener
    * @return 你输入的字符串会被切割为SparseArray<String>
    */
    public SparseArray<String> actionTts(String text, TuringOSClientListener listener)


    /** 
    * 
    * @param text 需要转语音的文字
    * @param ttsRequestConfig TtsRequestConfig tts参数
    * @param listener TuringOSClientListener
    * @return 你输入的字符串会被切割为SparseArray<String>
    */
    public SparseArray<String> actionTts(String text, TtsRequestConfig ttsRequestConfig, final TuringOSClientListener listener)

调用示例


    //无tts参数
    //返回的语音MP3地址会按照该textList对应的文字顺序返回
    SparseArray<String> textList = turingOSClient.actionTts(text, listener);


    //有tts参数
    TtsRequestConfig.Builder ttsRequestConfigBuilder = new TtsRequestConfig.Builder();
    ttsRequestConfigBuilder.pitch(pitch)
                .speed(speed)
                .volume(volume)
                .arousal(arousal)
                .tone("zhiwa");
    TtsRequestConfig ttsRequestConfig = ttsRequestConfigBuilder.build();

    //返回的语音MP3地址会按照该textList对应的文字顺序返回
    SparseArray<String> textList turingOSClient.actionTts(text, ttsRequestConfig, listener);

TTS音频链接输出

具体看TuringOSClientListener接口的onResult方法说明,ttsUrl为合成目标文字的音频链接。

json返回示例如下:

{
    "code":200,
    "globalId":"98412556156000000",
    "message":"success",
    "nlpResponse":{
        "intent":{
            "code":50101
        },
        "results":[
            {
                "groupType":0,
                "resultType":"text",
                "values":{
                    "ttsUrl":[
                        "http://turing-iot.oss-cn-beijing.aliyuncs.com/tts/tts-0b6c2dd6687a4c8cb73a3ca49ed9b3ca-ef856c768eb2495bafce0fd01eeade93.mp3"
                    ],
                    "text":"北京今天天气怎么样?"
                }
            }
        ]
    }
}

TTS输出说明

BaseResp说明

参数 类型 说明
code int 请求响应Code,具体可参考Code说明
message String 请求响应的消息描述
nlpResponse NlpResponse(Object)
  • 当code=200表示识别成功;
  • 其他code表示识别异常,参考Code说明

NlpResponse

参数 类型 说明
intent Intent(Object) 语义理解结果的实体内容
results List(Object) 语义理解结果的提示语和播放内容集合

NlpResponse-Intent

参数 类型 说明
code Intent(Object) 此次请求命中的技能Code
TT合成模块固定返回50101

NlpResponse-List-Results

参数 类型 说明
groupType int 组类型(普通接入可忽略该参数):
0为独立输出;
大于0时可能包含同组相关内容
resultType String 输出类型:
当 resultType=text 时:表示文本
TTS合成场景固定返回text
values Values(Object) 输出内容(必会包含 resultType 对应的 key, 其他会根据具体应用场景进行字段扩充)

NlpResponse-List-Results-Values

参数 类型 说明
ttsUrl String[] 文字合成语音的音频链接
text String 合成目标,即输入的文字

TTS MP3链接播放

SDK内部集成了MP3播放器池TtsPlayerPool,开发者可根据自身业务逻辑选择使用内部或者自行实现播放器。

TtsPlayerPool使用介绍

TtsPlayerPool:TtsPlayerPool主要用于播放mp3 List的播放池,内部实现了预加载和备用播放器。

使用方式一

需要传入所有mp3播放地址之后,才能调用start开始播放,具体使用示例如下:


    //第一步:创建播放池
    //textList为client.SparseArray(text)切割的结果
    TtsPlayerPool ttsPlayerPool = TtsPlayerPool.create(textList.size());

    //播放状态
    ttsPlayerPool.setCallback(new MyTtsCalkBack());

    //第二步:依次将MP3播放地址传入,
    ttsPlayerPool.addPlayUrl(url);

    //第三步:开始播放,需要将所有待播放的的url list完整的传入之后再开始播放
    ttsPlayerPool.start();

    //停止播放
    ttsPlayerPool.stop();



使用方式二

一边往播放池加入播放链接,一边播放,不用等到所有的播放List准备完毕再调用播放,具体使用示例如下:

    //第一步:创建播放池
    //textList为client.SparseArray(text)切割的结果
    TtsPlayerPool ttsPlayerPool = TtsPlayerPool.create(textList.size());

    //播放状态
    ttsPlayerPool.setCallback(new MyTtsCalkBack());

    //第二步:依次将MP3播放地址传入
    ttsPlayerPool.addPlayUrlAndStart(url);

    //停止播放
    ttsPlayerPool.stop();
  • 如果调用stop之后再次调用addPlayUrlAndStart则会再次进入播放状态,所以可以在停止的时候将ttsPlayerPool置空,清除addPlayUrlAndStart的触发条件。

TtsPlayerPool特殊说明

  • TtsPlayerPool.create传入的大小要与最终加入的播放链接List的大小一致,否则播放状态onPlayComplete将不会回调

二、TTS合成并播放

  • 该方式请求TTS后会在TuringOSClientListener中回调请求日志,并在TuringOSClientPlayListener中回调播放信息。
  • 该方法时请求后直接播放音频,不需要单独的开启播放的操作。所针对一些合成并播放的场景可以使用该方式;
  • 该方式不支持设置TtsRequestConfig的format参数。

方法说明:

 /**
     * 
     * @param text 合成的目标文字
     * @param ttsRequestConfig 可以为null,使用默认值
     * @param listener TuringOSClientListener
     * @param turingOSClientPlayListener TuringOSClientPlayListener
     * @return
     */
    public SparseArray<String> actionTtsPlay(String text,
                           TtsRequestConfig ttsRequestConfig, 
                           TuringOSClientListener listener,
                           TuringOSClientPlayListener turingOSClientPlayListener);

TtsRequestConfig为TTS合成参数,可以为null,也可以根据需要指定参数值。

播放状态控制

停止播放:

client.actionStopPlay();

暂停播放:

client.actionPausePlay();

继续播放:

client.actionResumePlay(); 

注意:以上播放控制的方法对语音聊天模块同样有效,所以尽可能明确设备正在处理播放的模块。

返回示例:

{
    "code":200,
    "globalId":"130611147397245001",
    "message":"success",
    "nlpResponse":{
        "intent":{
            "code":50101
        },
        "results":[
            {
                "groupType":0,
                "resultType":"text",
                "values":{
                    "ttsStreamId":"fb6b658e88194dbfab969f829348097f",
                    "text":"佩奇(Peppa Pig)(英文配音:海莉·博德,中文配音:陈奕雯) 佩奇是一只非常可爱的小猪,她和她的妈妈、爸爸以及弟弟乔治生活在一起。她和弟弟一样很喜欢恐龙,尤其是马门溪龙。 她最喜欢跳泥坑,"
                }
            }
        ]
    }
}

使用该方式时语音合成成功会在onResult返回合成信息,若目标文字过长时,会分段返回结果,调用开始后直接播放音频。

三、TTS合成文件

  • 该方式请求TTS后会在TuringOSClientListener的onResult中回调合成的文件路径,具体值为extension值。
  • 该方式中TtsRequestConfig不应为空,并且需要设置format参数;
  • 该方式需要传入合成文件的存储路径,例如:String filePath = “/storage/emulated/0/turingos/tts/”,合成结果为:/storage/emulated/0/turingos/tts/WAV_16_16_20200630172821.wav;
  • 合成文件名规则:WAV_16_16_20200630172821.wav,格式+日期+对应格式的文件后缀,文件格式应为ttsRequestConfig中的format参数的值;
  • 当目标文字过长时,从开始请求到合成完成回调结果需要一定的延时。

方法说明:

  /**
     * 
     * @param text 合成目标文字
     * @param filePath 合成之后的文件的文件父路径
     * @param ttsRequestConfig
     * @param listener
     * @return
     */
    public SparseArray<String> actionTtsToUri(String text, 
                                              String filePath, 
                                              TtsRequestConfig ttsRequestConfig,
                                              TuringOSClientListener listener);

    //示例
    TtsRequestConfig.Builder ttsRequestConfigBuilder = new TtsRequestConfig.Builder();
        ttsRequestConfigBuilder.pitch(pitch + 1)
                .speed(speed + 1)
                .volume(volume + 1)
                .arousal(arousal + 1)
                //需要指定tts合成的格式
                .format("WAV_16_16")
                .tone(voiveTone);
    TtsRequestConfig ttsRequestConfig = ttsRequestConfigBuilder.build();
    String path = SdkInitializer.getFilePath() + "tts/";
    client.actionTtsToUri(text, path, ttsRequestConfig, listener);