模型概述
模型特點
模型能力
使用案例
🚀 Kotoba-Whisper (v2.0)
Kotoba-Whisper是一系列用於日語自動語音識別(ASR)的蒸餾模型。它由Asahi Ushio和Kotoba Technologies合作開發,在速度上比OpenAI的Whisper large-v3快6.3倍,同時保持了較低的錯誤率,能有效解決日語語音轉錄的效率和準確性問題。
🚀 快速開始
Kotoba-Whisper從Hugging Face 🤗 Transformers庫的4.39版本開始得到支持。要運行該模型,首先需要安裝最新版本的Transformers:
pip install --upgrade pip
pip install --upgrade transformers accelerate
✨ 主要特性
- 高效性能:Kotoba-Whisper比Whisper large-v3快6.3倍,同時保持了較低的錯誤率。
- 多場景適用:支持短音頻(< 30秒)和長音頻(> 30秒)的轉錄,提供順序長格式和分塊長格式兩種轉錄算法。
- 可優化性:可以通過應用額外的速度和內存優化措施,進一步減少推理時間和顯存需求。
📦 安裝指南
運行Kotoba-Whisper模型,需要安裝最新版本的Transformers和其他必要的依賴庫:
pip install --upgrade pip
pip install --upgrade transformers accelerate
如果要進行評估,還需要安裝以下包:
pip install --upgrade pip
pip install --upgrade transformers datasets[audio] evaluate jiwer
如果要使用Flash Attention 2,需要安裝:
pip install flash-attn --no-build-isolation
💻 使用示例
基礎用法
短音頻轉錄
該模型可以使用pipeline
類來轉錄短音頻文件(< 30秒):
import torch
from transformers import pipeline
from datasets import load_dataset
# 配置
model_id = "kotoba-tech/kotoba-whisper-v2.0"
torch_dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model_kwargs = {"attn_implementation": "sdpa"} if torch.cuda.is_available() else {}
generate_kwargs = {"language": "ja", "task": "transcribe"}
# 加載模型
pipe = pipeline(
"automatic-speech-recognition",
model=model_id,
torch_dtype=torch_dtype,
device=device,
model_kwargs=model_kwargs
)
# 加載示例音頻
dataset = load_dataset("japanese-asr/ja_asr.reazonspeech_test", split="test")
sample = dataset[0]["audio"]
# 運行推理
result = pipe(sample, generate_kwargs=generate_kwargs)
print(result["text"])
- 要轉錄本地音頻文件,只需在調用pipeline時傳入音頻文件的路徑(確保音頻採樣率為16kHz):
- result = pipe(sample, generate_kwargs=generate_kwargs)
+ result = pipe("audio.mp3", generate_kwargs=generate_kwargs)
- 對於分段級時間戳,傳入參數
return_timestamps=True
並返回"chunks"
輸出:
result = pipe(sample, return_timestamps=True, generate_kwargs=generate_kwargs)
print(result["chunks"])
順序長格式轉錄
Kotoba-whisper設計為與OpenAI的順序長格式轉錄算法兼容。該算法使用滑動窗口對長音頻文件(> 30秒)進行緩衝推理,與分塊長格式算法相比,能返回更準確的轉錄結果。默認情況下,如果將長音頻文件傳遞給模型,它將使用順序長格式轉錄:
import torch
from transformers import pipeline
from datasets import load_dataset
# 配置
model_id = "kotoba-tech/kotoba-whisper-v2.0"
torch_dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model_kwargs = {"attn_implementation": "sdpa"} if torch.cuda.is_available() else {}
generate_kwargs = {"language": "ja", "task": "transcribe"}
# 加載模型
pipe = pipeline(
"automatic-speech-recognition",
model=model_id,
torch_dtype=torch_dtype,
device=device,
model_kwargs=model_kwargs
)
# 加載示例音頻(拼接實例以創建長音頻)
dataset = load_dataset("japanese-asr/ja_asr.reazonspeech_test", split="test")
sample = {"array": np.concatenate([i["array"] for i in dataset[:20]["audio"]]), "sampling_rate": dataset[0]['audio']['sampling_rate']}
# 運行推理
result = pipe(sample, generate_kwargs=generate_kwargs)
print(result["text"])
高級用法
分塊長格式轉錄
當需要轉錄單個大音頻文件並要求最快的推理速度時,應使用此算法。在這種情況下,分塊算法比OpenAI的順序長格式實現快達9倍:
import torch
from transformers import pipeline
from datasets import load_dataset
# 配置
model_id = "kotoba-tech/kotoba-whisper-v2.0"
torch_dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model_kwargs = {"attn_implementation": "sdpa"} if torch.cuda.is_available() else {}
generate_kwargs = {"language": "ja", "task": "transcribe"}
# 加載模型
pipe = pipeline(
"automatic-speech-recognition",
model=model_id,
torch_dtype=torch_dtype,
device=device,
model_kwargs=model_kwargs,
batch_size=16
)
# 加載示例音頻(拼接實例以創建長音頻)
dataset = load_dataset("japanese-asr/ja_asr.reazonspeech_test", split="test")
sample = {"array": np.concatenate([i["array"] for i in dataset[:20]["audio"]]), "sampling_rate": dataset[0]['audio']['sampling_rate']}
# 運行推理
result = pipe(sample, chunk_length_s=15, generate_kwargs=generate_kwargs)
print(result["text"])
額外的速度和內存優化
可以應用額外的速度和內存優化措施,進一步減少推理速度和顯存需求。這些優化主要針對注意力內核,將其從急切實現切換到更高效的閃存注意力版本。
Flash Attention 2
如果GPU支持,建議使用Flash-Attention 2。首先需要安裝Flash Attention:
pip install flash-attn --no-build-isolation
然後將attn_implementation="flash_attention_2"
傳遞給from_pretrained
:
- model_kwargs = {"attn_implementation": "sdpa"} if torch.cuda.is_available() else {}
+ model_kwargs = {"attn_implementation": "flash_attention_2"} if torch.cuda.is_available() else {}
📚 詳細文檔
模型詳情
請參閱https://huggingface.co/distil-whisper/distil-large-v3#model-details。
訓練
模型訓練的詳細信息請參考https://github.com/kotoba-tech/kotoba-whisper。蒸餾中使用的數據集和所有模型變體可以在https://huggingface.co/japanese-asr找到。
評估
以下代碼片段展示瞭如何在CommonVoice 8.0的日語子集上評估kotoba-whisper模型:
import torch
from transformers import pipeline
from datasets import load_dataset
from evaluate import load
from transformers.models.whisper.english_normalizer import BasicTextNormalizer
# 模型配置
model_id = "kotoba-tech/kotoba-whisper-v2.0"
torch_dtype = torch.bfloat16 if torch.cuda.is_available() else torch.float32
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model_kwargs = {"attn_implementation": "sdpa"} if torch.cuda.is_available() else {}
generate_kwargs = {"language": "japanese", "task": "transcribe"}
normalizer = BasicTextNormalizer()
# 數據配置
dataset_name = "japanese-asr/ja_asr.reazonspeech_test"
audio_column = 'audio'
text_column = 'transcription'
# 加載模型
pipe = pipeline(
"automatic-speech-recognition",
model=model_id,
torch_dtype=torch_dtype,
device=device,
model_kwargs=model_kwargs,
batch_size=16
)
# 加載數據集並以16kHz採樣音頻
dataset = load_dataset(dataset_name, split="test")
transcriptions = pipe(dataset['audio'])
transcriptions = [normalizer(i['text']).replace(" ", "") for i in transcriptions]
references = [normalizer(i).replace(" ", "") for i in dataset['transcription']]
# 計算CER指標
cer_metric = load("cer")
cer = 100 * cer_metric.compute(predictions=transcriptions, references=references)
print(cer)
主要日語ASR數據集的Hugging Face鏈接總結在這裡。例如,要在JSUT Basic5000上評估模型,更改dataset_name
:
- dataset_name = "japanese-asr/ja_asr.reazonspeech_test"
+ dataset_name = "japanese-asr/ja_asr.jsut_basic5000"
🔧 技術細節
Kotoba-Whisper 是一系列用於日語自動語音識別(ASR)的蒸餾Whisper模型,由Asahi Ushio和Kotoba Technologies合作開發。遵循distil-whisper的原始工作(Robust Knowledge Distillation via Large-Scale Pseudo Labelling),使用OpenAI的Whisper large-v3作為教師模型,學生模型由教師large-v3模型的完整編碼器和從large-v3模型的第一層和最後一層初始化的兩層解碼器組成。Kotoba-Whisper比large-v3快6.3倍,同時保持與large-v3相同的低錯誤率。
評估指標
模型 | CommonVoice 8 (日語測試集) | JSUT Basic 5000 | ReazonSpeech (保留測試集) |
---|---|---|---|
kotoba-tech/kotoba-whisper-v2.0 | 9.2(CER),58.8(WER) | 8.4(CER),63.7(WER) | 11.6(CER),55.6(WER) |
kotoba-tech/kotoba-whisper-v1.0 | 9.4(CER),59.2(WER) | 8.5(CER),64.3(WER) | 12.2(CER),56.4(WER) |
openai/whisper-large-v3 | 8.5(CER),55.1(WER) | 7.1(CER),59.2(WER) | 14.9(CER),60.2(WER) |
openai/whisper-large-v2 | 9.7(CER),59.3(WER) | 8.2(CER),63.2(WER) | 28.1(CER),74.1(WER) |
openai/whisper-large | 10(CER),61.1(WER) | 8.9(CER),66.4(WER) | 34.1(CER),74.9(WER) |
openai/whisper-medium | 11.5(CER),63.4(WER) | 10(CER),69.5(WER) | 33.2(CER),76(WER) |
openai/whisper-base | 28.6(CER),87.2(WER) | 24.9(CER),93(WER) | 70.4(CER),91.8(WER) |
openai/whisper-small | 15.1(CER),74.2(WER) | 14.2(CER),81.9(WER) | 41.5(CER),83(WER) |
openai/whisper-tiny | 53.7(CER),93.8(WER) | 36.5(CER),97.6(WER) | 137.9(CER),94.9(WER) |
延遲
由於kotoba-whisper使用與distil-whisper/distil-large-v3相同的架構,與openai/whisper-large-v3相比,它繼承了延遲改善的優勢(比large-v3快6.3倍):
模型 | 參數(M) | 相對延遲 |
---|---|---|
kotoba-tech/kotoba-whisper-v2.0 | 756 | 6.3 |
kotoba-tech/kotoba-whisper-v1.0 | 756 | 6.3 |
openai/whisper-large-v3 | 1550 | 1.0 |
📄 許可證
本項目採用Apache-2.0許可證。
致謝
- OpenAI提供了Whisper 模型。
- Hugging Face 🤗 Transformers實現了模型集成。
- Hugging Face 🤗 提供了Distil-Whisper代碼庫。
- Reazon Human Interaction Lab提供了ReazonSpeech數據集。



