Edited at

Kaldiを用いたリアルタイム音声認識

More than 1 year has passed since last update.

最近音声認識研究業界では標準になっているKaldiを用いて,リアルタイム音声認識をする方法です.音声が入力されている間にも,どんどん音声認識がされていく環境です(1発話が終わってから,音声が認識開始されるのではない.).

Kaldi GStreamer serverを用いて音声認識を行いますが,この環境がDockerイメージで公開されているので,それを使います.使わなくてもできると思います.

以下の例では,DNNの音声認識モデルにて,英語の音声認識をします.kaldi用online_nnet2モデルがあれば,日本語でもできるようです.


1.マシン環境

OS : Ubuntu 16.04


2.docker インストール


2.1.旧バージョンのアンインストール

$ sudo apt-get remove docker docker-engine docker.io


2.2. リポジトリのセットアップ

$ sudo apt-get update

$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

キーの確認

$ sudo apt-key fingerprint 0EBFCD88

pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22

リポジトリの追加

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"


2.3. インストール

$ sudo apt-get update

$ sudo apt-get install docker-ce


3.kaldiのdockerイ用イメージファイルをインストール

$ docker pull jcsilva/docker-kaldi-gstreamer-server

dockerのイメージは,/var/lib/docker/ 内に格納されます.

エラーで実行できない場合は,dockerグループにユーザが登録されていない可能性があります.

https://qiita.com/naomichi-y/items/93819573a5a51ae8cc07


4.dockerイメージ起動

以下の 3.2.1.〜 3.2.3.の3つの中で,自分の条件に合うものを一つ実行して,dockerイメージを起動してください.


4.1.dockerイメージ内で,認識サーバ&クライアントの両方を起動する場合

$ docker run --name kaldi_server -it --privileged -v /dev/snd:/dev/snd -v /media/kaldi_models:/opt/models jcsilva/docker-kaldi-gstreamer-server:latest /bin/bash

-v /dev/snd:/dev/snd で,サウンドデバイスをdocker内で使用できるようにしている.


4.2.同一マシンでクライアントも走らせる場合(docker内ではなく,ホストOSでクライアントを起動する場合)

$ docker run --name kaldi_server -it --privileged -v /media/kaldi_models:/opt/models jcsilva/docker-kaldi-gstreamer-server:latest /bin/bash


4.3.別マシンでクライアントを走らせる場合(ポートフォワードをする)

$ docker run --name kaldi_server  -it -p 8888:8888 --privileged -v /media/kaldi_models:/opt/models jcsilva/docker-kaldi-gstreamer-server:latest /bin/bash

-p 8888:8888 で,docker内ポート(8888)を,ホストOSのポート(8888)にポートフォワードしている.


4.4.オプション説明 & dockerについて

--name [string]                     :名前を指定できます.

-v /media/kaldi_models:/opt/models :前半のディレクトリが,イメージ内の後半のディレクトリにマップされます.

dockerについて

docker runは,「イメージからコンテナを新規作成」するコマンドです.

docker startは,「既存コンテナを起動」するコマンドです.

毎回docker runすると,コンテナが新規作成されます.作成した(一度使った)コンテナを使う場合には,docker startを使いましょう.

docker ps -aで,存在するコンテナを確認できます.

docker start -i [コンテナID or NAME]で,コンテナにログインできます.

docker rm [コンテナID or NAME]で,コンテナを削除できます.


5.docker内環境設定


5.1. ALSAインストール(aplay, arecord)

$ apt-get install alsa-utils

aplay -larecord -l デバイス番号の表示

arecord -D hw:2,0 test.wav デバイス[2],サブデバイス[0]にて,test.wavに録音(Unsigned 8 bit, Rate 8000 Hz, Mono)

aplay -l でサウンドカードが見つからない場合,$ sudo aplay -l をしてサウンドカードが表示されるなら,以下を実行して,audioグループにユーザを追加してください.

$ sudo gpasswd -a [user] audio

再起動後,$ aplay -lをしてみてください.


5.2.音声認識用モデルのダウンロード(英語:TEDLIUM)

