HumansXドキュメントセンター 公式サイトへ ↗

音声認識(ASR)— sherpa-onnx 認識フレームワークの概要

概要

sherpa-onnx は、ONNX Runtime をベースとしたオープンソースの音声認識ツールキットです。Paraformer、Conformer、Zipformer など複数の音声認識モデルに対応しています。ASR モジュールでは、sherpa-onnx を音声認識のコアエンジンとして使用しています。

公式リポジトリ:https://github.com/k2-fsa/sherpa-onnx
公式ドキュメント:https://k2-fsa.github.io/sherpa/onnx/

特長

  • 複数モデルに対応:Paraformer、Conformer、Zipformer の各モデルに対応しています
  • 多言語に対応:中国語、英語などの言語に対応しています
  • 高性能:ONNX Runtime ベースで、さまざまなハードウェアアクセラレーションに対応しています
  • クロスプラットフォーム:Windows、Linux、macOS などの OS に対応しています
  • 軽量:エッジデバイスへのデプロイ向けにモデルが最適化されています
  • リアルタイム認識:ストリーミング音声認識に対応しています

ASR モジュールでの利用

使用モデル

ASR モジュールでは、以下の sherpa-onnx モデルを使用しています。

  1. 音声認識モデル:Paraformer 中国語モデル
  • モデルディレクトリ:models/asr/sherpa-onnx-paraformer-zh-2024-03-09
  • モデルファイル:model.int8.ort
  • トークンファイル:tokens.txt
  1. VAD モデル:Silero VAD モデル
  • モデルファイル:models/vad/silero_vad.onnx

組み込み方法

import sherpa_onnx

# VAD を初期化
vad_config = sherpa_onnx.VadModelConfig()
vad_config.silero_vad.model = "models/vad/silero_vad.onnx"
vad = sherpa_onnx.VoiceActivityDetector(vad_config, buffer_size_in_seconds=100)

# ASR を初期化
recognizer = sherpa_onnx.OfflineRecognizer.from_paraformer(
    paraformer="models/asr/sherpa-onnx-paraformer-zh-2024-03-09/model.int8.ort",
    tokens="models/asr/sherpa-onnx-paraformer-zh-2024-03-09/tokens.txt",
    num_threads=2,
    sample_rate=16000,
    feature_dim=80,
    decoding_method="greedy_search"
)

# 音声を認識
stream = recognizer.create_stream()
stream.accept_waveform(16000, audio_data)
recognizer.decode_stream(stream)
text = stream.result.text

モデルの最適化

量子化

ASR モジュールで使用するモデルには INT8 量子化が施されており、モデルサイズの削減と推論の高速化を実現しています。

  • 元のモデル:model.onnx
  • 量子化モデル:model.int8.ort

パフォーマンスチューニング

  1. スレッド数:num_threads パラメーターで推論スレッド数を調整します
  2. サンプリングレート:16kHz のサンプリングレートに統一しています
  3. 特徴量の次元:80 次元の特徴量を使用しています

対応モデルの種類

ストリーミングモデル

  • Zipformer
  • Conformer
  • LSTM

非ストリーミングモデル

  • Paraformer
  • Whisper
  • TDNN

ハードウェアアクセラレーション

sherpa-onnx は、さまざまなハードウェアアクセラレーションのバックエンドに対応しています。

  • CPU:デフォルトでは CPU で推論します
  • CUDA:NVIDIA GPU によるアクセラレーション
  • CoreML:Apple デバイスによるアクセラレーション
  • DirectML:Windows デバイスによるアクセラレーション

ASR モジュールでは、クロスプラットフォームの互換性を確保するため、デフォルトで CPU 推論を使用しています。

API の使い方

オフライン認識

# 認識器を作成
recognizer = sherpa_onnx.OfflineRecognizer.from_paraformer(...)

# 音声ストリームを作成
stream = recognizer.create_stream()

# 音声データを入力
stream.accept_waveform(sample_rate, audio_data)

# 認識を実行
recognizer.decode_stream(stream)

# 結果を取得
result = stream.result.text

オンライン認識

# オンライン認識器を作成
recognizer = sherpa_onnx.OnlineRecognizer.from_paraformer(...)

# オンラインストリームを作成
stream = recognizer.create_stream()

# 音声データを入力
stream.accept_waveform(sample_rate, audio_data)

# 認識を実行
recognizer.decode_stream(stream)

# 途中結果を取得
result = stream.result.text

VAD 処理

# VAD を作成
vad = sherpa_onnx.VoiceActivityDetector(vad_config, buffer_size_in_seconds=100)

# 音声データを入力
vad.accept_waveform(audio_data)

# 発話区間があるか確認
if not vad.empty():
    # 発話区間を取得
    samples = vad.front.samples
    # 処理済みの発話区間を削除
    vad.pop()

モデルの入手

公式の学習済みモデル

sherpa-onnx 公式の学習済みモデルのページからモデルをダウンロードできます:https://k2-fsa.github.io/sherpa/onnx/pretrained_models/index.html

このページでは、さまざまな言語・用途向けの学習済みモデルが提供されています。主なものは以下のとおりです。

  1. 中国語モデル:
  • Paraformer 中国語モデル
  • Conformer 中国語モデル
  • Zipformer 中国語モデル
  1. 英語モデル:
  • Whisper 英語モデル
  • Conformer 英語モデル
  • Zipformer 英語モデル
  1. 多言語モデル:
  • Whisper 多言語モデル
  • Paraformer 多言語モデル

ダウンロード方法

モデルは以下の方法でダウンロードできます。

  1. 直接ダウンロード:Web ページからモデルファイルを直接ダウンロードします
  2. コマンドラインツール:sherpa-onnx が提供するダウンロードスクリプトを使用します
  3. Python スクリプト:Python スクリプトで一括ダウンロードします

ASR モジュールで使用しているモデル

ASR モジュールでは現在 Paraformer 中国語モデルを使用しています。以下のリンクから入手できます:Paraformer 中国語モデル

カスタムモデル

独自に学習させたモデルを使用することもできます。その場合は、モデル形式が ONNX と互換性があることを確認してください。

メモリ使用量

  • モデルの読み込み:約 100MB
  • 推論処理:約 50MB

トラブルシューティング

よくある質問

  1. モデルの読み込みに失敗する
  • モデルファイルのパスが正しいか確認してください
  • モデルファイルが破損していないか確認してください
  1. 認識結果が空になる
  • 音声のサンプリングレートが 16kHz になっているか確認してください
  • 音声データの形式が正しいか確認してください
  1. パフォーマンスに問題がある
  • スレッド数のパラメーターを調整してください
  • ハードウェアアクセラレーションの利用を検討してください

ログによるデバッグ

詳細ログを有効にすると、問題の診断に役立ちます。

import logging
logging.basicConfig(level=logging.DEBUG)

さらに学ぶために