テキスト読み上げの概要Get started with text-to-speech

このクイックスタートでは、Speech SDK を使用してテキスト読み上げ合成を行うための一般的な設計パターンについて説明します。In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. まずは基本的な構成と合成を行った後、次のようなより高度なカスタム アプリケーション開発の例に進みます。You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • インメモリ ストリームとして応答を取得するGetting responses as in-memory streams
  • 出力のサンプル レートとビット レートをカスタマイズするCustomizing output sample rate and bit rate
  • SSML (音声合成マークアップ言語) を使用して合成要求を送信するSubmitting synthesis requests using SSML (speech synthesis markup language)
  • ニューラル音声を使用するUsing neural voices

記事をスキップして GitHub 上のサンプルにアクセスするSkip to samples on GitHub

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の C# クイックスタート サンプルを参照してください。If you want to skip straight to sample code, see the C# quickstart samples on GitHub.

前提条件Prerequisites

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。This article assumes that you have an Azure account and Speech service subscription. アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しくださいIf you don't have an account and subscription, try the Speech service for free.

Speech SDK のインストールInstall the Speech SDK

何らかの操作を行うには、事前に Speech SDK をインストールしておく必要があります。Before you can do anything, you'll need to install the Speech SDK. ご利用のプラットフォームに応じて、次の手順を行います。Depending on your platform, use the following instructions:

依存関係のインポートImport dependencies

この記事の例を実行するには、スクリプトの先頭に次の using ステートメントを含めます。To run the examples in this article, include the following using statements at the top of your script.

using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

音声構成を作成するCreate a speech configuration

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。To call the Speech service using the Speech SDK, you need to create a SpeechConfig. このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

注意

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

SpeechConfig を初期化するには、次に示すようないくつかの方法があります。There are a few ways that you can initialize a SpeechConfig:

  • サブスクリプションの場合: キーと、それに関連付けられたリージョンを渡します。With a subscription: pass in a key and the associated region.
  • エンドポイントの場合: Speech Service エンドポイントを渡します。With an endpoint: pass in a Speech service endpoint. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • ホストの場合: ホスト アドレスを渡します。With a host: pass in a host address. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • 認証トークンの場合: 認証トークンと、それに関連付けられたリージョンを渡します。With an authorization token: pass in an authorization token and the associated region.

この例では、サブスクリプション キーとリージョンを使用して SpeechConfig を作成します。In this example, you create a SpeechConfig using a subscription key and region. Speech Service を無料で試す」の手順に従って、これらの資格情報を取得します。Get these credentials by following steps in Try the Speech service for free. また、この記事の残りの部分で使用する、基本的な定型コードをいくつか作成します。これを変更して、さまざまなカスタマイズを行います。You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

public class Program 
{
    static async Task Main()
    {
        await SynthesizeAudioAsync();
    }

    static async Task SynthesizeAudioAsync() 
    {
        var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    }
}

音声をファイルに合成するSynthesize speech to a file

次に、SpeechSynthesizer オブジェクトを作成します。これにより、テキストから音声への変換と、スピーカー、ファイル、またはその他の出力ストリームへの出力が実行されます。Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizer は、前の手順で作成した SpeechConfig オブジェクトと、出力結果の処理方法を指定する AudioConfig オブジェクトをパラメーターとして受け取ります。The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioConfig object that specifies how output results should be handled.

まず、FromWavFileOutput() 関数を使用して .wav ファイルに出力を自動的に書き込む AudioConfig を作成し、次にそれを using ステートメントでインスタンス化します。To start, create an AudioConfig to automatically write the output to a .wav file, using the FromWavFileOutput() function, and instantiate it with a using statement. このコンテキストの using ステートメントによって、アンマネージド リソースが自動的に破棄され、破棄後にオブジェクトがスコープ外になります。A using statement in this context automatically disposes of unmanaged resources and causes the object to go out of scope after disposal.

static async Task SynthesizeAudioAsync() 
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
}

次に、別の using ステートメントを使用して SpeechSynthesizer をインスタンス化します。Next, instantiate a SpeechSynthesizer with another using statement. config オブジェクトと audioConfig オブジェクトをパラメーターとして渡します。Pass your config object and the audioConfig object as params. こうすることで、音声合成を実行してファイルに書き込むことが、テキスト文字列を使用して SpeakTextAsync() を実行するのと同じぐらい簡単になります。Then, executing speech synthesis and writing to a file is as simple as running SpeakTextAsync() with a string of text.

static async Task SynthesizeAudioAsync() 
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
    using var synthesizer = new SpeechSynthesizer(config, audioConfig);
    await synthesizer.SpeakTextAsync("A simple test to write to a file.");
}

このプログラムを実行すると、合成された .wav ファイルが、指定した場所に書き込まれます。Run the program, and a synthesized .wav file is written to the location you specified. 以上は最も基本的な使用方法の好例ですが、この次は、カスタム シナリオに対応できるよう、出力をカスタマイズし、出力応答をインメモリ ストリームとして処理する方法について説明します。This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

スピーカー出力に合成するSynthesize to speaker output

場合によっては、合成された音声をスピーカーに直接出力することが必要になる場合があります。In some cases, you may want to directly output synthesized speech directly to a speaker. これは、上記の例で SpeechSynthesizer を作成するときに、AudioConfig パラメーターを省略するだけで実行できます。To do this, simply omit the AudioConfig param when creating the SpeechSynthesizer in the example above. これにより、現在のアクティブな出力デバイスに対して出力が行われます。This outputs to the current active output device.

static async Task SynthesizeAudioAsync() 
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var synthesizer = new SpeechSynthesizer(config);
    await synthesizer.SpeakTextAsync("Synthesizing directly to speaker output.");
}

結果をインメモリ ストリームとして取得するGet result as an in-memory stream

音声アプリケーション開発の多くのシナリオでは、結果として得られたオーディオ データは、ファイルに直接書き込むのではなく、インメモリ ストリームとして必要となるケースがよくあります。For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. その場合、次のようなカスタム動作を構築できます。This will allow you to build custom behavior including:

  • 結果として得られたバイト配列を、カスタム ダウンストリーム サービス向けのシーク可能なストリームとして抽象化する。Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • 結果を他の API またはサービスと統合する。Integrate the result with other API's or services.
  • オーディオ データの変更やカスタム .wav ヘッダーの記述などを行う。Modify the audio data, write custom .wav headers, etc.

この変更は、前の例から簡単に行うことができます。It's simple to make this change from the previous example. まず、AudioConfig ブロックを削除します。これは、この時点から出力動作を手動で管理して制御を強化するためです。First, remove the AudioConfig block, as you will manage the output behavior manually from this point onward for increased control. 次に、SpeechSynthesizer コンストラクターの AudioConfignull を渡します。Then pass null for the AudioConfig in the SpeechSynthesizer constructor.

注意

前述のスピーカー出力の例のように省略するのではなく、AudioConfignull を渡した場合、既定ではオーディオは現在のアクティブな出力デバイスで再生されません。Passing null for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

今回は、結果を SpeechSynthesisResult 変数に保存します。This time, you save the result to a SpeechSynthesisResult variable. AudioData プロパティには、出力データの byte [] が含まれます。The AudioData property contains a byte [] of the output data. この byte [] を手動で操作することも、AudioDataStream クラスを使用してインメモリ ストリームを管理することもできます。You can work with this byte [] manually, or you can use the AudioDataStream class to manage the in-memory stream. この例では、AudioDataStream.FromResult() 静的関数を使用して、結果からストリームを取得します。In this example you use the AudioDataStream.FromResult() static function to get a stream from the result.

static async Task SynthesizeAudioAsync() 
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var synthesizer = new SpeechSynthesizer(config, null);
    
    var result = await synthesizer.SpeakTextAsync("Getting the response as an in-memory stream.");
    using var stream = AudioDataStream.FromResult(result);
}

ここから、結果として得られた stream オブジェクトを使用して、任意のカスタム動作を実装できます。From here you can implement any custom behavior using the resulting stream object.

オーディオ形式をカスタマイズするCustomize audio format

次のセクションでは、次のようなオーディオ出力属性をカスタマイズする方法について説明します。The following section shows how to customize audio output attributes including:

  • オーディオ ファイルの種類Audio file type
  • サンプルレートSample-rate
  • ビット深度Bit-depth

オーディオ形式を変更するには、SpeechConfig オブジェクトで SetSpeechSynthesisOutputFormat() 関数を使用します。To change the audio format, you use the SetSpeechSynthesisOutputFormat() function on the SpeechConfig object. この関数には、SpeechSynthesisOutputFormat 型の enum が必要です。これは、出力形式を選択するために使用します。This function expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. 使用できるオーディオ形式の一覧については、リファレンス ドキュメントを参照してください。See the reference docs for a list of audio formats that are available.

要件に応じて、ファイルの種類ごとにさまざまなオプションがあります。There are various options for different file types depending on your requirements. 定義上、Raw24Khz16BitMonoPcm のような未加工の形式にはオーディオ ヘッダーが含まれないことに注意してください。Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. 未加工の形式は、ダウンストリームの実装で未加工のビットストリームをデコードできることがわかっている場合か、ビット深度、サンプル レート、チャネル数などに基づいてヘッダーを手動で作成する場合にのみ使用してください。Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

注意

en-US-AriaRUS および en-US-GuyRUS の音声は、Riff24Khz16BitMonoPcm サンプル レートでエンコードされたサンプルから作成されます。Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

この例では、SpeechConfig オブジェクトに SpeechSynthesisOutputFormat を設定することにより、高忠実度の RIFF 形式 Riff24Khz16BitMonoPcm を指定します。In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the SpeechSynthesisOutputFormat on the SpeechConfig object. 前のセクションの例と同様に、AudioDataStream を使用して結果のインメモリ ストリームを取得し、それをファイルに書き込みます。Similar to the example in the previous section, you use AudioDataStream to get an in-memory stream of the result, and then write it to a file.

static async Task SynthesizeAudioAsync() 
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    config.SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

    using var synthesizer = new SpeechSynthesizer(config, null);
    var result = await synthesizer.SpeakTextAsync("Customizing audio output format.");

    using var stream = AudioDataStream.FromResult(result);
    await stream.SaveToWaveFileAsync("path/to/write/file.wav");
}

プログラムをもう一度実行すると、指定したパスに .wav ファイルが書き込まれます。Running your program again will write a .wav file to the specified path.

SSML を使用して音声の特徴をカスタマイズするUse SSML to customize speech characteristics

音声合成マークアップ言語 (SSML) を使用すると、XML スキーマから要求を送信して、テキスト読み上げ出力のピッチ、発音、読み上げ速度、ボリュームなどを微調整することができます。Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. このセクションでは実用的な使用例をいくつか紹介しますが、詳細なガイドについては、SSML の操作方法に関する記事を参照してください。This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

SSML を使用したカスタマイズを開始するには、音声を切り替える単純な変更を加えます。To start using SSML for customization, you make a simple change that switches the voice. まず、ルート プロジェクト ディレクトリに SSML 構成用の新しい XML ファイルを作成します (この例では ssml.xml)。First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. ルート要素は常に <speak> であり、テキストを <voice> 要素でラップすることで、name パラメーターを使用して音声を変更できます。The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. この例では、音声を男性の英語 (英国) の音声に変更します。This example changes the voice to a male English (UK) voice. この音声が 標準 音声であることに注意してください。これは、ニューラル 音声とは価格や可用性が異なります。Note that this voice is a standard voice, which has different pricing and availability than neural voices. サポートされている 標準 音声の 全一覧を参照してください。See the full list of supported standard voices.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    When you're on the motorway, it's a good idea to use a sat-nav.
  </voice>
</speak>

次に、XML ファイルを参照するように音声合成要求を変更する必要があります。Next, you need to change the speech synthesis request to reference your XML file. 要求はほとんど同じですが、SpeakTextAsync() 関数を使用する代わりに、SpeakSsmlAsync() を使用します。The request is mostly the same, but instead of using the SpeakTextAsync() function, you use SpeakSsmlAsync(). この関数には XML 文字列が必要なので、最初に File.ReadAllText() を使用して SSML 構成を文字列として読み込みます。This function expects an XML string, so you first load your SSML config as a string using File.ReadAllText(). ここからは、結果のオブジェクトは前の例とまったく同じです。From here, the result object is exactly the same as previous examples.

