時報に「当地の天気」を追加 — OpenCCVoice for DVSwitch JTW版を公開
OpenCCVoice for DVSwitch に、毎正時の時報に続けて当地の天気を自動で読み上げる機能を実装しました。JT版(Open JTalk / Raspberry Pi 系)から派生した JTW版 として公開しています。
正時になると、こんなアナウンスが流れます。
「こちらは、ジェイジェイツーワイワイケー。19時です。続いて当地の天気は、快晴、気温は29度です」
ソース一式は GitHub で公開しています。本記事ではポイントだけ紹介しますので、コードの詳細はリポジトリを参照してください。
- リポジトリ: ji2tab/OpenCCVoice-For-DVSwitch
- JTW版フォルダ:
ocv_dvs_jtw/(bot 本体・設定ツール・JTW版完全マニュアルを同梱)
仕組み — 「正時の正確さ」を最優先した事前生成方式
天気は Open-Meteo の現況 API から取得します。API キー不要・追加ライブラリのインストール不要(Python 標準の urllib のみ)なので、Raspberry Pi の既存ノードにもファイルを置き換えるだけで導入できます。
工夫したのは読み上げのタイミングです。時報は「正時ちょうどに鳴る」ことが命ですが、Raspberry Pi 上の Open JTalk は合成に 1.5 秒以上かかり、天気込みの長文ではさらに延びます。正時に合成を始めたのでは間に合いません。
そこで正時の2分前に天気を取得し、その場でイントロ込みの「1本もの」音声を事前生成しておき、正時は完成済みの WAV を再生するだけ、という構成にしました。
正時2分前 Open-Meteo から天気コード+気温を取得
↓ 「こちらは、〜。N時です。続いて当地の天気は、…」を
1本の WAV として事前生成(RAM ディスク上)
正時発火 完成 WAV を再生するだけ(合成ゼロ=遅延ゼロ)→ 送出後に破棄
時報を絶対に落とさないよう、フォールバックは三段構えです。
- 事前生成 WAV があれば → 即送出
- WAV は無いが天気テキストは取得済み → その場で天気付きを合成
- 取得も失敗 → 従来どおり「N時です」のみ(天気だけ黙って省略)
回線断や API 側の障害があっても、時報そのものは必ず定刻に流れます。
設定
bot_config.json に任意キーを4つ追加しました。未設定なら完全に従来動作(天気 OFF)です。
| キー | 内容 |
|---|---|
WEATHER_ENABLED | 天気読み上げの有効/無効 |
WEATHER_LATITUDE / WEATHER_LONGITUDE | 取得座標 |
WEATHER_HOURS | 天気を読む正時の配列(例 [7,12,18]。省略で全時刻) |
設定ツール bot_setup.py(JTW版)の対話で設定でき、座標が未設定の場合は MMDVM_Bridge.ini の [Info] Latitude/Longitude を初期値として提示します(DVSwitch 配布 ini のプレースホルダ座標は除外する、という小細工入りです)。
導入手順は同フォルダの「OpenCCVoice 構築導入設定 完全マニュアル(JTW版)」にまとめてあります。
実波テストの結果
当局の UHF ノード(TGIF TG44833)で終日運用し、毎正時の連続動作を確認しました。ログはこんな具合です。
18:58:02 Weather 19:00 取得OK code=0 temp=29.4 → 「続いて当地の天気は、快晴、気温は29度です」 18:58:03 Weather prebuilt 19:00 用の音声を事前生成OK(正時は再生のみ) 19:00:05 TimeSignal 19:00 11.8s (prebuilt)
取得から事前生成完了まで実測 0.7〜1.0 秒。2分のリードに対して余裕は十分で、より非力な Raspberry Pi Zero 系でも問題なく収まる見込みです。気温も 31℃ → 32℃ → 33℃ と1時間ごとに正しく更新されており、毎回きちんと新しい現況を取りに行っていることが確認できました。
おまけ — 「途中で切れる」怪現象の正体
実はテスト中、「時刻が流れたあと電波が一度切れ、天気が頭切れで流れてくる」という現象に悩まされました。音声ファイルを解析し、送出経路を単体テストし……とさんざん切り分けた結果、bot にも音声にも一切問題はありませんでした。
正体は、同じ TG に向けて時報を出していた別の自局ノードとの正時同時送信。両ノードはコンマ2秒差でキーアップしており、TGIF が先着の短い時報を通し、それが終わった時点でまだ送信中だった天気付き時報(4.6 秒長い)へ途中から切り替えていたのです。同じコールサイン・同じ合成音声なので、1本の送信が切れたようにしか聞こえませんでした。
従来は全ノードの時報がほぼ同じ長さで完全に重なっていたため無害でしたが、1ノードだけ送信が長くなったことで「はみ出した後半」が初めて可聴化した、というわけです。複数ノードを同一 TG で運用している方は、定時送信の重複にご注意を。当局は時報担当を1ノードに絞って解決しました。
まとめ
- JT版の安定運用はそのまま、JTW版で天気読み上げを追加
- API キー・追加インストール不要、設定4キーで有効化
- 事前生成方式により、時報の正確さは従来と同一
- ソース・マニュアルは GitHub の
ocv_dvs_jtw/にすべて公開
質問・不具合報告は GitHub の Issue か、お空でお会いしたときにどうぞ。73!
🏛 JJ2YYK あいちデジタルコミュニケーションハムクラブ