使用 SpeechT5 進行語音合成、識別和更多功能

我們很高興地宣布,SpeechT5 現(xiàn)在可用于 ?? Transformers (一個開源庫,提供最前沿的機器學習模型實現(xiàn)的開源庫)。
SpeechT5 最初見于微軟亞洲研究院的這篇論文 SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing。論文作者發(fā)布的 官方檢查點 可在 Hugging Face Hub 上找到。
SpeechT5 論文地址:
https://arxiv.org/abs/2110.07205官方檢查點:
https://github.com/microsoft/SpeechT5
如果您想直接嘗試,這里有一些在 Spaces 上的演示:
語音合成 (TTS)
https://hf.co/spaces/Matthijs/speecht5-tts-demo語音轉(zhuǎn)換
https://hf.co/spaces/Matthijs/speecht5-vc-demo自動語音識別
https://hf.co/spaces/Matthijs/speecht5-asr-demo
介紹
SpeechT5 不是一種,也不是兩種,而是一種架構(gòu)中的三種語音模型。
它可以做:
語音到文本,用于自動語音識別或說話人識別;
文本轉(zhuǎn)語音,用于合成音頻;
語音到語音,用于在不同語音之間進行轉(zhuǎn)換或執(zhí)行語音增強。
SpeechT5 背后的主要思想是在文本到語音、語音到文本、文本到文本和語音到語音數(shù)據(jù)的混合體上預訓練單個模型。這樣,模型可以同時從文本和語音中學習。這種預訓練方法的結(jié)果是一個模型,該模型具有由文本和語音共享的隱藏表示的?統(tǒng)一空間。
SpeechT5 的核心是一個常規(guī)的?Transformer 編碼器 - 解碼器?模型。就像任何其他 Transformer 一樣,編碼器 - 解碼器網(wǎng)絡使用隱藏表示對序列到序列的轉(zhuǎn)換進行建模。這個 Transformer 骨干對于所有 SpeechT5 任務都是一樣的。
為了使同一個 Transformer 可以同時處理文本和語音數(shù)據(jù),添加了所謂的?pre-nets?和?post-nets。per-nets 的工作是將輸入文本或語音轉(zhuǎn)換為 Transformer 使用的隱藏表示。post-nets 從 Transformer 獲取輸出并將它們再次轉(zhuǎn)換為文本或語音。
下圖展示了 SpeechT5 的架構(gòu) (摘自原始論文)。
論文地址:
https://arxiv.org/abs/2110.07205

在預訓練期間,同時使用所有的 per-nets 和 post-nets 。預訓練后,整個編碼器 - 解碼器主干在單個任務上進行微調(diào)。這種經(jīng)過微調(diào)的模型僅使用特定于給定任務的 per-nets 和 post-nets 。例如,要將 SpeechT5 用于文本到語音轉(zhuǎn)換,您需要將文本編碼器 per-nets 交換為文本輸入,將語音解碼器 per-nets 和 post-nets 交換為語音輸出。
注意: 即使微調(diào)模型一開始使用共享預訓練模型的同一組權(quán)重,但最終版本最終還是完全不同。例如,您不能采用經(jīng)過微調(diào)的 ASR 模型并換掉 per-nets 和 post-nets 來獲得有效的 TTS 模型。SpeechT5 很靈活,但不是?那么靈活。
文字轉(zhuǎn)語音
SpeechT5 是我們添加到 ?? Transformers 的?第一個文本轉(zhuǎn)語音模型,我們計劃在不久的將來添加更多的 TTS 模型。
對于 TTS 任務,該模型使用以下 per-net 和 post-net:
文本編碼器 per-net。一個文本嵌入層,將文本標記映射到編碼器期望的隱藏表示。類似于 BERT 等 NLP 模型中發(fā)生的情況。
語音解碼器 per-net。這將對數(shù)梅爾頻譜圖作為輸入,并使用一系列線性層將頻譜圖壓縮為隱藏表示。此設計取自 Tacotron 2 TTS 模型。
語音解碼器 post-net。這預測了一個殘差以添加到輸出頻譜圖中并用于改進結(jié)果,同樣來自 Tacotron 2。微調(diào)模型的架構(gòu)如下所示。

