[C#] Cognitive Services日本語音声合成API『Bing Text To Speech API』の更新

Cloud Application Engineerの内海です。

Microsoft Azure Cognitive Servicesの音声合成APIである『Speech API』に更新があったようです。
今回はトークン取得と音声合成API『Bing Text To Speech API』について少し触れたいと思います。

まずは公式ドキュメントをどうぞ ^^) _旦~~
https://www.microsoft.com/cognitive-services/en-us/Speech-api/documentation/overview

まずはTokenの取得方法について(このTokenは音声認識APIのコール時にも使えます)

更新前に比べ、以下の点が変わっているように思えます。
・Post先URLの変更(ProjectOxfordからCognitiveServicesに変わっていました)
・変更前に色々あったリクエストパラメータがなくなっている
・そのままTokenのみが文字列として返ってくる(変更前はJson形式としてプロパティの1つとして返ってきました)

何というか叩きやすくなりました。
以下がトークン取得部分の関数になります。

非同期関数なのでご注意を…(HttpClientが使いたかっただけ

        static async Task<string> GetToken()
        {
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{your key}");
            var uri = @"https://api.cognitive.microsoft.com/sts/v1.0/issueToken";
            using (var content = new ByteArrayContent(new byte[0]))
            {
                content.Headers.ContentLength = 0;
                var response = await client.PostAsync(uri, content);
                return await response.Content.ReadAsStringAsync();
            }
        }

※{your key}にはあなたのKeyを!

続いて音声合成関数、こちらも非同期実装(HttpClientが使いたかっただけ
先ほど取得したtokenをもとに音声合成APIをコール、ローカルにwavファイルが生成されます

        static async Task TextToSpeech(string token)
        {
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-Microsoft-OutputFormat", "riff-16khz-16bit-mono-pcm");
            client.DefaultRequestHeaders.Add("Authorization", "Bearer "+token);
            client.DefaultRequestHeaders.Add("X-Search-AppId", Guid.NewGuid().ToString("N"));
            client.DefaultRequestHeaders.Add("X-Search-ClientID", Guid.NewGuid().ToString("N"));
            client.DefaultRequestHeaders.Add("User-Agent", "ListenToMySongs!");
            var uri = @"https://speech.platform.bing.com/synthesize";

            //合成させる文章生成部分(ssmlでPostするので注意を!)
            var speechSsml = "<prosody volume='+50'>おはよう!</prosody>みんなおはよう!";
            var speakSsml = $"<speak version='1.0' xml:lang='en-US'><voice xml:lang='ja-JP' xml:gender='Male' name='Microsoft Server Speech Text to Speech Voice (ja-JP, Ichiro, Apollo)'>{speechSsml}</voice></speak>";

            byte[] bytes = Encoding.UTF8.GetBytes(speakSsml);
            using (var content = new ByteArrayContent(bytes))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/ssml+xml");
                var response = await client.PostAsync(uri, content);
                var responseStream = response.Content.ReadAsStreamAsync().Result;
                using (var outputFileStream = new FileStream("file.wav",FileMode.Create,FileAccess.Write))
                {
                    responseStream.CopyTo(outputFileStream);
                }
            }
        }

以上になります。
次回はCognitiveの音声合成APIとテキスト解析APIを組み合わせてちょっと遊んでみようと思います。