GNURadioでFMラジオ予約録音ソフトをプログラミング

Python

GNURadioを使ってFMラジオの予約録音プログラムを作りましたので紹介します。

作ろうと思ったきっかけは、通勤が電車から自動車に変わって通勤中にラジオを聞くようになり、そのラジオ放送の中で番組の宣伝で聞きたい番組があったので、録音して聞いてみようと思いました。

FM放送番組はネットで事後配信もしているものがほとんどなので、ネットでダウンロードしてSDカードに記録してもいいのですが、せっかくソフトウェア無線(SDR)を持っているので、GNURadioから出力されるpythonコードを編集し、予約録音プログラムの作成を行ってみました。

使用可能なSDRは多彩

このプログラムは、受信ライブラリosmoSDRで動かしていますので、多くのUSBドングルで動作します。筆者はRTL2832, RTL-SDR.COM, HackRF oneを持っていますが、全部動作しました。

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

GNURadioでFMラジオのpyファイルを生成

FMラジオのフローグラフを組む

以前GNURadioのインストールで紹介した記事を参照にFMラジオ受信フローグラフを作成し、OptionsでNo GUI(GUIなし)に設定します。

No GUIにするとGUIの部分がエラーで赤色になるので、一旦ファイル名を変更して保存します。

フローグラフのエラーを修正する

エラーとなった部分のフローグラフを以下の要領で修正します。

  • QT GUI関連はすべてDisableにする
  • QTで数値を可変にした箇所はVariableボックスで再設定するか、直接入力する
  • Sink(出力)はデバッグのためにAudioとWavファイルの2つを接続する

ここでFMラジオの動作確認を行い正常に動作すれば、Audio SinkをDisableに変更します。

pyファイルを生成する

Run→Generateを実行すると、カレント作業フォルダにtop_block.pyというファイルが生成されます。

このpyファイルを元にしてプログラムを進めることにします。

pyファイル単独での動作確認

GNURadio Command Promptを起動し、pyファイルが動作出来るコマンドウィンドウを開けます。

Windowsのコマンドプロンプトではpathが通っておらずpyファイルが動作しませんので注意してください。

コマンドラインでpyファイルを動かして、コマンドラインで動作することを確認します。

ファイル名は、top_block.pyのままだと使いにくいのでリネームしておくと良いでしょう。

> python falcon_fm_recoder.py

これで受信動作をするpyファイルの生成が出来ました。

pyファイル編集して予約録音機能をプログラムする

pyファイルはpythonで記述されていますので、プログラムして次の要素を記述します。

ここからは純粋にPythonプログラムですので詳述はしません。プログラムは、記事末尾に掲載したpyファイルダウンロードして、以下の設計内容と見比べて確認してみてください。

  • ファイル名を録音日時に応じて可変にする
  • scheduleの組み込み
  • 録音時間の設定組み込み
  • 周波数や録音日時の設定入力と値のチェック処理

主な動作は次のパラメータにしています。

  • コマンドラインからの引数で周波数、録音日時、曜日、録音時間、Device Argumentsを設定
  • 録音日は曜日ごとの設定
  • scheduleは5秒毎に現在時刻をチェックし、予約時刻に到達したら受信操作を起動する
  • 受信1回でプログラム終了(毎週録音も出来ますが今回は1回のみの設定)

Pythonにscheduleモジュールをインストール

このpyファイルはpythonのscheduleモジュールを使いましたので別途インストールが必要です。

インストールはGNURadio Command Promptから次の操作で出来ました。

> python -m pip install schedule

scheduleライブラリは月単位を超える設定ができませんが、月単位を超える録音は行わないので必要十分と思います。

pyファイルの動作テスト

作成したpyファイルを動かしてみて、指定時間どおりに受信を開始、終了が行えることを確認します。

.py以降は、各種設定値をスペースで区切って入力し、プログラムに代入する形で設計しました。

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

  • 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が探して受信してくれるようです)
> python fmradio_recorder_202110.py 80.2 21:15 0 1 rtl=0

予約時間になり受信が開始されると、pyファイルがあるカレントフォルダに.wavファイルが生成されます。wavファイル名は、周波数と日時情報を付加して生成していますので、見つけるのも容易です。

生成されたwavファイルを再生して正常に録音できていれば、録音サーバープログラムは完成です。

wavファイルは、48KHzのPCMで記録(CDと同音質)されており、SDカードなどに書き出してカーナビやスマートフォンでそのまま再生が出来ます。

PCからネットワークドライブに出力して持ち出しも容易ですし、mp3形式に圧縮するとより多くのデバイスでも再生できるので色々と便利に使えます。

作成したプログラムはこちら

GNURadio_fmradio_recorder(py_file)

想定以上に便利に使えます

実際に使ってみると、待受時はPCの負荷も殆どありませんし、指定時刻にきちんと録音出来ることに驚きます。複数番組の予約であっても、コマンドプロンプトをたくさん立ち上げて、設定しておけば、順に録音してくれます。

ステレオ録音でないため高音質の音楽は聞けませんが、トーク番組や英会話学習などでは必要十分以上の音質だと思います。

この記事を作成する前にステレオ録音のフローを組んでみましたが、標準のWBFM処理では音声のカットオフ設定が出来ず、音声にどうしてもノイズが乗ってしまうので、独自処理を作る必要があるように思います。

今回はFM放送のみの録音サーバーでしたが、SDRの受信周波数が対応していれば、短波ラジオやAMラジオも同じ要領でフローグラフを組んで予約録音することが出来ます。

またSDRを複数持っていれば、同じプログラムでDevice Argumentsの引数を変えるだけで、複数チャンネルの同時録音も可能となります。

さすがGNURadioとPCだけあって市販のお高い録音ラジオ以上のことができます。

後日、このpyファイルをexe化し、GNURadioがなくても使えるFMラジオサーバーを作ってみたいと思います。