深度學習技術的進步推動了語音識別領域的快速發展,各種根據 Transformer 架構的模型如 Wav2Vec2、HuBERT、Whisper 等相繼出現,各有優劣。Wav2Vec2 利用 Masked Language Modeling 預訓練目標學習語音單元關係,而 HuBERT 則採用 Clustered MLM 學習聚類別關係。多語言語音識別模型 XLSR-53 和 XLS-R 根據 Wav2Vec2,分別使用 56,000 小時和 436,000 小時的語音資料進行預訓練,涵蓋了 53 種和 128 種語言。Whisper 則採用 sequence-to-sequence 訓練方法,可以直接將語音轉換為文字。Encoder-Decoder 架構是語音識別的常用方法,Whisper 也使用了這種架構,並透過特殊標記引導模型輸出,例如語言標記和無語音標記。Whisper 的使用步驟包括載入預訓練 tokenizer、token 化、解碼等。OpenAI 提供了多種 Whisper 變體,大小和語言支援各有不同。評估語音識別模型的指標包括 WER 和 CER,可以透過標準化文字和計算差異來評估模型的預測品質。在執行時間和記憶體佔用方面,Wav2Vec2 表現更佳,而 Whisper 在多語言支援和功能性方面更具優勢。

Wav2Vec2和HuBERT

Wav2Vec2和HuBERT是兩種根據Transformer的語音識別模型。Wav2Vec2使用了一種稱為Masked Language Modeling (MLM)的預訓練目標,學習語音單元之間的關係。HuBERT則使用了一種稱為Clustered MLM的預訓練目標,學習語音單元之間的聚類別關係。

XLSR-53和XLS-R

XLSR-53和XLS-R是兩種根據Wav2Vec2的多語言語音識別模型。XLSR-53使用了56,000小時的語音資料進行預訓練,涵蓋了53種語言。XLS-R則使用了436,000小時的語音資料進行預訓練,涵蓋了128種語言。

Whisper

Whisper是一種根據Transformer的語音識別模型,使用了一種稱為sequence-to-sequence的訓練方法。Whisper可以直接將語音訊號轉換為文字,不需要額外的語言模型。

Encoder-Decoder架構

Encoder-Decoder架構是一種常用的語音識別方法,將語音訊號編碼為一系列的向量,然後解碼為文字。Whisper使用了一種特殊的Encoder-Decoder架構,可以直接將語音訊號轉換為文字,不需要額外的語言模型。

圖表翻譯:
  graph LR
    A[語音訊號] --> B[CTC]
    B --> C[Wav2Vec2]
    C --> D[HuBERT]
    D --> E[XLSR-53]
    E --> F[XLS-R]
    F --> G[Whisper]
    G --> H[Encoder-Decoder架構]

圖表展示了語音識別技術與Transformer-Based架構之間的關係,從語音訊號到CTC、Wav2Vec2、HuBERT、XLSR-53、XLS-R和Whisper等模型,再到Encoder-Decoder架構。

Whisper模型的工作原理

Whisper是一種使用特殊序列格式的模型,因此瞭解其生成過程非常重要。特殊標記被用來指示語言或任務,從而引導模型向期望的輸出邁進。這與之前章節中介紹的條件方法類別似。一些最重要的標記包括:

  • 語音開始時的「開始轉錄」標記
  • 非英語語言的語言標記(例如,印地語的「hi」)
  • 使用語言標記,可以進行語言識別、轉錄或翻譯成英語
  • 如果存在「無語音」標記,Whisper用於語音活動檢測

下面是一個西班牙語的例子及其對應的格式:

from transformers import WhisperTokenizer

tokenizer = WhisperTokenizer.from_pretrained(
    "openai/whisper-small", language="Spanish", task="transcribe"
)

input_str = "Hola, ¿cómo estás?"

labels = tokenizer(input_str).input_ids

decoded_with_special = tokenizer.decode(
    labels, skip_special_tokens=False
)
decoded_str = tokenizer.decode(labels, skip_special_tokens=True)

print(f"輸入:{input_str}")
print(f"格式化輸入(含特殊標記):{decoded_with_special}")
print(f"格式化輸入(不含特殊標記):{decoded_str}")

Whisper的使用步驟

  1. 載入預先訓練好的tokenizer,並指定語言和任務引數。
  2. 將輸入字串進行token化。
  3. 將token IDs解碼回原始字串,包括特殊標記。
  4. 將token IDs解碼回原始字串,排除特殊標記。

