Azure OpenAI ServiceのText to Speechを試してみた

OpenAIではすでに提供されているテキスト読み上げサービスが、Azureでも使えるようになったので試してみました。

また、従来からあるAzure AI Speechとの比較も行いました。

概要

OpenAI のテキスト音声読み上げは、NeuralとNeuralHDの2 つのモデルがあります。

Neuralは速いですが品質が低いです。NeuralHDはNeuralに比べると遅いですが、品質が高いです。

OpenAI テキスト読み上げ音声とは - Azure AI services | Microsoft Learn

ボイスバリエーション(声の種類)は6つです。

英語に最適化されていますが、57の言語をサポートしていて、もちろん日本語も含まれています。

ちなみに、Azure AI Speechはボイスバリエーションは400以上で77の言語に対応していますが、日本語で絞るとボイスバリエーションは7つです。

音声を生成する

リソースのデプロイ

Azure OpenAI ServiceはNorth Central USとSweden Centralのみのサポートなので。リソースを上記のリージョンのいずれかでデプロイします。

モデルのデプロイ

Sweden Centralにデプロイ済みのリソースがあるので、今回はこちらにモデルをデプロイします。

まずは新しいデプロイの作成を選択します。

ベースモデルからtts-hdを選びます。

デプロイ名を指定して作成を選択します。

正常にデプロイできたことを確認します。

音声の生成

REST APIのみでプレイグラウンドは用意されていないので、WSLでCurlを使ってを試します。

※普段REST APIの検証はVS Codeの拡張機能を使っていますが、今回レスポンスをmp3ファイルとして保存する必要があり、VS Codeの拡張機能でレスポンスをmp3で保存する方法がわからなかったのでWSLを使いました。WSLはWindows上でLinuxを動かす仕組みです。詳しくは以下をご覧ください。

WSL のインストール | Microsoft Learn

環境変数でエンドポイントとデプロイ名とAPI keyを設定します。

eueda@W1008671N211:~$ export AZURE_OPENAI_ENDPOINT="https://XXXXXX.openai.azure.com/" 
eueda@W1008671N211:~$ export DEPLOYNAME="tts-hd"
eueda@W1008671N211:~$ export AZURE_OPENAI_KEY="XXXXXXXXXXXXXXXXXX"

クイックスタートを参考に音声データを生成します。

Azure OpenAI Service を使用したテキスト読み上げ - Azure OpenAI | Microsoft Learn

※クイックスタートのまま実行すると、inputのI'mのシングルクォーテーションに対してエスケープが必要なのでご注意ください。

Bash

curl $AZURE_OPENAI_ENDPOINT'openai/deployments/'$DEPLOYNAME'/audio/speech?api-version=2024-02-15-preview' \
  -H "api-key: $AZURE_OPENAI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
     "model": "tts-1-hd",
     "input": "I am excited to try text to speech.",
     "voice": "alloy"
 }' --output speech.mp3

実行結果

eueda@W1008671N211:~$ curl $AZURE_OPENAI_ENDPOINT'openai/deployments/'$DEPLOYNAME'/audio/speech?api-version=2024-02-15-preview' \
>  -H "api-key: $AZURE_OPENAI_KEY" \
>  -H "Content-Type: application/json" \
>  -d '{
>     "model": "tts-1-hd",
>     "input": "I am excited to try text to speech.",
>     "voice": "alloy"
> }' --output speech.mp3
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 39461    0 39360  100   101   5587     14  0:00:07  0:00:07 --:--:--  8969

エクスプローラで"\\wsl$"と入れると、WSLのファイルが確認できます。

出力されたファイルを聞きます。(はてなブログではmp3を埋め込めなかったのでmp4に変換しています)

出力サンプルはこちら

問題なく生成できることが確認できました。

日本語でのテスト

先ほどのinputを変更して日本語で出力します。

Bash

curl $AZURE_OPENAI_ENDPOINT'openai/deployments/'$DEPLOYNAME'/audio/speech?api-version=2024-02-15-preview' \
  -H "api-key: $AZURE_OPENAI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
     "model": "tts-1-hd",
     "input": "音声合成を試すのが楽しみだ。",
     "voice": "alloy"
 }' --output speech_jp.mp3

実行結果

eueda@W1008671N211:~$ curl $AZURE_OPENAI_ENDPOINT'openai/deployments/'$DEPLOYNAME'/audio/speech?api-version=2024-02-15-preview' \
>  -H "api-key: $AZURE_OPENAI_KEY" \
>  -H "Content-Type: application/json" \
>  -d '{
>     "model": "tts-1-hd",
>     "input": "音声合成を試すのが楽しみだ。",
>     "voice": "alloy"
> }' --output speech_jp.mp3
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 53388    0 53280  100   108   7797     15  0:00:07  0:00:06  0:00:01 12577

出力されたファイルを聞きます。

出力サンプルはこちら

少しイントネーションに違和感がありますが、問題ない範囲と感じました。

Azure AI Speechとの比較

すでにサービスが提供されている、Azure AI Speechと比較していきたいと思います。

Azure AI Speechでの生成

こちらを参考にAzure AI Speechでも音声を生成します。

テキストから音声を合成する方法 - Speech サービス - Azure AI services | Microsoft Learn

Azure AI Speech用のAPI Keyを設定します。

eueda@W1008671N211:~$ export AISPEECH_KEY="XXXXXXXXXXXXXXXX"

Bash

curl --location --request POST 'https://eastus.tts.speech.microsoft.com/cognitiveservices/v1' \
 --header 'Ocp-Apim-Subscription-Key: '$AISPEECH_KEY \
 --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 name='\''en-US-JennyNeural'\''>
         I am excited to try text to speech
     
 ' > output.mp3

実行結果

eueda@W1008671N211:~$ curl --location --request POST 'https://eastus.tts.speech.microsoft.com/cognitiveservices/v1' \
> --header 'Ocp-Apim-Subscription-Key: '$AISPEECH_KEY \
> --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 name='\''en-US-JennyNeural'\''>
>         I am excited to try text to speech
>     
> ' > output.mp3
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 50252    0 50112  100   140  28680     80  0:00:01  0:00:01 --:--:-- 28764

Azure OpenAI Serviceよりも早く生成できました。

出力サンプルはこちら

特に問題なく生成出来ています。

生成する日本語テキスト

生成する文章は、JBSの企業理念である以下にします。

優れたテクノロジーを、親しみやすく


世の中は技術革新によって目まぐるしい進歩を続けます。
企業・社会が持続的な成長を為すには、先進技術をいち早く取り入れる必要がある一方、正しい使い方を見極めて徹底活用しなければ望んだ効果は得られません。

私たちJBS は、お客さまに寄り添い、お客さまにとって必要な技術を最適な形で届け続けることで、技術革新がもたらす企業・社会の持続的成長に貢献してまいります。

企業理念|JBS 日本ビジネスシステムズ株式会社

Azure OpenAI ServiceでJBS企業理念の音声生成

先ほどのinput部分を変更します。

Bash

curl $AZURE_OPENAI_ENDPOINT'openai/deployments/'$DEPLOYNAME'/audio/speech?api-version=2024-02-15-preview' \
  -H "api-key: $AZURE_OPENAI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
     "model": "tts-1-hd",
     "input": "優れたテクノロジーを、親しみやすく。世の中は技術革新によって目まぐるしい進歩を続けます。企業・社会が持続的な成長を為すには、先進技術をいち早く取り入れる必要がある一方、正しい使い方を見極めて徹底活用しなければ望んだ効果は
得られません。私たちJBS は、お客さまに寄り添い、お客さまにとって必要な技術を最適な形で届け続けることで、技術革新がもたらす企業・社会の持続的成長に貢献してまいります。",
     "voice": "alloy"
}' --output aoai_speech_jbs.mp3

実行結果

