Linux環境のPythonでVOICEVOXのUI付きクライアントを書いてみた
VOICEVOXでナレーションするにはVOICEVOXを起動しておいてAPIを叩く必要があります。
VOICEVOXをLinuxにインストールする場合
下記の記事を参考にしてください。
https://qiita.com/kawamo55/items/d333524c82a03dd28c07
必要なライブラリ
PySimpleGUI、request、pyaudio がいります。
中でも、pyaudioをLinuxにpipでインストールする際ヘッダーファイルがないというエラーで止まる場合があります。
その場合は
apt install portaudio19-dev
でパッケージを入れないとだめな場合があります(debian系)
使い方
- VOICEVOXを起動します。
- ナレーション内容はソースの中にあるので書き換えます。
- ナレーションは('よみ'、'表示')の順に書きます。
これは読み間違いのある場合読みの方の読み間違う漢字をひらがなでいれます。 - スクリプトを起動します。
- TOP ボタンは最初の文章を読みます。
- Nextは次の文章を読みます。
- 終了 でプログラムを終わります。
ファイル名は vvnar としており実行権をつけるとコマンドとして起動できます。
プログラム内容
ご自由に書き換えてお使いくださいませ。
#!/usr/bin/python3
# このプログラムはVOICEVOXを利用したLinux版ナレータープログラムです。
# 使用するためにはVOICEVOXを起動しておく必要があります。
import PySimpleGUI as psg
import requests as req
import json
import pyaudio as pa
# ここにナレーションを入れます。('よみ','表示')の順で入れます。
mess = [
('読みには読み間違う漢字の部分を平仮名で入れます。','読みには読み間違う漢字の部分を平仮名で
入れます。'),
('読みと表示に分けることで正確に発音できます。','読みと表示に分けることで正確に発音できます
。')
]
dispnum=0
# init window
wlay = [[psg.Multiline(default_text=mess[0][1],size=(40,10),border_width=2,font=("",15),key='MText',disabled=True)],
[psg.Button('Next',key='Next'),psg.Button('Top',key='Top'),psg.Button('終了',key='END')]]
win = psg.Window('VOICEBOX ナレータ',wlay)
# sperk function
def speak(mess,no):
qu_requrl='http://localhost:50021/audio_query'
ad_requrl='http://localhost:50021/synthesis'
reqprm = (('text',mess), ('speaker',no), )
rsvdat = req.post(qu_requrl, params=reqprm)
wavdat = req.post(ad_requrl,
headers={"Content-Type": "application/json"},
params = reqprm,
data = json.dumps(rsvdat.json())
)
wav = wavdat.content
dev = pa.PyAudio()
dev_stream = dev.open(format=pa.paInt16,
channels=1,rate=24000,output=True)
dev_stream.write(wav)
dev_stream.close()
dev.terminate()
while True:
ev,val = win.read()
if ev in ('END',None):
break
if ev == 'Next':
dispnum+=1
if dispnum >= len(mess):
dispnum=len(mess)-1
if ev == 'Top':
dispnum=0
win['MText'].Update(mess[dispnum][1])
try:
# キャラを変えるためには第2引数の数値を変更します。
# 3 はずんだもん
speak(mess[dispnum][0],3)
except Exception as e:
print(e)
win.close()
以上