OpenCCVoice / DVSwitch Bot 操作マニュアル(運用者向け)

概要

このマニュアルは、OpenCCVoice / DVSwitch Bot を運用する方向けの操作マニュアル(逆引き集)です。「こうしたいときは、これを打つ」を素早く引けるよう、各操作を「目的 → コマンド → 確認方法」のセットで記載しています。仕組みの説明は別冊『システム仕様書』を参照してください。

前提条件

本マニュアルは、以下の環境を前提としています。

  • 対象システム:Raspberry Pi OS(Bookworm)+ DVSwitch-Server + デーモン分離版 Bot(V1.73)
  • スクリプト配置:/opt/dvswitch_bot/bin/
  • サービス名:dvswitch-bot(ハイフン)
⚠️ 注意:サービス名は dvswitch-bot(ハイフン)です。dvswitch_bot(アンダースコア)では「could not be found」になります。

まず覚える基本操作

迷ったらこの 4 つです。

状態を見ます。

sudo systemctl status dvswitch-bot --no-pager

再起動します(設定やスクリプトを変えた後)。

sudo systemctl restart dvswitch-bot

ログを流し見します(「Ctrl + C」で抜ける。bot は止まらない)。

sudo journalctl -u dvswitch-bot -f

設定を変えます(対話)。反映は再起動です。

sudo python3 /opt/dvswitch_bot/bin/bot_setup.py
sudo systemctl restart dvswitch-bot

運用フロー(全体像)

「設定を変えたい」「音声を変えたい」など、目的別の作業の流れです。

📝 鉄則:設定やスクリプトを変えたら、必ず再起動して、ログで確認します。

日常操作:起動・停止・状態確認

状態を確認する

sudo systemctl status dvswitch-bot --no-pager

見るポイントは以下のとおりです。

  • Active: active (running)…正常に動いている
  • Active: inactive (dead)…停止している
  • Active: activating (auto-restart)…起動に失敗して再起動を繰り返している(設定不正を疑う。「トラブル対応」へ)

起動・停止・再起動

起動します。

sudo systemctl start dvswitch-bot

停止します。

sudo systemctl stop dvswitch-bot

再起動します(設定変更の反映に使う)。

sudo systemctl restart dvswitch-bot

自動起動(電源投入時に自動で立ち上がる設定)

自動起動を有効化します。

sudo systemctl enable dvswitch-bot

自動起動を無効化します。

sudo systemctl disable dvswitch-bot

現在の設定を確認します(enabled / disabled)。

sudo systemctl is-enabled dvswitch-bot
📝 メモ:初回は sudo systemctl enable --now dvswitch-bot で「自動起動有効化+即起動」を一度に行えます。

ログの見方

常駐中の Bot は画面に出力されず、すべて journal(システムログ)に記録されます。

リアルタイムで流し見する(最もよく使う)

sudo journalctl -u dvswitch-bot -f

-f は「流し続ける」という意味です。カーチャンク応答や時報が出る様子をそのまま眺められます。「Ctrl + C」で抜けます(Bot は止まらず、表示だけ終わる)。

直近のログをまとめて見る

直近 50 行を見ます。

sudo journalctl -u dvswitch-bot -n 50 --no-pager

今日のぶんを見ます。

sudo journalctl -u dvswitch-bot --since today --no-pager

直近 1 時間を見ます。

sudo journalctl -u dvswitch-bot --since "1 hour ago" --no-pager

ログの読み方(よく出るメッセージ)

ログの例意味
Config loaded /opt/dvswitch_bot/bot_config.json設定の読み込み成功
Bot ready — monitoring DMR traffic監視開始(正常起動の合図)
Startup ann ... scheduled in 5.0s起動の約 5 秒後に「起動しました。」を送出(V1.62〜)
Kerchunk detected: <callsign> (0.9s) triggerカーチャンクを検知して応答する
receive:suppressed: <callsign> (... remaining ...)抑制時間中なので応答しない
receive:watchdog pseudo-end: <callsign> (...)SFR 中継等で終端が落ちた送信を擬似終端として救済(V1.67〜)
receive:watchdog ignored (high loss): ...パケットロスが大きすぎる受信は救済しない
Trigger 22:00 time_signal22 時の時報を送出
Trigger 22:30 half_hour_signal22 時 30 分の案内を送出(TIME_SIGNAL_MODE=2 のとき/V1.64〜)
Trigger 001.wav scheduled_message定時メッセージを送出
NightSkip ... time_signal suppressed (night mode)ナイトモードで時報を抑制
NightSkip ... half_hour_signal suppressed (night mode)ナイトモードで 30 分案内を抑制
NightSkip ... scheduled_message suppressed (night mode)ナイトモードで定時メッセージを抑制
Config error ...設定が不正。起動拒否(フェイルセーフ)
TX_GAIN ... フォールバックTX_GAIN の値が不正なので等倍(1.0)で動作(送出は止めない/V1.68〜)

