モデル概要
モデル特徴
モデル能力
使用事例
🚀 GigaSpeech用Conformer
このリポジトリは、SpeechBrain内でGigaSpeech (EN, XL split) で事前学習されたエンドツーエンドシステムを使用して自動音声認識を実行するために必要なすべてのツールを提供します。より良い体験を得るために、SpeechBrain についてもっと学ぶことをおすすめします。 モデルの全コンテキストモード(ストリーミングなし)でのパフォーマンスは次の通りです。
リリース日 | テストWER | 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% |
(*: この設定でモデルは明示的に学習されていません)
設定を比較する際には、テストセットの発話は有限の長さであることに注意してください。 すべてのWER値は、このスクリプト を使用して評価されました(異なる条件でのストリーミングWERを評価するより良い方法を統合するまで)。
🚀 クイックスタート
パイプラインの説明
このASRシステムは、RNN-T損失(トレーニングを安定させるための補助的なCTC損失を含む)で学習されたConformerモデルです。モデルはユニグラムトークナイザーを使用して動作します。 アーキテクチャの詳細は、トレーニングハイパーパラメータファイル に記載されています。
ストリーミングサポートにはDynamic Chunk Trainingが使用されています。マルチヘッドアテンションモジュールにはチャンク化されたアテンションが使用され、Dynamic Chunk Convolutions の実装が使用されています。 モデルは、異なるチャンクサイズ(および全コンテキスト)をサポートして学習されているため、さまざまなチャンクサイズとオフライントランスクリプションに適しています。
システムは、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",
# 左コンテキストが4チャンクの約960msのチャンクサイズを選択
DynChunkTrainConfig(24, 4),
# HuggingFaceからの取得を可能にするためにtorchaudioストリーミングを無効にする
# 自分のファイルやストリームでストリーミングファイルデコードを可能にするには、これをTrueに設定する
use_torchaudio_streaming=False,
)
DynChunkTrainConfig
の値は、レイテンシ、計算能力、およびトランスクリプション精度のトレードオフのために調整できます。ストリーミングWER表を参照して、あなたのユースケースに適した値を選択してください。
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チームは、このモデルを他のデータセットで使用した場合のパフォーマンスについて、いかなる保証も提供しません。
✨ 主な機能
- エンドツーエンドの自動音声認識システムを提供します。
- ストリーミングサポートにより、異なるチャンクサイズでの推論が可能です。
- モデルはGigaSpeechデータセットで事前学習されています。
📦 インストール
SpeechBrainのインストール
pip install 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",
# 左コンテキストが4チャンクの約960msのチャンクサイズを選択
DynChunkTrainConfig(24, 4),
# HuggingFaceからの取得を可能にするためにtorchaudioストリーミングを無効にする
# 自分のファイルやストリームでストリーミングファイルデコードを可能にするには、これをTrueに設定する
use_torchaudio_streaming=False,
)
高度な使用法
コマンドラインツールでファイルまたはライブストリームをトランスクリプションする
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("Loading libraries")
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"Loading model from \"{args.model_source}\" onto device {device}")
asr = StreamingASR.from_hparams(args.model_source, run_opts={"device": device})
config = DynChunkTrainConfig(args.chunk_size, args.left_context_chunks)
logging.info(f"Starting stream from URI \"{args.audio_path}\"")
for text_chunk in asr.transcribe_file_streaming(args.audio_path, config):
print(text_chunk, flush=True, end="")
Gradioを使用してブラウザからライブASRデコードする
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("Loading libraries")
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"Loading model from \"{args.model_source}\" onto device {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()) # norm by max abs() within chunk & avoid NaN
if len(y.shape) > 1:
y = torch.mean(y, dim=1) # downmix to mono
# HACK: we are making poor use of the resampler across chunk boundaries
# which may degrade accuracy.
# NOTE: we should also absolutely avoid recreating a resampler every time
resampler = torchaudio.transforms.Resample(orig_freq=sr, new_freq=asr.audio_normalizer.sample_rate).to(device)
y = resampler(y) # janky resample (probably to 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:]
# fake batch dim
chunk = chunk.unsqueeze(0)
# list of transcribed strings, of size 1 because the batch size is 1
with torch.no_grad():
transcribed = asr.transcribe_chunk(stream.context, chunk)
stream.decoded_text += transcribed[0]
return stream, stream.decoded_text
# NOTE: latency seems relatively high, which may be due to this:
# 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)
📚 ドキュメント
モデル情報
属性 | 詳細 |
---|---|
モデルタイプ | Conformerモデル(RNN-T損失と補助的なCTC損失で学習) |
トレーニングデータ | speechcolab/gigaspeech |
評価指標 | WER (Word Error Rate) |
SpeechBrainについて
- ウェブサイト: https://speechbrain.github.io/
- コード: https://github.com/speechbrain/speechbrain/
- HuggingFace: https://huggingface.co/speechbrain/
SpeechBrainを引用する場合
@misc{speechbrainV1,
title={Open-Source Conversational AI with SpeechBrain 1.0},
author={Mirco Ravanelli and Titouan Parcollet and Adel Moumen and Sylvain de Langen and Cem Subakan and Peter Plantinga and Yingzhi Wang and Pooneh Mousavi and Luca Della Libera and Artem Ploujnikov and Francesco Paissan and Davide Borra and Salah Zaiem and Zeyu Zhao and Shucong Zhang and Georgios Karakasidis and Sung-Lin Yeh and Pierre Champion and Aku Rouhe and Rudolf Braun and Florian Mai and Juan Zuluaga-Gomez and Seyed Mahed Mousavi and Andreas Nautsch and Xuechen Liu and Sangeet Sagar and Jarod Duret and Salima Mdhaffar and Gaelle Laperriere and Mickael Rouvier and Renato De Mori and Yannick Esteve},
year={2024},
eprint={2407.00463},
archivePrefix={arXiv},
primaryClass={cs.LG},
url={https://arxiv.org/abs/2407.00463},
}
@misc{speechbrain,
title={{SpeechBrain}: A General-Purpose Speech Toolkit},
author={Mirco Ravanelli and Titouan Parcollet and Peter Plantinga and Aku Rouhe and Samuele Cornell and Loren Lugosch and Cem Subakan and Nauman Dawalatabad and Abdelwahab Heba and Jianyuan Zhong and Ju-Chieh Chou and Sung-Lin Yeh and Szu-Wei Fu and Chien-Feng Liao and Elena Rastorgueva and François Grondin and William Aris and Hwidong Na and Yan Gao and Renato De Mori and Yoshua Bengio},
year={2021},
eprint={2106.04624},
archivePrefix={arXiv},
primaryClass={eess.AS},
note={arXiv:2106.04624}
}
📄 ライセンス
このプロジェクトはApache 2.0ライセンスの下で提供されています。