注意

Visual Studio を使用している場合、既定では、ビルド構成で XML ファイルが見つからない可能性があります。If you're using Visual Studio, your build config likely will not find your XML file by default. この問題を解決するには、該当する XML ファイルを右クリックし、 [プロパティ] を選択します。To fix this, right click the XML file and select Properties. [ビルド アクション][コンテンツ] に、 [出力ディレクトリにコピー][常にコピーする] に変更します。Change Build Action to Content, and change Copy to Output Directory to Copy always.

public static async Task SynthesizeAudioAsync() 
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var synthesizer = new SpeechSynthesizer(config, null);
    
    var ssml = File.ReadAllText("./ssml.xml");
    var result = await synthesizer.SpeakSsmlAsync(ssml);

    using var stream = AudioDataStream.FromResult(result);
    await stream.SaveToWaveFileAsync("path/to/write/file.wav");
}

出力は機能しますが、さらに自然に聞こえるように、いくつかの簡単な変更を加えることができます。The output works, but there a few simple additional changes you can make to help it sound more natural. 話す速度が全体的に少し速すぎるため、<prosody> タグを追加して、速度を既定速度の 90% に下げます。The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. また、文中のコンマの後の一時停止が少し短すぎて、不自然に聞こえます。Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. この問題を解決するには、<break> タグを追加して音声を遅らせ、time パラメーターを 200ms に設定します。To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. 合成を再実行して、これらのカスタマイズが出力にどのように影響したかを確認します。Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

ニューラル音声Neural voices

ニューラル音声とは、ディープ ニューラル ネットワークを使用した音声合成アルゴリズムです。Neural voices are speech synthesis algorithms powered by deep neural networks. ニューラル音声を使用した場合、合成音声は人間の録音とほとんど区別がつきません。When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. ニューラル音声では、人間のような自然な韻律と明瞭な発音により、ユーザーが AI システムと対話する際のリスニング疲労が大幅に軽減されます。With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

ニューラル音声に切り替えるには、nameニューラル音声オプションのいずれかに変更します。To switch to a neural voice, change the name to one of the neural voice options. 次に、mstts の XML 名前空間を追加し、テキストを <mstts:express-as> タグ内にラップします。Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. 読み上げスタイルをカスタマイズするには、style パラメーターを使用します。Use the style param to customize the speaking style. この例では cheerful を使用していますが、customerservice または chat に設定して、読み上げスタイルの違いを確認してみてください。This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

重要

ニューラル音声は、"米国東部"、"東南アジア"、"西ヨーロッパ" のリージョンで作成された音声リソースで のみ サポートされています。Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

このクイックスタートでは、Speech SDK を使用してテキスト読み上げ合成を行うための一般的な設計パターンについて説明します。In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. まずは基本的な構成と合成を行った後、次のようなより高度なカスタム アプリケーション開発の例に進みます。You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • インメモリ ストリームとして応答を取得するGetting responses as in-memory streams
  • 出力のサンプル レートとビット レートをカスタマイズするCustomizing output sample rate and bit rate
  • SSML (音声合成マークアップ言語) を使用して合成要求を送信するSubmitting synthesis requests using SSML (speech synthesis markup language)
  • ニューラル音声を使用するUsing neural voices

記事をスキップして GitHub 上のサンプルにアクセスするSkip to samples on GitHub

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の C++ クイックスタート サンプルを参照してください。If you want to skip straight to sample code, see the C++ quickstart samples on GitHub.

前提条件Prerequisites

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。This article assumes that you have an Azure account and Speech service subscription. アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しくださいIf you don't have an account and subscription, try the Speech service for free.

Speech SDK のインストールInstall the Speech SDK

何らかの操作を行うには、事前に Speech SDK をインストールしておく必要があります。Before you can do anything, you'll need to install the Speech SDK. ご利用のプラットフォームに応じて、次の手順を行います。Depending on your platform, use the following instructions:

依存関係のインポートImport dependencies

この記事の例を実行するには、スクリプトの先頭に次の import および using ステートメントを含めます。To run the examples in this article, include the following import and using statements at the top of your script.

#include <iostream>
#include <fstream>
#include <string>
#include <speechapi_cxx.h>

using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Audio;

音声構成を作成するCreate a speech configuration

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。To call the Speech service using the Speech SDK, you need to create a SpeechConfig. このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

注意

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

SpeechConfig を初期化するには、次に示すようないくつかの方法があります。There are a few ways that you can initialize a SpeechConfig:

  • サブスクリプションの場合: キーと、それに関連付けられたリージョンを渡します。With a subscription: pass in a key and the associated region.
  • エンドポイントの場合: Speech Service エンドポイントを渡します。With an endpoint: pass in a Speech service endpoint. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • ホストの場合: ホスト アドレスを渡します。With a host: pass in a host address. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • 認証トークンの場合: 認証トークンと、それに関連付けられたリージョンを渡します。With an authorization token: pass in an authorization token and the associated region.

この例では、サブスクリプション キーとリージョンを使用して SpeechConfig を作成します。In this example, you create a SpeechConfig using a subscription key and region. Speech Service を無料で試す」の手順に従って、これらの資格情報を取得します。Get these credentials by following steps in Try the Speech service for free. また、この記事の残りの部分で使用する、基本的な定型コードをいくつか作成します。これを変更して、さまざまなカスタマイズを行います。You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

int wmain()
{
    try
    {
        synthesizeSpeech();
    }
    catch (exception e)
    {
        cout << e.what();
    }
    return 0;
}
    
void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
}

音声をファイルに合成するSynthesize speech to a file

次に、SpeechSynthesizer オブジェクトを作成します。これにより、テキストから音声への変換と、スピーカー、ファイル、またはその他の出力ストリームへの出力が実行されます。Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizer は、前の手順で作成した SpeechConfig オブジェクトと、出力結果の処理方法を指定する AudioConfig オブジェクトをパラメーターとして受け取ります。The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioConfig object that specifies how output results should be handled.

まず、FromWavFileOutput() 関数を使用して .wav ファイルに出力を自動的に書き込む AudioConfig を作成します。To start, create an AudioConfig to automatically write the output to a .wav file, using the FromWavFileOutput() function.

void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
}

次に、config オブジェクトと audioConfig オブジェクトをパラメーターとして渡すことで SpeechSynthesizer をインスタンス化します。Next, instantiate a SpeechSynthesizer, passing your config object and the audioConfig object as params. こうすることで、音声合成を実行してファイルに書き込むことが、テキスト文字列を使用して SpeakTextAsync() を実行するのと同じぐらい簡単になります。Then, executing speech synthesis and writing to a file is as simple as running SpeakTextAsync() with a string of text.

void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, audioConfig);
    auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();
}

このプログラムを実行すると、合成された .wav ファイルが、指定した場所に書き込まれます。Run the program, and a synthesized .wav file is written to the location you specified. 以上は最も基本的な使用方法の好例ですが、この次は、カスタム シナリオに対応できるよう、出力をカスタマイズし、出力応答をインメモリ ストリームとして処理する方法について説明します。This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

スピーカー出力に合成するSynthesize to speaker output

場合によっては、合成された音声をスピーカーに直接出力することが必要になる場合があります。In some cases, you may want to directly output synthesized speech directly to a speaker. これは、上記の例で SpeechSynthesizer を作成するときに、AudioConfig パラメーターを省略するだけで実行できます。To do this, simply omit the AudioConfig param when creating the SpeechSynthesizer in the example above. これにより、現在のアクティブな出力デバイスに対して出力が行われます。This outputs to the current active output device.

void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto synthesizer = SpeechSynthesizer::FromConfig(config);
    auto result = synthesizer->SpeakTextAsync("Synthesizing directly to speaker output.").get();
}

結果をインメモリ ストリームとして取得するGet result as an in-memory stream

音声アプリケーション開発の多くのシナリオでは、結果として得られたオーディオ データは、ファイルに直接書き込むのではなく、インメモリ ストリームとして必要となるケースがよくあります。For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. その場合、次のようなカスタム動作を構築できます。This will allow you to build custom behavior including:

  • 結果として得られたバイト配列を、カスタム ダウンストリーム サービス向けのシーク可能なストリームとして抽象化する。Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • 結果を他の API またはサービスと統合する。Integrate the result with other API's or services.
  • オーディオ データの変更やカスタム .wav ヘッダーの記述などを行う。Modify the audio data, write custom .wav headers, etc.

この変更は、前の例から簡単に行うことができます。It's simple to make this change from the previous example. まず、AudioConfig を削除します。これは、制御を高めるために、この時点から出力動作を手動で管理するからです。First, remove the AudioConfig, as you will manage the output behavior manually from this point onward for increased control. 次に、SpeechSynthesizer コンストラクターの AudioConfigNULL を渡します。Then pass NULL for the AudioConfig in the SpeechSynthesizer constructor.

注意

前述のスピーカー出力の例のように省略するのではなく、AudioConfigNULL を渡した場合、既定ではオーディオは現在のアクティブな出力デバイスで再生されません。Passing NULL for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

今回は、結果を SpeechSynthesisResult 変数に保存します。This time, you save the result to a SpeechSynthesisResult variable. GetAudioData ゲッターは、出力データの byte [] を返します。The GetAudioData getter returns a byte [] of the output data. この byte [] を手動で操作することも、AudioDataStream クラスを使用してインメモリ ストリームを管理することもできます。You can work with this byte [] manually, or you can use the AudioDataStream class to manage the in-memory stream. この例では、AudioDataStream.FromResult() 静的関数を使用して、結果からストリームを取得します。In this example you use the AudioDataStream.FromResult() static function to get a stream from the result.

void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
    
    auto result = synthesizer->SpeakTextAsync("Getting the response as an in-memory stream.").get();
    auto stream = AudioDataStream::FromResult(result);
}

ここから、結果として得られた stream オブジェクトを使用して、任意のカスタム動作を実装できます。From here you can implement any custom behavior using the resulting stream object.

オーディオ形式をカスタマイズするCustomize audio format

次のセクションでは、次のようなオーディオ出力属性をカスタマイズする方法について説明します。The following section shows how to customize audio output attributes including:

  • オーディオ ファイルの種類Audio file type
  • サンプルレートSample-rate
  • ビット深度Bit-depth

オーディオ形式を変更するには、SpeechConfig オブジェクトで SetSpeechSynthesisOutputFormat() 関数を使用します。To change the audio format, you use the SetSpeechSynthesisOutputFormat() function on the SpeechConfig object. この関数には、SpeechSynthesisOutputFormat 型の enum が必要です。これは、出力形式を選択するために使用します。This function expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. 使用できるオーディオ形式の一覧については、リファレンス ドキュメントを参照してください。See the reference docs for a list of audio formats that are available.

要件に応じて、ファイルの種類ごとにさまざまなオプションがあります。There are various options for different file types depending on your requirements. 定義上、Raw24Khz16BitMonoPcm のような未加工の形式にはオーディオ ヘッダーが含まれないことに注意してください。Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. 未加工の形式は、ダウンストリームの実装で未加工のビットストリームをデコードできることがわかっている場合か、ビット深度、サンプル レート、チャネル数などに基づいてヘッダーを手動で作成する場合にのみ使用してください。Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

注意

en-US-AriaRUS および en-US-GuyRUS の音声は、Riff24Khz16BitMonoPcm サンプル レートでエンコードされたサンプルから作成されます。Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

この例では、SpeechConfig オブジェクトに SpeechSynthesisOutputFormat を設定することにより、高忠実度の RIFF 形式 Riff24Khz16BitMonoPcm を指定します。In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the SpeechSynthesisOutputFormat on the SpeechConfig object. 前のセクションの例と同様に、AudioDataStream を使用して結果のインメモリ ストリームを取得し、それをファイルに書き込みます。Similar to the example in the previous section, you use AudioDataStream to get an in-memory stream of the result, and then write it to a file.

