オムロン環境センサ（2JCIE-BU）をラズパイで使ってみた。（５）

今回は、センサーの話はあまりなく、ラズパイで音声合成のメッセージを流すまでの作業の記録です。
最後に、センサーから取得したデータから何らかのメッセージ（温湿度とか熱中症注意のめせーじとか）を流すことを目標としています。

# ラズパイとスピーカー

100円ショップで購入したスピーカーをラズパイに接続しています。
いろいろとあったので最後に追記。

# Audioの設定

```shell-session:
pi@raspberrypi:~ $ sudo raspi-config
```
「1 System Options」を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/2141ca63-ce15-99db-24f0-25686b4e179c.png)|
|:-:|

「S2 Audio」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/c421fbf8-6b42-e563-54fe-880a298b2d4c.png)

「0 Headphones」を選択して、了解をおして設定は終了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/c70a07e7-a645-0d8c-b457-4c9e0e1de7b3.png)

以下のコマンドを実行して音が流れるか確認しましょう。
音は流れたけど、ものすごく音量が小さい...。

```shell-session:
pi@raspberrypi:~ $ aplay /usr/share/sounds/alsa/Front_Center.wav
再生中 WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
```

参考までに

```shell-session:
pi@raspberrypi:~ $ cat /proc/asound/cards
 0 [Headphones     ]: bcm2835_headpho - bcm2835 Headphones
                      bcm2835 Headphones
pi@raspberrypi:~ $ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headphones]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
pi@raspberrypi:~ $ amixer controls
numid=4,iface=MIXER,name='Master Playback Switch'
numid=3,iface=MIXER,name='Master Playback Volume'
numid=2,iface=MIXER,name='Capture Switch'
numid=1,iface=MIXER,name='Capture Volume'
```
# Open JTalkをインストールする

```shell-session:
pi@raspberrypi:~ $ sudo apt install -y open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr5
03-m001
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libhtsengine1
以下のパッケージが新たにインストールされます:
  hts-voice-nitech-jp-atr503-m001 libhtsengine1 open-jtalk open-jtalk-mecab-naist-jdic
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 13 個。
17.0 MB のアーカイブを取得する必要があります。
この操作後に追加で 109 MB のディスク容量が消費されます。
取得:1 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/contrib armhf hts-voice-nitech-jp-atr503-m001 all 1.05-4 [766 kB]
取得:2 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf libhtsengine1 armhf 1.10-3 [39.3 kB]
取得:3 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf open-jtalk armhf 1.11-1 [151 kB]
取得:4 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf open-jtalk-mecab-naist-jdic all 1.11-1 [16.1 MB]
17.0 MB を 9秒 で取得しました (1,923 kB/s)
以前に未選択のパッケージ hts-voice-nitech-jp-atr503-m001 を選択しています。
(データベースを読み込んでいます ... 現在 101969 個のファイルとディレクトリがインストールされています。)
.../hts-voice-nitech-jp-atr503-m001_1.05-4_all.deb を展開する準備をしています ...
hts-voice-nitech-jp-atr503-m001 (1.05-4) を展開しています...
以前に未選択のパッケージ libhtsengine1:armhf を選択しています。
.../libhtsengine1_1.10-3_armhf.deb を展開する準備をしています ...
libhtsengine1:armhf (1.10-3) を展開しています...
以前に未選択のパッケージ open-jtalk を選択しています。
.../open-jtalk_1.11-1_armhf.deb を展開する準備をしています ...
open-jtalk (1.11-1) を展開しています...
以前に未選択のパッケージ open-jtalk-mecab-naist-jdic を選択しています。
.../open-jtalk-mecab-naist-jdic_1.11-1_all.deb を展開する準備をしています ...
open-jtalk-mecab-naist-jdic (1.11-1) を展開しています...
libhtsengine1:armhf (1.10-3) を設定しています ...
hts-voice-nitech-jp-atr503-m001 (1.05-4) を設定しています ...
open-jtalk-mecab-naist-jdic (1.11-1) を設定しています ...
open-jtalk (1.11-1) を設定しています ...
libc-bin (2.28-10+rpt2+rpi1) のトリガを処理しています ...
man-db (2.8.5-2) のトリガを処理しています ...
```
# PythonスクリプトでOpen JTalkを使ってみる

PythonスクリプトからOpen JTalkを使ってみます。

```python:jtalk.py
#coding:utf-8
import subprocess

def open_jtalk(text):
    VOICE_FILE = 'voice.wav'

    command = ['open_jtalk']
    dic = ['-x', '/var/lib/mecab/dic/open-jtalk/naist-jdic']
    voice = ['-m', '/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice']
    speed = ['-r', '1,0']
    output_file = ['-ow', VOICE_FILE]

    c = subprocess.Popen( command+dic+voice+speed+output_file,\
        encoding='UTF-8',\
        stdin=subprocess.PIPE )
    c.stdin.write(text)
    c.stdin.close()
    c.wait()

    command = ['aplay']
    options = ['-q']
    voice_file = [VOICE_FILE]
    subprocess.Popen(command+options+voice_file)

if __name__=='__main__':
    open_jtalk( "こんにちは" );
```

処理としては、

1. open_jtalkを実行してテキストからwavファイルを作る。
2. aplayでwavファイルを再生する。

という簡単なものです。
引数で再生したい文言をopen_jtalk()に渡しています。

上記のスクリプトを実行すると、男性の声で「こんにちは」と再生されます。

```shell-session:
pi@raspberrypi:~ $ python3 jtalk.py
```
# 温度と湿度をしゃべらせる

オムロンの環境センサから取得した温度と湿度を音声で流すようにします。
データベースに登録するスクリプトに上記のjtalk.pyのopen_jtalk()をコピーして、でーたべすの登録のところに以下の2行を追記すると、データベースに登録するときに、現在の温度と湿度を再生するようになります。

```python:
    text = '現在の温度は、' + str(temperature) + '℃です。湿度は、' + str(relative_humidity) + '%です。'
    open_jtalk(text)
```

# おまけ

配線がごちゃごちゃするのが嫌で100円ショップでアンプなしの安いスピーカーを3種ほど用意しました。（新しく買ったのは一番大きい白いので、他は以前購入してmicro:bitなどで使っていたものです）。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/4681f500-2c5d-dc4a-1445-301f621a468b.png)|
|:-:|

3種類ともみごとに音が小さくて、普段使いには難しいな感じました。
一番大きい白いのでやっと聞こえる感じ、他は耳元に持っていくと聞こえるって程度です。
PCなどに繋げると、そこそこの音量で再生されるので、ラズパイの音がもともと小さいのかなと思われます。

ということで、現在は、2代目iPadのスピーカーが壊れて音がならなかったときに購入したELECOMのスピーカーを繋いで音を鳴らしています。
音声出力用にステレオミニプラグ、電源供給用にUSBを繋いでいます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/11102b22-abe9-3f71-5b3f-4aa2259c2be9.png)|
|:-:|

Amazonで見ると4000円弱で売っていますが、もっと安く購入した気がするんだけど思い違いかなぁ。

https://www.amazon.co.jp/dp/B00JH47X14?th=1