使用Whisper建立轉錄內容與使用Wav2Vec2並不大不同:

  1. 使用processor將音訊資料準備為模型期望的格式。
  2. 模型生成對應於轉錄的token IDs。
  3. processor將IDs解碼並轉換為人類可讀的字串。

OpenAI釋出了九個Whisper變體,從3900萬到15億引數,並有多語言和英語僅設定的模型檢查點。在這個例子中,我們使用中等大小的多語言模型,它可以在2 GB的GPU記憶體中執行,並且比最大模型快六倍。

from transformers import WhisperForConditionalGeneration, WhisperProcessor

whisper_processor = WhisperProcessor.from_pretrained("openai/whisper-small")
whisper_model = WhisperForConditionalGeneration.from_pretrained(
    "openai/whisper-small"
).to(device)

inputs = whisper_processor(
    array, sampling_rate=sampling_rate, return_tensors="pt"
)

with torch.inference_mode():
    generated_ids = whisper_model.generate(**inputs.to(device))

transcription = whisper_processor.batch_decode(
    generated_ids, skip_special_tokens=False
)

Whisper模型的優勢

Whisper具有多種優勢,包括:

  • 支援多語言轉錄
  • 能夠進行語言識別和翻譯
  • 可以用於語音活動檢測
  • 有多種模型大小可供選擇,從小型到大型

此外,Whisper還有一些額外的功能,如Distil Whisper專案,它可以開發出高品質的小型模型,執行速度快達六倍,模型大小減少49%。

自然語言處理中的語音轉文字技術

語音轉文字(Speech-to-Text)是一種將語音訊號轉換為文字的技術,近年來因為深度學習和Transformer架構的發展而迅速進步。其中,Whisper是一種根據Transformer的語音轉文字模型,具有高準確度和多語言支援。

Whisper模型的優點

Whisper模型具有以下優點:

  • 高準確度:Whisper模型在多個語言和資料集上的表現優於其他語音轉文字模型。
  • 多語言支援:Whisper模型支援多種語言,包括英語、西班牙語、法語等。
  • 實時轉錄:Whisper模型可以實時轉錄語音訊號,適合於直播、會議等應用場景。

WhisperProcessor的使用

WhisperProcessor是Hugging Face Transformers函式庫中的一個類別,提供了對Whisper模型的簡單介面。以下是使用WhisperProcessor的示例:

from transformers import WhisperProcessor, WhisperForConditionalGeneration

# 載入預訓練的Whisper模型和處理器
processor = WhisperProcessor.from_pretrained("openai/whisper-small")
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")

# 載入音訊檔案
audio =...

# 將音訊檔案轉換為文字
inputs = processor(audio, return_tensors="pt")
logits = model(**inputs).logits
transcription = processor.batch_decode(logits)

print(transcription)

長音訊轉錄

Whisper模型可以處理長音訊檔案,但需要將音訊檔案分割成小塊,然後再進行轉錄。以下是使用WhisperProcessor進行長音訊轉錄的示例:

from transformers import WhisperProcessor, WhisperForConditionalGeneration

# 載入預訓練的Whisper模型和處理器
processor = WhisperProcessor.from_pretrained("openai/whisper-small")
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")

# 載入長音訊檔案
long_audio =...

# 將長音訊檔案分割成小塊
chunks =...
for chunk in chunks:
    # 將小塊音訊檔案轉換為文字
    inputs = processor(chunk, return_tensors="pt")
    logits = model(**inputs).logits
    transcription = processor.batch_decode(logits)
    print(transcription)

實時轉錄

Whisper模型可以實時轉錄語音訊號,適合於直播、會議等應用場景。以下是使用WhisperProcessor進行實時轉錄的示例:

from transformers import WhisperProcessor, WhisperForConditionalGeneration

# 載入預訓練的Whisper模型和處理器
processor = WhisperProcessor.from_pretrained("openai/whisper-small")
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")

# 開啟麥克風
import pyaudio
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)

while True:
    # 讀取麥克風音訊訊號
    audio = stream.read(1024)
    
    # 將音訊訊號轉換為文字
    inputs = processor(audio, return_tensors="pt")
    logits = model(**inputs).logits
    transcription = processor.batch_decode(logits)
    
    # 輸出轉錄結果
    print(transcription)

評估語音轉文字模型

