SileroVAD : 発話区間を検出する機械学習モデル
ailia SDKで使用できる機械学習モデルである「SileroVAD」のご紹介です。エッジ向け推論フレームワークであるailia SDKとailia MODELSに公開されている機械学習モデルを使用することで、簡単にAIの機能をアプリケーションに実装することができます。
SileroVADの概要
SileroVADは発話区間を検出する機械学習モデルです。音声ファイルから無音か有音かを検知するのは意外と難しく、AIを使用しない方法のwebrtc-vadが使用されていましたが、近年はAIベースのSileroVADが広く使われるようになってきています。

SileroVAD
SileroVADは1.8MBと軽量で、30msのchunkを1ms程度で処理でき高速で、高精度です。また、MITライセンスで使用可能です。
特に、音声認識AIであるWhisperは、無音を入れると、「ご清聴ありがとうございました。」などと表示されることが多く、Whisperに入れる前にVADで発話判定を行うのが重要になっています。そのため、SileroVADはfaster-whisperにも導入されています。faster-whisperでは、2秒以上の無音区間を除去します。
また、AIとの対話システムを作成する場合も、発話の終了をエッジ側で認識する必要があり、発話の終了を高精度に検知する方法として、SileroVADが使用可能です。
SileroVADの入出力
SileroVADでは、16kHzのPCM波形を扱います。処理単位のWindow Sizeは1536 sampleで、入力されたPCM波形を1536 sampleのchunkごとにオーバラップせずにSileroVADに供給します。出力値はchunkが無音でない確率値となります。
SileroVADの入力は、(batch, sequence)のPCM、(1)のサンプリングレート、(2, batch, 64)のh、(2, batch, 64)のcです。出力は、(batch, 1)の確率値、(2, batch, 64)のhn、(2, batch, 64)のcnです。
hとcは内部ステートで、最初のchunkは0で初期化、2番目以降のchunkは前回の出力のhnとcnを、今回の入力のhとcに与えます。
テストする音声ファイルを入れた場合、0.3〜2.0secが発話区間とします。16kHzで0.3secは4800 sample、2.0secは32000 sampleになります。
1536 sampleごとの確率値の例は下記のようになります。確率値が高いほど、発話であることを示しています。
INFO silero-vad.py (100) : 0.0 sec 0.06508361548185349
INFO silero-vad.py (100) : 0.096 sec 0.4314267337322235
INFO silero-vad.py (100) : 0.192 sec 0.9363511204719543
INFO silero-vad.py (100) : 0.288 sec 0.9912925362586975
INFO silero-vad.py (100) : 0.384 sec 0.9910984039306641INFO silero-vad.py (100) : 1.824 sec 0.9369962811470032
INFO silero-vad.py (100) : 1.92 sec 0.23795287311077118
INFO silero-vad.py (100) : 2.016 sec 0.044181931763887405
INFO silero-vad.py (100) : 2.112 sec 0.03219963237643242
INFO silero-vad.py (100) : 2.208 sec 0.034886687994003296
INFO silero-vad.py (100) : 2.304 sec 0.040618717670440674
SileroVADの標準では、0.5以上の値は発話区間と判定します。
SileroVADのアーキテクチャ
SileroVADは学習コードは公開されておらず、Pytorchのjitファイルと、ONNXファイルが提供されています。
ONNXファイルはSubgraphを使った、少し複雑な構成となっています。内部的にはConvとLSTMを使用したモデルになっています。

ONNXを開くとSubgraphが19個含まれている

subgraph10の表示
SileroVADの精度
SileroVADはLibryParty datasetとAVA Spoken Activiti Datasetsで評価されており、WebRTCのVADを大幅に上回る精度を持っています。16kは16kHz、8kは8kHzで推論することを指しています。

SileroVADの精度
SileroVADを使用する
Python
ailia SDKでSileroVADを使用するには、下記のコマンドを使用します。入力した音声ファイルから、無音区間を削除した音声ファイルを作成します。
$ python3 sileo-vad.py --input ex_example.wav --output only_speech.wav
なお、SileroVADの使用にはailia SDK 1.2.15以降が必要です。
C++
下記にC++から使用するサンプルがあります。Waveファイルを読み込んで、各セグメントの確率値を計算します。
Unity
下記にUnityから使用するサンプルがあります。C#のコードでPCMの各サンプルの確率値を計算します。また、WhisperのWEB APIと連携する際に便利なように、切り出したAudioClipを生成します。
一行目の赤が各サンプルの確率値で、値が大きいほど発話である確率が高くなります。1536サンプル単位で確率値が計算されます。
二行目以降はVADで切り出した発話区間です。

SileroVADの実行例
アイリア株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。アイリア株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。
ailia Tech BLOG