特別寄稿
2024年10月1日掲載
AIが『中の人』を務める自動応答局のイメージ
AI技術を活用して、D-STARの自動応答局を構築しました。従来の自動応答システムとは異なり、AIがリアルタイムで交信相手の状況や文脈を判断し、より自然かつスムーズな応答を実現します。本記事では、このシステムの仕組みや実装プロセス、実際の使用例を紹介し、アマチュア無線の新たな可能性を探ります。
自動応答局の動作の様子は、以下の動画をご参照ください。
動画1 動画2 動画3
D-STAR(Digital Smart Technologies for Amateur Radio)は、JARL(日本アマチュア無線連盟)が開発したデジタル通信方式を利用するアマチュア無線のシステムです。D-STARは、デジタル通信方式を利用して遠距離の無線局とも交信できる特徴があり、インターネット経由で世界中の局と通信することが可能です。
自動応答局は、他の局からの呼び出しを受信した際、その局に対して自動的にメッセージを応答するものです。アイコムならやまハムクラブのJK3ZNB Fが有名です。
D-STARの自動応答局(Auto Reply Station)を構成するには、以下のステップに従います。
1. 必要な機器とソフトウェアの準備
今回構築したD-STAR AI自動応答局の構成図を図1に示します。
図1 D-STAR AI自動応答局の構成図
2. 無線機の設定
無線機には以下の設定が必要です。
図2 無線機をターミナルモードにする
図3 変調入力の設定
この設定はCI-Vコマンドでも可能ですが、ユーザーが設定を元に戻す方法を理解できるように、あえて手動で設定する方法を選択しています。
3. コールサインの登録
D-STARを使うためには、JARL管理サーバーにコールサインを登録する必要があります。D-STARのWebサイトからユーザー登録をしてください。ここで登録されたコールサインがD-STARネットワーク上での識別子として使用されます。
プログラムの開発には、Windows 10 Pro 64bit 22H2、Python 3.9.13を使用しました。プログラム内で PyAudio, PySerial, Pydub, OpenAIなどのライブラリを使用しますので、実行する環境で不足しているものはpipを使用して適宜インストールします。また、オーディオの処理にffmpegが必要ですので、インストールしてそのbinフォルダにPATHを通します。
AI関連のAPIの利用には、若干の費用とOpenAI社のAPI Keyが必要です。OpenAIのアカウントを開設し、トークンをチャージしてAPI Keyを入手しておきます。API Keyは環境変数[OPENAI_API_KEY]に登録します。
実行環境の構築に関する詳細手順については、2024年7月1日掲載の「AIによる音声認識で交信内容をテキスト化しよう!」の記事をご覧ください。
プログラムは以下の3つのファイルで構成されています。
dstar_comm.pyとopenai_function.pyは、dstar_auto_ai_replyer.pyから呼び出されます。また、図4のように、本体プログラムと同じフォルダにユーザー環境設定ファイルsettings.jsonとdataフォルダを配置します。
図4 プログラムのファイル構成
settings.jsonで以下の項目を設定します。
"input_device_idx"は録音デバイスの番号です。PC環境により異なりますので、look_for_audio_input.pyで調べます。調べる方法は、「AIによる音声認識で交信内容をテキスト化しよう!」の記事で説明しています。
"comport"はCOMポートの番号です。PC環境により異なりますので、デバイスマネージャー等で調べます。詳しくは、USBドライバーインストールガイド(IC-9700, IC-705)をご参照ください。
"callsign_pronuc"は、自局のコールサインの読み方を指定する項目です。例えば、7M4MONを『ナナ エム ヨン モン』のように読んでしまう場合があるため、その発音を指定します。
作成した自動応答局のプログラムのフローチャートを図5に示します。
1~4については「AIによる音声認識で交信内容をテキスト化しよう!」の記事を、5については「生成AIを相手にしてCWの交信練習をしてみよう!」の記事をご参照ください。
なお、5のChatGPTに対するシステムプロンプトは["あなたは"+ mycallsign +"というアマチュア無線局です。アマチュア無線の交信相手として140字以内で応答しなさい。"]と指定しました。メッセージが長すぎると音声合成に時間がかかるため、140字以内に制限しました。
音声合成には、OpenAI社の‘tts-1’モデルを使用しました。‘tts-1’モデルはリアルタイムでの利用に最適化されており、今回のようなスピードが重要なアプリケーションに向いています。
声質は、"alloy", "echo", "fable", "onyx", "nova", "shimmer"の6つから選ぶことが出来ます。今回はランダムで声質を選択することにしました。使い方は、wisperやchatと同様で、clientを作成して、モデルと声質と合成する内容をAPIに渡します。しばらくすると、streamのresponseが返ってくるので、stream_to_fileでファイルに保存します。無線機を送信状態したらこのファイルを再生します。もし、無音が送信された場合は、再生先のデバイスが無線機のUSB Audioになっていることを確認してください。
「AIによる音声認識で交信内容をテキスト化しよう!」の記事では、シリアルポートのCTSとDSRを使って受信状態を判別していましたが、今回のアプリケーションでは、CI-Vコマンドを使用して無線機の状態取得と制御を行います。無線機には様々なコマンドが用意されていますが、今回使用するのは、'1C', '1F', '20' コマンドの3種類です。コマンド表を図6に示します。
CI-Vコマンドのフォーマットやその他の詳細についてはIC-705の補足説明書(CI-Vコマンド説明)もしくはIC-9700の補足説明書をご参照ください。
なお、[CI-V USBエコーバック]の設定によってバイト配列上で目的のデータの位置が変わるため、正攻法でコマンドを解析してデータを取り出した方が良いでしょう。
・受信状態を取得する
「DV受信ステータスの読み込み」は[20 02 02]コマンドです。これを10ms間隔でポーリングして状態を取得します。DV受信ステータスデータの詳細を図7に示します。
図7 DV受信ステータスデータの詳細
音声受信中はステータスが‘50'になります。よって、ステータスが‘50'になったら録音を開始し、他のステータスになったら録音を停止します。
・呼び出し元のコールサインを取得して宛先にセットする
自動応答局を構成するためには、呼び出し元のコールサインを宛先にセットする必要があります。「DV受信コールサインの読み込み」は[20 00 02]コマンドです。これを受信終了後に無線機に送信すると、CALLERのコールサインが含まれた、図8の応答を得ます。
CALLERのコールサインは、3バイト目から10バイト目にありますので、その8文字を取り出します。
取り出したコールサインを宛先のコールサインにセットするには、[1F 01]コマンドを図9のとおりに使用します。
図9 DV送信コールサイン表示データの詳細
・無線機を送信状態にする
送受信の切り替え設定コマンドは、[1C 00]コマンドです。送信開始時に[01]をセットし、送信終了時に[00]をセットします。
今回構築した自動応答局「JM1ZLK F」をしばらく公開していますので、「JM1ZLK F」を呼び出してみてください。なお、ソースコードはGitHubに公開しています。機能追加や改善に関するプルリクエストはいつでも歓迎しています!
AIを利用した自動応答システムを構築するプロジェクトに取り組み、多くの学びと新しい発見がありました。特に、AIの自然言語処理能力が想像以上に高く、交信の内容に応じて迅速かつ的確に返答できることに驚かされました。一方で、期待していた通りに機能しないケースや、予期せぬ応答をする場面もありました。狭帯域デジタル無線通信システムではボコーダー処理による音質の劣化は避けがたく、正しく文字起こしされないケースが散見されました。また、日本語は漢字変換や文法的な要素が複雑なので、誤変換や誤読によるミスコミュニケーションが発生しやすいようです。
OpenAI社が巨額の赤字を抱えながらも、ユーザーに極めて安価で革新的なサービスを提供してくれることに心から感謝しています。これからもAI技術がさらに発展し、より多くの人々の役に立つことを期待しています。
アマチュア無線関連機関/団体
各総合通信局/総合通信事務所
アマチュア無線機器メーカー(JAIA会員)
©2024 月刊FBニュース編集部 All Rights Reserved.