エラーだけ拾う

sudo journalctl -u dvswitch-bot --since today --no-pager | grep -iE "error|!!|fail"

設定変更(受信時間・時刻案内・放送回数・ナイトモード・送出音量)

Bot 本体(dvswitch_bot.py)は編集しません。設定は原則 bot_setup.py で変えます。送出音量 TX_GAINbot_setup.py/ダッシュボードで設定できます(後述)。

現在の設定を確認する

sudo python3 /opt/dvswitch_bot/bin/bot_setup.py -s

設定値の表示と、有効性チェック([OK] か [WARN])が出ます。

設定を変更する(対話)

sudo python3 /opt/dvswitch_bot/bin/bot_setup.py

対話で以下を聞かれます(Enter で現在値を維持)。

項目意味既定範囲
最小受信時間(秒)これ未満の電波は無視0.50 より大
最大受信時間(秒)これ以上は通常交信とみなし応答しない3.9最小 < 最大
放送回数1 時間あたりの定時メッセージ回数2時刻案内モード依存(下表)
ナイトモード(y/n)夜間の時報・定時メッセージ抑制yy / n
N1(開始時)ナイトモード開始時刻220〜23
N2(終了時)ナイトモード終了時刻50〜23

時刻案内モード(TIME_SIGNAL_MODE)— V1.64〜

時報(時刻案内)の頻度を選べます。bot_config.jsonTIME_SIGNAL_MODE で指定します(任意キー。未設定の旧設定は従来動作=モード 1 として扱う)。

モード動作
0時刻案内なし
1毎正時のみ「○○時です」(従来動作)
2毎正時「○○時です」+毎 30 分「○○時 30 分です」

放送回数(ANNOUNCE_FREQ)の有効範囲はモードに依存します(正時 / 30 分は時刻案内が占有するため)。

モード放送回数に指定できる値
00 / 1 / 2 / 3 / 4
10 / 1 / 2 / 3
20 / 2

変更を反映する(必須)

sudo systemctl restart dvswitch-bot
sudo journalctl -u dvswitch-bot -n 25 --no-pager

起動ログで設定が反映されているか確認します。

ナイトモードの動作

放送回数を例えば「2 回(:20, :40)」、N1=22、N2=5 と設定した場合は以下のとおりです。

時刻時報(:00)定時メッセージ(:20, :40)
〜21 時台出す出す
22:00出す(+ナイトモード突入アナウンス)
22:20, 22:40抑制(出さない)
23 時〜翌 5 時台抑制抑制
6:00〜再開再開

ポイントは、N1(22 時)の時報と突入アナウンスは出るが、その後の同じ時間帯の定時メッセージは出さない点です。起動ログでは time_signal : suppress 23-05 / sched_message : suppress 22-05 と表示されます(カーチャンク応答は 24 時間動作し、ナイトモードの影響を受けません)。

📝 メモTIME_SIGNAL_MODE=2(30 分案内あり)の場合、30 分案内は定時メッセージと同じ抑制窓(N1 時〜N2 時)で抑制されます。起動ログに half_hour : suppress 22:30-05:30 のように出ます。

送出音量(TX_GAIN)— 手動設定 / V1.68〜(上級者向け)

bot が送出するすべての音声(カーチャンク ID・時報・30 分案内・起動 / ナイト案内・定時メッセージ 001/002)の音量を、線形倍率 TX_GAIN(1.0=等倍)で一律に調整できます。Analog_Bridge.iniusrpGain と同じ表現で、主用途は減衰(1.0 未満)です。

💡 設定方法TX_GAINbot_config.json の任意キーで、現在は bot_setup.py(対話)とダッシュボード(app.py)の双方で設定でき、保存し直しても消えません。下記の手動 JSON 編集は、ツールを使わず直接調整したいとき向けの代替手段です。

設定手順(手動で JSON を編集)は以下のとおりです。

まず現在の設定を確認します。

cat /opt/dvswitch_bot/bot_config.json

エディタで TX_GAIN を追記します(例:0.7 に減衰)。"TX_GAIN": 0.7 を JSON に 1 行追加します(他のキーと同じ階層)。

sudo nano /opt/dvswitch_bot/bot_config.json

反映します。

