模型简介
模型特点
模型能力
使用案例
license: cc-by-nc-4.0 language:
- 德语
- 英语 base_model:
- openai/whisper-large-v3
- nyrahealth/CrisperWhisper metrics:
- 字符错误率(CER)
- 词错误率(WER) pipeline_tag: 自动语音识别 library_name: transformers
查看我们的模型集获取所有TTS模型上传。
学习微调TTS模型 - 阅读我们的指南。
Unsloth Dynamic 2.0实现更高精度,超越其他领先量化方案。
✨ 使用Unsloth运行和微调TTS模型!
- 免费使用我们的Google Colab笔记本微调TTS模型!
- 阅读我们关于TTS支持的博客:unsloth.ai/blog/tts
Unsloth支持 | 免费笔记本 | 性能 | 内存使用 |
---|---|---|---|
Orpheus-TTS | ▶️ 在Colab上启动 | 提速1.5倍 | 减少58% |
Whisper Large V3 | ▶️ 在Colab上启动 | 提速1.5倍 | 减少50% |
Qwen3 (14B) | ▶️ 在Colab上启动 | 提速2倍 | 减少70% |
Llama 3.2 Vision (11B) | ▶️ 在Colab上启动 | 提速1.8倍 | 减少50% |
CrisperWhisper
CrisperWhisper是OpenAI Whisper的进阶版本,专为快速、精准且逐字记录的语音识别设计,提供准确(清晰)的词级时间戳。与原始Whisper倾向于省略不流畅部分并采用意图转录风格不同,CrisperWhisper旨在精确转录每一个口语词汇,包括填充词、停顿、结巴和错误起始。详情请查看我们的仓库:https://github.com/nyrahealth/CrisperWhisper
核心特性
- 🎯 精确词级时间戳:通过调整分词器及训练中定制注意力损失,提供精确时间戳,即使在不流畅和停顿处也能准确标记。
- 📝 逐字转录:如实转录每个口语词汇,区分并记录如“um”和“uh”等填充词。
- 🔍 填充词检测:准确检测并转录填充词。
- 🛡️ 减少幻觉:最小化转录幻觉,提升准确性。
目录
亮点
- 🏆 在OpenASR排行榜逐字数据集(TED、AMI)中排名第一
- 🎓 被INTERSPEECH 2024接收
- 📄 论文发布:查看我们的论文了解分词器调整的细节与原理
- ✨ 新特性:论文中未提及的是新增的AttentionLoss,通过利用带时间戳的数据训练用于DTW对齐的注意力分数,显著提升了对齐性能
1. 性能概览
1.1 定性性能概览
音频 | Whisper Large V3 | Crisper Whisper |
---|---|---|
德语示例1 | 他不是天才,但确实是位能干的工程师。 | 虽然他不是。虽然他不是天才,但确实是位能干的工程师。 |
德语示例2 | 遗憾的是,在这艰难时期我们仍需处理日常事务。联合政府提出的文化预算旨在财政上延续联盟的成功路线。 | 遗憾的是[UH]在这[UH]艰难时期我们[UH]仍需[UH]处理日常事务。这里[UH]提出的[UH]文化预算[UH]旨在延续联盟[UH]财政上的成功路线。 |
德语示例3 | 应全面关注各党派情况,部分因成本过高。不仅因成本高。我们通过这份终稿进入所谓的疫情准备协议。 | 应全面关注各党[UH]派情况,部分因成成成本过高。不仅因成本高。我们[UH]通过这份终终稿进入所谓的疫情准备协议。 |
英语示例1 | 替代方案是你可以买那种Dr. Bronner's | 替代方案是你可以买那种[UH]你知道的,那种Dr. Bronner's。 |
英语示例2 | 如何影响自然环境?如何影响生态系统? | 影响我们的[UM]我们的[UH]自然环境。如何影响我们的生态系统? |
英语示例3 | 街上总能找到停车位,很方便,离目的地也不远。记得那时很有趣,活动也很棒。市区有华纳剧院 | 街上总能找到停车位。而且而且很方便,离目的地也不远。所以,我我我记得那时很有趣,活动也很棒。市区有华纳剧院,[UM] |
英语示例4 | 你知道,更阳刚、粗犷的类型,那绝对不是我。我很聪明,因为我父亲确保我聪明。所以我混在那群人里。还有些人整天做不该做的事。对,我在极客小分队。 | 你知道,更阳刚、粗犷的类型,那绝对不是我。我很聪明,因为我父亲确保我聪明。所以,[UM]你知道,我我混在那群人里。还有些人整天做不该做的事。对,我在极极客小分队。 |
1.2 定量性能概览
转录性能
CrisperWhisper在逐字转录风格的数据集(如AMI和TED-LIUM)上显著优于Whisper Large v3。
数据集 | CrisperWhisper | Whisper Large v3 |
---|---|---|
AMI | 8.72 | 16.01 |
Earnings22 | 12.37 | 11.3 |
GigaSpeech | 10.27 | 10.02 |
LibriSpeech clean | 1.74 | 2.03 |
LibriSpeech other | 3.97 | 3.91 |
SPGISpeech | 2.71 | 2.95 |
TED-LIUM | 3.35 | 3.9 |
VoxPopuli | 8.61 | 9.52 |
CommonVoice | 8.19 | 9.67 |
平均WER | 6.66 | 7.7 |
分段性能
CrisperWhisper在分段性能上表现更优,尤其在不流畅和停顿处。下表使用论文定义的指标,采用50ms容差。通过实现原理部分描述的方法选择各模型的最佳头,并选择F1分数最高的结果。
数据集 | 指标 | CrisperWhisper | 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脚本中使用CrisperWhisper:
首先安装我们定制的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数据集生成更多时间对齐数据。
- 因PyTorch CTC对齐器易高估停顿时长,我们采用论文中的停顿分割方法校正。通过手工标注数据集验证了校正效果。
-
词-标记对齐
- 由于重新分词(详见论文),每个标记仅属于词语或停顿/空格,绝不交叉。
- 因此每个标记可清晰对齐到词语或空格/停顿。
-
真实交叉注意力
- 定义标记的交叉注意力真实值为L2归一化向量:
- 值为1表示词语在真实时间戳中活跃。
- 值为0表示不应关注。
- 为应对真实时间戳的小误差,对真实向量两侧应用4步(8毫秒)线性插值,平滑过渡0到1。
- 定义标记的交叉注意力真实值为L2归一化向量:
-
损失计算
- 损失函数定义为预测交叉注意力向量(预测标记时)与真实交叉注意力向量间的
1 - 余弦相似度
。 - 该损失在所有预测标记和对齐头上取平均。
- 损失函数定义为预测交叉注意力向量(预测标记时)与真实交叉注意力向量间的
-
对齐头选择
- 为选择对齐头,我们在带时间戳的timit数据集上评估每个解码器注意力头的对齐性能。
- 选择表现最佳的15个头,用注意力损失微调。
-
训练细节
- 因多数训练样本短于30秒,我们以50%概率随机平移音频样本及对应时间戳真实值,防止交叉注意力对编码器输出早期位置“过拟合”。
- 若静音超过40ms(平移前后),在真实转录(及对应交叉注意力真实值)前添加空格,迫使模型准确预测首词起始时间。
- 训练中使用WavLM增强,添加随机语音或噪声,提升转录鲁棒性和对齐头稳定性。
- 将交叉注意力向量中真实词语前后4秒的“预测”值裁剪为0,降低向量维度,从而在损失和对齐中突出重点。
- 以1%概率使用纯噪声样本,模型需返回空预测以减少幻觉。
- 模型在英语和德语数据集混合训练,仅保证这两种语言的良好性能。
- 模型分三阶段训练:第一阶段用约10000小时音频调整Whisper至新分词器;第二阶段仅使用高质量逐字转录数据集;最后继续训练该混合集并添加注意力损失6000步。
许可证
license: cc-by-nc-4.0



