前提
ネットワーク越しでVoiceVoxを使う方法としてsshでlocalhost上のVoiceVoxポートをポートフォアーディングします。
なのでVoiceVoxが動作しているLinuxPCでopenssh-serverが動作している必要があります。
準備
1.VoiceVoxがインストールされているLinux PCでVoiceVoxを起動しておきます。
2.ssh username@targetpc.local -L 50021:localhost:50021
でVoiceVoxが動作しているPCにsshで接続します。
VoiceVoxクライアントを起動する。
VoiceVoxクライアントとしては次のようなコードを使います。
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=(60,4),border_width=2,font=("",17),key='MText',disabled=True)],
[psg.Button('Next',key='Next'),psg.Button('Top',key='Top'),psg.Button('終了',key='END')]]
win = psg.Window('VOICEVOX ナレータ(波音リツ)',wlay,keep_on_top=True)
# 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])
evT,valT = win.read(timeout=10,timeout_key='T10')
try:
# キャラを変えるためには第2引数の数値を変更します。
# 3 はずんだもん
speak(mess[dispnum][0],9)
except Exception as e:
print(e)
win.close()
なお、このコードは自由に改修してお使い下さい。
ファイルに取ったらそのファイルに実行権をつけてくださいね。
クライアントプログラムは、準備の2で接続した端末はログイン状態を維持したままで別の端末でこのプログラムを実行します。
するとポートフォアディングされているのでローカルでVoiceVoxが動作しているかのように動作します。
意外とVoiceVoxはCPUを使用するので非力なマシンではしんどいところがあるのでこの方法を使うことで非力なマシンでもテキストの読み上げができます。