sudo systemctl restart dvswitch-bot
sudo journalctl -u dvswitch-bot -n 25 --no-pager | grep -i "TX gain"
  • 有効範囲:0.0 より大きく 5.0 以下。1.0 を超えると増幅(クリップに注意)。
  • 値が不正(数値でない / 0 以下 / 範囲外)でも送出は止めず、等倍(1.0)にフォールバックして警告ログを出します。
  • 起動ログに TX gain : 0.7 (減衰 / vol 効果を全送出に付与) のように表示されます。

音声の変更(固定 WAV・試聴)

コールサインや案内文を変えたいときは、固定 WAV を作り直します。運用を続けたまま(常駐させたまま)作り直せます。

💡 重要:WAV の作り直しに Bot の再起動は不要です。Bot は応答・時報・定時メッセージを送出するたびに WAV ファイルを読み直す設計(起動時にメモリへ抱え込まない)のため、WAV を上書きすれば次の送出から自動的に新しい音声になります。systemctl restart は不要です。

カスタム音声(cstm)に差し替える — V1.73〜

bot が送出する intro(名乗り)・定時メッセージ 001・002 を、自前の WAV に個別に差し替えられます。標準ファイル(fixed_intro.wav001.wav002.wav)はそのまま残し、/opt/dvswitch_bot/ 直下に cstm_intro.wavcstm_001.wavcstm_002.wav8000 Hz・モノラル・16-bit)を置きます。

有効化は 2 通りあります(どちらでも結果は同じです)。

  • ダッシュボード:ブラウザでダッシュボードを開き、「変更モード」→「カスタム音声 — 差し替え」カードで使う項目にチェック →「保存」(自動でサービス再起動・反映)。
  • 対話設定sudo python3 /opt/dvswitch_bot/bin/bot_setup.py で intro/001/002 を個別に選びます。

intro をカスタムにすると、それを使う 3 か所(カーチャンク応答・起動アナウンス・ナイトアナウンスの名乗り)すべてに効きます。時報イントロ time_intro.wav は差し替え対象外です。

💡 安全策(フォールバック):カスタムを ON にしても対応ファイルが無ければ自動的に標準で鳴るため、送出は止まりません。判定は送出のたびに行うので、後からファイルを置けば再起動なしで次回から反映されます(ON/OFF 設定の変更時は再起動が必要です)。

詳しい作成手順・つまずきポイントは GitHub リポジトリの カスタム音声.md を参照してください。

運用途中で固定 WAV を作り直す(対話)

cd /opt/dvswitch_bot/bin
sudo ./create_wav.sh

コールサイン・地名・定時メッセージ 1/2 を対話入力すると、英数字を自動でカナ変換し、/opt/dvswitch_bot/ 直下に WAV を生成(上書き)します(fixed_intro / fixed_outro / time_intro / 001 / 002)。

💡 メモ:上書き前に自動バックアップされます。create_wav.sh は、上書きの直前に既存の *.wav/opt/dvswitch_bot/bak/wav/YYMMDDHHMMSS/ へ自動退避します(dvs_config.sh と同じ作法)。作り直しに失敗しても元へ戻せます(後述)。
⚠️ タイミングの注意(任意):生成(上書き)中に、ちょうど Bot が同じファイルを送出で読むと、まれに音が乱れることがあります。確実を期すなら、閑散時に作業するか、念のため一時停止してから作り直してください。

念のため停止します(任意)。

sudo systemctl stop dvswitch-bot

作り直します。

cd /opt/dvswitch_bot/bin && sudo ./create_wav.sh

作り直し後に再開します。

sudo systemctl start dvswitch-bot

通常は停止せずに作り直しても問題ありませんが、確実にしたいときの手順です。

生成された WAV を確認する

