台本を翻訳して外国語の音声ファイルを自動生成する方法

ポッドキャストやYouTube、ショート動画などでも台本を創る人とそのまましゃべっちゃう人と二通りあるかと思います。

いずれにしても、海外へのリーチも狙っている方にとっては、外国語翻訳と音声ファイルの同時生成が可能になれば、作業はめっちゃ楽になりますよね。

該当するAIサービスもたくさんありますから、それぞれ作業ごとにAIにかけてもいいですが、これくらいのことであれば、azure APIとPythonでやってしまうと一発解決です。

この記事では、AzureのAPIを使って、日本語の台本をそのまま外国語のスピーチとして音声ファイルを出力するサンプルコードを掲載しています。

日本語は話者人口は多いですが、やはり世界規模で見ると取得難解言語なので優位性は低くなります。

特にインバウンドを狙うビジネスをしている方は、ぜひマスターしてみてください。

日本語のテキストをスペイン語の音声にする

必要なライブラリは以下

pip install azure-cognitiveservices-speech azure-ai-translation-document

azureのAPIキーの取得や、リージョンの解説などは、こちらの記事を参考にしてください。

このサンプルコードを使えば、日本語でテキストを書いて、実行キーを押すだけで、スペイン語のナレーション音声ファイルが完成します。

また、もちろんAzure Speech Serviceの音声の種類は、非常に多くのバリエーションがあります。

音声は、言語、性別、発音のアクセント、話者のスタイル(ナチュラル、ニュースキャスター、感情豊かなど)によって異なります。

import os
import requests
from azure.cognitiveservices.speech import SpeechConfig, SpeechSynthesizer, AudioConfig

# Azure Translator APIの設定
translator_key = "あなたの翻訳APIキー"
translator_endpoint = "https://api.cognitive.microsofttranslator.com/"
translator_region = "あなたのリージョン"

# Azure Speech Service APIの設定
speech_key = "あなたのスピーチAPIキー"
speech_region = "あなたのリージョン"

# 日本語からスペイン語に翻訳する関数
def translate_text(text, to_lang="es"):
    path = '/translate?api-version=3.0'
    constructed_url = translator_endpoint + path
    
    headers = {
        'Ocp-Apim-Subscription-Key': translator_key,
        'Ocp-Apim-Subscription-Region': translator_region,
        'Content-type': 'application/json'
    }

    body = [{
        'text': text
    }]

    params = {
        'to': to_lang
    }

    response = requests.post(constructed_url, params=params, headers=headers, json=body)
    response.raise_for_status()
    translation_result = response.json()
    return translation_result[0]['translations'][0]['text']

# スペイン語のテキストを音声に変換する関数
def text_to_speech(text, output_file="output.wav"):
    speech_config = SpeechConfig(subscription=speech_key, region=speech_region)
    
    # スペイン語の女性音声を設定 (例: 'es-ES-ElviraNeural')
    speech_config.speech_synthesis_voice_name = 'es-ES-ElviraNeural'  # 女性の声に設定

    audio_config = AudioConfig(filename=output_file)

    # スペイン語(es-ES)で音声を合成
    synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
    synthesizer.speak_text(text)
    print(f"音声ファイル {output_file} を作成しました。")

# 使用例
if __name__ == "__main__":
    japanese_text = "こんにちは、元気ですか?"
    translated_text = translate_text(japanese_text)
    print(f"翻訳結果: {translated_text}")
    
    # スペイン語の音声を生成(女性の声)
    text_to_speech(translated_text)

コメントアウトで解説していますので、音声のタイプを選んで、あなたのプロジェクトにぴったりのものを使ってみてください。

主な音声の指定オプション

  1. 言語と地域: 各言語には特定の地域ごとのアクセントがあります(例: スペイン語にはスペインのアクセント es-ES、メキシコのアクセント es-MX など)。
  2. 性別: 音声は通常、男性(Male)と女性(Female)の両方がサポートされています。
  3. スタイル: 一部の音声には、感情や話し方のスタイルが選べる場合があります(例: ニュースキャスターのような話し方、フレンドリーなトーンなど)。

具体的な例

スペイン語には以下のような音声オプションがあります(例としてスペインのスペイン語 es-ES を使用):

  • 女性の音声:
    • es-ES-ElviraNeural
    • es-ES-LaiaNeural
  • 男性の音声:
    • es-ES-AlvaroNeural
    • es-ES-DarioNeural

これらの音声オプションは、Neural TTS(ニューラル音声合成)で、非常に自然な話し方を再現します。

スペイン語の音声オプション一覧

スペイン(es-ES)

  • 女性の声:
    • es-ES-ElviraNeural:自然で標準的な女性の声
    • es-ES-LaiaNeural:もう一つの女性の声
  • 男性の声:
    • es-ES-AlvaroNeural:自然な男性の声
    • es-ES-DarioNeural:もう一つの男性の声

