今さらPython

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

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

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

open_jtalk を使った再生部を作る。

外部プログラム呼び出し方法は、subprocess.runを使いましょう。
os.environ何とかってのは 環境変数をセット しているのね。 subprocess.runへの値受け渡しに超便利 なのでオススメ。

import os
import subprocess

class Jtalk():
   def talk(self,str):
       os.environ["TALK"] = str
       os.environ["Voice"] = "/home/illyasviel/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.talk(mx.text+"です。")
       text = mx.text
   time.sleep(0.5)

とりあえずこんなとこかな?
classの使い方は、もしわからなかったらクラスとPythonを参照して。 実行するとループに入って、分が変わるたびに時刻をしゃべるわ。

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


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-06-26 (日) 02:33:56