前言
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.csdn.net/kwgrg/article/details/54809238
Have fun!