LoginSignup
2

More than 3 years have passed since last update.

Docker仮想環境でオフライン音声認識システムJuliusをpythonで動かしてみた

Last updated at Posted at 2020-10-05

初めての記事を投稿します。

Julius(ユリウス)

 Juliusとは京大が開発した音声認識システムであり、精度は悪いものの、無料かつオフラインで動かすことができるといったメリットがあります。

 今ある記事の中では、Juliusをpythonで解析するためにソケット通信を用いないと出来ないものばかりで煩わしさを感じたので、pythonから直接Juliusを動かすコマンドを叩き、その結果を解析するコードをクラスとしてまとめました。

※2020年12月19日追記
実行環境 mac(Catalina ver 10.15.4)

以下githubソースコード
https://github.com/rirma/JuliusVoiceAnalyzer.git

必要ないライブラリもインストールされますがご了承願います。
必要でなければ下の方のpip3インストールなどは削除してください。

Juliusを動かすまでの流れ

*2020年12月19日追記

ホスト側の処理

 ① まず、macにpulseaudioをダウンロードします。

brew install pulseaudio

 ② ホスト側でpulseaudioを立ち上たままにしておきます。(docker仮想環境内でマイクを認識するために必要です)

pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1

サーバ側の処理

 ① ダウンロードしたフォルダ内で下記コマンドを叩き、dockerコンテナを作成します。

$ docker-compose up -d --build

 ②作成したコンテナ内に入ります。

$ docker-compose exec python bash

 ③VoiceAnalyzer.pyの置いてあるフォルダに移動し、プログラムを実行します。

# cd opt/public/src
# python3 VoiceAnalyzer.py

 ④何か声を発し、次のような実行結果になれば成功です。

start record
Saved.
20201005220733.wav
enter filename->...........................................................................................................................................................................................................enter filename->1 files processed
おはよう。

*2020年12月19日追記
 また、音声を解析したい場合は以下のコマンドを実行します。(your file pathには解析したいファイルを入れます)

$ bash julius-start.sh
...
enter filename->'your file path'

 これを利用すれば、pythonサーバに音声ファイルを送り、認識結果を返すようなアプリの開発もできるかと思います。

音声解析のためのプログラム

VoiceAnalyzer.py内にJuliusで音声解析をしやすくするためのクラスが定義されています。

初期化

def __init__(self, chunk = 1024, format = pyaudio.paInt16, channels = 1, rate = 44100, record_seconds = 2, threshold = 0.1)

必要に応じて変更するパラメータ

chunk: 音声ファイルのchunk
channnels: 音声ファイルのチャンネル
rate: サンプリングレート
record_seconds: 録音する長さ(秒)
threshold: 録音を開始する音の大きさ(0~1)、雑音で録音スタートしないようにするため

録音開始

def start_record(self, dir_name = '../sound/')

dir_name: 音声ファイルの保存先ディレクトリ名
返却値: 保存されたファイル名(ディレクトリ名は省略)

音声解析

def analyze_voice(self, file_path)

file_path: 解析するファイル(例 '../sound/20201005220733.wav')
返却値: ファイルの音声認識結果文字列

最後に

 Juliusはあまり精度はよくないですが、例えば「Hey Siri」などのような起動音を独自で作りたいといったときに役に立つのではないかと思います。私はJuliusに認識させたい起動音を何回も発声し、それらをリスト化することで誤差を吸収しました。対話アプリなどに役立てていただければ幸いです。

2020年12月19日追記

バグを含んだ状態でアップしていたようです。
見ていただいた方々、ご迷惑をおかけしたこと、お詫び申し上げます。
修正版をgithubにアップしましたので、もう一度試していただければ幸いです。
また、それに合わせて記事も修正しました。(いろいろ説明が足りていない部分がありました)
今後ともよろしくお願いします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2