JR6PUE HOME PAGE

Raspberry piで自動アナウンス装置を作成


 三郡山レピータで自動アナウンスを流したいので、どうにかできないかとの問い合わせを受けました。

 この問い合わせに、raspberry pi使用は必須だと思うと同時に、ラズパイにしゃべらせてそれを無線機のマイク端子に
注入すれば音声は流せます。あとは、無線機のPTT制御をうまくやればできそうだとのイメージがわいたので、
少し考えてみますとお返ししました。

1.音声アナウンスの検討

 raspberry piをしゃべらせるのは、google先生に尋ねるといろいろ出てきます。
 ラズパイでよく使われている音声合成ソフトは、open_jtalkというのが使われているようです。
 早速、インストールしてみてしゃべらせてみました。
 よくしゃべってくれますが、若干、外国人が発音するような日本語が気になります。
 ということで、音声合成サイトではどうかと確認するといろいろありました。
 一番使われていると思われる「音読さん」を使用して、同じ文章をしゃべらせてみました。
 やはり、こちらの方がスムーズな日本語です。
 今回は、一方的にアナウンスさせるのが目的なので音声合成サイトで文章を音声合成し、WAVファイルを作って
そのファイルをラズパイ側で利用することにしました。

 使用サイト 音読さん

2.PTT制御

 ラズパイのGPIOを使ってPTT制御を行う回路を考えます。
 パケット通信をやっていたころの回路をイメージして、そんなに難しい回路は必要無いとは思っていましたが
GPIOをON−OFFさせる制御ソフトが必要なので思案していました。

(1)PTT制御回路
 探すと、TNCインターフェース回路がここに紹介されていました。
 RS−232C側のRTSをGPIOでやれば良いということと、RTS側の信号をフォトカプラで
 制御することから5Vの制御が必要になることがわかりました。
 ラズパイのGPIOは、3.3Vが制御信号なので、5Vから3.3Vに変更する回路が必要になります。

 そこで、少し検索してみるとGPIOの5V制御で参考になるHPを見つけることができました。
 そこに参考になるPythonのソフトも紹介されていました。これを少し触れば使えます。ありがたい。

【参考プログラム】
プログラム内容としては「GPIO17」を「3秒間隔」で「ON/OFFを5回繰り返す」ものです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT)

for i in range(5):
   GPIO.output(17, True)
   time.sleep(3)
   GPIO.output(17, False)
   time.sleep(3)
   
GPIO.cleanup()

このプログラムを、後程、修正します。

 次に、部品を集めてブレッドボードで回路を組んでみます。



 試行錯誤の結果、下記の回路が出来上がりました。(簡単な回路ですが、結構、動作させるまでには苦労しました。)


回路図を変更(2023.08.13〜08.26)
 上記回路では、自動アナウンスが終了した後に不定期にPTTだけONとなる現象が発生しました。
 部品不良を疑い、すべて取り換えましたが部品類の不良は無し。
 詳細な原因を解明できませんでしたが、充電電流か何かでフォトカプラが動作しているような感じでした。
 ということで、PTT回路にDC3Vのリレーを入れて自動アナウンス時だけ回路を接続するようにしました。
 定番のオムロンG5V-1を探したのですが無かったので、秋月電子でY14H-1C-3DSを入手しました。
 リレー電源は、GPIO22を使いリレーにDC3Vを供給
 gpioP.pyを作成し、自動アナウンス時だけ60秒間リレーを動作させ、PTT回路を活かすようにしました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(27,GPIO.OUT)

for i in range(1):
   GPIO.output(27, True)
   time.sleep(60)

GPIO.cleanup()



この回路では、動作が不安定になりました。原因は、ラズパイからリレーの動作電源を取ったことから
ぎりぎりの状況で動作していた模様でちょっとした負荷の変化で電流が足りなくなっているようです
そこで、DC5VリレーをUSBから電源を取り使用することにしました。
完全に、PTT回路が切れているはずなのにカーチャンク動作が再発。回路的には、同時にGPIO17と22が
動作しないかぎりありえません。

いろいろ考えてフォトカプラ側の動作電源5VをGPIO端子からとっているのでこれもラズパイのUSB側から
供給するようにしました。トランジスタやリレーの動作電源は、やはりGPIOからは取らないほうが良いようです。
(2023.08.26)



基板に組み込みケースに入れて、接続ケーブル等を作成して完成。
ラズパイのGPIOに接続するのは間違いやすいので、別途、中間地点に接続箇所を作成し同じ色の線をを接続して
間違いをなくすようにしました。


2023.08.26に改造した自動アナウンス装置です。


 GPIOをオンするソフトは、参考になるソフトを必要無いところを削除し、利用させていただきました。
 これを、アナウンスさせる文章の長さ+2秒ほどPTTを1回だけONする時間動作させるgpio.pyという
 ファイルに変更。
 
