接続局読み上げ

自ノード(53197) に接続している局名を読み上げる。←これは内部コマンドです。
【概要】
AllStarLinkは、自ノードに直接接続しているノードがたとえ1つでも、そのノードが複数のノードと接続している場合は
その接続局リストも自ノードまでノード番号が流れてくる仕組みになっているので、そのリストを出力して
そのリスト(ノード番号)から/var/lib/asterisk/astdb.txtを利用してコールサインを抽出して読み上げる。

  1. OS 環境のLANGを変更しておく。
     英語で正確に読み上げるために、OS環境を LANG=en_GB.UTF-8 になるように以下の手順で変更しておく。

    # イギリス英語のロケールを生成

    sudo locale-gen en_GB.UTF-8
    
    # システムのデフォルトロケールを en_GB.UTF-8 に設定
    sudo localectl set-locale LANG=en_GB.UTF-8
    
    # 設定を反映させるために一度ログアウトするか、以下のコマンドを実行
    source /etc/default/locale
     以下のコマンドを打ち、LANG=en_GB.UTF-8 と表示されればOK。
    locale | grep LANG=
     
  1. list_links.sh
    $ sudo nano /etc/asterisk/scripts/list_links.sh

    #!/bin/bash

    TARGET_NODE="53197"
    AST_DB="/var/lib/asterisk/astdb.txt"
    
    # 1. 接続リストの抽出(Tから始まる行を特定)
    RAW_NODES=$(asterisk -rx "rpt nodes $TARGET_NODE" | grep "T[0-9]")
    # 2. カンマをスペースに変え、単語の頭(\b)にあるTだけを削除(JH1BLTのTは残る)
    LINKED_NODES=$(echo "$RAW_NODES" | sed 's/,/ /g' | sed 's/\bT//g')
    
    declare -A SEEN_CALLS
    CALL_LIST=()
    
    for NODE in $LINKED_NODES
    do
       [ "$NODE" == "$TARGET_NODE" ] && continue
       if [[ "$NODE" =~ ^[0-9]+$ ]]; then
           [ "$NODE" -le 2000 ] && continue
       fi
    
       CALLSIGN=$(grep "^${NODE}|" "$AST_DB" | cut -d'|' -f2)
       [ -z "$CALLSIGN" ] && CALLSIGN="$NODE"
    
       if [ -z "${SEEN_CALLS[$CALLSIGN]}" ]; then
           CALL_LIST+=("$CALLSIGN")
           SEEN_CALLS[$CALLSIGN]=1
       fi
    done
     
    TOTAL_COUNT=${#CALL_LIST[@]}
    
    if [ "$TOTAL_COUNT" -eq 0 ]; then
       asl-tts -n "$TARGET_NODE" -t "No links."
    else
       # 全体の件数を通知
       asl-tts -n "$TARGET_NODE" -t "$TOTAL_COUNT stations linked."
       sleep 0.4
    
       for CALL in "${CALL_LIST[@]}"
       do
           # Aを「エイ」、Cを「スィー」と英語らしく読ませる工夫:
           # 1文字ずつ分解してハイフンで繋ぐ(例: J-A-2-C-C-V)
           SPACED_CALL=$(echo "$CALL" | tr '[:lower:]' '[:upper:]' | sed 's/[A-Z0-9]/&- /g' | sed 's/- $//')
    
           echo "Announcing: $CALL"
           # オプションを標準(-n と -t のみ)に修正
           asl-tts -n "$TARGET_NODE" -t "$SPACED_CALL"
           sleep 0.4
       done
    fi
    
    TOTAL_COUNT=${#CALL_LIST[@]}
    
    # 3. 音声アナウンス開始
    if [ "$TOTAL_COUNT" -eq 0 ]; then
        asl-tts -n "$TARGET_NODE" -t "No links."
    else
       # 冒頭文を短くしてテンポアップ
       asl-tts -n "$TARGET_NODE" -t "$TOTAL_COUNT stations linked."
    
       # 待ち時間をさらに短縮 (0.8 -> 0.4)
       sleep 0.4
    
       for CALL in "${CALL_LIST[@]}"
       do
           # 【改良】カンマを消して「スペースのみ」に。これでポーズが最小限になります。
           SPACED_CALL=$(echo "$CALL" | tr '[:lower:]' '[:upper:]' | sed 's/./& /g')
    
           echo "Announcing: $CALL"
           # 標準オプションのみ使用
           asl-tts -n "$TARGET_NODE" -t "$SPACED_CALL"
    
           # 次の局までの待ち時間を最短に (0.8 -> 0.4)
           sleep 0.4
       done
    fi
     なお、list_links.sh はchmod 755 list_links.sh として実行権を与えておいてください。
     
  2. list_links.sh をDTMF で実行
    /etc/asterisk/rpt.conの[functions] に以下のように追加する。
    [functions]
    ;;;;;;;;;;;;;;;;;;; functions stanza ;;;;;;;;;;;;;;;;;;;
    ; Prefix    Functions
    ; *1        Disconnect Link
    ; *2        Monitor Link
    83 = cmd,/etc/asterisk/scripts/list_links.sh
     
  3. DTMFの実行
     *83 でノード内に現在の接続ノード数とコールサインを読み上げる。
      サンプル:file53197.mp3

    URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White


リロード   新規 下位ページ作成 凍結解除 差分 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS