MENU

NIC BLOG

Voice of the Staff

AIモデル開発試行錯誤(音声認識)【後編】

AIモデル開発試行錯誤(音声認識)【後編】

こんにちは、NEXT事業部の Mr.K です。
今回、AIモデル開発試行錯誤の【後編】となります。

【Linuxサーバの能力の問題】
2台のGPU搭載のLinuxサーバの環境でテスト開発を進めていましたが、所詮、
1台に1つのGPUのため、AIの複雑な集中した確率計算に非常に時間が掛かります。
結果出力は1時間に1回ぐらいが限界のようでした。
問題だったのは、設定したパラメータで学習を進めた結果、認識率が良い方向ではなく
悪い方向に変化することもあり、複数の組合せを試行しながらの実験のようでした

【ローマ字バージョンと、ひらがなバージョンを試行】
サーバが2台あるということで、出力する日本語を2種類テストすることにしました。
出力として「ローマ字」と「ひらがな」です。表示文字数としては、ひらがなの方が
圧倒的に多いため、結果的には、「ローマ字」で進めることにしました。

【ローマ字→日本語変換】
ローマ字で出力された情報を日本語(漢字混じり)に変換する必要があります。
このために日本語形態素変換の「Mecab」が使えないかと調査を開始しました。
Mecabそのものは、以前から使用したことがあり、多少内部的なことも分かっていたので
簡単にできると思っていましたが、これがまた大変でした。。。
そもそも形態素変換って、名詞や動詞に分けるのが目的のため、通常のMecabでは
うまくいかず、Mecabの亜種をサンプル提供しているものを暫定的に使用することに
しました。一応、Mecabの日本語辞書の機能を用いて、日本語変換ができるようになりました

【電子黒板で動作させる】
ここまでいろいろな試行錯誤の末、音声データ(wav)を学習させたAIモデルでローマ字化し
それを日本語化できるようになったため、電子黒板で動作させようと思いました。

ところが、電子黒板は、OSがカスタマイズされた「Android」でした(通常開発言語:Java、kotlin
Linux上のpython3で動かしていたモデルをどのようにして、Android上で動かすのか?
この問題が大きく圧し掛かってきました。
この時点で調査した結果、「kivy + Buildozer」の技術であれば可能そうな情報が
入ってきました。この技術を試行錯誤の末、何とかマスターし、電子黒板に移植しましたが
電子黒板に送るパッケージファイルが莫大に大きく、うまく動作しないことが判明しました
また、電子黒板上でマイク入力をどのように取り込むのか?も大きな課題でした。

また、一から調査です。
偶然、AIのライブラリとして使っていた「Pytorch」が、Androidでも動くことが分かりました。
なんと、Javaで記述されたサンプルプログラムも入手できました。音声入力も可能となった!!
このことにより何とか、電子黒板上でNICモデルを使用したローマ字表示が可能となりました

【Android上での日本語変換】
Linux上では、Mecabの亜種で実現しておりましたが、Android上でMecabをどのように動かすのか?
これがまた大変でした。結果的には、C++でコンパイルできる環境を、電子黒板上に無理やり作成し、
それを用いて、Mecabのソースをコンパイルして、何とか日本語変換を実現しました。
日本語変換は、その後、Mecabの進化系で、Javaに対応している「Kuromoji」で現在実現しています。

【ここにきて最大の問題】
電子黒板上で、マイクから音声入力を行い、NIC日本語モデルを使って、ローマ字変換し、Mecab亜種を
日本語変換できるようになりましたが、とにかく遅い。。。長い時には変換に10秒以上掛かる・・・
Android上のJavaのコードに処理時間Logを追加し、遅い処理を調査したところ、単純にNIC日本語モデル
のAI処理が遅いことが判明。。。ここへ来て、ここかよ。。。

【モデルが、でかいことが問題】
そもそも「Wav2Vec2.0」のベースモデルは、LargeモデルとBaseモデルがあり、最初は何も考えずに
Largeモデル(1.2GByte)を使用して、NICモデルを作成していました。
当然、NICモデルの大きさも、1.2GByte 処理時間は掛かるわなあ。。。

【どうしたら、モデルを小さくできるか】
ここからまたいろいろ調査して、モデルを圧縮できる技術があることを発見。
その技術が「動的量子化」。単純にモデルに1処理を追加するだけで実現できました。
これで、約640MByteまで、圧縮ができたが、、、まだ、遅い。。。

【元のLargeモデルをBaseモデルに変更】
ここで大きな決断。「Wav2Vec2.0」のベースモデルを、Baseモデル(369MByte)に変更する。
学習を最初からやり直し。。。Baseモデル(英語)をベースモデルとして基礎学習から再スタート。
日本語音声データをつかって、外国人を日本人にするようなもの。。。時間が掛かる。。。
これまで行ってきたcommon_voiceを用いた学習を再度行い、NIC日本語モデルを再作成しました。

【ここへ来て、大発見】
なんと、Microsoftが、Onnx(Open Neural Network Exchange)という技術を無償提供していました。
この技術は、機械学習や人工知能のモデルのフォーマットを変換してくれるもの。
上記のモデルを、Onnx化することで、369MByte→302MByte。
更に、動的量子化をすることで、約92MByte まで小さくすることが可能となりました

【この大きさであれば、電子黒板でも動作可能】
約2秒ぐらいの音声であれば、3~4秒ぐらいで表示が可能に。。。

【更に更に、知識蒸留という技術を用いて】
知識蒸留(Distilling kowledge)という技術を用いて、約50MByteまで小さくできることが判明

【現在は、NIC日本語モデルの認識率を上げることに注力】
現在は、いろいろな音声データを用いて追加学習し、NIC日本語モデルの認識率を上げることに
注力しています。(複数のパラメータを変更しながら調整中)
約92MByteのモデルと約50MByteのモデルに対して追加学習を行い、認識率アップを目指しています。

前の投稿 >

カテゴリ

このブログはNIC社員が定期的な(?)更新を行っています。
各担当者は普段の業務の合間をぬってブログの記事を作成していますので、日付順で表示した場合にはいろいろなカテゴリがごちゃまぜで表示されます。
カテゴリ別の表示をしていただくと、ひとつの流れとして読みやすくなると思います。

月別アーカイブ