最近は DitDah Apps 向けのソフトウェア部品のネタになるものを探しています。先日、モールス符号のデコードについて調べていると、AI を用いてモールス符号を認識する Morse Code Toolkit というものを見つけました。
NVIDIA NeMo という会話型 AI モデルを生成できるツールキットを使ってモールス符号を認識するモデルを作るものとのことです。
リポジトリの中身を見てみると、学習用データを作成するツール、モデルを学習させるためのツール、事前学習された英語とロシア語のモデルなどが含まれています。
今回はこのツールキットを使ってモールス符号のデコードを試してみたいと思います。
Google Colaboratory で新しいノートブックを作成し、Morse Code Toolkit リポジトリをクローンします。
!git clone https://github.com/1-800-BAD-CODE/morsecodetoolkit
Morse Code Toolkit にある手順ではライブラリの依存関係がうまく解決できなかったので、 NeMo の README を参考に nemo-toolkit をインストールします。
!apt-get update && apt-get install -y libsndfile1 ffmpeg !pip install Cython !pip install nemo_toolkit['all']
次に Morse Code Toolkit をセットアップします。
%cd /content/morsecodetoolkit !python setup.py develop
セットアップがうまくできているか確認するためにモールス符号の音声を認識させてみます。はじめにモールス符号の音声ファイルを作成します。
!mct-text-to-morse "HELLO WORLD" hello-world.wav
ダウンロードして聞いてみると、マークとスペースの長さに揺らぎがあるような気がします。次のように作成した音声ファイルのメルスペクトログラムの画像を生成することもできます。
!python scripts/extract_spectrogram.py hello-world.wav hello-world.png
事前学習されたモデルを使ってデコードしてみます。
!mct-morse-to-text pretrained/english/quartznet10x5.nemo hello-world.wav
次のようにデコードされました。
...(省略)... [05:03:01] INFO : Successfully loaded model 'pretrained/english/quartznet10x5.nemo' [05:03:01] INFO : Transcribing 'hello-world.wav' Transcribing: 100% 1/1 [00:00<00:00, 11.91it/s] [05:03:01] INFO : Transcription: 'HELLO WORLD'
英語のテキストで学習したモデルでモールス通信の電文がデコードできるのか試してみます。「CQ CQ CQ DE JI1JDI JI1JDI K」をデコードしてみます。音声ファイルとメルスペクトログラムを生成します。
!mct-text-to-morse "CQ CQ CQ DE JI1JDI JI1JDI K" cq-de-ji1jdi.wav !python scripts/extract_spectrogram.py cq-de-ji1jdi.wav cq-de-ji1jdi.png
デコードしてみます。
...(省略)... [05:13:25] INFO : Successfully loaded model 'pretrained/english/quartznet10x5.nemo' [05:13:25] INFO : Transcribing 'cq-de-ji1jdi.wav' Transcribing: 100% 1/1 [00:00<00:00, 6.39it/s] [05:13:25] INFO : Transcription: 'CQ CQ CQ DE JIJJDI JIJJDI K'
プリフィックスが「JIJ」になってしまいました。CW 交信のテキストを使ってファインチューニングしたり、一から学習モデルを作成してみたり、もう少し深層学習を学んでから試してみたいと思います。
JI1JDI
ゆるく楽しくアマチュア無線とプログラミングを楽しんでいます。 scrapbox.io