RaspberryPiとOpen JTalkを使って音声合成を行う。
インストール~女性の声セットまで
1 2 3 4 |
$ 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
1 2 3 4 5 6 7 8 9 |
#!/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に比べてしゃべり出すまでに時間がかかります。
ファイルを指定してしゃべってもらう
1 |
$ jtalk.sh `cat 004_union.txt` |
バッククオートで囲む
BOSCH製センサBME280と組み合わせて使う
Aquestalkとほぼ同じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#!/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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?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; } |
コメント