void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    config->SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat::Riff24Khz16BitMonoPcm);

    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
    auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();
    
    auto stream = AudioDataStream::FromResult(result);
    stream->SaveToWavFileAsync("path/to/write/file.wav").get();
}

プログラムをもう一度実行すると、指定したパスに .wav ファイルが書き込まれます。Running your program again will write a .wav file to the specified path.

SSML を使用して音声の特徴をカスタマイズするUse SSML to customize speech characteristics

音声合成マークアップ言語 (SSML) を使用すると、XML スキーマから要求を送信して、テキスト読み上げ出力のピッチ、発音、読み上げ速度、ボリュームなどを微調整することができます。Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. このセクションでは実用的な使用例をいくつか紹介しますが、詳細なガイドについては、SSML の操作方法に関する記事を参照してください。This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

SSML を使用したカスタマイズを開始するには、音声を切り替える単純な変更を加えます。To start using SSML for customization, you make a simple change that switches the voice. まず、ルート プロジェクト ディレクトリに SSML 構成用の新しい XML ファイルを作成します (この例では ssml.xml)。First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. ルート要素は常に <speak> であり、テキストを <voice> 要素でラップすることで、name パラメーターを使用して音声を変更できます。The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. この例では、音声を男性の英語 (英国) の音声に変更します。This example changes the voice to a male English (UK) voice. この音声が 標準 音声であることに注意してください。これは、ニューラル 音声とは価格や可用性が異なります。Note that this voice is a standard voice, which has different pricing and availability than neural voices. サポートされている 標準 音声の 全一覧を参照してください。See the full list of supported standard voices.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    When you're on the motorway, it's a good idea to use a sat-nav.
  </voice>
</speak>

次に、XML ファイルを参照するように音声合成要求を変更する必要があります。Next, you need to change the speech synthesis request to reference your XML file. 要求はほとんど同じですが、SpeakTextAsync() 関数を使用する代わりに、SpeakSsmlAsync() を使用します。The request is mostly the same, but instead of using the SpeakTextAsync() function, you use SpeakSsmlAsync(). この関数には XML 文字列が必要なので、最初に SSML 構成を文字列として読み込みます。This function expects an XML string, so you first load your SSML config as a string. ここからは、結果のオブジェクトは前の例とまったく同じです。From here, the result object is exactly the same as previous examples.

void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
    
    std::ifstream file("./ssml.xml");
    std::string ssml, line;
    while (std::getline(file, line))
    {
        ssml += line;
        ssml.push_back('\n');
    }
    auto result = synthesizer->SpeakSsmlAsync(ssml).get();
    
    auto stream = AudioDataStream::FromResult(result);
    stream->SaveToWavFileAsync("path/to/write/file.wav").get();
}

出力は機能しますが、さらに自然に聞こえるように、いくつかの簡単な変更を加えることができます。The output works, but there a few simple additional changes you can make to help it sound more natural. 話す速度が全体的に少し速すぎるため、<prosody> タグを追加して、速度を既定速度の 90% に下げます。The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. また、文中のコンマの後の一時停止が少し短すぎて、不自然に聞こえます。Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. この問題を解決するには、<break> タグを追加して音声を遅らせ、time パラメーターを 200ms に設定します。To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. 合成を再実行して、これらのカスタマイズが出力にどのように影響したかを確認します。Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

ニューラル音声Neural voices

ニューラル音声とは、ディープ ニューラル ネットワークを使用した音声合成アルゴリズムです。Neural voices are speech synthesis algorithms powered by deep neural networks. ニューラル音声を使用した場合、合成音声は人間の録音とほとんど区別がつきません。When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. ニューラル音声では、人間のような自然な韻律と明瞭な発音により、ユーザーが AI システムと対話する際のリスニング疲労が大幅に軽減されます。With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

ニューラル音声に切り替えるには、nameニューラル音声オプションのいずれかに変更します。To switch to a neural voice, change the name to one of the neural voice options. 次に、mstts の XML 名前空間を追加し、テキストを <mstts:express-as> タグ内にラップします。Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. 読み上げスタイルをカスタマイズするには、style パラメーターを使用します。Use the style param to customize the speaking style. この例では cheerful を使用していますが、customerservice または chat に設定して、読み上げスタイルの違いを確認してみてください。This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

重要

ニューラル音声は、"米国東部"、"東南アジア"、"西ヨーロッパ" のリージョンで作成された音声リソースで のみ サポートされています。Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

このクイックスタートでは、Speech SDK を使用してテキスト読み上げ合成を行うための一般的な設計パターンについて説明します。In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. まずは基本的な構成と合成を行った後、次のようなより高度なカスタム アプリケーション開発の例に進みます。You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • インメモリ ストリームとして応答を取得するGetting responses as in-memory streams
  • 出力のサンプル レートとビット レートをカスタマイズするCustomizing output sample rate and bit rate
  • SSML (音声合成マークアップ言語) を使用して合成要求を送信するSubmitting synthesis requests using SSML (speech synthesis markup language)
  • ニューラル音声を使用するUsing neural voices

記事をスキップして GitHub 上のサンプルにアクセスするSkip to samples on GitHub

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の Java クイックスタート サンプルを参照してください。If you want to skip straight to sample code, see the Java quickstart samples on GitHub.

前提条件Prerequisites

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。This article assumes that you have an Azure account and Speech service subscription. アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しくださいIf you don't have an account and subscription, try the Speech service for free.

Speech SDK のインストールInstall the Speech SDK

何らかの操作を行うには、事前に Speech SDK をインストールしておく必要があります。Before you can do anything, you'll need to install the Speech SDK. ご利用のプラットフォームに応じて、次の手順を行います。Depending on your platform, use the following instructions:

依存関係のインポートImport dependencies

この記事の例を実行するには、スクリプトの先頭に次の import ステートメントを含めます。To run the examples in this article, include the following import statements at the top of your script.

import com.microsoft.cognitiveservices.speech.AudioDataStream;
import com.microsoft.cognitiveservices.speech.SpeechConfig;
import com.microsoft.cognitiveservices.speech.SpeechSynthesizer;
import com.microsoft.cognitiveservices.speech.SpeechSynthesisOutputFormat;
import com.microsoft.cognitiveservices.speech.SpeechSynthesisResult;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;

import java.io.*;
import java.util.Scanner;

音声構成を作成するCreate a speech configuration

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。To call the Speech service using the Speech SDK, you need to create a SpeechConfig. このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

注意

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

SpeechConfig を初期化するには、次に示すようないくつかの方法があります。There are a few ways that you can initialize a SpeechConfig:

  • サブスクリプションの場合: キーと、それに関連付けられたリージョンを渡します。With a subscription: pass in a key and the associated region.
  • エンドポイントの場合: Speech Service エンドポイントを渡します。With an endpoint: pass in a Speech service endpoint. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • ホストの場合: ホスト アドレスを渡します。With a host: pass in a host address. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • 認証トークンの場合: 認証トークンと、それに関連付けられたリージョンを渡します。With an authorization token: pass in an authorization token and the associated region.

この例では、サブスクリプション キーとリージョンを使用して SpeechConfig を作成します。In this example, you create a SpeechConfig using a subscription key and region. Speech Service を無料で試す」の手順に従って、これらの資格情報を取得します。Get these credentials by following steps in Try the Speech service for free. また、この記事の残りの部分で使用する、基本的な定型コードをいくつか作成します。これを変更して、さまざまなカスタマイズを行います。You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

public class Program 
{
    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    }
}

音声をファイルに合成するSynthesize speech to a file

次に、SpeechSynthesizer オブジェクトを作成します。これにより、テキストから音声への変換と、スピーカー、ファイル、またはその他の出力ストリームへの出力が実行されます。Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizer は、前の手順で作成された SpeechConfig オブジェクト、および出力結果の処理方法を指定する AudioConfig オブジェクトをパラメーターとして受け取ります。The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioConfig object that specifies how output results should be handled.

まず、fromWavFileOutput() 静的関数を使用して .wav ファイルに出力を自動的に書き込む AudioConfig を作成します。To start, create an AudioConfig to automatically write the output to a .wav file using the fromWavFileOutput() static function.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
}

次に、speechConfig オブジェクトと audioConfig オブジェクトをパラメーターとして渡す SpeechSynthesizer をインスタンス化します。Next, instantiate a SpeechSynthesizer passing your speechConfig object and the audioConfig object as params. こうすることで、音声合成を実行してファイルに書き込むことが、テキスト文字列を使用して SpeakText() を実行するのと同じぐらい簡単になります。Then, executing speech synthesis and writing to a file is as simple as running SpeakText() with a string of text.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.SpeakText("A simple test to write to a file.");
}

このプログラムを実行すると、合成された .wav ファイルが、指定した場所に書き込まれます。Run the program, and a synthesized .wav file is written to the location you specified. 以上は最も基本的な使用方法の好例ですが、この次は、カスタム シナリオに対応できるよう、出力をカスタマイズし、出力応答をインメモリ ストリームとして処理する方法について説明します。This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

スピーカー出力に合成するSynthesize to speaker output

場合によっては、合成された音声をスピーカーに直接出力することが必要になる場合があります。In some cases, you may want to directly output synthesized speech directly to a speaker. これを行うには、fromDefaultSpeakerOutput() 静的関数を使用して AudioConfig をインスタンス化します。To do this, instantiate the AudioConfig using the fromDefaultSpeakerOutput() static function. これにより、現在のアクティブな出力デバイスに対して出力が行われます。This outputs to the current active output device.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    AudioConfig audioConfig = AudioConfig.fromDefaultSpeakerOutput();

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.SpeakText("Synthesizing directly to speaker output.");
}

結果をインメモリ ストリームとして取得するGet result as an in-memory stream

音声アプリケーション開発の多くのシナリオでは、結果として得られたオーディオ データは、ファイルに直接書き込むのではなく、インメモリ ストリームとして必要となるケースがよくあります。For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. その場合、次のようなカスタム動作を構築できます。This will allow you to build custom behavior including:

  • 結果として得られたバイト配列を、カスタム ダウンストリーム サービス向けのシーク可能なストリームとして抽象化する。Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • 結果を他の API またはサービスと統合する。Integrate the result with other API's or services.
  • オーディオ データの変更やカスタム .wav ヘッダーの記述などを行う。Modify the audio data, write custom .wav headers, etc.

この変更は、前の例から簡単に行うことができます。It's simple to make this change from the previous example. まず、AudioConfig ブロックを削除します。これは、この時点から出力動作を手動で管理して制御を強化するためです。First, remove the AudioConfig block, as you will manage the output behavior manually from this point onward for increased control. 次に、SpeechSynthesizer コンストラクターの AudioConfignull を渡します。Then pass null for the AudioConfig in the SpeechSynthesizer constructor.

注意

前述のスピーカー出力の例のように省略するのではなく、AudioConfignull を渡した場合、既定ではオーディオは現在のアクティブな出力デバイスで再生されません。Passing null for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

今回は、結果を SpeechSynthesisResult 変数に保存します。This time, you save the result to a SpeechSynthesisResult variable. SpeechSynthesisResult.getAudioData() 関数は、出力データの byte [] を返します。The SpeechSynthesisResult.getAudioData() function returns a byte [] of the output data. この byte [] を手動で操作することも、AudioDataStream クラスを使用してインメモリ ストリームを管理することもできます。You can work with this byte [] manually, or you can use the AudioDataStream class to manage the in-memory stream. この例では、AudioDataStream.fromResult() 静的関数を使用して、結果からストリームを取得します。In this example you use the AudioDataStream.fromResult() static function to get a stream from the result.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
    
    SpeechSynthesisResult result = synthesizer.SpeakText("Getting the response as an in-memory stream.");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    System.out.print(stream.getStatus());
}

ここから、結果として得られた stream オブジェクトを使用して、任意のカスタム動作を実装できます。From here you can implement any custom behavior using the resulting stream object.

オーディオ形式をカスタマイズするCustomize audio format

次のセクションでは、次のようなオーディオ出力属性をカスタマイズする方法について説明します。The following section shows how to customize audio output attributes including:

  • オーディオ ファイルの種類Audio file type
  • サンプルレートSample-rate
  • ビット深度Bit-depth

