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


最近音声認識研究業界では標準になっている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) <[email protected]>
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