You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/ja/6-consumer/lessons/4-multiple-language-support/pi-translate-speech.md

8.7 KiB

スピーチを翻訳する - Raspberry Pi

このレッスンのこの部分では、翻訳サービスを使用してテキストを翻訳するコードを書きます。

翻訳サービスを使用してテキストを音声に変換する

スピーチサービスのREST APIは直接の翻訳をサポートしていません。その代わりに、スピーチからテキストへのサービスで生成されたテキストや、話された応答のテキストを翻訳するためにTranslatorサービスを使用できます。このサービスには、テキストを翻訳するために使用できるREST APIがあります。

タスク - Translatorリソースを使用してテキストを翻訳する

  1. スマートタイマーには2つの言語が設定されます。1つはLUISをトレーニングするために使用されたサーバーの言語この言語はユーザーに話しかけるメッセージを作成するためにも使用されます、もう1つはユーザーが話す言語です。language変数をユーザーが話す言語に更新し、LUISをトレーニングするために使用された言語用にserver_languageという新しい変数を追加してください:

    language = '<user language>'
    server_language = '<server language>'
    

    <user language>を、話す予定の言語のロケール名に置き換えてください。例えば、フランス語の場合はfr-FR、広東語の場合はzn-HKです。

    <server language>を、LUISをトレーニングするために使用された言語のロケール名に置き換えてください。

    サポートされている言語とそのロケール名のリストは、Microsoft Docsの言語と音声のサポートドキュメントで確認できます。

    💁 複数の言語を話せない場合は、Bing TranslateGoogle Translateのようなサービスを使用して、好みの言語から選択した言語に翻訳することができます。これらのサービスは翻訳されたテキストの音声を再生することもできます。

    例えば、LUISを英語でトレーニングし、ユーザー言語としてフランス語を使用したい場合、Bing Translateを使用して「2分27秒のタイマーを設定して」という文を英語からフランス語に翻訳し、その後Listen translationボタンを使用して翻訳をマイクに話すことができます。

    Bing TranslateのListen translationボタン

  2. speech_api_keyの下にTranslator APIキーを追加してください

    translator_api_key = '<key>'
    

    <key>をTranslatorサービスリソースのAPIキーに置き換えてください。

  3. say関数の上に、サーバー言語からユーザー言語へテキストを翻訳するtranslate_text関数を定義してください:

    def translate_text(text, from_language, to_language):
    

    この関数には、翻訳元と翻訳先の言語が渡されます。アプリは、スピーチを認識する際にユーザー言語からサーバー言語へ変換し、話されたフィードバックを提供する際にサーバー言語からユーザー言語へ変換する必要があります。

  4. この関数内で、REST API呼び出しのURLとヘッダーを定義してください

    url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0'
    
    headers = {
        'Ocp-Apim-Subscription-Key': translator_api_key,
        'Ocp-Apim-Subscription-Region': location,
        'Content-type': 'application/json'
    }
    

    このAPIのURLは場所に依存せず、代わりに場所はヘッダーとして渡されます。APIキーは直接使用されるため、スピーチサービスのようにトークン発行APIからアクセストークンを取得する必要はありません。

  5. 次に、呼び出しのパラメータと本文を定義してください:

    params = {
        'from': from_language,
        'to': to_language
    }
    
    body = [{
        'text' : text
    }]
    

    paramsはAPI呼び出しに渡すパラメータを定義し、翻訳元と翻訳先の言語を渡します。この呼び出しは、from言語のテキストをto言語に翻訳します。

    bodyは翻訳するテキストを含みます。これは配列であり、同じ呼び出しで複数のテキストブロックを翻訳できます。

  6. REST APIを呼び出し、レスポンスを取得してください

    response = requests.post(url, headers=headers, params=params, json=body)
    

    戻ってくるレスポンスはJSON配列であり、翻訳を含む1つのアイテムがあります。このアイテムには、本文で渡されたすべてのアイテムの翻訳の配列があります。

    [
        {
            "translations": [
                {
                    "text": "Set a 2 minute 27 second timer.",
                    "to": "en"
                }
            ]
        }
    ]
    
  7. 配列内の最初のアイテムから最初の翻訳のtestプロパティを返してください:

    return response.json()[0]['translations'][0]['text']
    
  8. while Trueループを更新して、ユーザー言語からサーバー言語へconvert_speech_to_text呼び出しのテキストを翻訳してください:

    if len(text) > 0:
        print('Original:', text)
        text = translate_text(text, language, server_language)
        print('Translated:', text)
    
        message = Message(json.dumps({ 'speech': text }))
        device_client.send_message(message)
    

    このコードは、元のテキストと翻訳されたテキストをコンソールに出力します。

  9. say関数を更新して、サーバー言語からユーザー言語へ話すテキストを翻訳してください:

    def say(text):
        print('Original:', text)
        text = translate_text(text, server_language, language)
        print('Translated:', text)
        speech = get_speech(text)
        play_speech(speech)
    

    このコードは、元のテキストと翻訳されたテキストをコンソールに出力します。

  10. コードを実行してください。関数アプリが実行されていることを確認し、ユーザー言語でタイマーをリクエストしてください。自分でその言語を話すか、翻訳アプリを使用してください。

    pi@raspberrypi:~/smart-timer $ python3 app.py
    Connecting
    Connected
    Using voice fr-FR-DeniseNeural
    Original: Définir une minuterie de 2 minutes et 27 secondes.
    Translated: Set a timer of 2 minutes and 27 seconds.
    Original: 2 minute 27 second timer started.
    Translated: 2 minute 27 seconde minute a commencé.
    Original: Times up on your 2 minute 27 second timer.
    Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.
    

    💁 言語によって表現方法が異なるため、LUISに与えた例とは少し異なる翻訳が得られる場合があります。その場合は、LUISにさらに例を追加し、再トレーニングしてモデルを再公開してください。

💁 このコードはcode/piフォルダーにあります。

😀 あなたの多言語タイマーアプリは成功しました!

免責事項:
この文書は、AI翻訳サービス Co-op Translator を使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された原文が公式な情報源と見なされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の使用に起因する誤解や誤認について、当方は一切の責任を負いません。