0
2

ずんだもんナレーター(VOICEVOXクライアント)

Last updated at Posted at 2023-12-28

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系)

使い方

  1. VOICEVOXを起動します。
  2. ナレーション内容はソースの中にあるので書き換えます。
  3. ナレーションは('よみ'、'表示')の順に書きます。
      これは読み間違いのある場合読みの方の読み間違う漢字をひらがなでいれます。
  4. スクリプトを起動します。
  5. TOP ボタンは最初の文章を読みます。
  6. Nextは次の文章を読みます。
  7. 終了 でプログラムを終わります。
    ファイル名は 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()

以上

0
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2