評估語音轉文字模型的效能可以使用WER(Word Error Rate)和CER(Character Error Rate)等指標。以下是使用WER和CER評估Whisper模型的示例:

from transformers import WhisperProcessor, WhisperForConditionalGeneration

# 載入預訓練的Whisper模型和處理器
processor = WhisperProcessor.from_pretrained("openai/whisper-small")
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")

# 載入測試資料集
test_dataset =...

# 評估Whisper模型的效能
wer = 0
cer = 0
for audio, transcription in test_dataset:
    # 將音訊檔案轉換為文字
    inputs = processor(audio, return_tensors="pt")
    logits = model(**inputs).logits
    predicted_transcription = processor.batch_decode(logits)
    
    # 計算WER和CER
    wer +=...
    cer +=...
    
print(f"WER: {wer / len(test_dataset)}")
print(f"CER: {cer / len(test_dataset)}")

圖表翻譯:

  graph LR
    A[語音訊號] -->|轉換|> B[文字]
    B -->|評估|> C[WER和CER]
    C -->|輸出|> D[結果]

此圖表描述了語音轉文字技術的基本流程,包括語音訊號的轉換、評估和輸出結果。

自動語音識別模型評估

在評估自動語音識別(ASR)模型時,需要考慮多個因素,包括模型的執行時間、最大記憶體佔用量以及預測品質。這裡,我們將比較兩個流行的ASR模型:Wav2Vec2和Whisper。

執行時間和記憶體佔用量

首先,我們使用pipeline函式建立了Wav2Vec2和Whisper的管道,並使用measure_latency_and_memory_use函式測量了兩個模型的執行時間和最大記憶體佔用量。結果顯示,Wav2Vec2的執行時間遠遠快於Whisper,而兩個模型的最大記憶體佔用量相似。

wav2vec2_pipe = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h", device=device)
whisper_pipe = pipeline("automatic-speech-recognition", model="openai/whisper-base", device=device)

with torch.inference_mode():
    measure_latency_and_memory_use(wav2vec2_pipe, array, "Wav2Vec2", device, nb_loops=100)
    measure_latency_and_memory_use(whisper_pipe, array, "Whisper", device=device, nb_loops=100)

預測品質評估

評估ASR模型的預測品質通常使用單詞錯誤率(WER)作為指標。WER計算了預測結果與真實標籤之間的差異,包括替換、插入和刪除操作的數量。例如,給定真實標籤「how can the llama jump」和預測結果「can the lama jump up」,WER為0.6(三個錯誤除以五個單詞)。

from evaluate import load

wer_metric = load("wer")
label = "how can the llama jump"
pred = "can the lama jump up"
print(wer_metric.compute(predictions=[pred], references=[label]))

標準化和評估

在評估ASR模型之前,需要標準化標籤和預測結果,以確保公平性。這裡,我們使用BasicTextNormalizer從transformers函式庫來移除連續空白字元和基本標點符號,並將文字轉換為小寫。

from transformers.models.whisper.english_normalizer import BasicTextNormalizer

normalizer = BasicTextNormalizer()
print(normalizer("I'm having a great day!"))

實驗結果

我們使用Common Voice資料集的英語和法語測試集來評估Wav2Vec2和Whisper的效能。結果顯示,Wav2Vec2在WER和CER方面均優於Whisper。

圖表翻譯:

  flowchart TD
    A[開始] --> B[載入資料集]
    B --> C[標準化標籤和預測結果]
    C --> D[計算WER和CER]
    D --> E[比較模型效能]
    E --> F[輸出結果]

內容解密:

上述程式碼展示瞭如何使用pipeline函式建立ASR模型管道,然後使用measure_latency_and_memory_use函式測量執行時間和最大記憶體佔用量。接著,我們使用load函式從evaluate函式庫載入WER指標,然後計算預測結果與真實標籤之間的差異。最後,我們使用BasicTextNormalizer標準化標籤和預測結果,以確保公平性。

語音轉文字評估流程

在進行語音轉文字評估時,我們需要先準備好評估所需的資料和模型。以下是評估流程的重點:

資料準備

首先,我們需要載入語音資料集。在這個例子中,我們使用的是 Mozilla Foundation 的 Common Voice 資料集。這個資料集包含了多種語言的語音錄音,非常適合用於語音轉文字的評估。

from datasets import Audio

