RaspberryPiで音声合成Open JTalk版

screencapture-open-jtalk-sourceforge-net-1485741270374RaspberryPiとOpen JTalkを使って音声合成を行う。

インストール~女性の声セットまで

$ sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
$ wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
$ unzip MMDAgent_Example-1.7.zip
$ sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice

 

しゃべるスクリプト

jtalk.sh

#!/bin/bash
tempfile=`tempfile`
option="-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
 -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
 -ow $tempfile"

echo "$1" | open_jtalk $option
aplay -q $tempfile
rm $tempfile

chmod 755 jtalk.sh

$ jtalk.sh こんにちは

んんAquestalkに比べてしゃべり出すまでに時間がかかります。

ファイルを指定してしゃべってもらう

 

$ jtalk.sh `cat 004_union.txt`

バッククオートで囲む

BOSCH製センサBME280と組み合わせて使う

Aquestalkとほぼ同じ。

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

#BME280の観測データをしゃべらせるOpenJtalkVer
#2017/01/13

import RPi.GPIO as GPIO
from time import sleep

#SHELLの取り込みを可能にする
import subprocess as proc

import datetime

# BCMで初期化=GPIOばんごうを用いる
GPIO.setmode(GPIO.BCM)

#プルアップに設定
GPIO.setup(24,GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    while True:
         if GPIO.input(24) == GPIO.LOW:
             #print "switch on"
             print "============================================"

             #現在時刻の取得
             dt=datetime.datetime.now()

             #時刻をファイルにWrite
             f = open("/usr/local/bin/001_datetime.txt", "w")
             tstr=dt.strftime("%H時%M分%S秒です。温度は")
             f.write(tstr)
             f.close()
             print dt
             #PythonからSHELLの呼び出し
             #BME280温度を取得し002_temp.txtに書き込み
             proc.call("/usr/local/bin/getBME -t | sed s/C//g > /usr/local/bin/002_temp.txt", shell=True)
             proc.call("/usr/local/bin/getBME -h | sed s/%//g > /usr/local/bin/002_humd.txt", shell=True)
             #proc.call("/usr/local/bin/getBME -p | sed s/Pa//g > /usr/local/bin/002_pres.txt", shell=True)
             proc.call("echo \(`/usr/local/bin/getBME -p | sed s/Pa//g`\) / 100 | bc > /usr/local/bin/002_pres.txt", shell=True)

             #単位付け
             proc.call("echo '度。湿度は、' >> /usr/local/bin/002_temp.txt", shell=True)
             proc.call("echo '%。気圧は、' >> /usr/local/bin/002_humd.txt", shell=True)
             proc.call("echo 'ヘクトパスカルです。' >> /usr/local/bin/002_pres.txt", shell=True)

             #時刻と観測データの結合
             proc.call("cat /usr/local/bin/001_datetime.txt /usr/local/bin/002_temp.txt /usr/local/bin/002_humd.txt /usr/local/bin/002_pres.txt > /usr/local/bin/003_union.txt", shell=True)

             #結合したファイルの改行を除去
             proc.call("tr -d '\n' < /usr/local/bin/003_union.txt > /usr/local/bin/004_union.txt", shell=True)
             #半角スペースの除去
             proc.call("tr -d ' ' < /usr/local/bin/004_union.txt > /usr/local/bin/005_union.txt", shell=True)

             # ファイルの読み込み
             f = open('/usr/local/bin/005_union.txt', 'r')
             for row in f:
                 print row
             f.close()
             
             # OpenJtalkにテキストファイルを送りしゃべらせる
             proc.call("/usr/local/bin/jtalk.sh `cat /usr/local/bin/005_union.txt`", shell=True)
         sleep(0.01)

#CTRL+C処理
except KeyboardInterrupt:
    pass
GPIO.cleanup()

 

天気予報をしゃべってもらう

第21回「ラズベリーパイで手作り目覚まし時計!天気予報編」

から99.99%使わせていただきました。phpが入っていなかったので

$ sudo apt-get install php5をしてから

$ vi weather_talk.php

<?php
$txt = weather();
exec('/usr/local/bin/jtalk.sh '.$txt);
 
function weather(){
    $id   = '140010';
    $url  = 'http://weather.livedoor.com/forecast/webservice/json/v1?city='.$id;
    $json = @file_get_contents($url);
    $obj  = json_decode($json);
    $txt  = '';
 
    if($obj==null){
     $str .= "天気情報がありません。";
    }else{
     if(isset($obj->title)){
         $txt .= $obj->title.'は、';
     }
     if(isset($obj->forecasts[0]->telop)){
         $txt .= $obj->forecasts[0]->telop.'です。';
     }
     if(isset($obj->description->text)){
         $txt .= $obj->description->text;
     }
    }
    $txt = preg_replace('/(\s| )/','',$txt);
    $txt = preg_replace('/\n|\r|\r\n/', '', $txt);
    return $txt;
}

コメント