#author("2022-06-26T02:33:17+09:00","default:yakumo_murakami","yakumo_murakami")
#author("2022-06-26T02:33:56+09:00","default:yakumo_murakami","yakumo_murakami")
[[今さらPython]]

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

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

標準音声は男性のものなので、名古屋工業大学のマスコットメイちゃんの音声もらってきて組み込んでみます。
- https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/

* open_jtalk を使った再生部を作る。 [#wfefa448]

外部プログラム呼び出し方法は、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からだとうまく再生してくれない事がある'' から。~
再生に ALSA パッケージの aplay を使っているのだけど、これって ''cronからだとうまく再生してくれない事がある上に、なんかプロセス残っちゃう事がある'' から。~
なんかこう、うまく常駐させて再生させる方法ないかしらね?

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS