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を動かす仕組みです。詳しくは以下をご覧ください。
環境変数でエンドポイントとデプロイ名と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 は、お客さまに寄り添い、お客さまにとって必要な技術を最適な形で届け続けることで、技術革新がもたらす企業・社会の持続的成長に貢献してまいります。
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基盤構築等を経験し、現在はクラウドアーキテクトとして先端技術の活用提案や新規サービスの立ち上げを担当。
担当記事一覧