オーディオ形式を変更するには、SpeechConfig オブジェクトで setSpeechSynthesisOutputFormat() 関数を使用します。To change the audio format, you use the setSpeechSynthesisOutputFormat() function on the SpeechConfig object. この関数には、SpeechSynthesisOutputFormat 型の enum が必要です。これは、出力形式を選択するために使用します。This function expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. 使用できるオーディオ形式の一覧については、リファレンス ドキュメントを参照してください。See the reference docs for a list of audio formats that are available.

要件に応じて、ファイルの種類ごとにさまざまなオプションがあります。There are various options for different file types depending on your requirements. 定義上、Raw24Khz16BitMonoPcm のような未加工の形式にはオーディオ ヘッダーが含まれないことに注意してください。Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. 未加工の形式は、ダウンストリームの実装で未加工のビットストリームをデコードできることがわかっている場合か、ビット深度、サンプル レート、チャネル数などに基づいてヘッダーを手動で作成する場合にのみ使用してください。Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

注意

en-US-AriaRUS および en-US-GuyRUS の音声は、Riff24Khz16BitMonoPcm サンプル レートでエンコードされたサンプルから作成されます。Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

この例では、SpeechConfig オブジェクトに SpeechSynthesisOutputFormat を設定することにより、高忠実度の RIFF 形式 Riff24Khz16BitMonoPcm を指定します。In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the SpeechSynthesisOutputFormat on the SpeechConfig object. 前のセクションの例と同様に、AudioDataStream を使用して結果のインメモリ ストリームを取得し、それをファイルに書き込みます。Similar to the example in the previous section, you use AudioDataStream to get an in-memory stream of the result, and then write it to a file.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");

    // set the output format
    speechConfig.setSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
    SpeechSynthesisResult result = synthesizer.SpeakText("Customizing audio output format.");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    stream.saveToWavFile("path/to/write/file.wav");
}

プログラムをもう一度実行すると、指定したパスに .wav ファイルが書き込まれます。Running your program again will write a .wav file to the specified path.

SSML を使用して音声の特徴をカスタマイズするUse SSML to customize speech characteristics

音声合成マークアップ言語 (SSML) を使用すると、XML スキーマから要求を送信して、テキスト読み上げ出力のピッチ、発音、読み上げ速度、ボリュームなどを微調整することができます。Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. このセクションでは実用的な使用例をいくつか紹介しますが、詳細なガイドについては、SSML の操作方法に関する記事を参照してください。This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

SSML を使用したカスタマイズを開始するには、音声を切り替える単純な変更を加えます。To start using SSML for customization, you make a simple change that switches the voice. まず、ルート プロジェクト ディレクトリに SSML 構成用の新しい XML ファイルを作成します (この例では ssml.xml)。First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. ルート要素は常に <speak> であり、テキストを <voice> 要素でラップすることで、name パラメーターを使用して音声を変更できます。The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. この例では、音声を男性の英語 (英国) の音声に変更します。This example changes the voice to a male English (UK) voice. この音声が 標準 音声であることに注意してください。これは、ニューラル 音声とは価格や可用性が異なります。Note that this voice is a standard voice, which has different pricing and availability than neural voices. サポートされている 標準 音声の 全一覧を参照してください。See the full list of supported standard voices.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    When you're on the motorway, it's a good idea to use a sat-nav.
  </voice>
</speak>

次に、XML ファイルを参照するように音声合成要求を変更する必要があります。Next, you need to change the speech synthesis request to reference your XML file. 要求はほとんど同じですが、SpeakText() 関数を使用する代わりに、SpeakSsml() を使用します。The request is mostly the same, but instead of using the SpeakText() function, you use SpeakSsml(). この関数には XML 文字列が必要なので、最初に、XML ファイルを読み込んでそれを文字列として返す関数を作成します。This function expects an XML string, so first you create a function to load an XML file and return it as a string.

private static String xmlToString(String filePath) {
    File file = new File(filePath);
    StringBuilder fileContents = new StringBuilder((int)file.length());

    try (Scanner scanner = new Scanner(file)) {
        while(scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine() + System.lineSeparator());
        }
        return fileContents.toString().trim();
    } catch (FileNotFoundException ex) {
        return "File not found.";
    }
}

ここからは、結果のオブジェクトは前の例とまったく同じです。From here, the result object is exactly the same as previous examples.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);

    String ssml = xmlToString("ssml.xml");
    SpeechSynthesisResult result = synthesizer.SpeakSsml(ssml);
    AudioDataStream stream = AudioDataStream.fromResult(result);
    stream.saveToWavFile("path/to/write/file.wav");
}

出力は機能しますが、さらに自然に聞こえるように、いくつかの簡単な変更を加えることができます。The output works, but there a few simple additional changes you can make to help it sound more natural. 話す速度が全体的に少し速すぎるため、<prosody> タグを追加して、速度を既定速度の 90% に下げます。The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. また、文中のコンマの後の一時停止が少し短すぎて、不自然に聞こえます。Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. この問題を解決するには、<break> タグを追加して音声を遅らせ、time パラメーターを 200ms に設定します。To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. 合成を再実行して、これらのカスタマイズが出力にどのように影響したかを確認します。Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

ニューラル音声Neural voices

ニューラル音声とは、ディープ ニューラル ネットワークを使用した音声合成アルゴリズムです。Neural voices are speech synthesis algorithms powered by deep neural networks. ニューラル音声を使用した場合、合成音声は人間の録音とほとんど区別がつきません。When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. ニューラル音声では、人間のような自然な韻律と明瞭な発音により、ユーザーが AI システムと対話する際のリスニング疲労が大幅に軽減されます。With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

ニューラル音声に切り替えるには、nameニューラル音声オプションのいずれかに変更します。To switch to a neural voice, change the name to one of the neural voice options. 次に、mstts の XML 名前空間を追加し、テキストを <mstts:express-as> タグ内にラップします。Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. 読み上げスタイルをカスタマイズするには、style パラメーターを使用します。Use the style param to customize the speaking style. この例では cheerful を使用していますが、customerservice または chat に設定して、読み上げスタイルの違いを確認してみてください。This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

重要

ニューラル音声は、"米国東部"、"東南アジア"、"西ヨーロッパ" のリージョンで作成された音声リソースで のみ サポートされています。Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

このクイックスタートでは、Speech SDK を使用してテキスト読み上げ合成を行うための一般的な設計パターンについて説明します。In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. まずは基本的な構成と合成を行った後、次のようなより高度なカスタム アプリケーション開発の例に進みます。You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • インメモリ ストリームとして応答を取得するGetting responses as in-memory streams
  • 出力のサンプル レートとビット レートをカスタマイズするCustomizing output sample rate and bit rate
  • SSML (音声合成マークアップ言語) を使用して合成要求を送信するSubmitting synthesis requests using SSML (speech synthesis markup language)
  • ニューラル音声を使用するUsing neural voices

記事をスキップして GitHub 上のサンプルにアクセスするSkip to samples on GitHub

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の JavaScript クイックスタート サンプルを参照してください。If you want to skip straight to sample code, see the JavaScript quickstart samples on GitHub.

前提条件Prerequisites

この記事は、Azure アカウントと Speech Service リソースがあることを前提としています。This article assumes that you have an Azure account and Speech service resource. アカウントとリソースがない場合は、Speech Service を無料でお試しくださいIf you don't have an account and resource, try the Speech service for free.

Speech SDK のインストールInstall the Speech SDK

何らかの操作を行うには、事前に Speech SDK for JavaScript をインストールしておく必要があります。Before you can do anything, you'll need to install the Speech SDK for JavaScript . ご利用のプラットフォームに応じて、次の手順を行います。Depending on your platform, use the following instructions:

また、ターゲット環境によっては、次のいずれかを使用します。Additionally, depending on the target environment use one of the following:

Speech SDK for JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js ファイルをダウンロードして抽出し、HTML ファイルにアクセス可能なフォルダーに配置します。Download and extract the Speech SDK for JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js file, and place it in a folder accessible to your HTML file.

<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;

ヒント

Web ブラウザーを対象としていて、<script> タグを使用する場合は、sdk プレフィックスは必要ありません。If you're targeting a web browser, and using the <script> tag; the sdk prefix is not needed. sdk プレフィックスは、require モジュールに名前を付けるために使用されるエイリアスです。The sdk prefix is an alias used to name the require module.

音声構成を作成するCreate a speech configuration

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。To call the Speech service using the Speech SDK, you need to create a SpeechConfig. このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、認証トークンなど、ご利用のリソースに関する情報が含まれます。This class includes information about your resource, like your key and associated region, endpoint, host, or authorization token.

注意

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

SpeechConfig を初期化するには、次に示すようないくつかの方法があります。There are a few ways that you can initialize a SpeechConfig:

  • リソースの場合: キーと、それに関連付けられたリージョンを渡します。With a resource: pass in a key and the associated region.
  • エンドポイントの場合: Speech Service エンドポイントを渡します。With an endpoint: pass in a Speech service endpoint. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • ホストの場合: ホスト アドレスを渡します。With a host: pass in a host address. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • 認証トークンの場合: 認証トークンと、それに関連付けられたリージョンを渡します。With an authorization token: pass in an authorization token and the associated region.

この例では、リソース キーとリージョンを使用して SpeechConfig を作成します。In this example, you create a SpeechConfig using a resource key and region. Speech Service を無料で試す」の手順に従って、これらの資格情報を取得します。Get these credentials by following steps in Try the Speech service for free. また、この記事の残りの部分で使用する、基本的な定型コードをいくつか作成します。これを変更して、さまざまなカスタマイズを行います。You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
}

synthesizeSpeech();

音声をファイルに合成するSynthesize speech to a file

次に、SpeechSynthesizer オブジェクトを作成します。これにより、テキストから音声への変換と、スピーカー、ファイル、またはその他の出力ストリームへの出力が実行されます。Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizer は、前の手順で作成された SpeechConfig オブジェクト、および出力結果の処理方法を指定する AudioConfig オブジェクトをパラメーターとして受け取ります。The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioConfig object that specifies how output results should be handled.

まず、fromAudioFileOutput() 静的関数を使用して .wav ファイルに出力を自動的に書き込む AudioConfig を作成します。To start, create an AudioConfig to automatically write the output to a .wav file using the fromAudioFileOutput() static function.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const audioConfig = AudioConfig.fromAudioFileOutput("path/to/file.wav");
}

