RaspberryPiと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()
天気予報をしゃべってもらう
から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;
}



コメント