今さらPython

せっかくだから、open_jtalkで時刻でも話してもらいますか。

名古屋工業大学のマスコットメイちゃんの音声をもらってくる。

標準音声は男性のものなので、名古屋工業大学のマスコットメイちゃんの音声もらってきて組み込んでみます。

外部プログラム呼び出し方法は、subprocess.runを使いましょう。

import os
import subprocess

class Jtalk():
   def talk(self,str):
       os.environ["TALK"] = str
       os.environ["Voice"] = "/home/hachikun/Downloads/MMDAgent/MMDAgent_Example-1.8/Voice/mei/mei_normal.htsvoice"
       print(str)
       print(os.environ["TALK"])
       subprocess.run("echo $TALK | /usr/bin/open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic/ -m $Voice -r 1.0 -ow /dev/stdout | /usr/bin/aplay -q",shell=True)

よし。
じゃあ、細かいとこを作ってみますか。
時刻を取得して再生用の文面を生成してみるね。

時刻クラスを作って、生成と同時に再生用文面を作るようにしてみる。

import date
import datetime

class Jikoku():
   def answer(self,jkk):
       self.seq = str(jkk.hour)+"時"+str(jkk.minute)+"分"
       if(jkk.minute == 0):
           self.seq = str(jkk.hour)+"時ちょうど"
       elif(jkk.minute == 30):
           self.seq = str(jkk.hour)+"時半"
       return(self.seq)

   def __init__(self):
       self.dt = datetime.datetime.now()
       self.text = self.answer(self.dt)

i=0
jj = Jtalk()
text = ""
while i<10:
   mx = Jikoku()
   # 初回のみ無条件代入
   if(text == ""):
       text = mx.text
       print("初回なので、分が変わるまで喋りません。")
   if(mx.text != text):
       print(mx.text)
       jj.talk2(mx.text+"です。")
       text = mx.text
   time.sleep(0.5)

とりあえずこんなとこかな?
実行するとループに入って、分が変わるたびに時刻をしゃべるわ。

ただし、本ルーチンをcronから起動させないで。
再生に ALSA パッケージの aplay を使っているのだけど、これって cronからだとうまく再生してくれない事がある から。
なんかこう、うまく常駐させて再生させる方法ないかしらね?


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS