模型概述
模型特點
模型能力
使用案例
🚀 Kotoba-Whisper (v1.0)
Kotoba-Whisper是一系列用於日語自動語音識別(ASR)的蒸餾Whisper模型,由Asahi Ushio和Kotoba Technologies合作開發。該模型比Whisper large-v3快6.3倍,同時保持了較低的錯誤率。
faster-whisper權重,whisper.cpp權重,帶有stable-ts/標點的管道
新聞: 該模型的新版本可在https://huggingface.co/kotoba-tech/kotoba-whisper-v2.0獲取!
🚀 快速開始
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相同的低錯誤率。
作為初始版本,我們發佈了 kotoba-whisper-v1.0,它在ReazonSpeech的large
子集上進行訓練(ReazonSpeech是從日本電視音頻記錄中提取的最大的日語語音轉錄配對數據集)。在去除字錯誤率(WER)超過10的轉錄後(詳見WER過濾),該數據集包含1253小時的音頻和16861235個字符的轉錄(平均5秒音頻對應18個文本標記)。該模型以256的批量大小訓練了8個epoch,採樣率為16kHz,重現kotoba-whisper的訓練和評估代碼可在https://github.com/kotoba-tech/kotoba-whisper找到。
Kotoba-whisper-v1.0在ReazonSpeech的領域內保留測試集上的字符錯誤率(CER)和詞錯誤率(WER)優於openai/whisper-large-v3,在包括JSUT basic 5000和CommonVoice 8.0日語子集的領域外測試集上也取得了有競爭力的CER和WER(詳見評估)。
✨ 主要特性
- 速度快:Kotoba-Whisper比Whisper large-v3快6.3倍。
- 準確率高:在多個測試集上保持較低的CER和WER。
- 支持多種用法:支持短音頻轉錄、長音頻轉錄、帶提示轉錄等。
📦 安裝指南
Kotoba-Whisper從Hugging Face 🤗 Transformers庫的4.39版本開始支持。要運行該模型,首先安裝最新版本的Transformers:
pip install --upgrade pip
pip install --upgrade transformers accelerate
💻 使用示例
基礎用法
以下是使用Kotoba-Whisper進行短音頻轉錄的示例:
import torch
from transformers import pipeline
from datasets import load_dataset
# 配置
model_id = "kotoba-tech/kotoba-whisper-v1.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"])
- 要轉錄本地音頻文件,只需在調用管道時傳遞音頻文件的路徑(確保音頻採樣率為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秒)進行緩衝推理,與分塊長音頻算法相比,返回的轉錄更準確。默認情況下,如果將長音頻文件傳遞給模型,它將使用順序長音頻轉錄。順序長音頻算法適用於以下任何一種場景:
- 轉錄準確性是最重要的因素,而延遲不太重要。
- 您正在轉錄批量長音頻文件,在這種情況下,順序算法的延遲與分塊算法相當,但WER最多可提高0.5%。
如果您正在轉錄單個長音頻文件,並且延遲是最重要的因素,您應該使用下面描述的分塊算法。有關不同算法的詳細解釋,請參考Distil-Whisper論文的第5節。可以使用pipeline
類按如下方式使用順序算法轉錄長音頻文件:
import torch
from transformers import pipeline
from datasets import load_dataset
# 配置
model_id = "kotoba-tech/kotoba-whisper-v1.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"}
# 加載模型
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倍(詳見Distil-Whisper論文的表7)。要啟用分塊,將chunk_length_s
參數傳遞給pipeline
。對於distil-large-v3,25秒的分塊長度是最優的。要對長音頻文件進行批處理,傳遞參數batch_size
:
import torch
from transformers import pipeline
from datasets import load_dataset
# 配置
model_id = "kotoba-tech/kotoba-whisper-v1.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"}
# 加載模型
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"])
帶提示轉錄
Kotoba-whisper可以按如下方式進行帶提示的轉錄:
import re
import torch
from transformers import pipeline
from datasets import load_dataset
# 配置
model_id = "kotoba-tech/kotoba-whisper-v1.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")
# --- 無提示 ---
text = pipe(dataset[10]["audio"], generate_kwargs=generate_kwargs)['text']
print(text)
# 81歳、力強い走りに変わってきます。
# --- 有提示 ---: 讓我們將 `81` 改為 `91`。
prompt = "91歳"
generate_kwargs['prompt_ids'] = pipe.tokenizer.get_prompt_ids(prompt, return_tensors="pt").to(device)
text = pipe(dataset[10]["audio"], generate_kwargs=generate_kwargs)['text']
# 目前ASR的管道會在轉錄開頭添加提示,因此將其移除
text = re.sub(rf"\A\s*{prompt}\s*", "", text)
print(text)
# あっぶったでもスルガさん、91歳、力強い走りに変わってきます。
📚 詳細文檔
模型詳情
請參閱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模型。首先,我們需要安裝所需的包,包括🤗 Datasets用於加載音頻數據,🤗 Evaluate用於進行WER計算:
pip install --upgrade pip
pip install --upgrade transformers datasets[audio] evaluate jiwer
然後可以使用以下示例端到端運行評估:
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-v1.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使用蒸餾技術,學生模型包含教師large-v3模型的完整編碼器和一個解碼器,該解碼器的兩層從large-v3模型的第一層和最後一層初始化。
- 訓練數據:使用ReazonSpeech的
large
子集進行訓練。 - 評估指標:使用字符錯誤率(CER)和詞錯誤率(WER)進行評估。
📄 許可證
本項目採用Apache-2.0許可證。
致謝
- OpenAI提供了Whisper模型。
- Hugging Face 🤗 Transformers實現了模型集成。
- Hugging Face 🤗 提供了Distil-Whisper代碼庫。
- Reazon Human Interaction Lab提供了ReazonSpeech數據集。