次に、speechConfig オブジェクトと audioConfig オブジェクトをパラメーターとして渡す SpeechSynthesizer をインスタンス化します。Next, instantiate a SpeechSynthesizer passing your speechConfig object and the audioConfig object as params. こうすることで、音声合成を実行してファイルに書き込むことが、テキスト文字列を使用して speakTextAsync() を実行するのと同じぐらい簡単になります。Then, executing speech synthesis and writing to a file is as simple as running speakTextAsync() with a string of text. 結果のコールバックは synthesizer.close() を呼び出すのに最適な場所です。実際、合成が正しく機能するためにはこの呼び出しが必要です。The result callback is a great place to call synthesizer.close(), in fact - this call is needed in order for synthesis to function correctly.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const audioConfig = AudioConfig.fromAudioFileOutput("path-to-file.wav");

    const synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.speakTextAsync(
        "A simple test to write to a file.",
        result => {
            synthesizer.close();
            if (result) {
                // return result as stream
                return fs.createReadStream("path-to-file.wav");
            }
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

このプログラムを実行すると、合成された .wav ファイルが、指定した場所に書き込まれます。Run the program, and a synthesized .wav file is written to the location you specified. 以上は最も基本的な使用方法の好例ですが、この次は、カスタム シナリオに対応できるよう、出力をカスタマイズし、出力応答をインメモリ ストリームとして処理する方法について説明します。This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

スピーカー出力に合成するSynthesize to speaker output

場合によっては、合成された音声をスピーカーに直接出力することが必要になる場合があります。In some cases, you may want to directly output synthesized speech directly to a speaker. これを行うには、fromDefaultSpeakerOutput() 静的関数を使用して AudioConfig をインスタンス化します。To do this, instantiate the AudioConfig using the fromDefaultSpeakerOutput() static function. これにより、現在のアクティブな出力デバイスに対して出力が行われます。This outputs to the current active output device.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const audioConfig = AudioConfig.fromDefaultSpeakerOutput();

    const synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.speakTextAsync(
        "Synthesizing directly to speaker output.",
        result => {
            if (result) {
                synthesizer.close();
                return result.audioData;
            }
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

結果をインメモリ ストリームとして取得するGet result as an in-memory stream

音声アプリケーション開発の多くのシナリオでは、結果として得られたオーディオ データは、ファイルに直接書き込むのではなく、インメモリ ストリームとして必要となるケースがよくあります。For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. その場合、次のようなカスタム動作を構築できます。This will allow you to build custom behavior including:

  • 結果として得られたバイト配列を、カスタム ダウンストリーム サービス向けのシーク可能なストリームとして抽象化する。Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • 結果を他の API またはサービスと統合する。Integrate the result with other API's or services.
  • オーディオ データの変更やカスタム .wav ヘッダーの記述などを行う。Modify the audio data, write custom .wav headers, etc.

この変更は、前の例から簡単に行うことができます。It's simple to make this change from the previous example. まず、AudioConfig ブロックを削除します。これは、この時点から出力動作を手動で管理して制御を強化するためです。First, remove the AudioConfig block, as you will manage the output behavior manually from this point onward for increased control. 次に、SpeechSynthesizer コンストラクターの AudioConfigundefined を渡します。Then pass undefined for the AudioConfig in the SpeechSynthesizer constructor.

注意

前述のスピーカー出力の例のように省略するのではなく、AudioConfigundefined を渡した場合、既定ではオーディオは現在のアクティブな出力デバイスで再生されません。Passing undefined for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

今回は、結果を SpeechSynthesisResult 変数に保存します。This time, you save the result to a SpeechSynthesisResult variable. SpeechSynthesisResult.audioData プロパティは、既定のブラウザー ストリーム型である、出力データの ArrayBuffer を返します。The SpeechSynthesisResult.audioData property returns an ArrayBuffer of the output data, the default browser stream type. サーバー コードの場合、ArrayBuffer をバッファー ストリームに変換します。For server-code, convert the arrayBuffer to a buffer stream.

次のコードは、クライアント側のコードに対して機能します。The following code works for client-side code.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

    synthesizer.speakTextAsync(
        "Getting the response as an in-memory stream.",
        result => {
            synthesizer.close();
            return result.audioData;
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

ここから、結果として得られた ArrayBuffer オブジェクトを使用して、任意のカスタム動作を実装できます。From here you can implement any custom behavior using the resulting ArrayBuffer object. ArrayBuffer は、ブラウザーで受信し、この形式から再生する共通の型です。The ArrayBuffer is a common type to receive in a browser and play from this format.

サーバー ベースのコードでは、ArrayBuffer ではなくストリームとしてデータを操作する必要がある場合は、オブジェクトをストリームに変換する必要があります。For any server-based code, if you need to work with the data as a stream, instead of an ArrayBuffer, you need to convert the object into a stream.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

    synthesizer.speakTextAsync(
        "Getting the response as an in-memory stream.",
        result => {
            const { audioData } = result;

            synthesizer.close();

            // convert arrayBuffer to stream
            // return stream
            const bufferStream = new PassThrough();
            bufferStream.end(Buffer.from(audioData));
            return bufferStream;
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

オーディオ形式をカスタマイズするCustomize audio format

次のセクションでは、次のようなオーディオ出力属性をカスタマイズする方法について説明します。The following section shows how to customize audio output attributes including:

  • オーディオ ファイルの種類Audio file type
  • サンプルレートSample-rate
  • ビット深度Bit-depth

オーディオ形式を変更するには、SpeechConfig オブジェクトで speechSynthesisOutputFormat プロパティを使用します。To change the audio format, you use the speechSynthesisOutputFormat property on the SpeechConfig object. このプロパティには、SpeechSynthesisOutputFormat 型の enum が必要です。これは、出力形式を選択するために使用します。This property expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. 使用できるオーディオ形式の一覧については、リファレンス ドキュメントを参照してください。See the reference docs for a list of audio formats that are available.

要件に応じて、ファイルの種類ごとにさまざまなオプションがあります。There are various options for different file types depending on your requirements. 定義上、Raw24Khz16BitMonoPcm のような未加工の形式にはオーディオ ヘッダーが含まれないことに注意してください。Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. 未加工の形式は、ダウンストリームの実装で未加工のビットストリームをデコードできることがわかっている場合か、ビット深度、サンプル レート、チャネル数などに基づいてヘッダーを手動で作成する場合にのみ使用してください。Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

注意

en-US-AriaRUS および en-US-GuyRUS の音声は、Riff24Khz16BitMonoPcm サンプル レートでエンコードされたサンプルから作成されます。Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

この例では、SpeechConfig オブジェクトに speechSynthesisOutputFormat を設定することにより、高忠実度の RIFF 形式 Riff24Khz16BitMonoPcm を指定します。In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the speechSynthesisOutputFormat on the SpeechConfig object. 前のセクションの例と同様に、オーディオ ArrayBuffer データを取得して操作します。Similar to the example in the previous section, get the audio ArrayBuffer data and interact with it.

function synthesizeSpeech() {
    const speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");

    // Set the output format
    speechConfig.speechSynthesisOutputFormat = SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm;

    const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);
    synthesizer.speakTextAsync(
        "Customizing audio output format.",
        result => {
            // Interact with the audio ArrayBuffer data
            const audioData = result.audioData;
            console.log(`Audio data byte size: ${audioData.byteLength}.`)

            synthesizer.close();
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

プログラムをもう一度実行すると、指定したパスに .wav ファイルが書き込まれます。Running your program again will write a .wav file to the specified path.

SSML を使用して音声の特徴をカスタマイズするUse SSML to customize speech characteristics

音声合成マークアップ言語 (SSML) を使用すると、XML スキーマから要求を送信して、テキスト読み上げ出力のピッチ、発音、読み上げ速度、ボリュームなどを微調整することができます。Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. このセクションでは実用的な使用例をいくつか紹介しますが、詳細なガイドについては、SSML の操作方法に関する記事を参照してください。This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

SSML を使用したカスタマイズを開始するには、音声を切り替える単純な変更を加えます。To start using SSML for customization, you make a simple change that switches the voice. まず、ルート プロジェクト ディレクトリに SSML 構成用の新しい XML ファイルを作成します (この例では ssml.xml)。First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. ルート要素は常に <speak> であり、テキストを <voice> 要素でラップすることで、name パラメーターを使用して音声を変更できます。The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. この例では、音声を男性の英語 (英国) の音声に変更します。This example changes the voice to a male English (UK) voice. この音声が 標準 音声であることに注意してください。これは、ニューラル 音声とは価格や可用性が異なります。Note that this voice is a standard voice, which has different pricing and availability than neural voices. サポートされている 標準 音声の 全一覧を参照してください。See the full list of supported standard voices.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    When you're on the motorway, it's a good idea to use a sat-nav.
  </voice>
</speak>

次に、XML ファイルを参照するように音声合成要求を変更する必要があります。Next, you need to change the speech synthesis request to reference your XML file. 要求はほとんど同じですが、speakTextAsync() 関数を使用する代わりに、speakSsmlAsync() を使用します。The request is mostly the same, but instead of using the speakTextAsync() function, you use speakSsmlAsync(). この関数には XML 文字列が必要なので、最初に、XML ファイルを読み込んでそれを文字列として返す関数を作成します。This function expects an XML string, so first you create a function to load an XML file and return it as a string.

function xmlToString(filePath) {
    const xml = readFileSync(filePath, "utf8");
    return xml;
}

readFileSync の詳細については、「Node.js ファイル システム」を参照してください。For more information on readFileSync, see Node.js file system. ここからは、結果のオブジェクトは前の例とまったく同じです。From here, the result object is exactly the same as previous examples.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);

    const ssml = xmlToString("ssml.xml");
    synthesizer.speakSsmlAsync(
        ssml,
        result => {
            if (result.errorDetails) {
                console.error(result.errorDetails);
            } else {
                console.log(JSON.stringify(result));
            }

            synthesizer.close();
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

出力は機能しますが、さらに自然に聞こえるように、いくつかの簡単な変更を加えることができます。The output works, but there a few simple additional changes you can make to help it sound more natural. 話す速度が全体的に少し速すぎるため、<prosody> タグを追加して、速度を既定速度の 90% に下げます。The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. また、文中のコンマの後の一時停止が少し短すぎて、不自然に聞こえます。Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. この問題を解決するには、<break> タグを追加して音声を遅らせ、time パラメーターを 200ms に設定します。To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. 合成を再実行して、これらのカスタマイズが出力にどのように影響したかを確認します。Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

ニューラル音声Neural voices

ニューラル音声とは、ディープ ニューラル ネットワークを使用した音声合成アルゴリズムです。Neural voices are speech synthesis algorithms powered by deep neural networks. ニューラル音声を使用した場合、合成音声は人間の録音とほとんど区別がつきません。When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. ニューラル音声では、人間のような自然な韻律と明瞭な発音により、ユーザーが AI システムと対話する際のリスニング疲労が大幅に軽減されます。With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

ニューラル音声に切り替えるには、nameニューラル音声オプションのいずれかに変更します。To switch to a neural voice, change the name to one of the neural voice options. 次に、mstts の XML 名前空間を追加し、テキストを <mstts:express-as> タグ内にラップします。Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. 読み上げスタイルをカスタマイズするには、style パラメーターを使用します。Use the style param to customize the speaking style. この例では cheerful を使用していますが、customerservice または chat に設定して、読み上げスタイルの違いを確認してみてください。This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

重要

ニューラル音声は、"米国東部"、"東南アジア"、"西ヨーロッパ" のリージョンで作成された音声リソースで のみ サポートされています。Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
    xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

Swift および Objective-C 用の Speech SDK を使用して、テキストから音声を合成することができます。You can synthesize speech from text using the Speech SDK for Swift and Objective-C.

前提条件Prerequisites

以下のサンプルは、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。The following samples assume that you have an Azure account and Speech service subscription. アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しくださいIf you don't have an account and subscription, try the Speech service for free.

Speech SDK とサンプルをインストールするInstall Speech SDK and samples

Cognitive Services Speech SDK には、iOS と Mac 向けに Objective-C と Swift で作成されたサンプルが含まれています。The Cognitive Services Speech SDK contains samples written in in Swift and Objective-C for iOS and Mac. リンクをクリックして、各サンプルのインストール手順をご覧ください。Click a link to see installation instructions for each sample:

オンラインの「Objective-C 向け Speech SDK リファレンス」もご覧いただけます。We also provide an online Speech SDK for Objective-C Reference.

このクイックスタートでは、Speech SDK を使用してテキスト読み上げ合成を行うための一般的な設計パターンについて説明します。In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. まずは基本的な構成と合成を行った後、次のようなより高度なカスタム アプリケーション開発の例に進みます。You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • インメモリ ストリームとして応答を取得するGetting responses as in-memory streams
  • 出力のサンプル レートとビット レートをカスタマイズするCustomizing output sample rate and bit rate
  • SSML (音声合成マークアップ言語) を使用して合成要求を送信するSubmitting synthesis requests using SSML (speech synthesis markup language)
  • ニューラル音声を使用するUsing neural voices

記事をスキップして GitHub 上のサンプルにアクセスするSkip to samples on GitHub

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の Python クイックスタート サンプルを参照してください。If you want to skip straight to sample code, see the Python quickstart samples on GitHub.

前提条件Prerequisites

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。This article assumes that you have an Azure account and Speech service subscription. アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しくださいIf you don't have an account and subscription, try the Speech service for free.

Speech SDK のインストールInstall the Speech SDK

何らかの操作を行うには、事前に Speech SDK をインストールしておく必要があります。Before you can do anything, you'll need to install the Speech SDK.

pip install azure-cognitiveservices-speech

macOS を使用していて、インストールの問題が発生した場合は、まず次のコマンドを実行することが必要な場合があります。If you're on macOS and run into install issues, you may need to run this command first.

python3 -m pip install --upgrade pip

Speech SDK がインストールされたら、スクリプトの先頭に次の import ステートメントを含めます。After the Speech SDK is installed, include the following import statements at the top of your script.

from azure.cognitiveservices.speech import AudioDataStream, SpeechConfig, SpeechSynthesizer, SpeechSynthesisOutputFormat
from azure.cognitiveservices.speech.audio import AudioOutputConfig

音声構成を作成するCreate a speech configuration

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。To call the Speech service using the Speech SDK, you need to create a SpeechConfig. このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

注意

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

SpeechConfig を初期化するには、次に示すようないくつかの方法があります。There are a few ways that you can initialize a SpeechConfig:

  • サブスクリプションの場合: キーと、それに関連付けられたリージョンを渡します。With a subscription: pass in a key and the associated region.
  • エンドポイントの場合: Speech Service エンドポイントを渡します。With an endpoint: pass in a Speech service endpoint. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • ホストの場合: ホスト アドレスを渡します。With a host: pass in a host address. キーまたは認証トークンは省略可能です。A key or authorization token is optional.
  • 認証トークンの場合: 認証トークンと、それに関連付けられたリージョンを渡します。With an authorization token: pass in an authorization token and the associated region.

この例では、サブスクリプション キーとリージョンを使用して SpeechConfig を作成します。In this example, you create a SpeechConfig using a subscription key and region. Speech Service を無料で試す」の手順に従って、これらの資格情報を取得します。Get these credentials by following steps in Try the Speech service for free.

speech_config = SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")

音声をファイルに合成するSynthesize speech to a file

次に、SpeechSynthesizer オブジェクトを作成します。これにより、テキストから音声への変換と、スピーカー、ファイル、またはその他の出力ストリームへの出力が実行されます。Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizer は、前の手順で作成された SpeechConfig オブジェクト、および出力結果の処理方法を指定する AudioOutputConfig オブジェクトをパラメーターとして受け取ります。The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioOutputConfig object that specifies how output results should be handled.

まず、filename コンストラクター パラメーターを使用して .wav ファイルに出力を自動的に書き込む AudioOutputConfig を作成します。To start, create an AudioOutputConfig to automatically write the output to a .wav file, using the filename constructor param.

audio_config = AudioOutputConfig(filename="path/to/write/file.wav")

次に、speech_config オブジェクトと audio_config オブジェクトをパラメーターとして渡して SpeechSynthesizer をインスタンス化します。Next, instantiate a SpeechSynthesizer by passing your speech_config object and the audio_config object as params. このようにすれば、音声合成を実行してファイルに書き込むことが、テキスト文字列を使用して speak_text_async() を実行するのと同じぐらい簡単になります。Then, executing speech synthesis and writing to a file is as simple as running speak_text_async() with a string of text.

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
synthesizer.speak_text_async("A simple test to write to a file.")

このプログラムを実行すると、合成された .wav ファイルが、指定した場所に書き込まれます。Run the program, and a synthesized .wav file is written to the location you specified. 以上は最も基本的な使用方法の好例ですが、この次は、カスタム シナリオに対応できるよう、出力をカスタマイズし、出力応答をインメモリ ストリームとして処理する方法について説明します。This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

スピーカー出力に合成するSynthesize to speaker output

場合によっては、合成された音声をスピーカーに直接出力することが必要になる場合があります。In some cases, you may want to directly output synthesized speech directly to a speaker. これを行うには、前のセクションの例を使用しますが、filename パラメーターを削除して AudioOutputConfig を変更し、use_default_speaker=True を設定します。To do this, use the example in the previous section, but change the AudioOutputConfig by removing the filename param, and set use_default_speaker=True. これにより、現在のアクティブな出力デバイスに対して出力が行われます。This outputs to the current active output device.

audio_config = AudioOutputConfig(use_default_speaker=True)

結果をインメモリ ストリームとして取得するGet result as an in-memory stream

音声アプリケーション開発の多くのシナリオでは、結果として得られたオーディオ データは、ファイルに直接書き込むのではなく、インメモリ ストリームとして必要となるケースがよくあります。For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. その場合、次のようなカスタム動作を構築できます。This will allow you to build custom behavior including:

  • 結果として得られたバイト配列を、カスタム ダウンストリーム サービス向けのシーク可能なストリームとして抽象化する。Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • 結果を他の API またはサービスと統合する。Integrate the result with other API's or services.
  • オーディオ データの変更やカスタム .wav ヘッダーの記述などを行う。Modify the audio data, write custom .wav headers, etc.

この変更は、前の例から簡単に行うことができます。It's simple to make this change from the previous example. まず、AudioConfig を削除します。これは、制御を高めるために、この時点から出力動作を手動で管理するからです。First, remove the AudioConfig, as you will manage the output behavior manually from this point onward for increased control. 次に、SpeechSynthesizer コンストラクターの AudioConfigNone を渡します。Then pass None for the AudioConfig in the SpeechSynthesizer constructor.

注意

前述のスピーカー出力の例のように省略するのではなく、AudioConfigNone を渡した場合、既定ではオーディオは現在のアクティブな出力デバイスで再生されません。Passing None for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

今回は、結果を SpeechSynthesisResult 変数に保存します。This time, you save the result to a SpeechSynthesisResult variable. audio_data プロパティには、出力データの bytes オブジェクトが含まれます。The audio_data property contains a bytes object of the output data. このオブジェクトを手動で操作することも、AudioDataStream クラスを使用してインメモリ ストリームを管理することもできます。You can work with this object manually, or you can use the AudioDataStream class to manage the in-memory stream. この例では、AudioDataStream コンストラクターを使用して、結果からストリームを取得します。In this example you use the AudioDataStream constructor to get a stream from the result.

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)
result = synthesizer.speak_text_async("Getting the response as an in-memory stream.").get()
stream = AudioDataStream(result)

ここから、結果として得られた stream オブジェクトを使用して、任意のカスタム動作を実装できます。From here you can implement any custom behavior using the resulting stream object.

オーディオ形式をカスタマイズするCustomize audio format

次のセクションでは、次のようなオーディオ出力属性をカスタマイズする方法について説明します。The following section shows how to customize audio output attributes including:

  • オーディオ ファイルの種類Audio file type
  • サンプルレートSample-rate
  • ビット深度Bit-depth

オーディオ形式を変更するには、SpeechConfig オブジェクトで set_speech_synthesis_output_format() 関数を使用します。To change the audio format, you use the set_speech_synthesis_output_format() function on the SpeechConfig object. この関数には、SpeechSynthesisOutputFormat 型の enum が必要です。これは、出力形式を選択するために使用します。This function expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. 使用できるオーディオ形式の一覧については、リファレンス ドキュメントを参照してください。See the reference docs for a list of audio formats that are available.

要件に応じて、ファイルの種類ごとにさまざまなオプションがあります。There are various options for different file types depending on your requirements. 定義上、Raw24Khz16BitMonoPcm のような未加工の形式にはオーディオ ヘッダーが含まれないことに注意してください。Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. 未加工の形式は、ダウンストリームの実装で未加工のビットストリームをデコードできることがわかっている場合か、ビット深度、サンプル レート、チャネル数などに基づいてヘッダーを手動で作成する場合にのみ使用してください。Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

注意

en-US-AriaRUS および en-US-GuyRUS の音声は、Riff24Khz16BitMonoPcm サンプル レートでエンコードされたサンプルから作成されます。Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

この例では、SpeechConfig オブジェクトに SpeechSynthesisOutputFormat を設定することにより、高忠実度の RIFF 形式 Riff24Khz16BitMonoPcm を指定します。In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the SpeechSynthesisOutputFormat on the SpeechConfig object. 前のセクションの例と同様に、AudioDataStream を使用して結果のインメモリ ストリームを取得し、それをファイルに書き込みます。Similar to the example in the previous section, you use AudioDataStream to get an in-memory stream of the result, and then write it to a file.

speech_config.set_speech_synthesis_output_format(SpeechSynthesisOutputFormat["Riff24Khz16BitMonoPcm"])
synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)

result = synthesizer.speak_text_async("Customizing audio output format.").get()
stream = AudioDataStream(result)
stream.save_to_wav_file("path/to/write/file.wav")

プログラムをもう一度実行すると、指定したパスに、カスタマイズされた .wav ファイルが書き込まれます。Running your program again will write a customized .wav file to the specified path.

SSML を使用して音声の特徴をカスタマイズするUse SSML to customize speech characteristics

音声合成マークアップ言語 (SSML) を使用すると、XML スキーマから要求を送信して、テキスト読み上げ出力のピッチ、発音、読み上げ速度、ボリュームなどを微調整することができます。Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. このセクションでは実用的な使用例をいくつか紹介しますが、詳細なガイドについては、SSML の操作方法に関する記事を参照してください。This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

SSML を使用したカスタマイズを開始するには、音声を切り替える単純な変更を加えます。To start using SSML for customization, you make a simple change that switches the voice. まず、ルート プロジェクト ディレクトリに SSML 構成用の新しい XML ファイルを作成します (この例では ssml.xml)。First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. ルート要素は常に <speak> であり、テキストを <voice> 要素でラップすることで、name パラメーターを使用して音声を変更できます。The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. この例では、音声を男性の英語 (英国) の音声に変更します。This example changes the voice to a male English (UK) voice. この音声が 標準 音声であることに注意してください。これは、ニューラル 音声とは価格や可用性が異なります。Note that this voice is a standard voice, which has different pricing and availability than neural voices. サポートされている 標準 音声の 全一覧を参照してください。See the full list of supported standard voices.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    When you're on the motorway, it's a good idea to use a sat-nav.
  </voice>
</speak>

次に、XML ファイルを参照するように音声合成要求を変更する必要があります。Next, you need to change the speech synthesis request to reference your XML file. 要求はほとんど同じですが、speak_text_async() 関数を使用する代わりに、speak_ssml_async() を使用します。The request is mostly the same, but instead of using the speak_text_async() function, you use speak_ssml_async(). この関数には XML 文字列が必要なので、最初に SSML 構成を文字列として読み取ります。This function expects an XML string, so you first read your SSML config as a string. ここからは、結果のオブジェクトは前の例とまったく同じです。From here, the result object is exactly the same as previous examples.

注意

ssml_string が文字列の先頭に  を含んでいる場合は、BOM 形式を削除する必要があります。そうしないと、サービスからエラーが返されます。If your ssml_string contains  at the beginning of the string, you need to strip off the BOM format or the service will return an error. これを行うには、encoding パラメーターを次のように設定します: open("ssml.xml", "r", encoding="utf-8-sig")You do this by setting the encoding parameter as follows: open("ssml.xml", "r", encoding="utf-8-sig").

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)

ssml_string = open("ssml.xml", "r").read()
result = synthesizer.speak_ssml_async(ssml_string).get()

stream = AudioDataStream(result)
stream.save_to_wav_file("path/to/write/file.wav")

出力は機能しますが、さらに自然に聞こえるように、いくつかの簡単な変更を加えることができます。The output works, but there a few simple additional changes you can make to help it sound more natural. 話す速度が全体的に少し速すぎるため、<prosody> タグを追加して、速度を既定速度の 90% に下げます。The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. また、文中のコンマの後の一時停止が少し短すぎて、不自然に聞こえます。Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. この問題を解決するには、<break> タグを追加して音声を遅らせ、time パラメーターを 200ms に設定します。To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. 合成を再実行して、これらのカスタマイズが出力にどのように影響したかを確認します。Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

ニューラル音声Neural voices

ニューラル音声とは、ディープ ニューラル ネットワークを使用した音声合成アルゴリズムです。Neural voices are speech synthesis algorithms powered by deep neural networks. ニューラル音声を使用した場合、合成音声は人間の録音とほとんど区別がつきません。When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. ニューラル音声では、人間のような自然な韻律と明瞭な発音により、ユーザーが AI システムと対話する際のリスニング疲労が大幅に軽減されます。With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

ニューラル音声に切り替えるには、nameニューラル音声オプションのいずれかに変更します。To switch to a neural voice, change the name to one of the neural voice options. 次に、mstts の XML 名前空間を追加し、テキストを <mstts:express-as> タグ内にラップします。Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. 読み上げスタイルをカスタマイズするには、style パラメーターを使用します。Use the style param to customize the speaking style. この例では cheerful を使用していますが、customerservice または chat に設定して、読み上げスタイルの違いを確認してみてください。This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

重要

ニューラル音声は、"米国東部"、"東南アジア"、"西ヨーロッパ" のリージョンで作成された音声リソースで のみ サポートされています。Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

このクイックスタートでは、Speech Service と cURL を使用してテキストを音声に変換する方法について学習します。In this quickstart, you learn how to convert text to speech using the Speech service and cURL.

テキスト読み上げの概念の概要については、概要に関する記事を参照してください。For a high-level look at Text-To-Speech concepts, see the overview article.

前提条件Prerequisites

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。This article assumes that you have an Azure account and Speech service subscription. アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しくださいIf you don't have an account and subscription, try the Speech service for free.

テキストを音声に変換するConvert text to speech

コマンド プロンプトで、次のコマンドを実行します。At a command prompt, run the following command. 次の値をコマンドに挿入する必要があります。You will need to insert the following values into the command.

  • 音声サービスのサブスクリプション キー。Your Speech service subscription key.
  • Speech Service のリージョン。Your Speech service region.

次の値を変更することもできます。You might also wish to change the following values.

  • オーディオ出力形式を制御する X-Microsoft-OutputFormat ヘッダー値。The X-Microsoft-OutputFormat header value, which controls the audio output format. サポートされているオーディオ出力形式の一覧については、REST API リファレンスを参照してください。You can find a list of supported audio output formats in the text-to-speech REST API reference.
  • 出力音声。The output voice. 対象の Speech エンドポイントで使用可能な音声の一覧を取得するには、次のセクションを参照してください。To get a list of voices available for your Speech endpoint, see the next section.
  • 出力ファイル。The output file. この例では、サーバーからの応答を output.wav という名前のファイルに送信します。In this example, we direct the response from the server into a file named output.wav.
curl --location --request POST 'https://INSERT_REGION_HERE.tts.speech.microsoft.com/cognitiveservices/v1' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/ssml+xml' \
--header 'X-Microsoft-OutputFormat: audio-16khz-128kbitrate-mono-mp3' \
--header 'User-Agent: curl' \
--data-raw '<speak version='\''1.0'\'' xml:lang='\''en-US'\''>
    <voice xml:lang='\''en-US'\'' xml:gender='\''Female'\'' name='\''en-US-AriaRUS'\''>
        my voice is my passport verify me
    </voice>
</speak>' > output.wav

対象の Speech エンドポイントで使用可能な音声を一覧表示するList available voices for your Speech endpoint

対象の Speech エンドポイントで使用可能な音声を一覧表示するには、次のコマンドを実行します。To list the available voices for your Speech endpoint, run the following command.

curl --location --request GET 'https://INSERT_ENDPOINT_HERE.tts.speech.microsoft.com/cognitiveservices/voices/list' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'

次のような応答を受け取ります。You should receive a response like the following one.

[
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ar-EG, Hoda)",
        "DisplayName": "Hoda",
        "LocalName": "هدى",
        "ShortName": "ar-EG-Hoda",
        "Gender": "Female",
        "Locale": "ar-EG",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ar-SA, Naayf)",
        "DisplayName": "Naayf",
        "LocalName": "نايف",
        "ShortName": "ar-SA-Naayf",
        "Gender": "Male",
        "Locale": "ar-SA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (bg-BG, Ivan)",
        "DisplayName": "Ivan",
        "LocalName": "Иван",
        "ShortName": "bg-BG-Ivan",
        "Gender": "Male",
        "Locale": "bg-BG",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ca-ES, HerenaRUS)",
        "DisplayName": "Herena",
        "LocalName": "Helena",
        "ShortName": "ca-ES-HerenaRUS",
        "Gender": "Female",
        "Locale": "ca-ES",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (cs-CZ, Jakub)",
        "DisplayName": "Jakub",
        "LocalName": "Jakub",
        "ShortName": "cs-CZ-Jakub",
        "Gender": "Male",
        "Locale": "cs-CZ",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (da-DK, HelleRUS)",
        "DisplayName": "Helle",
        "LocalName": "Helle",
        "ShortName": "da-DK-HelleRUS",
        "Gender": "Female",
        "Locale": "da-DK",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (de-AT, Michael)",
        "DisplayName": "Michael",
        "LocalName": "Michael",
        "ShortName": "de-AT-Michael",
        "Gender": "Male",
        "Locale": "de-AT",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (de-CH, Karsten)",
        "DisplayName": "Karsten",
        "LocalName": "Karsten",
        "ShortName": "de-CH-Karsten",
        "Gender": "Male",
        "Locale": "de-CH",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (de-DE, HeddaRUS)",
        "DisplayName": "Hedda",
        "LocalName": "Hedda",
        "ShortName": "de-DE-HeddaRUS",
        "Gender": "Female",
        "Locale": "de-DE",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (de-DE, Stefan)",
        "DisplayName": "Stefan",
        "LocalName": "Stefan",
        "ShortName": "de-DE-Stefan",
        "Gender": "Male",
        "Locale": "de-DE",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (el-GR, Stefanos)",
        "DisplayName": "Stefanos",
        "LocalName": "Στέφανος",
        "ShortName": "el-GR-Stefanos",
        "Gender": "Male",
        "Locale": "el-GR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-AU, Catherine)",
        "DisplayName": "Catherine",
        "LocalName": "Catherine",
        "ShortName": "en-AU-Catherine",
        "Gender": "Female",
        "Locale": "en-AU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-AU, HayleyRUS)",
        "DisplayName": "Hayley",
        "LocalName": "Hayley",
        "ShortName": "en-AU-HayleyRUS",
        "Gender": "Female",
        "Locale": "en-AU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-CA, HeatherRUS)",
        "DisplayName": "Heather",
        "LocalName": "Heather",
        "ShortName": "en-CA-HeatherRUS",
        "Gender": "Female",
        "Locale": "en-CA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-CA, Linda)",
        "DisplayName": "Linda",
        "LocalName": "Linda",
        "ShortName": "en-CA-Linda",
        "Gender": "Female",
        "Locale": "en-CA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-GB, George)",
        "DisplayName": "George",
        "LocalName": "George",
        "ShortName": "en-GB-George",
        "Gender": "Male",
        "Locale": "en-GB",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-GB, HazelRUS)",
        "DisplayName": "Hazel",
        "LocalName": "Hazel",
        "ShortName": "en-GB-HazelRUS",
        "Gender": "Female",
        "Locale": "en-GB",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-GB, Susan)",
        "DisplayName": "Susan",
        "LocalName": "Susan",
        "ShortName": "en-GB-Susan",
        "Gender": "Female",
        "Locale": "en-GB",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-IE, Sean)",
        "DisplayName": "Sean",
        "LocalName": "Sean",
        "ShortName": "en-IE-Sean",
        "Gender": "Male",
        "Locale": "en-IE",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-IN, Heera)",
        "DisplayName": "Heera",
        "LocalName": "Heera",
        "ShortName": "en-IN-Heera",
        "Gender": "Female",
        "Locale": "en-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-IN, PriyaRUS)",
        "DisplayName": "Priya",
        "LocalName": "Priya",
        "ShortName": "en-IN-PriyaRUS",
        "Gender": "Female",
        "Locale": "en-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-IN, Ravi)",
        "DisplayName": "Ravi",
        "LocalName": "Ravi",
        "ShortName": "en-IN-Ravi",
        "Gender": "Male",
        "Locale": "en-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-US, AriaRUS)",
        "DisplayName": "Aria",
        "LocalName": "Aria",
        "ShortName": "en-US-AriaRUS",
        "Gender": "Female",
        "Locale": "en-US",
        "SampleRateHertz": "24000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-US, BenjaminRUS)",
        "DisplayName": "Benjamin",
        "LocalName": "Benjamin",
        "ShortName": "en-US-BenjaminRUS",
        "Gender": "Male",
        "Locale": "en-US",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-US, GuyRUS)",
        "DisplayName": "Guy",
        "LocalName": "Guy",
        "ShortName": "en-US-GuyRUS",
        "Gender": "Male",
        "Locale": "en-US",
        "SampleRateHertz": "24000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)",
        "DisplayName": "Zira",
        "LocalName": "Zira",
        "ShortName": "en-US-ZiraRUS",
        "Gender": "Female",
        "Locale": "en-US",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-ES, HelenaRUS)",
        "DisplayName": "Helena",
        "LocalName": "Helena",
        "ShortName": "es-ES-HelenaRUS",
        "Gender": "Female",
        "Locale": "es-ES",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-ES, Laura)",
        "DisplayName": "Laura",
        "LocalName": "Laura",
        "ShortName": "es-ES-Laura",
        "Gender": "Female",
        "Locale": "es-ES",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-ES, Pablo)",
        "DisplayName": "Pablo",
        "LocalName": "Pablo",
        "ShortName": "es-ES-Pablo",
        "Gender": "Male",
        "Locale": "es-ES",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-MX, HildaRUS)",
        "DisplayName": "Hilda",
        "LocalName": "Hilda",
        "ShortName": "es-MX-HildaRUS",
        "Gender": "Female",
        "Locale": "es-MX",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-MX, Raul)",
        "DisplayName": "Raul",
        "LocalName": "Raúl",
        "ShortName": "es-MX-Raul",
        "Gender": "Male",
        "Locale": "es-MX",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fi-FI, HeidiRUS)",
        "DisplayName": "Heidi",
        "LocalName": "Heidi",
        "ShortName": "fi-FI-HeidiRUS",
        "Gender": "Female",
        "Locale": "fi-FI",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-CA, Caroline)",
        "DisplayName": "Caroline",
        "LocalName": "Caroline",
        "ShortName": "fr-CA-Caroline",
        "Gender": "Female",
        "Locale": "fr-CA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-CA, HarmonieRUS)",
        "DisplayName": "Harmonie",
        "LocalName": "Harmonie",
        "ShortName": "fr-CA-HarmonieRUS",
        "Gender": "Female",
        "Locale": "fr-CA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-CH, Guillaume)",
        "DisplayName": "Guillaume",
        "LocalName": "Guillaume",
        "ShortName": "fr-CH-Guillaume",
        "Gender": "Male",
        "Locale": "fr-CH",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-FR, HortenseRUS)",
        "DisplayName": "Hortense",
        "LocalName": "Hortense",
        "ShortName": "fr-FR-HortenseRUS",
        "Gender": "Female",
        "Locale": "fr-FR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-FR, Julie)",
        "DisplayName": "Julie",
        "LocalName": "Julie",
        "ShortName": "fr-FR-Julie",
        "Gender": "Female",
        "Locale": "fr-FR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-FR, Paul)",
        "DisplayName": "Paul",
        "LocalName": "Paul",
        "ShortName": "fr-FR-Paul",
        "Gender": "Male",
        "Locale": "fr-FR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (he-IL, Asaf)",
        "DisplayName": "Asaf",
        "LocalName": "אסף",
        "ShortName": "he-IL-Asaf",
        "Gender": "Male",
        "Locale": "he-IL",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (hi-IN, Hemant)",
        "DisplayName": "Hemant",
        "LocalName": "हेमन्त",
        "ShortName": "hi-IN-Hemant",
        "Gender": "Male",
        "Locale": "hi-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (hi-IN, Kalpana)",
        "DisplayName": "Kalpana",
        "LocalName": "कल्पना",
        "ShortName": "hi-IN-Kalpana",
        "Gender": "Female",
        "Locale": "hi-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (hr-HR, Matej)",
        "DisplayName": "Matej",
        "LocalName": "Matej",
        "ShortName": "hr-HR-Matej",
        "Gender": "Male",
        "Locale": "hr-HR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (hu-HU, Szabolcs)",
        "DisplayName": "Szabolcs",
        "LocalName": "Szabolcs",
        "ShortName": "hu-HU-Szabolcs",
        "Gender": "Male",
        "Locale": "hu-HU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (id-ID, Andika)",
        "DisplayName": "Andika",
        "LocalName": "Andika",
        "ShortName": "id-ID-Andika",
        "Gender": "Male",
        "Locale": "id-ID",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (it-IT, Cosimo)",
        "DisplayName": "Cosimo",
        "LocalName": "Cosimo",
        "ShortName": "it-IT-Cosimo",
        "Gender": "Male",
        "Locale": "it-IT",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (it-IT, LuciaRUS)",
        "DisplayName": "Lucia",
        "LocalName": "Lucia",
        "ShortName": "it-IT-LuciaRUS",
        "Gender": "Female",
        "Locale": "it-IT",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ja-JP, Ayumi)",
        "DisplayName": "Ayumi",
        "LocalName": "歩美",
        "ShortName": "ja-JP-Ayumi",
        "Gender": "Female",
        "Locale": "ja-JP",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ja-JP, HarukaRUS)",
        "DisplayName": "Haruka",
        "LocalName": "春香",
        "ShortName": "ja-JP-HarukaRUS",
        "Gender": "Female",
        "Locale": "ja-JP",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ja-JP, Ichiro)",
        "DisplayName": "Ichiro",
        "LocalName": "一郎",
        "ShortName": "ja-JP-Ichiro",
        "Gender": "Male",
        "Locale": "ja-JP",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ko-KR, HeamiRUS)",
        "DisplayName": "Heami",
        "LocalName": "해 미",
        "ShortName": "ko-KR-HeamiRUS",
        "Gender": "Female",
        "Locale": "ko-KR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ms-MY, Rizwan)",
        "DisplayName": "Rizwan",
        "LocalName": "Rizwan",
        "ShortName": "ms-MY-Rizwan",
        "Gender": "Male",
        "Locale": "ms-MY",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (nb-NO, HuldaRUS)",
        "DisplayName": "Hulda",
        "LocalName": "Hulda",
        "ShortName": "nb-NO-HuldaRUS",
        "Gender": "Female",
        "Locale": "nb-NO",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (nl-NL, HannaRUS)",
        "DisplayName": "Hanna",
        "LocalName": "Hanna",
        "ShortName": "nl-NL-HannaRUS",
        "Gender": "Female",
        "Locale": "nl-NL",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (pl-PL, PaulinaRUS)",
        "DisplayName": "Paulina",
        "LocalName": "Paulina",
        "ShortName": "pl-PL-PaulinaRUS",
        "Gender": "Female",
        "Locale": "pl-PL",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (pt-BR, Daniel)",
        "DisplayName": "Daniel",
        "LocalName": "Daniel",
        "ShortName": "pt-BR-Daniel",
        "Gender": "Male",
        "Locale": "pt-BR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (pt-BR, HeloisaRUS)",
        "DisplayName": "Heloisa",
        "LocalName": "Heloisa",
        "ShortName": "pt-BR-HeloisaRUS",
        "Gender": "Female",
        "Locale": "pt-BR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (pt-PT, HeliaRUS)",
        "DisplayName": "Helia",
        "LocalName": "Hélia",
        "ShortName": "pt-PT-HeliaRUS",
        "Gender": "Female",
        "Locale": "pt-PT",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ro-RO, Andrei)",
        "DisplayName": "Andrei",
        "LocalName": "Andrei",
        "ShortName": "ro-RO-Andrei",
        "Gender": "Male",
        "Locale": "ro-RO",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ru-RU, EkaterinaRUS)",
        "DisplayName": "Ekaterina",
        "LocalName": "Екатерина",
        "ShortName": "ru-RU-EkaterinaRUS",
        "Gender": "Female",
        "Locale": "ru-RU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ru-RU, Irina)",
        "DisplayName": "Irina",
        "LocalName": "Ирина",
        "ShortName": "ru-RU-Irina",
        "Gender": "Female",
        "Locale": "ru-RU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ru-RU, Pavel)",
        "DisplayName": "Pavel",
        "LocalName": "Павел",
        "ShortName": "ru-RU-Pavel",
        "Gender": "Male",
        "Locale": "ru-RU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (sk-SK, Filip)",
        "DisplayName": "Filip",
        "LocalName": "Filip",
        "ShortName": "sk-SK-Filip",
        "Gender": "Male",
        "Locale": "sk-SK",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (sl-SI, Lado)",
        "DisplayName": "Lado",
        "LocalName": "Lado",
        "ShortName": "sl-SI-Lado",
        "Gender": "Male",
        "Locale": "sl-SI",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (sv-SE, HedvigRUS)",
        "DisplayName": "Hedvig",
        "LocalName": "Hedvig",
        "ShortName": "sv-SE-HedvigRUS",
        "Gender": "Female",
        "Locale": "sv-SE",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ta-IN, Valluvar)",
        "DisplayName": "Valluvar",
        "LocalName": "வள்ளுவர்",
        "ShortName": "ta-IN-Valluvar",
        "Gender": "Male",
        "Locale": "ta-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (te-IN, Chitra)",
        "DisplayName": "Chitra",
        "LocalName": "చిత్ర",
        "ShortName": "te-IN-Chitra",
        "Gender": "Female",
        "Locale": "te-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (th-TH, Pattara)",
        "DisplayName": "Pattara",
        "LocalName": "ภัทรา",
        "ShortName": "th-TH-Pattara",
        "Gender": "Male",
        "Locale": "th-TH",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (tr-TR, SedaRUS)",
        "DisplayName": "Seda",
        "LocalName": "Seda",
        "ShortName": "tr-TR-SedaRUS",
        "Gender": "Female",
        "Locale": "tr-TR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (vi-VN, An)",
        "DisplayName": "An",
        "LocalName": "An",
        "ShortName": "vi-VN-An",
        "Gender": "Male",
        "Locale": "vi-VN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-CN, HuihuiRUS)",
        "DisplayName": "Huihui",
        "LocalName": "慧慧",
        "ShortName": "zh-CN-HuihuiRUS",
        "Gender": "Female",
        "Locale": "zh-CN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-CN, Kangkang)",
        "DisplayName": "Kangkang",
        "LocalName": "康康",
        "ShortName": "zh-CN-Kangkang",
        "Gender": "Male",
        "Locale": "zh-CN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-CN, Yaoyao)",
        "DisplayName": "Yaoyao",
        "LocalName": "瑶瑶",
        "ShortName": "zh-CN-Yaoyao",
        "Gender": "Female",
        "Locale": "zh-CN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-HK, Danny)",
        "DisplayName": "Danny",
        "LocalName": "Danny",
        "ShortName": "zh-HK-Danny",
        "Gender": "Male",
        "Locale": "zh-HK",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-HK, TracyRUS)",
        "DisplayName": "Tracy",
        "LocalName": "Tracy",
        "ShortName": "zh-HK-TracyRUS",
        "Gender": "Female",
        "Locale": "zh-HK",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-TW, HanHanRUS)",
        "DisplayName": "HanHan",
        "LocalName": "涵涵",
        "ShortName": "zh-TW-HanHanRUS",
        "Gender": "Female",
        "Locale": "zh-TW",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-TW, Yating)",
        "DisplayName": "Yating",
        "LocalName": "雅婷",
        "ShortName": "zh-TW-Yating",
        "Gender": "Female",
        "Locale": "zh-TW",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-TW, Zhiwei)",
        "DisplayName": "Zhiwei",
        "LocalName": "志威",
        "ShortName": "zh-TW-Zhiwei",
        "Gender": "Male",
        "Locale": "zh-TW",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    }
]