dockerの/opt/models 内にデータをダウンロードした(マップされて,ホストOSの /media/kaldi_models に入る)

$ mkdir -p /opt/models/test/models

$ cd /opt/models/test/models
$ wget --no-check-certificate https://phon.ioc.ee/~tanela/tedlium_nnet_ms_sp_online.tgz
$ tar zxvf tedlium_nnet_ms_sp_online.tgz


5.3.認識実行ディレクトリにて,音声認識用モデルにリンクを貼る

$ cd /opt/kaldi-gstreamer-server

$ ln -s /opt/models/test .


5.4. 環境変数設定

$ export GST_PLUGIN_PATH=/opt/gst-kaldi-nnet2-online/src

毎回入力しないといけないから,起動時に自動で適用されるように,~/.bashrc に書いておいてもいいかもね.


5.5. 起動するか確認

$ gst-inspect-1.0 kaldinnet2onlinedecoder

オプション項目が表示されればOK.


6.音声認識:サーバ起動


6.1. masterサーバ起動(master_server.py)

masterサーバは,音声認識サーバではなく,workerとclientとのリクエストのやり取りを行うサーバです.

$ cd /opt/kaldi-gstreamer-server

$ python kaldigstserver/master_server.py --port=8888 &


6.2.workerサーバ起動(worker.py)

$ cd /opt/kaldi-gstreamer-server

$ python kaldigstserver/worker.py -u ws://localhost:8888/worker/ws/speech -c sample_english_nnet2.yaml &


7.音声認識:クライアント起動


7.1.ファイルからの音声認識

dockerの/opt/models 内にデータをダウンロードした

$ mkdir -p  /opt/models/data

$ cd /opt/models/data
$ wget https://raw.githubusercontent.com/alumae/kaldi-gstreamer-server/master/test/data/bill_gates-TED.mp3
$ wget https://raw.githubusercontent.com/alumae/kaldi-gstreamer-server/master/test/data/bill_gates-TED.txt

音声認識実行

$ cd /opt/kaldi-gstreamer-server

$ python kaldigstserver/client.py -r 8192 test/data/bill_gates-TED.mp3


7.2.マイクからの認識

実行する環境下で,client.pyをダウンロードしてください.

$ wget https://raw.githubusercontent.com/alumae/kaldi-gstreamer-server/master/kaldigstserver/client.py

pythonのバージョンに気をつけること.client.pyは,python2用.python3では動きません.

そして,以下の 7.2.1.〜 7.2.3.の3つの中で,自分の条件に合うものを実行してください.

なお,以下の例は,マイクのデバイス番号[2],サブデバイス番号[0]の場合です.


7.2.1.dockerイメージ内で実行

$ arecord -f S16_LE -r 16000 -D plughw:2,0 | python2 kaldigstserver/client.py -r 32000 -


7.2.2.dockerイメージを起動しているマシンで実行(ホストOS)

$ arecord -f S16_LE -r 16000 -D plughw:2,0 | python2 client.py -u ws://localhost:8888/client/ws/speech -r 32000 -


7.2.3.別マシンから接続

$ arecord -f S16_LE -r 16000 -D plughw:2,0 | python2 client.py -u ws://[ASR SERVER IP]:8888/client/ws/speech -r 32000 -


7.2.4.オプション説明

[arecord]

-D: 録音デバイス指定

[client.py]
-u: サーバ指定


8.参考にしたページ

Kaldi GStreamer server (このページのREADME.mdの通りにやっていく)

https://github.com/alumae/kaldi-gstreamer-server

docker-kaldi-gstreamer-server

https://github.com/jcsilva/docker-kaldi-gstreamer-server

dockerのインストール

https://docs.docker.com/engine/installation/

https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/

kaldiオフィシャルページのオンライン認識


http://kaldi-asr.org/doc/online_decoding.html

aplay -l で「サウンドカードが見つかりません...」と出る場合の対処方法


https://raspberrypi.stackexchange.com/questions/3637/how-to-play-audio-without-being-root-via-sudo