Jetsonで日本語の音声認識【2021年版】


はじめに

Jetson Nano + Juliusで日本語の音声認識をやってみました。
メモを書き留めていたので、少し整理して書いてみます。
実用レベルでできることを期待。

必要な機器

・Jetson nano(ubuntu 18.04.6 LTS (Bionic Beaver))
・USBマイク(Jetson nanoに接続)
・USB Wi-Fiドングル(同上)
・Mac(ssh用)
・Wi-Fiルーター

必要なソフトウェア環境

・Julius(https://julius.osdn.jp/)

導入作業

MacのターミナルからJetson nanoへsshで接続します。

作業ディレクトリに移動

$ cd ~
$ mkdir julius
$ cd julius

ライブラリ類をインストール

$ sudo apt install build-essential zlib1g-dev libsdl2-dev libasound2-dev git-lfs

Juliusをダウンロード

$ git clone https://github.com/julius-speech/julius.git

Julius Japanese Dictation-kitのインストール

$ git lfs install
$ git clone https://github.com/julius-speech/dictation-kit.git

下記の2つのファイルをブラウザ等でダウンロードして、対象ディレクトリの同名ファイルに上書きします。

※ファイルに保存する場合は、UTF-8(BOM無し)で、改行はLFのみのUNIX形式にしておきます。

config.guess

https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess

config.sub

https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub

config.guessを各ディレクトリへコピーします。

$ sudo cp config.guess ~/julius/adintool/
$ sudo cp config.guess ~/julius/jcontrol/
$ sudo cp config.guess ~/julius/support/
$ sudo cp config.guess ~/julius/msvc/Library_PortAudio/src/
$ sudo cp config.guess ~/julius/msvc/Library_PortAudio/src/bindings/cpp/build/gnu/

config.subを各ディレクトリへコピーします。

$ sudo cp config.sub ~/julius/adintool/
$ sudo cp config.sub ~/julius/jcontrol/
$ sudo cp config.sub ~/julius/support/
$ sudo cp config.sub ~/julius/msvc/Library_PortAudio/src/
$ sudo cp config.sub ~/julius/msvc/Library_PortAudio/src/bindings/cpp/build/gnu/

Juliusインストール

$ cd ~/julius
$ env CC=/usr/local/cuda-10.2/bin/nvcc CFLAGS=-O3 ./configure --enable-words-int
$ make -j4
$ ls -l julius/julius

マイク番号を確認

$ arecord -l

.profileを新規作成

$ sudo vi .profile
".profile"
export ALSADEV="plughw:2,0"
source .profile

Juliusを実行

$ ~/julius/julius/julius -C ~/julius/dictation-kit/main.jconf -C ~/julius/dictation-kit/am-gmm.jconf -nostrip

シェルスクリプトを作成

julius.sh
#!/bin/bash
source .profile
~/julius/julius/julius -C ~/julius/dictation-kit/main.jconf -C ~/julius/dictation-kit/am-gmm.jconf -nostrip

実行権限を付与

sudo chmod u+x julius.sh

実行

$ ./julius.sh

実行すると以下のような入力待ちの画面になります。

### read waveform input
Stat: adin_alsa: device name from ALSADEV: "plughw:2,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Stat: "plughw:2,0": Device [USB PnP Sound Device] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>

「本日は晴天なり」とマイクに向かって発話すると

pass1_best:  本日 は 晴天 なる 。
pass1_best_wordseq: <s> 本日+名詞 は+助詞 晴天+名詞 なる+動詞 </s>
pass1_best_phonemeseq: silB | h o N j i ts u | w a | s e: t e N | n a r u | silE
pass1_best_score: -4696.621094
### Recognition: 2nd pass (RL heuristic best-first)
STAT: 00 _default: 14092 generated, 1645 pushed, 237 nodes popped in 190
sentence1:  本日 は 晴天 なり 。
wseq1: <s> 本日+名詞 は+助詞 晴天+名詞 なり+助動詞 </s>
phseq1: silB | h o N j i ts u | w a | s e: t e N | n a r i | silE
cmscore1: 0.606 0.981 0.638 0.418 0.158 1.000
score1: -4666.019043

<<< please speak >>>

となりました。

おわりに

個人的な感想ですが、ブラウザの「Web Speech API」を使った音声-テキスト変換の方がずっと正確で早いですね。