以下是如何使用 SpeechT5 文本轉(zhuǎn)語音模型合成語音的完整示例。您還可以在 交互式 Colab 筆記本 中進行操作。
https://colab.research.google.com/drive/1XnOnCsmEmA3lHmzlNRNxRMcu80YZQzYf?usp=sharing
SpeechT5 在最新版本的 Transformers 中尚不可用,因此您必須從 GitHub 安裝它。還要安裝附加的依賴語句,然后重新啟動運行。
首先,我們從 Hub 加載 微調(diào)模型,以及用于標記化和特征提取的處理器對象。我們將使用的類是?SpeechT5ForTextToSpeech
。
微調(diào)模型:
https://hf.co/microsoft/speecht5_tts
接下來,標記輸入文本。
SpeechT5 TTS 模型不限于為單個說話者創(chuàng)建語音。相反,它使用所謂的?Speaker Embeddings?來捕捉特定說話者的語音特征。我們將從 Hub 上的數(shù)據(jù)集中加載這樣一個 Speaker Embeddings。
Speaker Embeddings 是形狀為 (1, 512) 的張量。這個特定的 Speaker Embeddings 描述了女性的聲音。使用 此腳本 從 CMU ARCTIC 數(shù)據(jù)集獲得嵌入?/utils/prep_cmu_arctic_spkemb.py
,任何 X-Vector 嵌入都應該有效。
腳本地址:
https://hf.co/mechanicalsea/speecht5-vc/blob/main/manifestCMU ARCTIC:
http://www.festvox.org/cmu_arctic/
現(xiàn)在我們可以告訴模型在給定輸入標記和 Speaker Embeddings 的情況下生成語音。
這會輸出一個形狀為 (140, 80) 的張量,其中包含對數(shù)梅爾譜圖。第一個維度是序列長度,它可能在運行之間有所不同,因為語音解碼器 per-net 總是對輸入序列應用 dropout。這為生成的語音增加了一些隨機變化。
要將預測的對數(shù)梅爾聲譜圖轉(zhuǎn)換為實際的語音波形,我們需要一個?聲碼器。理論上,您可以使用任何適用于 80-bin 梅爾聲譜圖的聲碼器,但為了方便起見,我們在基于 HiFi-GAN 的 Transformers 中提供了一個。此聲碼器的權(quán)重,以及微調(diào) TTS 模型的權(quán)重,由 SpeechT5 的原作者友情提供。
聲碼器的權(quán)重:
https://huggingface.co/mechanicalsea/speecht5-tts
加載聲碼器與任何其他 ?? Transformers 模型一樣簡單。
要從頻譜圖中制作音頻,請執(zhí)行以下操作:
我們還提供了一個快捷方式,因此您不需要制作頻譜圖的中間步驟。當您將聲碼器對象傳遞給 generate_speech 時,它會直接輸出語音波形。
最后,將語音波形保存到文件中。SpeechT5 使用的采樣率始終為 16 kHz。
輸出聽起來像這樣:
https://hf.co/datasets/huggingface/documentation-images/resolve/main/blog/speecht5/tts_example.wav
這就是 TTS 模型!使這個聲音好聽的關鍵是使用正確的 Speaker Embeddings。
您可以在 Spaces 上進行 交互式演示。
交互式演示:
https://hf.co/spaces/Matthijs/speecht5-tts-demo
語音轉(zhuǎn)語音的語音轉(zhuǎn)換
從概念上講,使用 SpeechT5 進行語音轉(zhuǎn)語音建模與文本轉(zhuǎn)語音相同。只需將文本編碼器 per-net 換成語音編碼器 per-net 即可。模型的其余部分保持不變。
語音編碼器 per-net?與 wAV2vec 2.0 中的特征編碼模塊相同。它由卷積層組成,這些卷積層將輸入波形下采樣為一系列音頻幀表示。
wAV2vec 2.0:
https://hf.co/docs/transformers/model_doc/wAV2vec2
作為語音到語音任務的示例,SpeechT5 的作者提供了一個 微調(diào)檢查點 用于進行語音轉(zhuǎn)換。要使用它,首先從 Hub 加載模型。請注意,模型類現(xiàn)在是?SpeechT5ForSpeechToSpeech
。
微調(diào)檢查點:
https://hf.co/microsoft/speecht5_vc
我們需要一些語音音頻作為輸入。出于本示例的目的,我們將從 Hub 上的小型語音數(shù)據(jù)集加載音頻。您也可以加載自己的語音波形,只要它們是單聲道的并且使用 16 kHz 的采樣率即可。我們在這里使用的數(shù)據(jù)集中的樣本已經(jīng)采用這種格式。
接下來,對音頻進行預處理,使其采用模型期望的格式。
與 TTS 模型一樣,我們需要 Speaker Embeddings。這些描述了目標語音聽起來像什么。
我們還需要加載聲碼器以將生成的頻譜圖轉(zhuǎn)換為音頻波形。讓我們使用與 TTS 模型相同的聲碼器。
現(xiàn)在我們可以通過調(diào)用模型的?generate_speech
?方法來執(zhí)行語音轉(zhuǎn)換
更改為不同的聲音就像加載新的 Speaker Embeddings 一樣簡單。您甚至可以嵌入自己的聲音!
原始輸入下載:
https://hf.co/datasets/huggingface/documentation-images/resolve/main/blog/speecht5/speech_original.wav
轉(zhuǎn)換后的語音:
https://hf.co/datasets/huggingface/documentation-images/resolve/main/blog/speecht5/speech_converted.wav
請注意,此示例中轉(zhuǎn)換后的音頻在句子結(jié)束前被切斷。這可能是由于兩個句子之間的停頓導致 SpeechT5 (錯誤地) 預測已經(jīng)到達序列的末尾。換個例子試試,你會發(fā)現(xiàn)轉(zhuǎn)換通常是正確的,但有時會過早停止。
???您可以進行交互式演示。
https://hf.co/spaces/Matthijs/speecht5-vc-demo
用于自動語音識別的語音轉(zhuǎn)文本
ASR 模型使用以下 pre-nets 和 post-net:
語音編碼器 per-net。這是語音到語音模型使用的相同預網(wǎng),由來自 wAV2vec 2.0 的 CNN 特征編碼器層組成。
文本解碼器 per-net。與 TTS 模型使用的編碼器預網(wǎng)類似,它使用嵌入層將文本標記映射到隱藏表示中。(在預訓練期間,這些嵌入在文本編碼器和解碼器預網(wǎng)之間共享。)
文本解碼器 post-net。這是其中最簡單的一個,由一個線性層組成,該層將隱藏表示投射到詞匯表上的概率。微調(diào)模型的架構(gòu)如下所示。
如果您之前嘗試過任何其他 ?? Transformers 語音識別模型,您會發(fā)現(xiàn) SpeechT5 同樣易于使用。最快的入門方法是使用流水線。
作為語音音頻,我們將使用與上一節(jié)相同的輸入,任何音頻文件都可以使用,因為流水線會自動將音頻轉(zhuǎn)換為正確的格式。
現(xiàn)在我們可以要求流水線處理語音并生成文本轉(zhuǎn)錄。
打印轉(zhuǎn)錄給出:
聽起來完全正確!SpeechT5 使用的分詞器非常基礎,是字符級別工作。因此,ASR 模型不會輸出任何標點符號或大寫字母。
當然也可以直接使用模型類。首先,加載 微調(diào)模型 和處理器對象。該類現(xiàn)在是?SpeechT5ForSpeechToText
。
微調(diào)模型:
https://hf.co/microsoft/speecht5_asr
預處理語音輸入:
最后,告訴模型從語音輸入中生成文本標記,然后使用處理器的解碼功能將這些標記轉(zhuǎn)換為實際文本。
播放?語音到文本任務?的交互式演示。
https://hf.co/spaces/Matthijs/speecht5-asr-demo
結(jié)論
SpeechT5 是一個有趣的模型,因為與大多數(shù)其他模型不同,它允許您使用相同的架構(gòu)執(zhí)行多項任務。只有 per-net 和 post-net 發(fā)生變化。通過在這些組合任務上對模型進行預訓練,它在微調(diào)時變得更有能力完成每個單獨的任務。
目前我們只介紹了語音識別 (ASR)、語音合成 (TTS) 和語音轉(zhuǎn)換任務,但論文還提到該模型已成功用于語音翻譯、語音增強和說話者識別。如此廣泛的用途,前途不可估量!
原文:?https://huggingface.co/blog/speecht5
作者: Mathijs Hollemans
譯者: innovation64 (李洋)
審校、排版: zhongdongy (阿東)