Granite-Speech-4.1-2B-Plus 与 Granite-Speech-4.1-2B 模型具有相似的能力。该增强版模型新增了两项社区需求的丰富转录功能,只需简单修改提示词即可激活:带说话人属性的语音识别(说话人标签和词语转录)以及词语级时间信息。与基础模型不同,增强版模型不提供标点符号和大小写转换功能。
该模型的训练语料与 Granite-Speech-4.1-2B 模型相似,并增加了说话人轮次和词语级时间戳标签。这使得模型能够通过不同的提示词控制,提供多种功能模式。
另外还有两个模型变体,分别针对不同的能力和推理优化进行了探索:
在此模式下,模型仅生成文本转录,类似于 Granite-Speech-4.1-2B 模型。
在此模式下,模型会在每个说话人轮次前添加格式为 [Speaker N]: 的说话人标签,其中 为说话人编号。说话人按其出现顺序编号,因此第一个说话人始终标记为 [Speaker 1]:,第二个为 [Speaker 2]:,依此类推。例如:"[Speaker 1]: Hello how are you [Speaker 2]: I'm fine and how are you feeling [Speaker 1]: I feel wonderful"。
有关 SAA 的更多信息,请参见 资源。
在此模式下,模型会在每个单词后添加时间戳标签,标明该单词在音频中的结束位置。静音部分会被转录为 _,其结束位置也会用时间戳标签表示。标签格式为 [T:N],其中 是一个整数,表示以厘秒(1/100 秒)为单位的时间。为减少生成的 tokens 数量,仅提供 的后三位数字。这会导致每 10 秒发生一次循环。
将时间 (秒)转换为时间戳的公式为 。要转换回秒,使用 ,其中 是循环计数器。以下是 Python 中的示例实现代码。
有关时间戳的更多信息,请参见 资源。
在某些情况下,我们希望将新的音频片段与之前已转录的片段一起进行转录。这有助于为模型提供更长的上下文,从而提高转录准确性,或在 SAA 模式下保持说话人编号。为避免重新解码先前的片段,我们可以在对话模板的 prefix_text 字段中提供先前的转录文本。模型将从该文本之后的部分开始解码。示例代码如下。
关键词列表偏向功能可用于增强对关键词(如名称和技术术语)的识别。
这在复杂术语可能被误识别的任务中尤为有用。
可以通过在提示中直接包含关键词来应用关键词偏向;例如,在 ASR 模式下:Can you transcribe the speech into a written format? Keywords: …
用户可以提供单个关键词或关键词列表,其中也可以包含未出现在输入音频中的术语,使其非常适合批量处理或特定领域的重复使用场景。
有关关键词列表偏向的更多信息,请参见 资源。
我们的评估显示,该模型在自动语音识别(ASR)和说话人活动检测(SAA)任务中,可良好处理长达9分钟的音频片段;在时间戳任务中,可处理长达5分钟的音频片段。
在 HuggingFace 开放语音识别排行榜 上的表现:
| model | 平均字错误率(WER) | AMI | Earnings22 | Gigaspeech | LS Clean | LS Other | SPGISpeech | Tedlium | Voxpopuli |
|---|---|---|---|---|---|---|---|---|---|
| ibm-granite/granite-speech-4.1-2b-plus | 5.71 | 8.63 | 8.68 | 10.38 | 1.44 | 3.06 | 3.72 | 3.89 | 5.9 |
| ibm-granite/granite-speech-4.1-2b | 5.33 | 8.09 | 8.37 | 9.8 | 1.33 | 2.5 | 3.78 | 3.07 | 5.7 |
| ibm-granite/granite-speech-4.1-2b-nar | 5.44 | 8.03 | 8.44 | 10.16 | 1.28 | 2.77 | 3.33 | 3.62 | 5.86 |
(使用 推测解码)
关键词列表偏向准确率 - 关键词 F1 分数(%,↑ 越高越好):
| 模式 | Gigaspeech | LS-C | LS-O | SPGISpeech | VOX | TED_LIUM | Earnings22 | CV-en | CV-de | CV-es | CV-fr | CV-pt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 无 KWB | 74.2 | 89.1 | 78.2 | 80.8 | 93.9 | 87.9 | 68.8 | 74.6 | 78.5 | 83.1 | 74.5 | 90.0 |
| 有 KWB | 84.1 | 96.1 | 93.0 | 92.5 | 96.3 | 94.9 | 81.5 | 91.5 | 92.9 | 93.9 | 90.6 | 95.0 |
说话人归因语音识别性能 - 词分轨错误率(WDER,%,↓ 数值越低越好):
| 模型 | FISHER | CALLHOME English | AMI-SDM | GALE |
|---|---|---|---|---|
| VibeVoice ASR [1] | 2.8 | 7.1 | 27.4 | 44.8 |
| Granite-speech-4.1-2b-plus | 0.9 | 2.2 | 14.6 | 30.2 |
结果为 2-5 分钟语音片段的平均值。
(评估指标:词分轨错误率 [WDER] 是指单词被错误归因于说话人的百分比)
词级时间戳准确性 - 累积平均偏移(AAS,毫秒,↓ 数值越低越好):
| 模型 | AMI-I | AMI-S | LS-C | LS-O | VOX | CV | MLS | TMT | En Avg | MLS-fr | MLS-es | MLS-de | MLS-pt | CV-fr | CV-es | CV-de | CV-pt | ML Avg |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Qwen3-FA [2] | 48.1 | 82.5 | 27.8 | 29.3 | 41.0 | 48.4 | 34.3 | 29.9 | 42.7 | 38.1 | 27.0 | 31.2 | 26.3 | 30.3 | 40.0 | 29.4 | 34.2 | 33.3 |
| CrisperWhisper [3] | 55.7 | 64.3 | 35.9 | 40.1 | 47.2 | 97.4 | 46.4 | 42.7 | 53.7 | 35.6 | 28.0 | 31.2 | 36.8 | 62.9 | 58.9 | 60.9 | 83.8 | 50.1 |
| Canary-v2 [4] | 127.8 | 129.7 | 92.5 | 89.2 | 109.9 | 110.3 | 94.3 | 86.1 | 105.0 | 85.0 | 81.1 | 80.2 | – | 86.8 | 88.5 | 91.5 | – | – |
| WhisperX [5] | 107.1 | 150.2 | 71.7 | 72.0 | 78.8 | 91.2 | 79.2 | 63.6 | 89.2 | 117.3 | 84.7 | 132.2 | 75.0 | 104.2 | 88.1 | 126.8 | 79.5 | 101.0 |
| Granite-speech-4.1-2b-plus | 43.4 | 69.0 | 11.4 | 14.6 | 80.2 | 43.3 | 24.3 | 24.5 | 38.8 | 45.4 | 23.0 | 41.3 | 47.1 | 18.6 | 19.3 | 19.5 | 24.2 | 29.8 |
(评估指标:累积平均偏移 [AAS] 用于衡量每个单词的平均时间偏移)
2026年4月28日
英语、法语、德语、西班牙语、葡萄牙语
该模型旨在用于需要处理语音输入的企业应用,尤其适用于需要包含说话人轮次和时间戳的详细转录场景。特别地,该模型非常适合英语、法语、德语、西班牙语和葡萄牙语的语音转文本任务。
Granite Speech模型在transformers>=5.8中得到原生支持。以下是使用该模型不同模式的简单示例。
transformers配合使用首先安装PyTorch。
安装transformers。granite-speech-plus模型的代码最近才添加,因此在PyPI包更新之前,您可能需要从源代码安装。
pip install torchaudio datasets accelerate torchcodec设置 — 加载模型和测试音频片段:
import re
import torch
from datasets import Audio, load_dataset
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor加载模型并定义用于音频解码的通用函数:
MODEL_NAME = "ibm-granite/granite-speech-4.1-2b-plus"
device = "cuda" if torch.cuda.is_available() else "cpu"
processor = AutoProcessor.from_pretrained(MODEL_NAME)
tokenizer = processor.tokenizer
model = AutoModelForSpeechSeq2Seq.from_pretrained(MODEL_NAME, device_map=device, dtype=torch.bfloat16)
model.eval()
SYSTEM_PROMPT = "Knowledge Cutoff Date: April 2024.\nToday's Date: December 19, 2024.\nYou are Granite, developed by IBM. You are a helpful AI assistant"
@torch.inference_mode()
def transcribe(audio, prompt, max_new_tokens=2000, prefix_text=None):
chat = [{"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": prompt}]
extra = {"prefix_text": prefix_text} if prefix_text is not None else {}
prompt_text = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True, **extra)
inputs = processor(prompt_text, audio, device=device, return_tensors="pt").to(device)
outputs = model.generate(**inputs, max_new_tokens=max_new_tokens, do_sample=False, num_beams=1)
new_tokens = outputs[0, inputs["input_ids"].shape[-1]:]
output_text = tokenizer.decode(new_tokens, add_special_tokens=False, skip_special_tokens=True)
return output_text从 AMI 数据集中加载一些示例音频数据
SAMPLE_RATE = 16000
ds = load_dataset("diarizers-community/ami", "ihm", split="test")
ds = ds.cast_column("audio", Audio(sampling_rate=SAMPLE_RATE, num_channels=1))
TEST_SAMPLE = 0
START_TIME, END_TIME = 5 * 60, 6 * 60
audio = ds["audio"][TEST_SAMPLE].get_samples_played_in_range(START_TIME, END_TIME)任务 1:ASR — 纯语音转文本转录:
ASR_PROMPT = "<|audio|> can you transcribe the speech into a written format?"
asr_text = transcribe(audio.data, ASR_PROMPT)
print(asr_text)任务 2:带说话人属性的自动语音识别(Speaker Attributed ASR)——带说话人标签的转录:
SAA_PROMPT = "<|audio|> Speaker attribution: Transcribe and denote who is speaking by adding [Speaker 1]: and [Speaker 2]: tags before speaker turns."
saa_text = transcribe(audio.data, SAA_PROMPT)
for segment in re.split(r"(
$$Speaker \d+$$
:)", saa_text):
print(segment.strip())任务 3:单词级时间戳——带逐词计时的转录:
时间戳以厘秒为单位给出,且采用模 1000(=10 秒)的方式,因此我们需要通过添加 10 秒的倍数来对其进行解包。
TS_PROMPT = "<|audio|> Timestamps: Transcribe the speech. After each word, add a timestamp tag showing the end time in centiseconds, e.g. hello [T:45] world [T:82]"
ts_text = transcribe(audio.data, TS_PROMPT, max_new_tokens=10000)
ts_words = re.split(r"
$$T:(\d+)$$
", ts_text)
last_word_end_time = 0
offset_time = 0
for word, ts in zip(ts_words[::2], ts_words[1::2]):
word_end_time = float(ts) / 100
while word_end_time + offset_time < last_word_end_time:
offset_time += 10
last_word_end_time = word_end_time + offset_time
print(f"{word}\t{last_word_end_time:.2f}s")任务 4:增量解码——在累积音频上下文的同时转录片段:
NUM_SEGMENTS = 3
previous_transcript = ""
all_audio = None
for k in range(NUM_SEGMENTS):
t1 = START_TIME + (END_TIME - START_TIME) * k / NUM_SEGMENTS
t2 = START_TIME + (END_TIME - START_TIME) * (k + 1) / NUM_SEGMENTS
new_audio = ds["audio"][TEST_SAMPLE].get_samples_played_in_range(t1, t2)
all_audio = new_audio.data if all_audio is None else torch.cat([all_audio, new_audio.data], dim=-1)
saa_text = transcribe(all_audio, SAA_PROMPT, prefix_text=previous_transcript)
print(f"{t1:06.2f}-{t2:06.2f}:\t{saa_text}")
previous_transcript = (previous_transcript + " " + saa_text).strip()本模型与 Granite-Speech-4.1-2B 模型采用相同的架构。
本模型的训练数据集与 Granite-Speech-4.1-2B 相同。
用于说话人活动检测(SAA)的额外训练数据是利用包含说话人识别信息的数据集(如 Multilingual-Librispeech)中的音频片段创建的。我们将具有交替说话人的片段进行拼接,以生成较长的多说话人样本。
词级时间戳功能的实现,是通过结合多种公开可用的语音语料库:LibriSpeech、MLS(英语、法语、德语、葡萄牙语、西班牙语)、CommonVoice(英语、法语、德语、葡萄牙语、西班牙语)、VoxPopuli(英语、法语、德语、西班牙语)、AMI-IHM、Switchboard、TIMIT 和 YODAS。对于 AMI-IHM、Switchboard 和 TIMIT,我们使用现有的时间戳标注。对于其他所有数据集,我们使用基于 GMM-HMM 的强制对齐工具——蒙特利尔强制对齐器(MFA)来获取词级对齐。我们还使用 MFA 在人工标注的数据集中插入静音边界。
为确保训练数据的高质量,我们使用基于 CTC 的语音编码器进行强制对齐,以此验证 MFA 生成的对齐结果。我们计算 CTC 与 MFA 对齐时间戳(以毫秒为单位)之间的平均绝对误差,即累积平均偏移(AAS),并仅保留对齐误差最低的样本:英语数据保留前 95%,非英语数据保留前 70%。对于较大的数据集(YODAS 和 MLS-英语),我们将训练数据分别限制在 400 万和 500 万样本。
此外,我们通过拼接短片段生成了包含时间戳的长音频样本作为额外训练数据。
模型在训练时,语音识别(ASR)和说话人活动检测(SAA)任务使用的音频样本最长为 10 分钟,时间戳任务使用的音频样本最长为 5 分钟。
我们使用 IBM 的超级计算集群 Blue Vela 训练 Granite Speech 模型,该集群配备了 NVIDIA H100 GPU。此集群提供了可扩展且高效的基础设施,支持在数千块 GPU 上训练我们的模型。本模型的训练在 32 块 H100 GPU 上进行,耗时约 5 天完成。
大型语音和语言模型的使用可能引发特定风险及伦理问题。尽管我们的对齐流程已纳入安全考量,但在某些情况下,模型仍可能对用户提示生成不准确、带有偏见、冒犯性或非预期的响应。此外,小型模型由于规模较小,在生成场景中是否更容易出现幻觉现象,从而限制其生成连贯且上下文准确响应的能力,这一点尚不明确。该方面目前是研究的活跃领域,我们期待在这一领域进行更深入的探索、理解和风险缓解。
IBM 建议将此模型用于自动语音识别和翻译任务。模型设计通过限制音频输入对系统的影响来提升安全性。当接收到不熟悉或格式错误的提示时,模型会直接忽略该提示并执行转录,这是默认的回退模式。与直接解读音频且可能更容易遭受此类攻击的集成模型不同,这种设计将对抗性输入的风险降至最低。请注意,更通用的语音任务可能会带来更高的触发非预期输出的固有风险。
为增强安全性,我们建议将 Granite-Speech-4.1-2B-Plus 与 Granite Guardian 配合使用。Granite Guardian 是一个经过微调的指令模型,旨在根据 IBM AI 风险图谱中概述的关键维度,检测并标记提示和响应中的风险。
[1] VibeVoice-ASR(与Transformers兼容版本)。在线获取:https://huggingface.co/microsoft/VibeVoice-ASR-HF。
[2] X. Shi 等人,“Qwen3-ASR 技术报告”,2026。arXiv
[3] M. Zusag、L. Wagner 与 B. Thallinger,“CrisperWhisper:逐字语音转录的精确时间戳”,收录于《Interspeech 会议论文集》,2024。
[4] M. Sekoyan、N. R. Koluguri、N. Tadevosyan、P. Zelasko、T. Bartley、N. Karpov、J. Balam 与 B. Ginsburg,“Canary-1B-v2 和 Parakeet-TDT-0.6B-v3:用于多语言语音识别和语音翻译的高效高性能模型”,2025。arXiv
[5] M. Bain、J. Huh、T. Han 与 A. Zisserman,“WhisperX:长音频的时间精确语音转录”,2023。arXiv