このクイックスタートでは、Speech SDK を使用してテキスト読み上げ合成を行うための一般的な設計パターンについて説明します。In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. まずは基本的な構成と合成を行った後、次のようなより高度なカスタム アプリケーション開発の例に進みます。You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • インメモリ ストリームとして応答を取得するGetting responses as in-memory streams
  • 出力のサンプル レートとビット レートをカスタマイズするCustomizing output sample rate and bit rate
  • SSML (音声合成マークアップ言語) を使用して合成要求を送信するSubmitting synthesis requests using SSML (speech synthesis markup language)
  • ニューラル音声を使用するUsing neural voices

前提条件Prerequisites

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。This article assumes that you have an Azure account and Speech service subscription. アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しくださいIf you don't have an account and subscription, try the Speech service for free.

ダウンロードしてインストールするDownload and install

Windows に Speech CLI をインストールするには、次の手順に従います。Follow these steps to install the Speech CLI on Windows:

  1. Windows では、お使いのプラットフォームに対応した Microsoft Visual Studio 2019 の Visual C++ 再頒布可能パッケージが必要です。On Windows, you need the Microsoft Visual C++ Redistributable for Visual Studio 2019 for your platform. これを初めてインストールする場合、再起動が必要になる場合があります。Installing this for the first time may require a restart.

  2. .NET Core 3.1 をインストールします。Install .NET Core 3.1.

  3. 次のコマンドを入力して、NuGet を使用して Speech CLI をインストールします。Install the Speech CLI using NuGet by entering this command:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI --version 1.15.0

