Created
September 18, 2018 07:29
-
-
Save sdcb/a126780a454cdfbcff39b61f40132bb4 to your computer and use it in GitHub Desktop.
Azure text to speech LINQPad
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Query Kind="Program"> | |
<Output>DataGrids</Output> | |
<Reference><RuntimeDirectory>\System.Net.Http.dll</Reference> | |
<NuGetReference>Microsoft.CognitiveServices.Speech</NuGetReference> | |
<NuGetReference>NAudio</NuGetReference> | |
<NuGetReference>NAudio.Lame</NuGetReference> | |
<Namespace>Microsoft.CognitiveServices.Speech</Namespace> | |
<Namespace>NAudio.Wave</Namespace> | |
<Namespace>System.Net.Http</Namespace> | |
<Namespace>System.Net.Http.Headers</Namespace> | |
<Namespace>System.Threading.Tasks</Namespace> | |
</Query> | |
async Task Main() | |
{ | |
string token = await CreateToken(MyExtensions.RecognizeSubscriptionKey); | |
var text = @"床前明月光,疑是地上霜。举头望明月,低头思故乡。"; | |
await PlayMp3Stream(await ConvertTextToStream(token, text, "zh-CN", "Male", "Microsoft Server Speech Text to Speech Voice (zh-CN, Kangkang, Apollo)")); | |
await PlayMp3Stream(await ConvertTextToStream(token, text, "zh-CN", "Female", "Microsoft Server Speech Text to Speech Voice (zh-CN, Yaoyao, Apollo)")); | |
await PlayMp3Stream(await ConvertTextToStream(token, text, "zh-CN", "Female", "Microsoft Server Speech Text to Speech Voice (zh-CN, HuihuiRUS)")); | |
} | |
HttpClient client = new HttpClient(); | |
async Task<string> CreateToken(string subscriptionKey) | |
{ | |
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"); | |
request.Headers.Add("Ocp-Apim-Subscription-Key", subscriptionKey); | |
var response = await client.SendAsync(request); | |
var token = await response.Content.ReadAsStringAsync(); | |
return token; | |
} | |
async Task<Stream> ConvertTextToStream(string token, string text, | |
string locale = "zh-CN", | |
string gender = "Male", | |
string name = "Microsoft Server Speech Text to Speech Voice (zh-CN, Kangkang, Apollo)") | |
{ | |
var request = new HttpRequestMessage(HttpMethod.Post, "https://speech.platform.bing.com/synthesize"); | |
request.Headers.TryAddWithoutValidation("Content-Type", "application/ssml+xml"); | |
request.Headers.Add("X-Microsoft-OutputFormat", "audio-16khz-128kbitrate-mono-mp3"); | |
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); | |
request.Headers.Add("X-Search-AppId", "20c69425fac84a3ababd5f3400eb011f"); | |
request.Headers.Add("X-Search-ClientId", "bfb326e629aa44659a69a23389aea581"); | |
request.Headers.UserAgent.ParseAdd("LINQPad"); | |
request.Content = new StringContent(new XDocument( | |
new XElement("speak", | |
new XAttribute("version", "1.0"), | |
new XAttribute(XNamespace.Xml + "lang", "en-US"), | |
new XElement("voice", | |
new XAttribute(XNamespace.Xml + "lang", locale), | |
new XAttribute(XNamespace.Xml + "gender", gender), | |
new XAttribute("name", name), text))) | |
.ToString()); | |
var response = await client.SendAsync(request); | |
response.EnsureSuccessStatusCode(); | |
var stream = await response.Content.ReadAsStreamAsync(); | |
return stream; | |
} | |
async Task PlayMp3Stream(Stream stream) | |
{ | |
var device = new WaveOut(); | |
device.Init(new Mp3FileReader(stream)); | |
device.Play(); | |
while (device.PlaybackState == PlaybackState.Playing) | |
{ | |
await Task.Delay(100); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment