license: cc-by-nc-4.0
language:
- de
- en
base_model: openai/whisper-large-v3
metrics:
- cer
- wer
pipeline_tag: automatic-speech-recognition
library_name: transformers
清晰版Whisper(CrisperWhisper)
清晰版Whisper是OpenAI Whisper的进阶版本,专为快速、精准且逐字对应的语音识别设计,提供准确(清晰)的词级时间戳。与原始Whisper倾向于省略不流畅表达、采用意图转录风格不同,清晰版Whisper旨在精确转录每一个口语词汇,包括填充词、停顿、口吃和错误起始。详情请访问我们的代码库:https://github.com/nyrahealth/CrisperWhisper
核心特性
- 🎯 精确词级时间戳:通过调整分词器及训练时采用自定义注意力损失,即使在表达不流畅和停顿处也能提供精准时间戳。
- 📝 逐字转录:如实转录每一个口语词汇,区分并包含"um"、"uh"等填充词。
- 🔍 填充词检测:准确识别并转录填充词。
- 🛡️ 幻听抑制:最大限度减少转录幻听,提升准确性。
目录
亮点
- 🏆 在OpenASR排行榜逐字转录数据集(TED、AMI)中荣获第一名
- 🎓 论文被INTERSPEECH 2024收录
- 📄 论文发布:阅读我们的论文了解分词器调整的细节与原理
- ✨ 新特性:论文中未提及的是新增的AttentionLoss进一步提升了时间戳准确性。通过专门针对带时间戳数据训练DTW对齐所用的注意力分数,我们显著提升了对齐性能。
1. 性能概览
1.1 定性性能对比
音频 |
Whisper Large V3 |
清晰版Whisper |
德语示例1 |
他虽非天才,但确是能干的工程师。 |
虽然他不是...他虽非天才,但确是能干的工程师。 |
德语示例2 |
遗憾的是,在这艰难时期我们仍需处理日常事务。联合政府提交的文化预算旨在财政上延续联盟的成功路线。 |
遗憾的是[UH]在这[UH]艰难时期我们[UH]仍需[UH]处理日常事务。此处[UH]提交的[UH]文化预算[UH]旨在延续联盟[UH]在财政上的成功路线。呃。 |
德语示例3 |
需要全面关注所有FRA党派,部分项目成本极高。不仅因其高昂成本。我们通过这份终稿介入所谓的大流行病准备协议。 |
需要全面关注所有Fr Fra党派,尤其[UH]要留意部分非非非非非常昂贵的项目。不仅因为它们贵贵。我们[UH]通过这份草草案介入所谓的大大流行病准备协议。 |
英语示例1 |
替代方案是你可以买到那种Dr. Bronner's |
替代方案是你可以买到比如[UH]那种,你知道的,那种Brahmer博士的产品。 |
英语示例2 |
如何影响自然环境?如何影响生态系统? |
影响我们的[UM]我们的[UH]自然环境。如何影响生态系统? |
英语示例3 |
街上总能找到停车位,很方便,离目的地都不远。记得那时很有趣也很轻松,有很多好去处和精彩活动。来市中心有华纳剧院 |
街上总能找到停车位。而而且很很很方便,离目的地都不远。所以,我我我记得那时很有趣也很轻松,有很多好去处,[UM]精彩活动。来市中心有华纳剧院,[UM] |
英语示例4 |
那些更阳刚、粗犷的类型,那绝对不是我。我很聪明,因为父亲确保我聪明。所以我跟那些人混。还有些人整天做不该做的事。对,我属于小极客团队。你也是。 |
那些更阳刚、粗犷的类型,那绝对不是我。我很聪明,因为父亲确保我聪明。你知道,[UM]所以我我我跟那些人混。还有些人整整天做不该做的事。对,我属于小极客团队。你 |
1.2 定量性能对比
转录性能
清晰版Whisper显著优于Whisper Large v3,特别是在AMI和TED-LIUM等采用逐字转录标准的数据集上表现突出。
分段性能
清晰版Whisper展现出更优的分段性能,尤其在表达不流畅和停顿处的表现差距明显。
下表采用论文定义的指标(使用50ms容差)。通过实现原理所述方法选择各模型的最佳注意力头,选取不同头数组合中F1分数最高的结果进行对比。
数据集 |
指标 |
清晰版Whisper |
Whisper Large v2 |
Whisper Large v3 |
AMI IHM |
F1分数 |
0.79 |
0.63 |
0.66 |
|
平均IOU |
0.67 |
0.54 |
0.53 |
Common Voice |
F1分数 |
0.80 |
0.42 |
0.48 |
|
平均IOU |
0.70 |
0.32 |
0.43 |
TIMIT |
F1分数 |
0.69 |
0.40 |
0.54 |
|
平均IOU |
0.56 |
0.32 |
0.43 |
2. 使用方法
Python脚本调用方法如下:
首先安装我们定制的transformers分支以获得最准确时间戳:
pip install git+https://github.com/nyrahealth/transformers.git@crisper_whisper
2.1 使用🤗 transformers
import os
import sys
import torch
from datasets import load_dataset
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
def adjust_pauses_for_hf_pipeline_output(pipeline_output, split_threshold=0.12):
"""
通过将不超过阈值的停顿时间均匀分配到相邻词语之间来调整停顿时间
"""
adjusted_chunks = pipeline_output["chunks"].copy()
for i in range(len(adjusted_chunks) - 1):
current_chunk = adjusted_chunks[i]
next_chunk = adjusted_chunks[i + 1]
current_start, current_end = current_chunk["timestamp"]
next_start, next_end = next_chunk["timestamp"]
pause_duration = next_start - current_end
if pause_duration > 0:
if pause_duration > split_threshold:
distribute = split_threshold / 2
else:
distribute = pause_duration / 2
adjusted_chunks[i]["timestamp"] = (current_start, current_end + distribute)
adjusted_chunks[i + 1]["timestamp"] = (next_start - distribute, next_end)
pipeline_output["chunks"] = adjusted_chunks
return pipeline_output
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "nyrahealth/CrisperWhisper"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
chunk_length_s=30,
batch_size=16,
return_timestamps='word',
torch_dtype=torch_dtype,
device=device,
)
dataset = load_dataset("distil-whisper/librispeech_long", "clean", split="validation")
sample = dataset[0]["audio"]
hf_pipeline_output = pipe(sample)
crisper_whisper_result = adjust_pauses_for_hf_pipeline_output(hf_pipeline_output)
print(crisper_whisper_result)
关于停顿时间分配逻辑的详细原理请参阅我们的论文。
3. 实现原理?
我们采用流行的动态时间规整(DTW)算法处理Whisper交叉注意力分数(详见论文)来获取词级时间戳。通过重新分词流程,该方法能稳定检测停顿。由于时间戳精度高度依赖DTW成本矩阵及交叉注意力质量,我们开发了专用于选定对齐头部的损失函数以提升精度。
虽然该损失函数因实验和训练未能在论文提交截止前完成而未纳入原论文,但已用于训练我们公开的模型。该损失函数的关键特点包括:
-
数据准备
- 使用带词级时间戳标注的数据集(如AMI IHM和TIMIT),但需要更多时间戳数据
- 通过小型人工标注数据集验证多种强制对齐工具的准确性
- 基于验证结果选用PyTorch CTC对齐器从CommonVoice数据集生成更多时间对齐数据
- 因该工具易高估停顿时长,采用论文所述的停顿分割方法进行校正,经人工数据集验证有效
-
词符-词语对齐
- 由于重新分词(详见论文),每个词符仅属于词语或停顿/空格,不会同时属于两者
- 因此每个词符可明确对应词语或空格/停顿
-
真实交叉注意力
- 定义词符的交叉注意力真值为L2归一化向量:
- 值为1表示该词语在真实时间戳范围内活跃
- 值为0表示不应关注
- 为应对真实时间戳的小误差,在真值向量两侧采用4步(8毫秒)线性插值平滑过渡
-
损失计算
- 损失函数定义为预测交叉注意力向量(预测词符时)与真实交叉注意力向量间的
1 - 余弦相似度
- 对所有预测词符和注意力头取平均
-
注意力头选择
- 评估各解码器注意力头在TIMIT数据集上的对齐表现
- 选择表现最佳的15个头进行注意力损失微调
-
训练细节
- 由于多数训练样本短于30秒,以50%概率对音频样本及对应时间戳真值进行位移,防止交叉注意力"过拟合"编码器输出的前段位置
- 若存在超过40ms静音(位移前后),在真值文本前添加空格,迫使模型准确预测首词起始时间
- 训练时使用WavLM增强技术,添加随机语音样本或噪声,提升转录鲁棒性和注意力头稳定性
- 将交叉注意力向量中真值词语前后4秒的"预测"值裁剪为0,降低向量维度从而强化关键位置的注意力
- 以1%概率使用纯噪声样本训练模型返回空预测,抑制幻听
- 模型在英德混合数据集上训练,仅保证这两种语言的性能
- 训练分三阶段:第一阶段使用约10000小时音频适应新分词器;第二阶段仅使用高质量逐字转录数据集;最后继续训练并加入注意力损失6000步
许可协议
license: cc-by-nc-4.0