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で接続します。

```
% ssh USERNAME@jetson.local
```


##作業ディレクトリに移動

```
$ 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
```

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

※ファイルに保存する場合は、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: 
 本日+名詞 は+助詞 晴天+名詞 なる+動詞 

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: 
 本日+名詞 は+助詞 晴天+名詞 なり+助動詞 

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」を使った音声-テキスト変換の方がずっと正確で早いですね。