見出し画像

PythonとVOICEVOXを繋げる

どうもアキオです。
最近動画を作りたいなという思いがありまして,
Python上でVOICEVOXを操作するための前準備をしたので,
そのやり方をまとめてみました。

環境
OS: Windows, IDE: VScord

下記の手順で


VOICEVOXをインストール

VOICEVOXのサイトに行き,インストーラでダウンロード

https://voicevox.hiroshiba.jp/

ローカルサーバの確認

ローカルサーバが動いてるか確認するため,Voicevoxを開きながら,下記にアクセスする
http://127.0.0.1:50021/docs

PythonからVOICEVOXにアクセス

ローカルサーバが動いていることを確認したら,Pythonでローカルサーバからデータが引っ張れるか試す。
ローカルサーバとPythonを連携させるライブラリをinstall

pip install requests

加えて
Returnが見やすくするために,richライブラリをinstall

pip install rich

installが済んだら
試しにidを入手してみましょう

# キャラクターの声の種類とidの一覧を表示する

import requests
from rich import print

host = "127.0.0.1"
port = "50021"

def get_speakers():
    # キャラクターの一覧を取得する
    res = requests.get(f"http://{host}:{port}/speakers")
    print(res.json())

if __name__ == "__main__":
    get_speakers()

idの入手ができたら,今度はvscord上で発音させてみましょう

vscord上で実際に話させてみる

PCのスピーカーで話すには,sounddeviceが必要なのでinstall

pip install sounddevice

計算を効率化するためにnumpyをinstall

pip install numpy

vscord上でずんだもんに喋らせるコード

# PythonからVOICEVOXを実行する

import requests
import json
import sounddevice as sd
import numpy as np

# from rich import print

host = "127.0.0.1"
port = "50021"
speaker = 3

def post_audio_query(text: str) -> dict:
    # 音声合成用のクエリを作成する
    params = {"text": text, "speaker": speaker}

    res = requests.post(
        f"http://{host}:{port}/audio_query",
        params=params,
    )

    query_data = res.json()
    # query_data["speedScale"] = 1.5

    # print(query_data)

    return query_data

def post_synthesis(query_data: dict) -> bytes:
    # 音声合成を実行する
    params = {"speaker": speaker}
    headers = {"content-type": "application/json"}

    res = requests.post(
        f"http://{host}:{port}/synthesis",
        data=json.dumps(query_data),
        params=params,
        headers=headers,
    )

    return res.content

def play_wavfile(wav_data: bytes):
    # 音声を再生する
    sample_rate = 24000  # サンプリングレート
    wav_array = np.frombuffer(wav_data, dtype=np.int16)  # バイトデータをnumpy配列に変換
    sd.play(wav_array, sample_rate, blocking=True)  # 音声の再生

def text_to_voice():
    # 入力したテキストをVOICEVOXの音声で再生する
    while True:
        text = input("テキストを入力してください: ")
        if text == "q":
            exit()

        res = post_audio_query(text)
        wav = post_synthesis(res)
        play_wavfile(wav)

if __name__ == "__main__":
    text_to_voice()

これを実行すると,ターミナルが下記みたいな感じになります。

vscordのターミナル

これを確認できたら
一番下の”テキストを入力してください:”に右に適当な文章を打ってみて,再度実行してください。
そうすると,お手元のPCにずんだもんの声が流れるとおもいます。

ずんだもんの声が流せたところで,今回は終了となります。
お疲れさまでした。
近いうちに続きを出そうと思います。

リソース

【たった10分】アプリにもずんだもんを組み込める!PythonでVOICEVOXを使う方法を解説
☝の動画内で使われたコード
https://github.com/cmqr/voicevox
AITuberを作ってみたら生成AIプログラミングがよくわかった件-阿部-由延-sald_ra/dp/4296070789


この記事が気に入ったらサポートをしてみませんか?