Skip to content

Instantly share code, notes, and snippets.

@sdcb
Created September 18, 2018 07:29
Show Gist options
  • Save sdcb/a126780a454cdfbcff39b61f40132bb4 to your computer and use it in GitHub Desktop.
Save sdcb/a126780a454cdfbcff39b61f40132bb4 to your computer and use it in GitHub Desktop.
Azure text to speech LINQPad
<Query Kind="Program">
<Output>DataGrids</Output>
<Reference>&lt;RuntimeDirectory&gt;\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