Morse Code Toolkit でモールス符号をデコードしてみる

最近は DitDah Apps 向けのソフトウェア部品のネタになるものを探しています。先日、モールス符号のデコードについて調べていると、AI を用いてモールス符号を認識する Morse Code Toolkit というものを見つけました。

github.com

NVIDIA NeMo という会話型 AI モデルを生成できるツールキットを使ってモールス符号を認識するモデルを作るものとのことです。

github.com

リポジトリの中身を見てみると、学習用データを作成するツール、モデルを学習させるためのツール、事前学習された英語とロシア語のモデルなどが含まれています。

今回はこのツールキットを使ってモールス符号のデコードを試してみたいと思います。

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