メキシコ(es-MX)

  • 女性の声:
    • es-MX-DaliaNeural:メキシコの女性の声
  • 男性の声:
    • es-MX-JorgeNeural:メキシコの男性の声

ロシア語に変換

import os
import requests
from azure.cognitiveservices.speech import SpeechConfig, SpeechSynthesizer, AudioConfig

# Azure Translator APIの設定
translator_key = "あなたの翻訳APIキー"
translator_endpoint = "https://api.cognitive.microsofttranslator.com/"
translator_region = "あなたのリージョン"

# Azure Speech Service APIの設定
speech_key = "あなたのスピーチAPIキー"
speech_region = "あなたのリージョン"

# 日本語からロシア語に翻訳する関数
def translate_text(text, to_lang="ru"):  # ロシア語 'ru' に変更
    path = '/translate?api-version=3.0'
    constructed_url = translator_endpoint + path
    
    headers = {
        'Ocp-Apim-Subscription-Key': translator_key,
        'Ocp-Apim-Subscription-Region': translator_region,
        'Content-type': 'application/json'
    }

    body = [{
        'text': text
    }]

    params = {
        'to': to_lang
    }

    response = requests.post(constructed_url, params=params, headers=headers, json=body)
    response.raise_for_status()
    translation_result = response.json()
    return translation_result[0]['translations'][0]['text']

# ロシア語のテキストを女性の音声で音声に変換する関数
def text_to_speech(text, output_file):
    # 1. ロシア語の音声設定を追加する
    speech_config = SpeechConfig(subscription=speech_key, region=speech_region)
    
    # 女性の声を指定する: 'ru-RU-SvetlanaNeural' はロシア語の女性の音声
    speech_config.speech_synthesis_voice_name = 'ru-RU-SvetlanaNeural'  # ここでロシア語の女性の声を指定

    audio_config = AudioConfig(filename=output_file)

    # 2. SpeechSynthesizerを初期化
    synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)

    # 3. ロシア語で音声を合成
    synthesizer.speak_text(text)  # ロシア語テキストを読み上げ
    print(f"音声ファイル {output_file} を作成しました。")

# 使用例
if __name__ == "__main__":
    japanese_text = "こんにちは、元気ですか?"  # 日本語の入力テキスト
    translated_text = translate_text(japanese_text)  # 日本語からロシア語に翻訳
    print(f"翻訳結果: {translated_text}")
    
    # 絶対パスを指定して音声ファイルを出力
    absolute_output_path = "/tmp/output_audio.wav"  # ここに絶対パスを指定
    text_to_speech(translated_text, absolute_output_path)  # ロシア語音声を作成

ロシア語の音声オプション一覧

ロシア語(ru-RU)

  • 女性の声:
    • ru-RU-SvetlanaNeural:自然なロシア語の女性の声
  • 男性の声:
    • ru-RU-DmitryNeural:自然なロシア語の男性の声

より自然な処理をするための技術

句読点や間の適切な扱い

1. 標準的な句読点

通常の文章では、句読点(カンマやピリオド)を使うことで、Azureの音声合成エンジンが適切に間やイントネーションを処理します。例えば、以下のような文ではカンマやピリオドを自然に読み上げます。

  • : “こんにちは、元気ですか?私はとても元気です。”

2. 改行や段落

文章に改行(\n)や段落を追加することで、音声合成エンジンに少し長めのポーズを入れさせることができます。

  • : “こんにちは。\n私は元気です。”

3. SSML(Speech Synthesis Markup Language)を使った高度な制御

より細かい音声制御が必要な場合、Azure Speech Serviceは SSML(Speech Synthesis Markup Language)をサポートしています。SSMLを使うと、句読点に加えて、音声合成時の間(pause)やイントネーションを調整できます。

SSMLの使用例は以下の通りです。

SSMLの例

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="ru-RU">
    Здравствуйте, как вы? <break time="500ms"/> Я чувствую себя отлично.
</speak>

この例では、<break time=”500ms”/> タグを使って、500ミリ秒(0.5秒)のポーズを追加しています。
このように、SSMLを使うと句読点に加えて、さらに詳細な制御が可能になります。

<break time=”500ms”/> タグを使った場合、そのタグが挿入された箇所にポーズが入ります。

これは、句読点の有無に関わらず、タグが指定された場所にポーズが追加されます。

SSMLでは、発話するタイミングや間(ポーズ)の場所をより細かく制御するために、このようなタグを使用します。

ただし、<break time=”500ms”/>は翻訳後のファイルに手動で挿入する必要があり、かなり細かく設定しなければいけないプロジェクト向けてです。

参考になれば幸いです。