6
Help us understand the problem. What are the problem?

posted at

updated at

【Python】話題の音声認識ツールキット Vosk を試してみた

はじめに

こちらの記事はZennにも投稿しています。

たまたまTLで見かけたので試してみました。結果から言うとすごく簡単、触っていておもしろかったです。

What is Vosk?

20言語以上に対応した音声認識ツールキット。言語モデルが50MBと軽く、組み込みがしやすいです。1
PythonはもちろんのことNode.jsやJava, C#でも実装可能。ラズパイ/iOS/Android用のビルド、Websocketサーバまで用意されているという準備の良さです。
なおM1 Macには非対応です。
詳しくは Vosk のリファレンスで。

サンプル音声の準備

まずは音源の準備をします。フリーの素材がないかと探していたところ こえやさん と言うサイトを見つけたので今回はこちらのファイルを拝借。

Voskのページをみると、しれっと以下のような記載があったのでffmpegで変換します。

When using your own audio file make sure it has the correct format - PCM 16khz 16bit mono.

ffmpeg -i sample_voice.wav -ar 16000 -ac 1 -f s16le sample_voice_16khz.wav

Let's coding

Voskはpipでのインストールが可能です。ただ私はpoetryが好きなのでそちらでインストールしてみます。
どうやらMacOSだと最新版 (0.3.38) が対応しておらずインストール時にエラーに。pipでインストールできるバージョンに落としてインストールします。(2022-05-19 執筆時点)

また言語モデルはこちらにあがっているのでDL。Zipを解凍して使います。

poetry add vosk@0.3.32
curl -O https://alphacephei.com/vosk/models/vosk-model-small-ja-0.22.zip
unzip vosk-model-small-ja-0.22.zip
mv vosk-model-small-ja-0.22/ model/

PythonモジュールはExampleがあったのでそこから落として適当に書き換えます。(引数でファイル名渡していたのを先述の音源ファイルに変えただけ。バージョンはインストールしたものに合わせています。)

main.py
# wf = wave.open(sys.argv[1], "rb")
wav = "sample_voice_16khz.wav"
wf = wave.open(wav, "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
    print ("Audio file must be WAV format mono PCM.")
    exit (1)

そうして実行すると、、、

Terminal gif

おぉ、少し違うところもあるけどちゃんと漢字まで日本語認識できてる!!

ちなみに音源のテキストは「ご視聴ありがとうございました!グッドボタンとチャンネル登録よろしくお願いします!」です。

Exampleには他にマイクからとってくるモジュールもありましたのでそちらも試してみたいですね。

おわりに

いかがでしたでしょうか?
精度の高さ&50MBという軽さ&気軽に試せると3点よしでVoskとってもいい感じでした。
皆さまも是非試してみてください!

コードはGitHubとReplitにあげています。
よろしければ気軽にフォローしていただけるとアヒルくんが喜びます。

Thank you for reading my post. Happy Development!!

  1. 後にリンク乗せていますが、まさかReplitでも動くとは思わなかった。。。それだけ組み込みしやすいということですね。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
6
Help us understand the problem. What are the problem?