Chirp 3: 即時カスタム音声

Text-to-Speech の即時カスタム音声を使用すると、ユーザーは独自の高品質の音声録音でモデルをトレーニングして、パーソナライズされた音声モデルを作成できます。これにより、個人の音声を迅速に生成できます。生成された音声は、ストリーミングと長いテキストの両方をサポートする Cloud TTS API を使用して音声を合成するために使用できます。

安全上の理由から、この音声クローニング機能へのアクセスは、許可リストに登録されたユーザーに制限されています。この機能にアクセスするには、セールスチームのメンバーにお問い合わせのうえ、許可リストに追加してください。

Colab ノートブックを試す GitHub でノートブックを表示

対応言語

インスタント カスタム音声の作成と合成は、次の言語でサポートされています。

言語 BCP-47 コード 同意に関する声明
アラビア語(XA) ar-XA .أنا مالك هذا الصوت وأوافق على أن تستخدم Google هذا الصوت لإنشاء نموذج صوتي اصطناعي
ベンガル語(インド) bn-IN আমি এই ভয়েসের মালিক এবং আমি একটি সিন্থেটিক ভয়েস মডেল তৈরি করতে এই ভয়েস ব্যবহার করে Google-এর সাথে সম্মতি দিচ্ছি।
中国語(中国) cmn-CN 我是此声音的拥有者并授权谷歌使用此声音创建语音合成模型
ドイツ語(ドイツ) de-DE Ich bin der Eigentümer dieser Stimme und bin damit einverstanden, dass Google diese Stimme zur Erstellung eines synthetischen Stimmmodells verwendet.
英語(オーストラリア) en-AU 私はこの音声の所有者であり、Google がこの音声を使用して合成音声モデルを作成することに同意します。
英語(英国) en-GB 私はこの音声の所有者であり、Google がこの音声を使用して合成音声モデルを作成することに同意します。
英語(インド) en-IN 私はこの音声の所有者であり、Google がこの音声を使用して合成音声モデルを作成することに同意します。
英語(アメリカ) en-US 私はこの音声の所有者であり、Google がこの音声を使用して合成音声モデルを作成することに同意します。
スペイン語(スペイン) es-ES Soy el propietario de esta voz y doy mi consentimiento para que Google la utilice para crear un modelo de voz sintetica.
スペイン語(アメリカ) es-US Soy el propietario de esta voz y doy mi consentimiento para que Google la utilice para crear un modelo de voz sintetica.
フランス語(カナダ) fr-CA Je suis le propriétaire de cette voix et j'autorise Google à utiliser cette voix pour créer un modèle de voix synthétique.
フランス語(フランス) fr-FR Je suis le propriétaire de cette voix et j'autorise Google à utiliser cette voix pour créer un modèle de voix synthétique.
グジャラト語(インド) gu-IN હું આ વોઈસનો માલિક છું અને સિન્થેટિક વોઈસ મોડલ બનાવવા માટે આ વોઈસનો ઉપયોગ કરીને google ને હું સંમતિ આપું છું
ヒンディー語(インド) hi-IN मैं इस आवाज का मालिक हूं और मैं सिंथेटिक आवाज मॉडल बनाने के लिए Google को इस आवाज का उपयोग करने की सहमति देता हूं
インドネシア語(インドネシア) id-ID Saya pemilik suara ini dan saya menyetujui Google menggunakan suara ini untuk membuat model suara sintetis.
イタリア語(イタリア) it-IT Sono il proprietario di questa voce e acconsento che Google la utilizzi per creare un modello di voce sintetica.
日本語(日本) ja-JP 私はこの音声の所有者であり、Googleがこの音声を使用して音声合成モデルを作成することを承認します。
カンナダ語(インド) kn-IN ನಾನು ಈ ಧ್ವನಿಯ ಮಾಲಿಕ ಮತ್ತು ಸಂಶ್ಲೇಷಿತ ಧ್ವನಿ ಮಾದರಿಯನ್ನು ರಚಿಸಲು ಈ ಧ್ವನಿಯನ್ನು ಬಳಸಿಕೊಂಡುಗೂಗಲ್ ಗೆ ನಾನು ಸಮ್ಮತಿಸುತ್ತೇನೆ.
韓国語(韓国) ko-KR 나는 이 음성의 소유자이며 구글이 이 음성을 사용하여 음성 합성 모델을 생성할 것을 허용합니다.
マラヤーラム語(インド) ml-IN ഈ ശബ്ദത്തിന്റെ ഉടമ ഞാനാണ്, ഒരു സിന്തറ്റിക് വോയ്‌സ് മോഡൽ സൃഷ്ടിക്കാൻ ഈ ശബ്‌ദം ഉപയോഗിക്കുന്നതിന് ഞാൻ Google-ന് സമ്മതം നൽകുന്നു."
マラーティー語(インド) mr-IN मी या आवाजाचा मालक आहे आणि सिंथेटिक व्हॉइस मॉडेल तयार करण्यासाठी हा आवाज वापरण्यासाठी मी Google ला संमती देतो
オランダ語(オランダ) nl-NL Ik ben de eigenaar van deze stem en ik geef Google toestemming om deze stem te gebruiken om een synthetisch stemmodel te maken.
ポーランド語(ポーランド) pl-PL Jestem właścicielem tego głosu i wyrażam zgodę na wykorzystanie go przez Google w celu utworzenia syntetycznego modelu głosu.
ポルトガル語(ブラジル) pt-BR Eu sou o proprietário desta voz e autorizo o Google a usá-la para criar um modelo de voz sintética.
ロシア語(ロシア) ru-RU Я являюсь владельцем этого голоса и даю согласие Google на использование этого голоса для создания модели синтетического голоса.
タミル語(インド) ta-IN நான் இந்த குரலின் உரிமையாளர் மற்றும் செயற்கை குரல் மாதிரியை உருவாக்க இந்த குரலை பயன்படுத்த குகல்க்கு நான் ஒப்புக்கொள்கிறேன்.
テルグ語(インド) te-IN నేను ఈ వాయిస్ యజమానిని మరియు సింతటిక్ వాయిస్ మోడల్ ని రూపొందించడానికి ఈ వాయిస్ ని ఉపయోగించడానికి googleకి నేను సమ్మతిస్తున్నాను.
タイ語(タイ) th-TH ฉันเป็นเจ้าของเสียงนี้ และฉันยินยอมให้ Google ใช้เสียงนี้เพื่อสร้างแบบจำลองเสียงสังเคราะห์
トルコ語(トルコ) tr-TR Bu sesin sahibi benim ve Google'ın bu sesi kullanarak sentetik bir ses modeli oluşturmasına izin veriyorum.
ベトナム語(ベトナム) vi-VN Tôi là chủ sở hữu giọng nói này và tôi đồng ý cho Google sử dụng giọng nói này để tạo mô hình giọng nói tổng hợp.