(例 45秒 PTTをONする設定)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT)

for i in range(1):
   GPIO.output(17, True)
   time.sleep(45)
       
GPIO.cleanup()
 
 あと、それぞれの文章に対応するよう time.sleep(45)の45秒を変更して、
gpio.pyファイル(ファイル名はそれぞれ変更)を作成します。

 作成した回路を手持ちのICOMの無線機のマイク端子と接続し、想定通りにPTTを動作させることを
確認できました。

 GPIOによるPTTの制御時間は、PTTを動作させてから頭切れをなくすために、3秒後に音声を流し、
終了、2秒後にPTTをオフする設定にとしました。
 3秒後に音声を流すのは、音読さん側で設定しています。
 
 音読さんで、間合いを取るために必要なコードはたった2つです。

<speak></speak>
<break time="3s"/>
 これを、読ませたい文章の頭に入れると3秒後から読み始めます。
 文章の切れ間に1秒ほどの間合いを持たせるとより自然なメッセージになりますのでいろいろとお試しください。

3.音声を読み上げる
 ラズパイでWAVファイルを読み上げるのは、alsamixerを使いaplayで読み上げさせます。
 当初、USBタイプのサウンドカードを利用してWAVファイルを読ませてシステムを構築していきましたが
 一定の時刻に自動的に音声を読み上げるのにcronを利用したのですが、crontabで動作させると何故か
 音声が出ないという現象に悩まされました。

 シェルスクリプトでは、ディレクトリーを相対ディレクトリでなく絶対ディレクトリで書いておく方が
 良いとかいろいろ言われていますが、何をやってもダメでした。

 数日、この現象に悩まされていたのですがalsamixerで本体のヘッドフォン端子側に切り替えてやってみると
 難なく動作しています。???
 cronで動作させるときの音声出力は、alsamixerが担当してないのか??よくわからない。
 とりあえず、動作すればいいやということでUSBのサウンドカードは利用せず内臓のヘッドフォン端子を
 利用することでこのトラブルは解決することにしました。音声は、音楽では無いのでほとんど内臓音源回路で
 問題ありません。

4.cronをどう書くか
 自動アナウンスさせる文章を4種類作成。これを、毎正時に切り替えて自動でアナウンスするという方針としました。
 つまり、1番目の文章が0時に読まれると、次は、4時に読まれるということです。
 それぞれ1日に6回のアナウンスが流れるというcronを書くことになります。
 数行できれいに書く方法もあるのでしょうが、確実な動作が一番ということで毎正時ごとにどのファイルを読むという
 ように書くことにしました。全部で48行。プロから見るときれいではないでしょうが、素人は、単純が一番。

crontab -e

# m h  dom mon dow   command
00 0 * * * python /home/dhiro/gpioP.py
00 4 * * * python /home/dhiro/gpioP.py
00 8 * * * python /home/dhiro/gpioP.py
00 12 * * * python /home/dhiro/gpioP.py
00 16 * * * python /home/dhiro/gpioP.py
00 20 * * * python /home/dhiro/gpioP.py
00 0 * * * python /home/dhiro/gpio1.py
00 4 * * * python /home/dhiro/gpio1.py
00 8 * * * python /home/dhiro/gpio1.py
00 12 * * * python /home/dhiro/gpio1.py
00 16 * * * python /home/dhiro/gpio1.py
00 20 * * * python /home/dhiro/gpio1.py
00 0 * * * /home/dhiro/1.sh
00 4 * * * /home/dhiro/1.sh
00 8 * * * /home/dhiro/1.sh
00 12 * * * /home/dhiro/1.sh
00 16 * * * /home/dhiro/1.sh
00 20 * * * /home/dhiro/1.sh

不定期にPTTがONとなる現象を避けるために、crontabにgpioP.pyを追加し
自動アナウンスが動作したときだけPTT回路をリレーで接続するようにしました。(2023.08.13)

以下に、流す文書名に対応するようにcrontab -eに追加しています。
長いので省略。
言うまでもありませんが、全て、実行権はつけてください。

シエルスプリクトは、下記です。
sangun1というWAVファイルを読み上げる1.shシエルスプリクトです。

#!/bin/bash
cd /home/dhiro/ondoku
/usr/bin/aplay ./sangun1.wav

今後、実機での試験を行って実運用に入っていくことになると思います。(^^;

(2022.08.14)

九州総通への福岡三郡山レピータクラブ JG6YDAの付加装置を含めた無線機追加の変更申請も終わり
8月27日(土)22時から自動アナウンスの運用を開始しました。(2022.08.27)