def prepare_dataset(language="en", sample_count=200):
    dataset = load_dataset(
        "mozilla-foundation/common_voice_13_0",
        language,
        split="test",
        streaming=True,
    )
    dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
    dataset = dataset.take(sample_count)
    buffered_dataset = [sample for sample in dataset.map(normalize)]
    return buffered_dataset

模型評估

接下來,我們需要定義評估模型的函式。這個函式會根據輸入的模型、資料集和語言,進行語音轉文字的評估。

def evaluate_model(pipe, dataset, lang="en", use_whisper=False):
    predictions, references = [], []
    for sample in dataset:
        if use_whisper:
            extra_kwargs = {
                "task": "transcribe",
                "language": f"<|{lang}|>",
                "max_new_tokens": 100,
            }
            transcription = pipe(
                sample["audio"]["array"],
                return_timestamps=True,
                generate_kwargs=extra_kwargs,
            )
        else:
            transcription = pipe(sample["audio"]["array"])
        predictions.append(normalizer(transcription["text"]))
        references.append(sample["norm_text"])
    return predictions, references

評估套件

現在,我們需要定義評估套件。這個套件包含了要評估的模型、語言和其他引數。

eval_suite = [
    ["Wav2Vec2", wav2vec2_pipe, "en"],
    ["Wav2Vec2", wav2vec2_pipe, "fr"],
    ["Whisper", whisper_pipe, "en"],
    ["Whisper", whisper_pipe, "fr"],
]

執行評估

最後,我們可以執行評估了。首先,我們需要載入 CER(Character Error Rate)指標,用於評估語音轉文字模型的效能。

cer_metric = load("cer")

然後,我們可以開始評估了。

processed_datasets = {
    "en": prepare_dataset("en"),
    "fr": prepare_dataset("fr"),
}

這樣,我們就完成了語音轉文字評估流程的所有步驟。接下來,我們可以根據評估結果,選擇最適合我們需求的模型和引數。

自然語言處理與語音技術

近年來,自然語言處理(NLP)和語音技術取得了顯著的進展。這些技術的應用包括語音識別、語音合成、問答系統等。在這個領域中,Transformer架構已經成為了一種主流的模型結構。

語音識別技術

語音識別是指將語音訊號轉換為文字的過程。目前,語音識別技術已經達到了一個相當高的準確率。例如,Whisper和Wav2Vec2就是兩種常用的語音識別模型。Whisper是一種多語言模型,可以處理多種語言的語音識別任務,而Wav2Vec2是一種單語言模型,主要針對英語語音識別。

語音合成技術

語音合成是指將文字轉換為語音訊號的過程。目前,語音合成技術已經達到了一個相當高的水準。例如,SpeechT5是一種多功能模型,可以實作語音識別、語音合成等任務。SpeechT5使用了一種編碼器-解碼器架構,可以處理多種輸入和輸出格式。

Transformer架構

Transformer架構是一種常用的神經網路模型結構,廣泛應用於NLP和語音技術領域。Transformer架構由編碼器和解碼器組成,可以處理序列到序列的任務。例如,SpeechT5就使用了Transformer架構,可以實作多種語音任務。

多語言模型

多語言模型是指可以處理多種語言的模型。例如,Whisper就是一種多語言模型,可以處理多種語言的語音識別任務。多語言模型可以減少訓練成本和模型複雜度。

語音合成評估

語音合成評估是指評估語音合成模型的效能。評估指標包括WER(Word Error Rate)和CER(Character Error Rate)。WER是指單詞錯誤率,CER是指字元錯誤率。

未來,NLP和語音技術將繼續發展。例如,Diffusion模型是一種新的模型結構,可以實作更好的語音合成效能。另外,多模態模型也是一個熱門研究方向,可以實作多種模態之間的互動。

音訊生成技術

在音訊生成的領域中,log-mel spectrogram是一種強大的工具,但它也存在著一些限制。雖然可以使用Short-Time Fourier Transforms將波形轉換為spectrogram,但反過來將spectrogram轉換回波形的過程就比較複雜了。這是因為spectrogram中缺乏一些重要的資訊,例如相位(phase)資訊。

相位資訊對於準確地重建原始音訊訊號至關重要。雖然可以使用一些經典的方法,如Griffin-Lim演算法來重建波形,但這些方法通常會產生低品質的音訊。因此,需要更先進的技術,例如神經網路來解決這個問題。