ご利用いただけるリージョン

カスタム音声の即時作成と合成は、次の Google Cloud リージョンでそれぞれご利用いただけます。

Google Cloud ゾーン サポートされている方法 提供状況
global 作成、統合 限定公開プレビュー
us 統合性 限定公開プレビュー
eu 統合性 限定公開プレビュー
asia-southeast1 統合性 限定公開プレビュー

サポートされる出力形式

デフォルトのレスポンス形式は LINEAR16 ですが、次の形式もサポートされています。

API メソッド 形式
streaming ALAW、MULAW、OGG_OPUS、PCM
batch ALAW、MULAW、MP3、OGG_OPUS、PCM

機能のサポートと制限事項

機能 サポート 説明
SSML いいえ 合成音声をカスタマイズするための SSML タグ
テキストベースのプロンプト 試験運用版 句読点、休止、不自然な発音を使用して、テキスト読み上げに自然な流れとペースを追加します。
タイムスタンプ いいえ 単語レベルのタイムスタンプ
タグを一時停止する いいえ 合成音声にオンデマンド一時停止を導入
ペース管理 いいえ 合成音声の速度を 0.25 倍から 2 倍に調整します。
発音の制御 いいえ IPA または X-SAMPA 音声エンコードを使用した単語やフレーズの発音のカスタマイズ

Chirp 3: インスタント カスタム音声を使用する

