記事公開日
最終更新日
Azure AI 音声使ってテキスト読み上げ

AI×音声ではどのようなサービスがあるのだろうと考えていたところ、Azure AI音声という面白そうなサービスがありましたので、 こちらでテキスト読み上げをさせてみようと思います。
Azure AI音声とは
Azure AI音声は、音声をテキストに変換したり、テキストを自然な音声で読み上げたり、音声を翻訳したりする機能を提供するサービスです。 例えば、会議の内容をリアルタイムで文字起こししたり、カスタム音声アシスタントを作成したりすることができます。 また、話者認識機能を使って、会話中に誰が話しているかを識別することも可能です。https://azure.microsoft.com/ja-jp/products/ai-services/ai-speech
音声テキスト読み上げはAzure AI音声以外にAzure OpenAI Serviceでもできるようです。 細かな違いがありますのでそちらは以下を参照ください。
https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/openai-voices
テキスト→音声変換
まずはAzurePortalでSpeech Servicesリソースを作成しましょう。AzurePortalの検索窓で"音声サービス"と検索すれば出てきます。次はコンソールアプリを作成します。 コードは以下です。本コードはコンソールに入力したテキストを読み上げるコードです。 基本的にこちら をベースに作成しており、音声をファイル保存するコードを追加しています。
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
// This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
static string speechKey = Environment.GetEnvironmentVariable("SPEECH_KEY");
static string speechRegion = Environment.GetEnvironmentVariable("SPEECH_REGION");
static string filePath = @".\output.mp3";
static void OutputSpeechSynthesisResult(SpeechSynthesisResult speechSynthesisResult, string text)
{
switch (speechSynthesisResult.Reason)
{
case ResultReason.SynthesizingAudioCompleted:
Console.WriteLine($"Speech synthesized for text: [{text}]");
using (var stream = AudioDataStream.FromResult(speechSynthesisResult))
{
stream.SaveToWaveFileAsync(filePath).Wait();
Console.WriteLine($"Audio content saved to file: {filePath}");
}
break;
case ResultReason.Canceled:
var cancellation = SpeechSynthesisCancellationDetails.FromResult(speechSynthesisResult);
Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");
if (cancellation.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails=[{cancellation.ErrorDetails}]");
Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
}
break;
default:
break;
}
}
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion);
// The neural multilingual voice can speak different languages based on the input text.
speechConfig.SpeechSynthesisVoiceName = "en-US-AvaMultilingualNeural";
using (var speechSynthesizer = new SpeechSynthesizer(speechConfig))
{
// Get text from the console and synthesize to the default speaker.
Console.WriteLine("Enter some text that you want to speak >");
string text = Console.ReadLine();
var speechSynthesisResult = await speechSynthesizer.SpeakTextAsync(text);
OutputSpeechSynthesisResult(speechSynthesisResult, text);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
実行し、コンソールにテキストを入力してみましょう。

出力された音声ファイルは以下です。いい感じに読み上げられています。
また、以下の"en-US-AvaMultilingualNeural"部分を変えることでテキスト読み上げ音声を変えることができます。
サポートされている言語、音声は以下を参照ください。
https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/language-support?tabs=tts
speechConfig.SpeechSynthesisVoiceName = "en-US-AvaMultilingualNeural";
ロケールによる精度、発音の違い
前項で指定した"en-US-AvaMultilingualNeural"のように"Multilingual"とついているテキスト読み上げ音声は多言語音声です。ロケールや多言語音声か否かを変えることでどのように音声が変わるか見てみようと思います。
※"ja-JP-MasaruMultilingualNeural"はパブリックプレビュー段階のため、米国東部、東南アジア、西ヨーロッパリージョンのみで使用可能です。
【テキスト読み上げ音声:en-US-AvaMultilingualNeural(多言語音声)】
| 読み上げテキスト | 音声 | コメント |
|---|---|---|
| Thanks for visiting my blog. | 流暢に読めている。 | |
| 3月1日は日曜日で祝日、晴れの日でした。 | 正しく読めているが、若干英語っぽい発音。 | |
| 天照大神 | 中国語?で読まれている。 | |
| 押忍 | 読み間違え。 |
【テキスト読み上げ音声:en-US-AvaNeural】
| 読み上げテキスト | 音声 | コメント |
|---|---|---|
| Thanks for visiting my blog. | 流暢に読めている。 | |
| 3月1日は日曜日で祝日、晴れの日でした。 | 3、1の数字のみ読まれている? | |
| 天照大神 | 音声ファイルは作成されるものの再生不可。 | 読めない。 |
| 押忍 | 音声ファイルは作成されるものの再生不可。 | 読めない。 |
【テキスト読み上げ音声:ja-JP-MasaruMultilingualNeural(多言語音声)】
| 読み上げテキスト | 音声 | コメント |
|---|---|---|
| Thanks for visiting my blog. | 流暢に読めている。 | |
| 3月1日は日曜日で祝日、晴れの日でした。 | 流暢に読めている。 | |
| 天照大神 | 中国語?で読まれている。 | |
| 押忍 | 読み間違え。 |
【テキスト読み上げ音声:ja-JP-NanamiNeural】
| 読み上げテキスト | 音声 | コメント |
|---|---|---|
| Thanks for visiting my blog. | 正しく読めているが日本人が話す英語っぽい発音。 | |
| 3月1日は日曜日で祝日、晴れの日でした。 | 流暢に読めている。 | |
| 天照大神 | カタコトだがちゃんと読めている。 | |
| 押忍 | 読み間違え。 |
多言語音声ではen-USロケールで日本語、ja-JPロケールで英語を読むことができています。
一方、多言語音声でないものはロケールで指定していない言語を読むことができない、若しくはカタコトのような発音になっています。
"押忍"に関してはいずれも読み間違えが発生しています。まだまだ精度がすごく高いとは言えないですね。
また、面白いのは多言語音声のja-JP-MasaruMultilingualNeuralでは中国語のような音声であった"天照大神"が、
多言語音声ではないja-JP-NanamiNeuralではカタコトではあるものの読めていることです。
ですので、テキストの言語がわかっている際はむやみに多言語音声を使うのではなく、その言語のロケールに合った音声を使用する方が良さそうです。
最後に
いかがだったでしょうか。 他のAIサービスを使用してテキストがどの言語で記載されているのか動的に判定し、読み上げ音声を選択できれば非常に流暢な読み上げができそうですね。QESでは、「AIチャットボット構築サービス」をはじめとして、各AIサービスを利用したシステム導入のお手伝いをしております。それ以外でも様々なアプリケーションの開発・導入を行っております。提供するサービス・ソリューションにつきましては こちら に掲載しております。
システム開発・構築でお困りの問題や弊社が提供するサービス・ソリューションにご興味を抱かれましたら、是非一度 お問い合わせ ください。
※このブログで参照されている、Microsoft、Azure OpenAI、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。
※その他の会社名、製品名は各社の登録商標または商標です。