近年來,神經網路基礎的vocoder模型已經成為了一種熱門的研究領域。這些模型可以接收spectrogram或其他特徵表示,並將其轉換為波形。WaveNet是一個著名的模型,它可以產生高品質的重建音訊,但它是一個自迴歸模型,生成速度較慢。

後來,根據GAN的方法已經成為了一種流行的、實時的spectrogram到波形重建方法。這些方法使用了一種對抗式訓練方法,其中一個模型(稱為生成器)接收mel spectrogram並輸出波形,而另一個模型(稱為判別器)則評估生成的音訊品質。MelGAN和HiFiGAN是兩種流行的GAN基礎方法,它們快速、可平行化,並且有良好的開源實作。

在這裡,我們使用HiFiGAN作為SpeechT5的vocoder。HiFiGAN的生成器是一個CNN,它使用兩個判別器來評估不同方面的音訊品質,從而推動CNN生成高品質的音訊。我們可以使用SpeechT5HifiGan從transformers函式庫中載入預訓練模型,並使用它來生成音訊。

from transformers import SpeechT5HifiGan
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")
with torch.inference_mode():
    speech = vocoder(spectrogram)

這樣,我們就可以使用SpeechT5生成spectrogram,並使用HiFiGAN將其轉換為波形。雖然SpeechT5是在英語上訓練的,因此它在其他語言上可能會表現得不佳。但是,我們可以對其進行微調,以支援其他語言。

內容解密:

在上面的程式碼中,我們首先從transformers函式庫中載入預訓練的SpeechT5HifiGan模型。然後,我們使用with torch.inference_mode():來啟用推理模式,這樣可以加速生成速度。最後,我們使用vocoder(spectrogram)來生成音訊。

圖表翻譯:

下面是使用Mermaid語法繪製的SpeechT5和HiFiGAN之間的流程圖:

  flowchart TD
    A[SpeechT5] --> B[Spectrogram]
    B --> C[HiFiGAN]
    C --> D[Waveform]

在這個流程圖中,SpeechT5首先生成spectrogram,然後HiFiGAN將其轉換為波形。最終,輸出的是生成的音訊波形。

圖表說明:

這個流程圖展示了SpeechT5和HiFiGAN之間的合作過程。SpeechT5負責生成spectrogram,而HiFiGAN則負責將其轉換為波形。這樣,可以實作從文字到語音的完整生成過程。

9. 生成音訊

隨著技術的進步,生成音訊的模型也在不斷演進。近年來,出現了許多根據深度學習的音訊生成模型,例如 VITS、Bark 等。這些模型可以生成高品質的音訊,包括語音、音樂和其他音效。

從技術架構視角來看,Whisper、Wav2Vec2 和 SpeechT5 等根據 Transformer 架構的模型,為語音轉文字和語音合成任務帶來了顯著的進步。Whisper的多語言能力和語音活動檢測功能使其在多種應用場景中具有優勢,而 Wav2Vec2 則在執行速度上表現出色。SpeechT5的多功能性使其在語音識別和合成方面都具有潛力,結合HiFi-GAN vocoder更能產生高品質的音訊。然而,這些模型也存在一些限制,例如Whisper在非英語語音上的表現、SpeechT5的跨語言泛化能力以及長音訊處理的效率等。

深度剖析這些技術的效能瓶頸,可以發現,模型大小、計算資源和資料集規模都對效能產生顯著影響。例如,Whisper 的大型模型雖然效能更佳,但需要更大的計算資源,而 Wav2Vec2 則在資源有限的情況下提供了更快的執行速度。此外,多語言模型的訓練需要大量的多語言資料,這也是一個挑戰。對於長音訊的處理,目前普遍採用的分塊處理方式雖然可行,但仍需進一步研究更有效率的解決方案。

展望未來,隨著模型架構的持續最佳化、訓練資料的擴充以及硬體效能的提升,預期語音技術的準確性和效率將進一步提升。同時,多模態模型的發展也將推動語音技術與其他模態(例如影像、文字)的融合,創造更豐富的應用場景。玄貓認為,關注輕量化模型的發展、探索更高效的長音訊處理方法以及研究如何提升多語言模型的跨語言泛化能力,將是未來語音技術發展的關鍵方向。對於開發者而言,深入理解不同模型的特性和適用場景,並根據實際需求選擇合適的模型和技術方案,才能最大程度地發揮語音技術的潛力。