以降のセクションでは、Text-to-Speech API で Chirp 3: インスタント カスタム音声の機能を使用するための方法について説明します。

  1. 同意宣言を録音する: インスタント カスタム音声に関する法律と倫理のガイドラインに準拠するため、必要な同意宣言を適切な言語で録音します。この音声は、24 kHz のサンプリング レートで LINEAR16 エンコードのモノラル WAV ファイルとして録音します。(私はこの音声の所有者であり、Google がこの音声を使用して合成音声モデルを作成することに同意します。)
  2. 参照音声を録音する: パソコンのマイクを使用して、24 kHz のサンプリング レートで LINEAR16 エンコードのモノラル WAV ファイルとして最大 10 秒間の音声を録音します。録音中に背景雑音が入らないようにしてください。同意音声と参照音声の両方を同じ環境で録音する必要があります。
  3. 音声ファイルを保存する: 録音した音声ファイルを、指定した Cloud Storage のロケーションに保存します。

REST API を使用してインスタント カスタム音声を作成する

import requests, os, json

def create_instant_custom_voice_key(
    access_token, project_id, reference_audio_bytes, consent_audio_bytes
):
    url = "https://texttospeech.googleapis.com/v1beta1/voices:generateVoiceCloningKey"

    request_body = {
        "reference_audio": {
            "audio_config": {"audio_encoding": "LINEAR16", "sample_rate_hertz": 24000},
            "content": reference_audio_bytes,
        },
        "voice_talent_consent": {
            "audio_config": {"audio_encoding": "LINEAR16", "sample_rate_hertz": 24000},
            "content": consent_audio_bytes,
        },
        "consent_script": "I am the owner of this voice and I consent to Google using this voice to create a synthetic voice model.",
        "language_code": "en-US",
    }

    try:
        headers = {
            "Authorization": f"Bearer {access_token}",
            "x-goog-user-project": project_id,
            "Content-Type": "application/json; charset=utf-8",
        }

        response = requests.post(url, headers=headers, json=request_body)
        response.raise_for_status()

        response_json = response.json()
        return response_json.get("voiceCloningKey")

    except requests.exceptions.RequestException as e:
        print(f"Error making API request: {e}")
    except json.JSONDecodeError as e:
        print(f"Error decoding JSON response: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

REST API を使用して即時カスタム音声で合成する

import requests, os, json, base64
from IPython.display import Audio, display

def synthesize_text_with_cloned_voice(access_token, project_id, voice_key, text):
    url = "https://texttospeech.googleapis.com/v1beta1/text:synthesize"

    request_body = {
        "input": {
            "text": text
        },
        "voice": {
            "language_code": "en-US",
            "voice_clone": {
                "voice_cloning_key": voice_key,
            }
        },
        "audioConfig": {
            "audioEncoding": "LINEAR16",
            "sample_rate_hertz": 24000
        }
    }

    try:
        headers = {
            "Authorization": f"Bearer {access_token}",
            "x-goog-user-project": project_id,
            "Content-Type": "application/json; charset=utf-8"
        }

        response = requests.post(url, headers=headers, json=request_body)
        response.raise_for_status()

        response_json = response.json()
        audio_content = response_json.get("audioContent")

        if audio_content:
            display(Audio(base64.b64decode(audio_content), rate=24000))
        else:
            print("Error: Audio content not found in the response.")
            print(response_json)

    except requests.exceptions.RequestException as e:
        print(f"Error making API request: {e}")
    except json.JSONDecodeError as e:
        print(f"Error decoding JSON response: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

Python クライアント ライブラリを使用してインスタント カスタム音声で合成する

この例では、Python クライアント ライブラリを使用して、voice_cloning_key.txt に保存されている音声クローニング キーを使用して、即時カスタム音声合成を行います。音声クローニング キーを生成するには、REST API を使用してインスタント カスタム音声を作成するをご覧ください。

from google.cloud import texttospeech
from google.cloud.texttospeech_v1beta1.services.text_to_speech import client


def perform_voice_cloning(
    voice_cloning_key: str,
    transcript: str,
    language_code: str,
    synthesis_output_path: str,
    tts_client: client.TextToSpeechClient,
) -> None:
  """Perform voice cloning and write output to a file.

  Args:
    voice_cloning_key: The voice cloning key.
    transcript: The transcript to synthesize.
    language_code: The language code.
    synthesis_output_path: The synthesis audio output path.
    tts_client: The TTS client to use.
  """
  voice_clone_params = texttospeech.VoiceCloneParams(
      voice_cloning_key=voice_cloning_key
  )
  voice = texttospeech.VoiceSelectionParams(
      language_code=language_code, voice_clone=voice_clone_params
  )
  request = texttospeech.SynthesizeSpeechRequest(
      input=texttospeech.SynthesisInput(text=transcript),
      voice=voice,
      audio_config=texttospeech.AudioConfig(
          audio_encoding=texttospeech.AudioEncoding.LINEAR16,
          sample_rate_hertz=24000,
      ),
  )
  response = tts_client.synthesize_speech(request)
  with open(synthesis_output_path, 'wb') as out:
    out.write(response.audio_content)
    print(f'Audio content written to file {synthesis_output_path}.')


if __name__ == '__main__':
  client = texttospeech.TextToSpeechClient()
  with open('voice_cloning_key.txt', 'r') as f:
    key = f.read()
  perform_voice_cloning(
      voice_cloning_key=key,
      transcript='Hello world!',
      language_code='en-US',
      synthesis_output_path='/tmp/output.wav',
      tts_client=client,
  )

Python クライアント ライブラリを使用してインスタント カスタム音声でストリーミング合成を行う

この例では、Python クライアント ライブラリを使用して、voice_cloning_key.txt に保存されている音声クローニング キーを使用して、即時カスタム音声ストリーミング合成を行います。音声クローニング キーを生成するには、REST API を使用してインスタント カスタム音声を作成するをご覧ください。

import io
import wave
from google.cloud import texttospeech
from google.cloud.texttospeech_v1beta1.services.text_to_speech import client


def perform_voice_cloning_with_simulated_streaming(
    voice_cloning_key: str,
    simulated_streamed_text: list[str],
    language_code: str,
    synthesis_output_path: str,
    tts_client: client.TextToSpeechClient,
) -> None:
  """Perform voice cloning for a given reference audio, voice talent consent, and consent script.

  Args:
    voice_cloning_key: The voice cloning key.
    simulated_streamed_text: The list of transcripts to synthesize, where each
      item represents a chunk of streamed text. This is used to simulate
      streamed text input and is not meant to be representative of real-world
      streaming usage.
    language_code: The language code.
    synthesis_output_path: The path to write the synthesis audio output to.
    tts_client: The TTS client to use.
  """
  voice_clone_params = texttospeech.VoiceCloneParams(
      voice_cloning_key=voice_cloning_key
  )
  streaming_config = texttospeech.StreamingSynthesizeConfig(
      voice=texttospeech.VoiceSelectionParams(
          language_code=language_code, voice_clone=voice_clone_params
      ),
      streaming_audio_config=texttospeech.StreamingAudioConfig(
          audio_encoding=texttospeech.AudioEncoding.PCM,
          sample_rate_hertz=24000,
      ),
  )
  config_request = texttospeech.StreamingSynthesizeRequest(
      streaming_config=streaming_config
  )

  # Request generator. Consider using Gemini or another LLM with output
  # streaming as a generator.
  def request_generator():
    yield config_request
    for text in simulated_streamed_text:
      yield texttospeech.StreamingSynthesizeRequest(
          input=texttospeech.StreamingSynthesisInput(text=text)
      )

  streaming_responses = tts_client.streaming_synthesize(request_generator())
  audio_buffer = io.BytesIO()
  for response in streaming_responses:
    print(f'Audio content size in bytes is: {len(response.audio_content)}')
    audio_buffer.write(response.audio_content)

  # Write collected audio outputs to a WAV file.
  with wave.open(synthesis_output_path, 'wb') as wav_file:
    wav_file.setnchannels(1)
    wav_file.setsampwidth(2)
    wav_file.setframerate(24000)
    wav_file.writeframes(audio_buffer.getvalue())
    print(f'Audio content written to file {synthesis_output_path}.')


if __name__ == '__main__':
  client = texttospeech.TextToSpeechClient()
  with open('voice_cloning_key.txt', 'r') as f:
    key = f.read()
  perform_voice_cloning_with_simulated_streaming(
      voice_cloning_key=key,
      simulated_streamed_text=[
          'Hello world!',
          'This is the second text chunk.',
          'This simulates streaming text for synthesis.',
      ],
      language_code='en-US',
      synthesis_output_path='streaming_output.wav',
      tts_client=client,
  )