PyQt5でFMラジオ予約録音ソフトをGUI化する

Python

前回の記事でGNURadioを使ったFMラジオ予約録音プログラムでラジオの予約録音を行うことができるようになりました。

しかし、何度か使っていると、毎回コマンドラインから数値入力するのが面倒になってきましたので、PyQt5を使ったGUI入力方式へ改良してみました。

GUI化により格段に操作性が良くなりましたので、今回もソフトウェアパッケージにまとめて配布させていただくことにしました。

最初に苦労話...

最初は、GNURadioで作成したpyソースを組み込み、単一プログラムで完成させる計画としましたが、GNURadioのpyファイル内にイベントループが存在していることが要因でうまく動きません。

何度となくGUIによる入力待ちを組み込むと、二重ループとなるのは異常終了となってしまいます。イベントループができないようにモジュールの実行順を変えたりしてみましたが、どうしてもGNURadioモジュールを動かすと永久ループになるか、エラーで止まってしまいます。

仕方なく、前回製作した予約録音プログラムを呼び出す形に計画を変更し、GUI化することにしました。

使えるUSBチューナーとPC動作環境

本ソフトウェアの動作環境は次の通りです。

  • Windows10 64bit (PC性能はそれほどいりません)
  • USBチューナのドライバーzadigがインストール済み(インストール要領はこちら
  • 動作確認チューナー:RTL2832, RTL-SDR.COM blog V3, HackRF one(firmware 2018.01)
  • ディエンファシスを50usecとしているため日本国内専用でモノラル受信です。

本ソフトウェア単体ではテスト受信が出来ませんので、動かす前にSDRsharp(SDR#)やHDSDRなどの汎用SDRでFMラジオが受信できることを確かめてください。

FMラジオは帯域が広くそれほど周波数精度も求められないので、USBチューナーは安価なものでも十分です。

もし5,000円程度の費用が出せるならRTL-SDR.COMがオススメです。AMラジオや短波ラジオも聞ける上、周波数精度も高いです。

USB2.0 デジタル DVB-T SDR+ DAB+ FM HDTV TVチューナー 受信機 RTL2832U+ R820T2

HackRF oneは玄人向きですが、AMラジオやHF帯の受信もRFアンプが機能し、貧弱なアンテナでも安定して受信することが出来ます。(欠点は起動して安定するのに1分程度の時間が必要なことくらいです)

ソフトの入手とインストール

作成したソフトウェアは、本ページの下部のリンクよりダウンロードしてください。

ダウンロードしたファイルは、ミュージックフォルダなど音楽データ保存に適したフォルダへ移動して、zipファイルを展開します。

展開したファイルの中にある「jfm_rec_02.exe」がGUIプログラム、jfmradio_recorder_01.exeが受信プログラムとなります。

jfm_rec_02とjfmradio_recorder_01はWindows上で動作する単体ソフトウェアですので、PCへインストールする必要はありません。

録音データは、jfmradio_recorder.exeがあるフォルダに自動生成されます。

未圧縮のWAVファイル(CD音質:90分で700MB程度)が生成されますので、長時間の録音をする場合はディスクの空容量には注意してください。

GNURadioライブラリ(GPLv3)を使っている関係から、sourceディレクトリにソースファイル(.pyファイル)を添付していますが、削除しても動作に支障はありません。

ソフトの使い方

基本的な使い方

使い方は、jfm_rec_02.exeをダブルクリックで起動し、ウィンドウ画面から周波数、時刻、曜日、録音時間を設定し、予約するをクリックするだけです。

USBチューナーにHackRF oneを使う場合は、Device Argumentsの「rtl=0」を「hackrf=0」に書き換えると使うことが出来ます。

バッチファイルを起動したらコマンドウィンドウが開きますので、周波数、時刻、曜日、録音時間を入力します。入力した値の確認を確認して、Enterを入力すると、プログラムが実行されて録音待ちになります。

FM Radio Recorder Ver.0.1 Copyright 2021 falconblog.org. All rights reserved.
Recording schedule = Every Saturday 22:43
Dulation Time = 2.0min

予約録音をキャンセルする場合は、起動時に表示されたコマンドプロンプト上からCtrl+cを入力し、jfm_rec_02の動作を強制停止してください。(✕のクリックでは終了できません)

録音開始時刻になるとコマンドプロンプトウィンドウ上にチューナーの動作状態が表示され、録音を始めます。

録音時間が終了するとコマンドウィンドウは自動で閉じ、予約録音プログラムは終了します。

FM Radio Recorder Ver.0.1 Copyright 2021 falconblog.org. All rights reserved.
Recording schedule = Every Saturday 22:43
Dulation Time = 2.0min
gr-osmosdr 0.2.0.0 (0.2.0) gnuradio v3.8.2.0-57-gd71cd177
built-in source types: file rtl rtl_tcp uhd hackrf bladerf airspy airspyhf soapy redpitaya
Using device #0 Realtek RTL2838UHIDIR SN: 00000001
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
[R82XX] PLL not locked!
gr::pagesize: no info; setting pagesize = 4096
Now Recording... Dulation Time = 120
Finish to Recording.

録音終了後、ソフトのあるフォルダを確認すると録音ファイルが生成されています。

ファイル名は周波数、日時、開始時刻が自動で割り振られて保存されますので、重複することは無いと思います。

  • wavファイル記録様式:fm_(周波数)_(日時)_(開始時刻).wav

Wavファイルは容量が大きいので、fre:ac audio converterなどのフリーソフトでmp3形式に変換すれば、どの端末やカーナビでも録音したラジオ放送が聞けるようになります。

複数チャンネルの同時録音も可能

USBチューナーを複数保有している方は、exeファイルを複数起動して同時録音することも出来ます。

ただウィンドウ位置は固定で起動するので少々使いにくいかもしれません。

jfmradio_recorder.exeファイルの使い方

jfmradio_recorder.exeは、コマンドラインより以下の形式で設定します。

> jfmradio_recorder_01.exe <FREQ> <XX:YY> <week:No.> <Dulation:min> <device arg.>

exe以降のオプションは、通常のコマンドライン引数の設定となっていますので、スペースで区切って正しく入力してください。

引数は入れた数をチェックしている簡易なものですので、値を間違って入れると録音時にエラーとなります。

  • FREQ: 周波数をMHzで指定します。(例:80.0)
  • XX:YY : 時刻を09:23の24時間形式で設定します。先頭の0は省略できません。
  • Week No.: 予約する曜日を数字で指定します。(0:月, 1:火, 2:水, 3:木, 4:金, 5:土, 6:日)
  • Dulation:min : 録音する時間を分で指定します。(例:25)
  • device arg.: 受信に使うSDRを指定します。rtl-sdrが1台だけならrtl=0と入力します。(間違っていても受信モジュールosmoSDRが探して受信してくれるようです)

現在の仕様では曜日指定までとしています。

プログラムの変更により平日(weekday)や毎日などの設定も可能ですが、時刻や曜日を扱うプログラムは複雑(10進数ではないから)になりがちですので、ニーズがあれば対応してみようと思います。

既知の課題

本ソフトをGNURadioインストールしていないPCで動作させた場合、以下エラーがでるようです。

録音の基本動作には影響ないようですが、対処法がわかりません。

gr-osmosdr 0.2.0.0 (0.2.0) gnuradio v3.8.2.0-57-gd71cd177
built-in source types: file rtl rtl_tcp uhd hackrf bladerf airspy airspyhf soapy redpitaya
Using device #0 Realtek RTL2838UHIDIR SN: 00000001
Found Fitipower FC0012 tuner
C:\Users\falcon\AppData\Roaming\.gnuradio\prefs\vmcircbuf_default_factory: No such file or directory
gr::pagesize: no info; setting pagesize = 4096
Now Recording... Dulation Time = 60
Finish to Recording.

プログラムの製作について

GUIプログラムは、これまで全くの未経験でしたが、いろいろと調べながら約1週間で完成しました。

pythonのGUIはtinkerがメジャーですが、GNURadioの環境では動かなかったので、GNURadioに標準セットされているPyQt5を使いました。

GNURadioのpyファイルを内包した1ファイル化もやってみたのですが、GNURadioのpyファイル側にイベントループがあるため、GNURadio側の修正が必要で自分の能力で1ファイル化は出来ませんでした。

今後AMラジオのフローも追加して、常用に耐えるラジオ録音ソフトにしていきたいと思います。

ご要望等は本HPのお問い合わせページよりお知らせいただければ幸いです。

ダウンロードはこちら

ダウンロードは下のdownloadをクリックしてください。(68Mbytes程あります。)

※注記)バージョン更新に伴い、ソースファイルのみの公開に変更します。(2022.1)

紹介動画はこちら

Comming Soon!