模型简介
模型特点
模型能力
使用案例
推理:false # 需要在HF中实现流式API 语言:
- 英文 缩略图:null 标签:
- 自动语音识别
- 转换器
- 一致性模型
- PyTorch
- SpeechBrain 许可证:apache-2.0 数据集:
- speechcolab/gigaspeech 指标:
- 词错误率 模型索引:
- 名称:SpeechBrain的Conformer-Transducer
结果:
- 任务:
名称:自动语音识别
类型:自动语音识别
数据集:
名称:GigaSpeech
类型:gigaspeech
分割:测试
参数:
语言:英文
指标:
- 名称:测试词错误率(非流式贪婪解码) 类型:词错误率 值:11.00%
- 名称:测试词错误率(960ms分块大小,4个左上下文分块) 类型:词错误率 值:11.53%
- 任务:
名称:自动语音识别
类型:自动语音识别
数据集:
名称:GigaSpeech
类型:gigaspeech
分割:测试
参数:
语言:英文
指标:
GigaSpeech的Conformer模型
本仓库提供了所有必要的工具,用于在SpeechBrain中执行基于GigaSpeech(英文,XL分割)预训练的端到端自动语音识别系统。为了获得更好的体验,我们鼓励您了解更多关于SpeechBrain的信息。
模型在完整上下文模式(非流式)下的性能如下:
发布版本 | 测试词错误率 | GPU数量 |
---|---|---|
2024-11-08 | 11.00% | 4xA100 40GB |
在流式模式下,测试分割上不同分块大小的结果如下:
完整 | cs=32 (1280ms) | 24 (960ms) | 16 (640ms) | 12 (480ms) | 8 (320ms) | |
---|---|---|---|---|---|---|
完整 | 11.00% | - | - | - | - | - |
16 | - | - | - | 11.70% | 11.84% | 12.14% |
8 | - | - | 11.50% | 11.72% | 11.88% | 12.28% |
4 | - | 11.40% | 11.53% | 11.81% | 12.03% | 12.64% |
2 | - | 11.46% | 11.67% | 12.03% | 12.43% | 13.25% |
1* | - | 11.59% | 11.85% | 12.39% | 12.93% | 14.13% |
(*: 模型从未明确针对此设置进行训练)
在比较配置时,请注意测试集的语音长度是有限的。
所有词错误率值均使用此脚本评估(直到我们集成一种更好的方法来评估不同条件下的流式词错误率)。
流程描述
该ASR系统是一个使用RNN-T损失(以及辅助CTC损失以稳定训练)训练的Conformer模型。模型使用单字分词器操作。
架构细节在训练超参数文件中描述。
流式支持利用了动态分块训练。多头注意力模块使用了分块注意力,并实现了动态分块卷积。
模型训练时支持不同的分块大小(甚至完整上下文),因此适用于各种分块大小和离线转录。
系统训练时使用的录音采样率为16kHz(单声道)。
在调用transcribe_file
时,代码会自动对音频进行归一化处理(即重采样+单声道选择)。
安装SpeechBrain
首先,请使用以下命令安装SpeechBrain:
pip install speechbrain
请注意,我们鼓励您阅读我们的教程并了解更多关于SpeechBrain的信息。
转录您自己的英文音频文件
from speechbrain.inference.ASR import StreamingASR
from speechbrain.utils.dynamic_chunk_training import DynChunkTrainConfig
asr_model = StreamingASR.from_hparams("speechbrain/asr-streaming-conformer-gigaspeech")
asr_model.transcribe_file(
"speechbrain/asr-streaming-conformer-librispeech/test-en.wav",
# 选择约960ms的分块大小,带4个左上下文分块
DynChunkTrainConfig(24, 4),
# 禁用torchaudio流式以允许从HuggingFace获取
# 对于您自己的文件或流,设置为True以允许流式文件解码
use_torchaudio_streaming=False,
)
可以调整DynChunkTrainConfig
的值以在延迟、计算能力和转录准确性之间进行权衡。参考流式词错误率表选择适合您用例的值。
用于转录文件或实时流的命令行工具
使用ffmpeg从实时流解码(BBC Radio 4):
python3 asr.py http://as-hls-ww-live.akamaized.net/pool_904/live/ww/bbc_radio_fourfm/bbc_radio_fourfm.isml/bbc_radio_fourfm-audio%3d96000.norewind.m3u8 --model-source=speechbrain/asr-streaming-conformer-gigaspeech --device=cpu -v
从文件解码:
python3 asr.py some-english-speech.wav --model-source=speechbrain/asr-streaming-conformer-gigaspeech --device=cpu -v
from argparse import ArgumentParser
import logging
parser = ArgumentParser()
parser.add_argument("audio_path")
parser.add_argument("--model-source", required=True)
parser.add_argument("--device", default="cpu")
parser.add_argument("--ip", default="127.0.0.1")
parser.add_argument("--port", default=9431)
parser.add_argument("--chunk-size", default=24, type=int)
parser.add_argument("--left-context-chunks", default=4, type=int)
parser.add_argument("--num-threads", default=None, type=int)
parser.add_argument("--verbose", "-v", default=False, action="store_true")
args = parser.parse_args()
if args.verbose:
logging.getLogger().setLevel(logging.INFO)
logging.info("加载库")
from speechbrain.inference.ASR import StreamingASR
from speechbrain.utils.dynamic_chunk_training import DynChunkTrainConfig
import torch
device = args.device
if args.num_threads is not None:
torch.set_num_threads(args.num_threads)
logging.info(f"将模型从\"{args.model_source}\"加载到设备{device}")
asr = StreamingASR.from_hparams(args.model_source, run_opts={"device": device})
config = DynChunkTrainConfig(args.chunk_size, args.left_context_chunks)
logging.info(f"从URI \"{args.audio_path}\"启动流")
for text_chunk in asr.transcribe_file_streaming(args.audio_path, config):
print(text_chunk, flush=True, end="")
使用Gradio从浏览器进行实时ASR解码
我们希望在创建一个适当的HuggingFace空间来演示CPU上的实时流之前优化模型的一些方面。
在此期间,这是一个简单的临时演示,展示了使用Gradio的实时麦克风流功能在浏览器中进行实时ASR。
如果您运行此代码,请注意:
- 现代浏览器拒绝通过不受信任的连接(纯HTTP)流式传输麦克风输入,除非是本地主机。如果您在远程服务器上运行此代码,可以使用SSH端口转发将远程端口暴露在您的机器上。
- 在Firefox上使用Gradio流式传输似乎会导致一些问题。基于Chromium的浏览器表现更好。
运行命令:
python3 gradio-asr.py --model-source speechbrain/asr-streaming-conformer-gigaspeech --ip=localhost --device=cpu
from argparse import ArgumentParser
from dataclasses import dataclass
import logging
parser = ArgumentParser()
parser.add_argument("--model-source", required=True)
parser.add_argument("--device", default="cpu")
parser.add_argument("--ip", default="127.0.0.1")
parser.add_argument("--port", default=9431)
parser.add_argument("--chunk-size", default=24, type=int)
parser.add_argument("--left-context-chunks", default=4, type=int)
parser.add_argument("--num-threads", default=None, type=int)
parser.add_argument("--verbose", "-v", default=False, action="store_true")
args = parser.parse_args()
if args.verbose:
logging.getLogger().setLevel(logging.INFO)
logging.info("加载库")
from speechbrain.inference.ASR import StreamingASR, ASRStreamingContext
from speechbrain.utils.dynamic_chunk_training import DynChunkTrainConfig
import torch
import gradio as gr
import torchaudio
import numpy as np
device = args.device
if args.num_threads is not None:
torch.set_num_threads(args.num_threads)
logging.info(f"将模型从\"{args.model_source}\"加载到设备{device}")
asr = StreamingASR.from_hparams(args.model_source, run_opts={"device": device})
config = DynChunkTrainConfig(args.chunk_size, args.left_context_chunks)
@dataclass
class GradioStreamingContext:
context: ASRStreamingContext
chunk_size: int
waveform_buffer: torch.Tensor
decoded_text: str
def transcribe(stream, new_chunk):
sr, y = new_chunk
y = y.astype(np.float32)
y = torch.tensor(y, dtype=torch.float32, device=device)
y /= max(1, torch.max(torch.abs(y)).item()) # 按分块内的最大绝对值归一化并避免NaN
if len(y.shape) > 1:
y = torch.mean(y, dim=1) # 降混为单声道
# 临时方案:我们在分块边界上对重采样器的使用不佳,可能会降低准确性。
# 注意:我们也应该绝对避免每次重新创建重采样器
resampler = torchaudio.transforms.Resample(orig_freq=sr, new_freq=asr.audio_normalizer.sample_rate).to(device)
y = resampler(y) # 临时重采样(可能到16kHz)
if stream is None:
stream = GradioStreamingContext(
context=asr.make_streaming_context(config),
chunk_size=asr.get_chunk_size_frames(config),
waveform_buffer=y,
decoded_text="",
)
else:
stream.waveform_buffer = torch.concat((stream.waveform_buffer, y))
while stream.waveform_buffer.size(0) > stream.chunk_size:
chunk = stream.waveform_buffer[:stream.chunk_size]
stream.waveform_buffer = stream.waveform_buffer[stream.chunk_size:]
# 伪造批次维度
chunk = chunk.unsqueeze(0)
# 转录字符串列表,大小为1因为批次大小为1
with torch.no_grad():
transcribed = asr.transcribe_chunk(stream.context, chunk)
stream.decoded_text += transcribed[0]
return stream, stream.decoded_text
# 注意:延迟似乎相对较高,可能是由于此问题:
# https://github.com/gradio-app/gradio/issues/6526
demo = gr.Interface(
transcribe,
["state", gr.Audio(sources=["microphone"], streaming=True)],
["state", "text"],
live=True,
)
demo.launch(server_name=args.ip, server_port=args.port)
GPU上的推理
要在GPU上执行推理,调用from_hparams
方法时添加run_opts={"device":"cuda"}
。
批量并行推理
目前,高级转录接口不支持批量推理,但低级接口(即encode_chunk
)支持。
我们希望未来能为此提供高效的功能。
训练
该模型使用SpeechBrain v1.0.2
训练。
要从头开始训练,请按照以下步骤操作:
- 克隆SpeechBrain:
git clone https://github.com/speechbrain/speechbrain/
- 安装:
cd speechbrain
pip install -r requirements.txt
pip install -e .
- 按照此配方的README中列出的步骤操作。
限制
SpeechBrain团队不对此模型在其他数据集上的性能提供任何保证。
**关于