spx」と入力して、Speech CLI のヘルプを表示します。Type spx to see help for the Speech CLI.

注意

NuGet の代わりに、Speech CLI の zip アーカイブをダウンロードして抽出し、spx-zips ディレクトリからお使いのプラットフォームを検索して抽出し、spx パスをシステムの PATH 変数に追加することができます。As an alternative to NuGet, you can download and extract the Speech CLI zip archive, find and extract your platform from the spx-zips directory, and add the spx path to your system PATH variable.

フォントの制限事項Font limitations

Windows の Speech CLI では、ローカル コンピューター上のコマンド プロンプトで使用できるフォントのみを表示できます。On Windows, the Speech CLI can only show fonts available to the command prompt on the local computer. Windows ターミナルでは、Speech CLI によって対話的に生成されるすべてのフォントがサポートされます。Windows Terminal supports all fonts produced interactively by the Speech CLI.

ファイルに出力すると、メモ帳などのテキスト エディターや、Microsoft Edge などの Web ブラウザーでも、すべてのフォントを表示できます。If you output to a file, a text editor like Notepad or a web browser like Microsoft Edge can also show all fonts.

サブスクリプション構成の作成Create subscription config

Speech CLI の使用を開始するには、Speech サブスクリプション キーとリージョン識別子を入力する必要があります。To start using the Speech CLI, you need to enter your Speech subscription key and region identifier. Speech Service を無料で試す」の手順に従って、これらの資格情報を取得します。Get these credentials by following steps in Try the Speech service for free. サブスクリプション キーとリージョン識別子 (たとえば、Once you have your subscription key and region identifier (ex. eastuswestus) を入手したら、次のコマンドを実行します。eastus, westus), run the following commands.