ls -la /opt/dvswitch_bot/*.wav

音声フォーマット(8000 Hz / 1ch / 16-bit)を確認します。

soxi /opt/dvswitch_bot/*.wav

ファイルの更新時刻が今になっていれば、上書きできています。

試聴する(実際に電波に乗せて聞く)

二重送信を避けるため、先に Bot を止めます。

sudo systemctl stop dvswitch-bot
python3 /opt/dvswitch_bot/bin/test_send.py /opt/dvswitch_bot/001.wav
python3 /opt/dvswitch_bot/bin/test_send.py /opt/dvswitch_bot/fixed_intro.wav

確認できたら Bot を戻します。

sudo systemctl start dvswitch-bot
⚠️ 注意:Bot を止めずに test_send.py を実行すると、同じ UDP ポート(51000)に二重送信になり音が崩れます。必ず stop してからテストしてください。

作り直しに失敗した → 元の音声に戻す(復元)

cd /opt/dvswitch_bot/bin
sudo ./create_wav.sh -r

日付フォルダの一覧が出るので、戻したい番号を選びます。復元後は再起動不要で次の送出から反映されます。

古いバックアップをまとめて消したいときは以下を実行します(/opt/dvswitch_bot/bak/wav/ を全削除。確認あり)。

⚠️ 注意:次のコマンドはバックアップ済み WAV を全削除します。実行前に、消して問題ないか確認してください(確認プロンプトが出ます)。
cd /opt/dvswitch_bot/bin
sudo ./create_wav.sh -d

DVSwitch 設定の変更(コールサイン・TGIF・TG)

コールサイン・DMR ID・TGIF パスワード・送信 TG を変えるときは dvs_config.sh を使います。3 つの ini を編集する前に自動でバックアップを取ります。

設定変更(対話)

cd /opt/dvswitch_bot/bin
sudo ./dvs_config.sh

対話入力します(Enter で現状維持)。

項目
CallsignJJ2YYK
DMR ID(7 桁)4402519
ESSID(2 桁)11
TGIF Password(TGIF サイトで発行した値)
送信 TG(txTg)44833

最後に「サービスを再起動しますか?(y/N)」と聞かれます。y で analog_bridge と mmdvm_bridge が再起動され、設定が反映されます。

バックアップから復元する

cd /opt/dvswitch_bot/bin
sudo ./dvs_config.sh -r

古いバックアップを全部消す

⚠️ 注意:次のコマンドはバックアップ済みの ini を全削除します。実行前に、消して問題ないか確認してください。
cd /opt/dvswitch_bot/bin
sudo ./dvs_config.sh -d

スクリプトの更新(GitHub から最新版を反映)

GitHub リポジトリのスクリプトを更新したら、実機にも反映します。

現行をバックアップ

sudo cp /opt/dvswitch_bot/bin/dvswitch_bot.py \
        /opt/dvswitch_bot/bin/dvswitch_bot.py.bak.$(date +%F_%H%M%S)

最新版を取得して上書き

cd /opt/dvswitch_bot/bin
BASE=https://raw.githubusercontent.com/ji2tab/OpenCCVoice-For-DVSwitch/main
curl -fsSL "$BASE/dvswitch_bot.py" -o dvswitch_bot.py
chmod +x dvswitch_bot.py

5 本まとめて取り直すなら以下を実行します。

cd /opt/dvswitch_bot/bin
for f in dvswitch_bot.py bot_setup.py test_send.py create_wav.sh dvs_config.sh; do
  curl -fsSL "$BASE/$f" -o "$f"
done
chmod +x *.py *.sh

バージョンを確認して再起動

人間向けの版表記を確認します。

grep -n "Document Version" /opt/dvswitch_bot/bin/dvswitch_bot.py | head -1

機械可読の固定バージョン行を確認します(V1.69〜。ダッシュボードはこちらを優先参照)。

grep -n '^version' /opt/dvswitch_bot/bin/dvswitch_bot.py | head -1

再起動して確認します。

sudo systemctl restart dvswitch-bot
sudo journalctl -u dvswitch-bot -n 25 --no-pager

起動ログのバージョン表記が更新されていれば反映成功です。

バックアップと復元

設定一式をまとめて保存する

mkdir -p ~/dvswitch_backup && cd ~/dvswitch_backup
sudo cp /opt/Analog_Bridge/Analog_Bridge.ini ./
sudo cp /opt/MMDVM_Bridge/MMDVM_Bridge.ini ./
cp /opt/dvswitch_bot/bin/dvswitch_bot.py ./
cp /opt/dvswitch_bot/bin/bot_setup.py ./
cp /opt/dvswitch_bot/bot_config.json ./
sudo cp /etc/systemd/system/dvswitch-bot.service ./ 2>/dev/null || true
cp /usr/share/hts-voice/mei/mei_normal.htsvoice ./
cd ~ && tar czf dvswitch_backup_$(date +%Y%m%d).tar.gz dvswitch_backup/

できた dvswitch_backup_YYYYMMDD.tar.gz を別の PC やクラウドに保管します。

ini だけ手早く戻す

dvs_config.sh -r(前述)が、ini のバックアップ / 復元には最も簡単です。

SD カードまるごとバックアップ(推奨・別 PC で)

Pi をシャットダウンし、SD を別 PC に挿して実行します。

⚠️ 注意dd は不可逆なコマンドです。of= / if= のデバイス名を取り違えると、書き込み先のディスクを破壊します。fdisk -l で対象デバイス(/dev/sdX)を必ず確認してから実行してください。

デバイス名を確認します。

sudo fdisk -l

SD カードのイメージを取得します(/dev/sdX は確認した実際のデバイス名に置き換える)。

sudo dd if=/dev/sdX of=~/pi_backup_$(date +%Y%m%d).img bs=4M status=progress

イメージを圧縮します。

gzip ~/pi_backup_*.img

トラブル対応(逆引き)

症状原因の候補対処
サービスが見つからない(could not be found)名前の打ち間違いサービス名は dvswitch-bot(ハイフン)。アンダースコアではない
activating (auto-restart) を繰り返す設定不正でフェイルセーフ作動journalctl -u dvswitch-bot -n 30Config error を確認 → bot_setup.py で設定し直す
手動起動で Config error で止まるbot_config.json が無い / 壊れ / 値不正bot_setup.py で作成。-s で検証
音が出ない(無音)md380-emu 停止 or Analog 設定ミスsudo systemctl status md380-emu。停止なら restart
音がプツプツ / ケロケロ一時的負荷一度 restart。頻発するなら CPU 温度・電源を確認
カーチャンクに反応しない抑制時間中 / 受信時間が範囲外ログの suppressed や受信秒数を確認。bot_setup.py で最小 / 最大受信時間を見直す
SFR 中継でカーチャンクに反応しない終端パケット落ちで end が記録されないV1.67 以降に更新。ログに watchdog pseudo-end が出れば救済動作中(watchdog ignored (high loss) ならロス過大で救済対象外)
時報・定時が出ないナイトモード中ログに NightSkip が出ていれば仕様どおり。bot_setup.py -s で確認
30 分案内が出ないTIME_SIGNAL_MODE が 2 でないbot_config.jsonTIME_SIGNAL_MODE を 2 に。放送回数の有効範囲も変わる
起動アナウンスが出ないV1.61 以前V1.62 以降に更新。起動ログのバージョンを確認
定時が夜間も出てしまう旧版(V1.60 以前)の可能性V1.69 へ更新。起動ログのバージョンを確認
TX_GAIN を変えても音量が変わらない設定変更後に再起動していない / 値が範囲外bot_setup.py かダッシュボードで設定し直して再起動。有効範囲は 0.0 超〜5.0 以下。不正値は等倍にフォールバック
カスタム音声にしたのに標準のままファイル名・置き場所が違うls /opt/dvswitch_bot/cstm_*.wav で名前と場所を確認(カスタム音声の節を参照)
ログに「フォールバック」と出るカスタム ON だがファイルが無いファイルを置けば再起動なしで反映される(カスタム音声の節を参照)
test_send で音が崩れるBot と二重送信先に sudo systemctl stop dvswitch-bot してからテスト
音声を作り直したら失敗した読み間違い・変換ミス等sudo ./create_wav.sh -r で前の WAV に戻す
md380-emu が SEGVqemu が新しすぎるqemu-user-static を 5.2 系に固定(apt-mark hold

よく使うコマンド早見表

サービス操作

sudo systemctl status dvswitch-bot --no-pager
sudo systemctl restart dvswitch-bot
sudo systemctl stop dvswitch-bot
sudo systemctl start dvswitch-bot

ログ

sudo journalctl -u dvswitch-bot -f
sudo journalctl -u dvswitch-bot -n 50 --no-pager

設定

sudo python3 /opt/dvswitch_bot/bin/bot_setup.py
sudo python3 /opt/dvswitch_bot/bin/bot_setup.py -s
sudo nano /opt/dvswitch_bot/bot_config.json
sudo systemctl restart dvswitch-bot

音声

cd /opt/dvswitch_bot/bin && sudo ./create_wav.sh
cd /opt/dvswitch_bot/bin && sudo ./create_wav.sh -r
python3 /opt/dvswitch_bot/bin/test_send.py /opt/dvswitch_bot/001.wav

DVSwitch 設定

cd /opt/dvswitch_bot/bin && sudo ./dvs_config.sh
cd /opt/dvswitch_bot/bin && sudo ./dvs_config.sh -r

バージョン確認

grep -n '^version' /opt/dvswitch_bot/bin/dvswitch_bot.py

関連サービス

sudo systemctl status md380-emu --no-pager
sudo systemctl restart analog_bridge mmdvm_bridge md380-emu
📝 OpenCCVoice / DVSwitch Bot 操作マニュアル(運用者向け)
対象:Raspberry Pi OS Bookworm、DVSwitch-Server、デーモン分離版 V1.69
配置:/opt/dvswitch_bot/bin/

📝 執筆:JJ2TAB(尾張旭 DMR デジピーター 管理人)
🏛 JJ2YYK あいちデジタルコミュニケーションハムクラブ

JJ2YYK
  • JJ2YYK

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です