Python で Text-to-Speech API を使用する

1. 概要

1215f38908082356.png

Text-to-Speech API を使用すると、デベロッパーは人間のような音声を生成できます。API は、テキストを WAV、MP3、Ogg Opus などの音声形式に変換します。また、音声合成マークアップ言語(SSML)入力もサポートしており、休止、数字、日時形式、その他の発音上の指示を指定できます。

このチュートリアルでは、Python で Text-to-Speech API を使用する方法に焦点を当てます。

学習内容

  • 環境の設定方法
  • サポートされている言語を一覧表示する方法
  • 利用可能な音声を一覧表示する方法
  • テキストから音声を合成する方法

必要なもの

  • Google Cloud プロジェクト
  • ブラウザ(ChromeFirefox など)
  • Python の使用経験

アンケート

このチュートリアルをどのように使用されますか?

通読のみ 通読して演習を行う

Python のご利用経験はどの程度ありますか?

初心者 中級者 上級者

Google Cloud サービスの使用経験はどの程度ありますか?

初心者 中級者 上級者

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] 853e55310c205094.png をクリックします。

3c1dabeca90e44e5.png

Cloud Shell を初めて起動する場合は、その内容を説明する中間画面が表示されます。中間画面が表示された場合は、[続行] をクリックします。

9c92662c6a846a5c.png

すぐにプロビジョニングが実行され、Cloud Shell に接続されます。

9f0e51b578fecce5.png

この仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。このコードラボで行う作業のほとんどはブラウザから実行できます。

Cloud Shell に接続すると、認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。

  1. Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list

コマンド出力

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

上記のようになっていない場合は、次のコマンドで設定できます。

gcloud config set project <PROJECT_ID>

コマンド出力

Updated property [core/project].

3. 環境のセットアップ

Text-to-Speech API の使用を開始する前に、Cloud Shell で次のコマンドを実行して API を有効にします。

gcloud services enable texttospeech.googleapis.com

次のように表示されます。

Operation "operations/..." finished successfully.

これで、Text-to-Speech API を使用できるようになりました。

ホーム ディレクトリに移動します。

cd ~

依存関係を分離する Python 仮想環境を作成します。

virtualenv venv-texttospeech

仮想環境をアクティブにします。

source venv-texttospeech/bin/activate

IPython と Text-to-Speech API クライアント ライブラリをインストールします。

pip install ipython google-cloud-texttospeech

次のように表示されます。

...
Installing collected packages: ..., ipython, google-cloud-texttospeech
Successfully installed ... google-cloud-texttospeech-2.16.3 ...

これで、Text-to-Speech API クライアント ライブラリを使用する準備が整いました。

次の手順では、前の手順でインストールした IPython というインタラクティブな Python インタープリタを使用します。Cloud Shell で ipython を実行してセッションを開始します。

ipython

次のように表示されます。

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.18.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

最初のリクエストを送信して、サポートされている言語を一覧表示する準備ができました。

4. サポートされている言語を一覧表示する

このセクションでは、サポートされているすべての言語のリストを取得します。

次のコードを IPython セッションにコピーします。

from typing import Sequence

import google.cloud.texttospeech as tts


def unique_languages_from_voices(voices: Sequence[tts.Voice]):
    language_set = set()
    for voice in voices:
        for language_code in voice.language_codes:
            language_set.add(language_code)
    return language_set


def list_languages():
    client = tts.TextToSpeechClient()
    response = client.list_voices()
    languages = unique_languages_from_voices(response.voices)

    print(f" Languages: {len(languages)} ".center(60, "-"))
    for i, language in enumerate(sorted(languages)):
        print(f"{language:>10}", end="\n" if i % 5 == 4 else "")
        

コードをよく見て、list_voices クライアント ライブラリ メソッドを使用してサポートされている言語のリストを作成する方法を確認してください。

関数を呼び出す

list_languages()

次のような(またはそれ以上の)リストが表示されます。

---------------------- Languages: 58 -----------------------
     af-ZA     am-ET     ar-XA     bg-BG     bn-IN
     ca-ES    cmn-CN    cmn-TW     cs-CZ     da-DK
     de-DE     el-GR     en-AU     en-GB     en-IN
     en-US     es-ES     es-US     eu-ES     fi-FI
    fil-PH     fr-CA     fr-FR     gl-ES     gu-IN
     he-IL     hi-IN     hu-HU     id-ID     is-IS
     it-IT     ja-JP     kn-IN     ko-KR     lt-LT
     lv-LV     ml-IN     mr-IN     ms-MY     nb-NO
     nl-BE     nl-NL     pa-IN     pl-PL     pt-BR
     pt-PT     ro-RO     ru-RU     sk-SK     sr-RS
     sv-SE     ta-IN     te-IN     th-TH     tr-TR
     uk-UA     vi-VN    yue-HK

リストには、次のような 58 の言語と言語変種が表示されます。

  • 中国語と台湾語、
  • オーストラリア英語、英国英語、インド英語、米国英語、
  • カナダとフランスのフランス語、
  • ブラジルとポルトガルのポルトガル語。

このリストは固定ではなく、新しい音声が利用可能になると増えます。

概要

この手順では、サポートされている言語を一覧表示しました。

5. 利用可能な音声を一覧表示する

このセクションでは、さまざまな言語で利用できる音声の一覧を示します。

次のコードを IPython セッションにコピーします。

import google.cloud.texttospeech as tts


def list_voices(language_code=None):
    client = tts.TextToSpeechClient()
    response = client.list_voices(language_code=language_code)
    voices = sorted(response.voices, key=lambda voice: voice.name)

    print(f" Voices: {len(voices)} ".center(60, "-"))
    for voice in voices:
        languages = ", ".join(voice.language_codes)
        name = voice.name
        gender = tts.SsmlVoiceGender(voice.ssml_gender).name
        rate = voice.natural_sample_rate_hertz
        print(f"{languages:<8} | {name:<24} | {gender:<8} | {rate:,} Hz")
        

