前言
Link : Microsoft Speech API overview
通过这个链接,大致了解Bing speech API的语音识别和语音合成两部分,
这次是需要用到TTS,所以就直接看TTS相关的文档。
Link : Bing text to speech API
简介
使用Bing语音合成API,需要应用程序通过发送HTTP请求到云端,云端合成为人声后返回音频文件。
语音合成请求
JSON Web Token(JWT) access token
每一个的语音合成请求都需要一个JSON Web Token(JWT) access token,且这个JWT要放在语音请求的header中。每一个JWT持续10分钟,如果超时或者没有获得这个JWT,那么你的语音请求就会得到**[403 Forbidden]**的response。
所以,发送语音请求的第一步需要根据你的API密钥来获取,API密钥就是:
登录后就看的到了,有两个,哪个都行。
根据文档,发送POST请求来获取Base64 access token,用curl就如下:
E:\xxx>curl.exe -X POST --header "Content-Length: 0" --header "Ocp-Apim-Subscription-Key:your api key goes here" "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"
当然,用几次你就会想还是写个程序来的方便,哈哈。
那么,就得到了Base64 access token的一串东西,现在可以来发送语音合成的请求了。
HTTP headers
如下表:
Header | Value | Comments |
---|---|---|
Content-Type | application/ssml+xml | The input content type. |
X-Microsoft-OutputFormat | 1.ssml-16khz-16bit-mono-tts 2.raw-16khz-16bit-mono-pcm 3.audio-16khz-16kbps-mono-siren 4.riff-16khz-16kbps-mono-siren 5.riff-16khz-16bit-mono-pcm 6.audio-16khz-128kbitrate-mono-mp3 7.audio-16khz-64kbitrate-mono-mp3 8.audio-16khz-32kbitrate-mono-mp3 | The output audio format. |
X-Search-AppId | A GUID (hex only, no dashes) | An ID that uniquely identifies the client application. This can be the store ID for apps. If one is not available, the ID can be user generated for an application. |
X-Search-ClientID | A GUID (hex only, no dashes) | An ID that uniquely identifies an application instance for each installation. |
User-Agent | Application name | The application name is required and must be fewer than 255 characters. |
Authorization | Authorization token | See the Authorization token section. |
不是每一项都必须,我只用了加粗的那3个header
Input parameters
好,头已经准备就绪,只等……
body部分包含SSML,SSML通过更改参数可以改变输出的声音。
所以,语音输出请求就像这样:
POST /synthesize
HTTP/1.1
Host: speech.platform.bing.com
X-Microsoft-OutputFormat: riff-8khz-8bit-mono-mulaw
Content-Type: application/ssml+xml
Authorization: Bearer [Base64 access_token]
<speak version='1.0' xml:lang='en-US'><voice xml:lang='en-US' xml:gender='Female' name='Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)'>Microsoft Bing Voice Output API</voice></speak>
请求之后一会儿服务器返回音频文件,程序中写入文件就好了。
SSML参考资料:
Changing voice output via SSML
SSML W3C Specification
P.S. Bing speech和Microsoft speech似乎不是同一套东西,但大部分规则是相通的:
Speech Synthesis Markup Language Reference
(这里是个总览,可以选择具体元素的页面)
以下几个页面对SSML的修饰有比较大的帮助:
1.prosody Element
(包括音调、速率、持续时间、音量等的描述)
2.phoneme Element
(这个元素主要针对如何改变发音的描述,此页面没有中文的例子,但可以先看看)
SSML说明
< prosody >音律调整
此部分说明了音律调整要用到的包括pitch(音调)、contour("音形")、 range(音调范围)、rate(速率)、duration(持续时间)和volume(音量)
语法:
<prosody pitch="value" contour="value" range="value" rate="value" duration="value" volume="value"> </prosody>
参数信息:
属性 | 描述 |
---|---|
pitch | 代表文字的基准音调,它的值有3种不同的方式表达:1.一个绝对的值,使用“数字Hz”的方式。例如,600Hz;2.一个相对的值,使用“+/-数字Hz/st”的方式,表示音调的变化程度。例如,+80Hz 或 -2st。st(semitone)表示一个半音;3.一个枚举的值,包括:x-low, low, medium, high, x-high, or default |
contour | 在不同的时间段内描述出音调变化(感觉是个高级特性),时间段用%作区隔,代表在此百分比时音调开始变化。例如,< prosody contour="(0%,+20Hz) (10%,-2st) (40%,+10Hz)" > |
range | 代表文字音调的范围,值同上面的pitch |
rate | 代表文字的阅读速率,它的值有2种不同的方式表达:1.一个相对的值,例如:1表示速率不变;.5表示速率减半;3表示3倍基本速率(测试发现用"+20%"的方式也行);2.一个枚举的值,包括:x-slow, slow, medium, fast, x-fast, or default |
duration | 文字阅读的持续时间,单位为s或ms |
volume | 代表阅读的音量大小,它的值有3中不同的方式表达:1.一个绝对的值,范围在0.0~100.0(从最小声到最大声)。例如,75。默认为100.0;2.一个相对的值,使用“+/-数字”的方式。例如,+10或-5.5;3.一个枚举的值,包括:silent, x-soft, soft, medium, loud, x-loud, or default |
< phoneme >音素调整
此部分说明了如何从支持的语音字母表中来更改文字的发音。
语法:
<phoneme alphabet="string" ph="string"> </phoneme>
注意:参数alphabet的值只有3个:ipa | x-microsoft-sapi | x-microsoft-ups
也就是支持的发音字母表,参见:3.Phonetic Alphabet Reference
(Microsoft.speech的发音表,总共有3个,SAPI支持中文)
参数信息:
属性 | 描述 |
---|---|
alphabet | 可选。选择一个合适的发音字母表,值为:ipa / x-microsoft-sapi / x-microsoft-ups |
ph | 必须。一个描述如何发音的字符串,如果这个字符串不合法,TTS引擎会拒绝SSML文档,不会生成任何输出。中文发音标注的方式,例如,< phoneme alphabet="x-microsoft-sapi" ph="o 3" >哦< phoneme >,这里“哦”字的发音就是o的第三声。另外,12345代表汉语发音的4声和轻声。 |
SSML例子:
<speak version="1.0"
xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="http://www.w3.org/2001/mstts" xml:lang="zh-CN">
<voice xml:lang="zh-CN" name="Microsoft Server Speech Text to Speech Voice (zh-CN, Kangkang, Apollo)">
<prosody rate="+20%" pitch="+8st" duration="220ms">
<phoneme alphabet="x-microsoft-sapi" ph="a 1">啊</phoneme>
</prosody>
<prosody rate="-20%" duration="380ms">
<phoneme alphabet="x-microsoft-sapi" ph="ou 1">哦</phoneme>
</prosody>
</voice>
</speak>
对了,还有另一位老兄的文章,是Bing speech语音识别那部分的:http://blog.****.net/kwgrg/article/details/54809238
Have fun!