spx config --set @key SUBSCRIPTION-KEY
spx config --set @region REGION

これで、今後の SPX 要求のためのサブスクリプション認証が格納されるようになりました。Your subscription authentication is now stored for future SPX requests. これらの格納されている値のいずれかを削除する必要がある場合は、spx config @region --clear または spx config @key --clear を実行します。If you need to remove either of these stored values, run spx config @region --clear or spx config @key --clear.

スピーカーに音声を合成するSynthesize speech to a speaker

Speech CLI を実行して、音声をテキストに合成する準備ができました。Now you're ready to run the Speech CLI to synthesize speech from text. コマンド ラインから、Speech CLI バイナリ ファイルが含まれるディレクトリに変更します。From the command line, change to the directory that contains the Speech CLI binary file. 次に、次のコマンドを実行します。Then run the following command.

spx synthesize --text "The speech synthesizer greets you!"

Speech CLI では、コンピューターのスピーカーを通じて、英語の自然言語を生成します。The Speech CLI will produce natural language in English through the computer speaker.

音声をファイルに合成するSynthesize speech to a file

次のコマンドを実行して、スピーカーからの出力を .wav ファイルに変更します。Run the following command to change the output from your speaker to a .wav file.

spx synthesize --text "The speech synthesizer greets you!" --audio output greetings.wav

Speech CLI では、greetings.wav オーディオ ファイルに英語の自然言語を生成します。The Speech CLI will produce natural language in English into the greetings.wav audio file. Windows では、start greetings.wav と入力すると、オーディオファイルを再生できます。In Windows, you can play the audio file by entering start greetings.wav.

次のステップNext steps