コードをよく見て、クライアント ライブラリ メソッド list_voices(language_code) を使用して、特定の言語で使用可能な音声のリストを取得する方法を確認してください。

次に、利用可能なドイツ語の音声のリストを取得します。

list_voices("de")

次のように表示されます。

------------------------ Voices: 20 ------------------------
de-DE    | de-DE-Neural2-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Neural2-B          | MALE     | 24,000 Hz
...
de-DE    | de-DE-Standard-A         | FEMALE   | 24,000 Hz
de-DE    | de-DE-Standard-B         | MALE     | 24,000 Hz
...
de-DE    | de-DE-Studio-B           | MALE     | 24,000 Hz
de-DE    | de-DE-Studio-C           | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-B          | MALE     | 24,000 Hz
...

複数の女性と男性の声、標準音声、WaveNet 音声、Neural2 音声、スタジオ音声を利用できます。

次に、利用可能な英語の音声のリストを取得します。

list_voices("en")

次のような結果が得られます。

------------------------ Voices: 90 ------------------------
en-AU    | en-AU-Neural2-A          | FEMALE   | 24,000 Hz
...
en-AU    | en-AU-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Neural2-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Standard-A         | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-US    | en-US-Neural2-A          | MALE     | 24,000 Hz
...
en-US    | en-US-News-K             | FEMALE   | 24,000 Hz
...
en-US    | en-US-Standard-A         | MALE     | 24,000 Hz
...
en-US    | en-US-Studio-M           | MALE     | 24,000 Hz
...
en-US    | en-US-Wavenet-A          | MALE     | 24,000 Hz
...

さまざまな性別や音質の複数の音声に加えて、オーストラリア英語、イギリス英語、インド英語、アメリカ英語など、複数のアクセントも用意されています。

優先言語とバリエーション(またはすべての言語とバリエーション)で利用可能な音声のリストを作成します。

list_voices("fr")
list_voices("pt")
list_voices()

概要

このステップでは、利用可能な音声を一覧表示しました。詳しくは、サポートされている音声と言語をご覧ください。

6. テキストから音声を合成する

Text-to-Speech API を使用すると、文字列を音声データに変換できます。音声合成の出力はさまざまな方法で構成できます。たとえば、ユニークな音声を選択することや、ピッチの出力、音量、発話速度、サンプルレートを調節することが可能です。

次のコードを IPython セッションにコピーします。

import google.cloud.texttospeech as tts


def text_to_wav(voice_name: str, text: str):
    language_code = "-".join(voice_name.split("-")[:2])
    text_input = tts.SynthesisInput(text=text)
    voice_params = tts.VoiceSelectionParams(
        language_code=language_code, name=voice_name
    )
    audio_config = tts.AudioConfig(audio_encoding=tts.AudioEncoding.LINEAR16)

    client = tts.TextToSpeechClient()
    response = client.synthesize_speech(
        input=text_input,
        voice=voice_params,
        audio_config=audio_config,
    )

    filename = f"{voice_name}.wav"
    with open(filename, "wb") as out:
        out.write(response.audio_content)
        print(f'Generated speech saved to "{filename}"')
        

コードをよく見て、synthesize_speech クライアント ライブラリ メソッドを使用して音声データを生成し、wav ファイルとして保存する方法を確認してください。

次に、いくつかの異なるアクセントで文を生成します。

text_to_wav("en-AU-Neural2-A", "What is the temperature in Sydney?")
text_to_wav("en-GB-Neural2-B", "What is the temperature in London?")
text_to_wav("en-IN-Wavenet-C", "What is the temperature in Delhi?")
text_to_wav("en-US-Studio-O", "What is the temperature in New York?")
text_to_wav("fr-FR-Neural2-A", "Quelle est la température à Paris ?")
text_to_wav("fr-CA-Neural2-B", "Quelle est la température à Montréal ?")

次のように表示されます。

Generated speech saved to "en-AU-Neural2-A.wav"
Generated speech saved to "en-GB-Neural2-B.wav"
Generated speech saved to "en-IN-Wavenet-C.wav"
Generated speech saved to "en-US-Studio-O.wav"
Generated speech saved to "fr-FR-Neural2-A.wav"
Generated speech saved to "fr-CA-Neural2-B.wav"

生成されたすべてのファイルを一度にダウンロードするには、Python 環境から次の Cloud Shell コマンドを使用します。

!cloudshell download *.wav

検証すると、ブラウザでファイルがダウンロードされます。

44382e3b7a3314b0.png 4dbccf007cd73b91.png

各ファイルを開いて結果を確認します。

概要

このステップでは、Text-to-Speech API を使用して文を音声 wav ファイルに変換しました。詳しくは、音声ファイルの作成をご覧ください。

7. 完了

1215f38908082356.png

このラボでは、Python を使用して Text-to-Speech API を使用し、人間のような音声を生成する方法を学びました。

クリーンアップ

開発環境をクリーンアップするには、Cloud Shell で次の操作を行います。

  • IPython セッションがまだ開いている場合は、シェルに戻ります。exit
  • Python 仮想環境の使用を停止します。deactivate
  • 仮想環境フォルダ cd ~ ; rm -rf ./venv-texttospeech を削除します。

Google Cloud プロジェクトを削除するには、Cloud Shell で次の操作を行います。

  • 現在のプロジェクト ID を取得します。PROJECT_ID=$(gcloud config get-value core/project)
  • 削除するプロジェクトが echo $PROJECT_ID であることを確認します。
  • プロジェクトを削除する: gcloud projects delete $PROJECT_ID

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。