eueda@W1008671N211:~$ curl $AZURE_OPENAI_ENDPOINT'openai/deployments/'$DEPLOYNAME'/audio/speech?api-version=2024-02-15-preview' \
>  -H "api-key: $AZURE_OPENAI_KEY" \
>  -H "Content-Type: application/json" \
>  -d '{
>     "model": "tts-1-hd",
>     "input": "優れたテクノロジーを、親しみやすく。世の中は技術革新によって目まぐるしい進歩を続けます。企業・社会が持続的な成長を為すには、先進技術をいち早く取り入れる必要がある一方、正しい使い方を見極めて徹底活用しなければ望んだ効果は
得られません。私たちJBS は、お客さまに寄り添い、お客さまにとって必要な技術を最適な形で届け続けることで、技術革新がもたらす企業・社会の持続的成長に貢献してまいります。",
>     "voice": "alloy"
> }' --output aoai_speech_jbs.mp3
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  702k    0  702k  100   643  36884     32  0:00:20  0:00:19  0:00:01 74931

出力サンプルはこちら

「為す」の読み方が間違っていますが、概ね問題ないです

Azure AI SpeechでJBS企業理念の音声生成

Azure AI Speechで日本語の音声を生成するためには、voice nameのパラメータを日本語対応のものに変更する必要があります。

Bash

curl --location --request POST 'https://eastus.tts.speech.microsoft.com/cognitiveservices/v1' \
--header 'Ocp-Apim-Subscription-Key: '$AISPEECH_KEY \
--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 name='\''ja-JP-NanamiNeural'\''>
        優れたテクノロジーを、親しみやすく。世の中は技術革新によって目まぐるしい進歩を続けます。企業・社会が持続的な成長を為すには、先進技術をいち早く取り入れる必要がある一方、正しい使い方を見極めて徹底活用しなければ望んだ効果は得られません。私たちJBS は、お客さまに寄り添い、お客さまにとって必要な技術を最適な形で届け続けることで、技術革新がもたらす企業・社会の持続的成長に貢献してまいります。
    
' > aispeech_output_jbs.mp3

実行結果

eueda@W1008671N211:~$ curl --location --request POST 'https://eastus.tts.speech.microsoft.com/cognitiveservices/v1' \
> --header 'Ocp-Apim-Subscription-Key: '$AISPEECH_KEY \
> --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 name='\''ja-JP-NanamiNeural'\''>
>         優れたテクノロジーを、親しみやすく。世の中は技術革新によって目まぐるしい進歩を続けます。企業・社会が持続的な成長を為すには、先進技術をいち早く取り入れる必要がある一方、正しい使い方を見極めて徹底活用しなければ望んだ効果は得られ
ません。私たちJBS は、お客さまに寄り添い、お客さまにとって必要な技術を最適な形で届け続けることで、技術革新がもたらす企業・社会の持続的成長に貢献してまいります。
>     
> ' > aispeech_output_jbs.mp3
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  596k    0  595k  100   684   307k    352  0:00:01  0:00:01 --:--:--  307k

出力サンプルはこちら

こちらは「為す」の読み方も含めて、問題なく生成できました。

まとめ

Azure OpenAI Serviceを使った音声生成も非常に高いレベルで行えることが出来ましたが、 Azure AI Speechと比べると改善の余地はあるかと思います。

また、生成のスピードも現状ではAzure AI Speechの方が優れていました。JBSの企業理念の文章を使用した比較では、Azure AI Speechは1秒ほどで生成したのに対して、Azure OpenAI Serviceのは20秒程度かかりました。この結果からもAzure AI Speechのほうが高速であるといえます。

しかしながら、Azure AI Speechは言語に合わせてボイスバリエーションを設定する必要があります。一定の言語で生成せず多言語の場合は、Azure OpenAI Serviceのほうが簡単なスクリプトで生成できると考えます。

執筆担当者プロフィール
上田 英治

上田 英治(日本ビジネスシステムズ株式会社)

エンジニアとしてインフラ構築、システム開発やIoT基盤構築等を経験し、現在はクラウドアーキテクトとして先端技術の活用提案や新規サービスの立ち上げを担当。

担当記事一覧