ThinkPad X121eにインストールしたUbuntu Server 19.10でサウンドを有効にし、現在時刻をしゃべらせてみた。

Bash How To Programming Server ThinkPad Ubuntu X121e

さて、今回環境構築を実施したWEBサーバであるUbuntuServer19.10 ですが、
ハード変更により性能向上したことですし、何かサーバ上でイベントが
発生した際に音声による警告メッセージを出力させてみたいと思います。
その手始めに時刻をしゃべってもらうことにしました。

サウンドカードを確認

そもそもサウンドカードを認識しているのか確認します。

$ lspci | grep -i audio
00:1b.0 Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller (rev 04)
$ cat /proc/asound/cards
 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xd1600000 irq 33
29 [ThinkPadEC     ]: ThinkPad EC - ThinkPad Console Audio Control
                      ThinkPad Console Audio Control at EC reg 0x30, fw unknown

認識しているので以下のAlsa関係のモジュールをインストールします。

音声出力関係のモジュールをインストール

$ sudo apt install alsa-base alsa-utils mpg123 pulseaudio

次にサウンドを利用するユーザを追加し、ここで再起動しておきます。

$ sudo adduser USER_NAME audio
$ sudo reboot

再起動後から、音量調整が可能になります。

$ alsamixer

日本語の合成音声を出力するモジュールをインストール

次にOpenJTalkのモジュールをインストールします。

sudo apt install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

open-jtalkに日本語音声出力を指示するには、読ませたいテキストファイルを音響モデルと辞書を指定した実行結果としてwavファイルが生成される。コマンド実行のサンプルは以下。

open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow sample.wav sample.txt

上記モジュールインストール後の標準音声は男性の声で筆者にはなんだか物足りない。

というかやはり女性に喋ってもらいたいのだ。
女性の音声ファイルは以下のURLで名工大のサンプルが公開されている。今回はそれを使用させていただいた。
http://www.mmdagent.jp/ からexampleファイルをダウンロード。
(※2020年3月20日現在、バージョン1.8が利用可能。)

上記を解凍してできたファイルの中のVoiceフォルダ以下には以下の三つのフォルダがあり、その中にそれぞれ格納されている。
mei(女性)、takumi(男性)、sltがある。

meiは、angry、bashful、happy、normal、sadのそれぞれ若干感情パターンが異なるファイルが用意されている。
Voice以下を次のディレクトリに移動する。

/usr/share/hts-voice/

今回は、時刻をtmpに一度テキストファイルとして書き出し、それを読み取り、ランダムでmeiとtakumiの音声が出力されるものとした。

またオマケでPCのコンセント経由で電力供給されていない場合、オフラインであることを警告するようにした。
以下がサンプルコードである。

OpenJTalk音声時報出力サンプルコード

#!/bin/bash
#
JTALK_PATH1="open_jtalk -m /usr/share/hts-voice/Voice"
JTALK_PATH2="/var/lib/mecab/dic/open-jtalk/naist-jdic"
JIHOU_PATH="/tmp/jihou.txt"
#
if [ "`acpi -a | grep on-line`" ]; then
        echo `date +"%Hじ" && date +"%Mふんです"`> $JIHOU_PATH;
fi
if [ "`acpi -a | grep off-line`" ]; then
        echo `date +"%Hじ" && date +"%Mふんです。バッテリーがオフラインです、至急コンセントを確認してください"`> $JIHOU_PATH;
fi
#
TMP=$($(cd $(dirname $0));pwd)/jsay.wav
#
#VOICE_NO=$1
VOICE_NO=$(($RANDOM % 9))
case $VOICE_NO in
        0) cat $JIHOU_PATH | $JTALK_PATH1/mei/mei_normal.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
        1) cat $JIHOU_PATH | $JTALK_PATH1/mei/mei_happy.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
        2) cat $JIHOU_PATH | $JTALK_PATH1/mei/mei_bashful.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
        3) cat $JIHOU_PATH | $JTALK_PATH1/mei/mei_angry.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
        4) cat $JIHOU_PATH | $JTALK_PATH1/mei/mei_sad.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
        5) cat $JIHOU_PATH | $JTALK_PATH1/takumi/takumi_happy.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
        6) cat $JIHOU_PATH | $JTALK_PATH1/takumi/takumi_normal.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
        7) cat $JIHOU_PATH | $JTALK_PATH1/takumi/takumi_sad.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
        8) cat $JIHOU_PATH | $JTALK_PATH1/takumi/takumi_angry.htsvoice -x $JTALK_PATH2 -ow $TMP && aplay --quiet $TMP
                ;;
esac
rm -f $TMP