音声合成、音声認識、そしてSpeechT5を使ったその他の機能
音声合成、音声認識、その他のSpeechT5機能
私たちは喜んでお知らせします。SpeechT5は🤗Transformersで利用可能になりました。これは最先端の機械学習モデルの簡単に使用できる実装を提供するオープンソースライブラリです。
SpeechT5はもともと、Microsoft Research Asiaによって開発された論文「SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing」で説明されています。論文の著者が公開した公式のチェックポイントはHugging Face Hubで利用可能です。
すぐに試してみたい場合は、以下のデモがあります:
- 音声合成(TTS)
- 音声変換
- 自動音声認識
はじめに
SpeechT5は、1つのアーキテクチャに3つの異なる種類の音声モデルを組み込んでいます。
- パラメータ効率の高いファインチューニングを使用する 🤗 PEFT
- ゼロショット画像からテキスト生成 BLIP-2
- Hugging FaceとAWSが協力し、AIをよりアクセスしやすくするためにパートナーシップを結成
以下のことができます:
- 音声からテキストへの変換(自動音声認識や話者識別に使用)
- テキストから音声への変換(音声を合成)
- 音声から音声への変換(異なる声や音声の強調を行う)
SpeechT5の基本的なアイデアは、テキストから音声、音声からテキスト、テキストからテキスト、音声から音声までのデータの混合で単一のモデルを事前学習することです。これにより、モデルはテキストと音声の両方から同時に学習します。この事前学習アプローチの結果は、テキストと音声の両方に共有される統一された隠れ表現の空間を持つモデルです。
SpeechT5の中心には、通常のTransformerエンコーダーデコーダーモデルがあります。他のどのTransformerと同様に、エンコーダーデコーダーネットワークは、隠れ表現を使用してシーケンスからシーケンスへの変換をモデリングします。このTransformerバックボーンは、すべてのSpeechT5タスクに共通です。
テキストと音声データの両方を同じTransformerで扱うために、プリネットとポストネットと呼ばれるものが追加されました。プリネットの役割は、テキストまたは音声の入力をTransformerが使用する隠れ表現に変換することです。ポストネットは、Transformerの出力を再びテキストまたは音声に変換します。
SpeechT5のアーキテクチャを示す図は以下に示されています(オリジナルの論文から引用)。
事前学習中には、すべてのプリネットとポストネットが同時に使用されます。事前学習後、エンコーダーデコーダーバックボーン全体が単一のタスクでファインチューニングされます。このようなファインチューニングされたモデルでは、与えられたタスクに固有のプリネットとポストネットのみを使用します。たとえば、テキストから音声への変換にSpeechT5を使用する場合、テキストエンコーダープリネットをテキストの入力に、音声デコーダープリネットとポストネットを音声の出力に交換します。
注意:ファインチューニングされたモデルは、共有された事前学習済みモデルから同じ重みセットを使用して開始されますが、最終的にはすべて異なるものになります。たとえば、ファインチューニングされたASRモデルを取り出してプリネットとポストネットを交換して動作するTTSモデルを取得することはできません。SpeechT5は柔軟ですが、それほど柔軟ではありません。
テキストから音声への変換
SpeechT5は🤗Transformersに追加した初のテキストから音声モデルであり、近い将来、さらにTTSモデルを追加する予定です。
TTSタスクでは、モデルは次のプリネットとポストネットを使用します:
-
テキストエンコーダープリネット。テキストトークンをエンコーダーが期待する隠れ表現にマッピングするテキスト埋め込み層。BERTなどのNLPモデルで行われることに類似しています。
-
音声デコーダープリネット。ログメルスペクトログラムを入力として受け取り、一連の線形層を使用してスペクトログラムを隠れ表現に圧縮する。これはTacotron 2のTTSモデルから取られたデザインです。
-
音声デコーダーポストネット。出力スペクトログラムに追加する残差を予測し、結果を改善するために使用されます。これもTacotron 2から取られました。
ファインチューニングされたモデルのアーキテクチャは以下のようになります。
SpeechT5のテキストから音声モデルを使用して音声を合成する完全な例は次のとおりです。また、このインタラクティブなColabノートブックでも同様に進めることができます。
SpeechT5はTransformersの最新リリースではまだ利用できないため、GitHubからインストールする必要があります。さらに、追加の依存関係であるsentencepieceもインストールし、ランタイムを再起動してください。
pip install git+https://github.com/huggingface/transformers.git
pip install sentencepiece
まず、Hubから事前調整されたモデルをロードします。トークナイズと特徴抽出に使用されるプロセッサオブジェクトも一緒にロードします。使用するクラスはSpeechT5ForTextToSpeech
です。
from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts")
model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts")
次に、入力テキストをトークナイズします。
inputs = processor(text="Don't count the days, make the days count.", return_tensors="pt")
SpeechT5 TTSモデルは、単一の話者のための音声を作成するだけでなく、スピーカー埋め込みと呼ばれるものも使用します。これは特定の話者の声の特徴を捉えたものです。私たちは、Hub上のデータセットからこのようなスピーカー埋め込みをロードします。
from datasets import load_dataset
embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation")
import torch
speaker_embeddings = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0)
スピーカー埋め込みは形状が(1, 512)のテンソルです。この特定のスピーカー埋め込みは女性の声を表しています。これらの埋め込みは、CMU ARCTICデータセットからこのスクリプトを使用して取得されましたが、任意のX-Vector埋め込みを使用することができます。
今、モデルに入力トークンとスピーカー埋め込みを与えて音声を生成するように指示することができます。
spectrogram = model.generate_speech(inputs["input_ids"], speaker_embeddings)
これにより、形状が(140, 80)の対数メルスペクトログラムを含むテンソルが出力されます。最初の次元はシーケンスの長さであり、生成された音声のためにスピーチデコーダーのプレネットが常に入力シーケンスにドロップアウトを適用するため、実行ごとに変動する可能性があります。これにより、生成された音声に少しのランダムな変動が加わります。
予測された対数メルスペクトログラムを実際の音声波形に変換するには、ボコーダが必要です。理論的には、80ビンのメルスペクトログラムで動作する任意のボコーダを使用することができますが、便宜上、HiFi-GANに基づいたTransformersのボコーダを提供しています。このボコーダの重みと、事前調整されたTTSモデルの重みは、SpeechT5の元の著者から提供されました。
ボコーダをロードすることは他の🤗 Transformersモデルと同じくらい簡単です。
from transformers import SpeechT5HifiGan
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")
スペクトログラムからオーディオを作成するには、以下の手順を実行します。
with torch.no_grad():
speech = vocoder(spectrogram)
スペクトログラムを作成する中間ステップを必要としないように、generate_speech
にボコーダオブジェクトを渡すと、直接スピーチ波形が出力されます。
speech = model.generate_speech(inputs["input_ids"], speaker_embeddings, vocoder=vocoder)
最後に、音声波形をファイルに保存します。SpeechT5で使用されるサンプルレートは常に16 kHzです。
import soundfile as sf
sf.write("tts_example.wav", speech.numpy(), samplerate=16000)
出力は次のようになります(オーディオをダウンロード):
お使いのブラウザはオーディオ要素をサポートしていません。
TTSモデルについては以上です!うまくいくようにするための鍵は、適切なスピーカー埋め込みを使用することです。
Spacesでインタラクティブなデモを試すことができます。
💡 自分のデータセットや言語でSpeechT5 TTSを事前調整する方法に興味がある場合は、このColabノートブックを確認してプロセスの詳細な手順を見てください。
音声変換のための音声から音声へ
SpeechT5を使用して音声から音声へのモデリングを行うコンセプトは、テキストから音声へのモデリングと同じです。テキストエンコーダープレネットを音声エンコーダープレネットと交換するだけで、モデルの残りの部分は同じままです。
音声エンコーダープレネットは、wav2vec 2.0の特徴エンコーディングモジュールと同じです。入力波形をオーディオフレーム表現のシーケンスにダウンサンプリングするための畳み込み層から構成されています。
音声から音声へのタスクの例として、SpeechT5の作者は音声変換を行うためのファインチューンドされたチェックポイントを提供しています。これを使用するには、まずモデルをハブからロードします。モデルクラスはSpeechT5ForSpeechToSpeech
です。
from transformers import SpeechT5Processor, SpeechT5ForSpeechToSpeech
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_vc")
model = SpeechT5ForSpeechToSpeech.from_pretrained("microsoft/speecht5_vc")
入力として使用する音声オーディオが必要です。この例では、ハブ上の小さな音声データセットからオーディオをロードします。独自の音声波形をロードすることもできますが、モノラルでサンプリングレートが16 kHzである必要があります。ここで使用しているデータセットのサンプルはすでにこの形式になっています。
from datasets import load_dataset
dataset = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation")
dataset = dataset.sort("id")
example = dataset[40]
次に、モデルが期待する形式にオーディオを前処理します。
sampling_rate = dataset.features["audio"].sampling_rate
inputs = processor(audio=example["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")
TTSモデルと同様に、話者の埋め込みも必要です。これは、目標の声がどのように聞こえるかを説明します。
import torch
embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation")
speaker_embeddings = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0)
生成されたスペクトログラムをオーディオ波形に変換するために、ボコーダーもロードする必要があります。TTSモデルと同じボコーダーを使用しましょう。
from transformers import SpeechT5HifiGan
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")
これで、モデルのgenerate_speech
メソッドを呼び出して音声変換を行うことができます。
speech = model.generate_speech(inputs["input_values"], speaker_embeddings, vocoder=vocoder)
import soundfile as sf
sf.write("speech_converted.wav", speech.numpy(), samplerate=16000)
異なる声に変更するには、新しい話者の埋め込みをロードするだけです。自分自身の声から埋め込みを作成することさえできます!
元の入力(ダウンロード):
お使いのブラウザは
変換された声(ダウンロード):
お使いのブラウザは
この例の変換されたオーディオは、文の終わりよりも前に切れています。これは、2つの文の間の一時停止により、SpeechT5が(誤って)シーケンスの終わりに達したと予測したためかもしれません。他の例でも試してみてください。変換は正しいことが多いですが、時折早期に停止することがあります。
こちらでインタラクティブなデモを試すこともできます。🔥
自動音声認識のための音声からテキストへの変換
ASRモデルは、以下のプリネットとポストネットを使用します。
-
音声エンコーダのプリネット。これは、音声から音声モデルで使用されるプリネットと同じであり、wav2vec 2.0のCNN特徴エンコーダレイヤーから構成されています。
-
テキストデコーダのプリネット。テキストトークンを埋め込み層を使用して隠れた表現にマップする、TTSモデルのエンコーダプリネットと同様です。(事前トレーニングでは、これらの埋め込みはテキストエンコーダとデコーダのプリネット間で共有されます。)
-
テキストデコーダのポストネット。これは最も単純なものであり、隠れた表現を語彙上の確率に射影する単一の線形層で構成されています。
ファインチューンドされたモデルのアーキテクチャは次のようになります。
以前に🤗 Transformersの音声認識モデルのいずれかを試したことがある場合、SpeechT5も同じように使いやすいと感じるでしょう。始める最も簡単な方法は、パイプラインを使用することです。
from transformers import pipeline
generator = pipeline(task="automatic-speech-recognition", model="microsoft/speecht5_asr")
音声オーディオとしては、前のセクションと同じ入力を使用しますが、パイプラインがオーディオを自動的に正しい形式に変換するため、任意のオーディオファイルでも機能します。
from datasets import load_dataset
dataset = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation")
dataset = dataset.sort("id")
example = dataset[40]
今、パイプラインに音声を処理させ、テキストの転記を生成するように依頼することができます。
transcription = generator(example["audio"]["array"])
転記を印刷すると、次のようになります。
a man said to the universe sir i exist
それはまさに正しいですね!SpeechT5が使用するトークナイザは非常に基本的であり、文字レベルで動作します。したがって、ASRモデルは句読点や大文字を出力しません。
もちろん、モデルクラスを直接使用することも可能です。まず、ファインチューニングされたモデルとプロセッサオブジェクトをロードします。クラスは SpeechT5ForSpeechToText
です。
from transformers import SpeechT5Processor, SpeechT5ForSpeechToText
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_asr")
model = SpeechT5ForSpeechToText.from_pretrained("microsoft/speecht5_asr")
音声入力を前処理します。
sampling_rate = dataset.features["audio"].sampling_rate
inputs = processor(audio=example["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")
最後に、モデルにテキストトークンを音声入力から生成させ、その後、プロセッサのデコーディング関数を使用してこれらのトークンを実際のテキストに変換します。
predicted_ids = model.generate(**inputs, max_length=100)
transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
音声からテキストへのタスクのインタラクティブなデモで遊びましょう。
結論
SpeechT5は興味深いモデルです。他のほとんどのモデルとは異なり、同じアーキテクチャで複数のタスクを実行できます。プリネットとポストネットのみが変更されます。これらの組み合わせたタスクでモデルを事前学習することにより、ファインチューニング時に各個別のタスクをより優れた能力で実行できるようになります。
音声認識(ASR)、音声合成(TTS)、音声変換のタスクのチェックポイントのみを含めましたが、論文では音声翻訳、音声強化、話者識別のタスクにもモデルが成功裏に使用されたと述べられています。非常に多目的です!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles