Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Apr 19, 2023 - コメント - 日記

PythonでVOICEBOXを使ってずんだもんに喋らせてみよう

今日はPythonを使って、YouTubeでよく見かける人気キャラクター「ずんだもん」に喋ってもらいましょう。この記事では、VOICEBOX というすごいソフトウェアを使って、簡単にずんだもんの声を再現する方法をご紹介します。

VOICEBOXのセットアップ

まずは、PythonからVOICEBOXを利用するために、UIを使わないバージョンのvoicevox_engine をインストールしましょう。Dockerイメージが配布されているので、以下のDockerコマンドで簡単に起動できます。

docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest

このコマンドを実行すると、50021ポートでVOICEBOXのAPIが立ち上がります。次に、PythonからこのAPIを利用してみましょう。

Pythonクライアントの作成

Pythonクライアントは以下のように実装します。

from threading import Lock
import requests
from playsound import playsound
import wave
import pyaudio
import time
import urllib.parse
import os

def playwav(file):
    # wavファイルの読み込み
    with wave.open(file, 'rb') as f:
        # PyAudioのインスタンスを生成
        p = pyaudio.PyAudio()

        # Streamを開く
        stream = p.open(format=p.get_format_from_width(f.getsampwidth()),
                        channels=f.getnchannels(),
                        rate=f.getframerate(),
                        output=True)

        # チャンクサイズを設定
        chunk_size = 1024

        # wavファイルを再生
        data = f.readframes(chunk_size)
        while data:
            stream.write(data)
            data = f.readframes(chunk_size)

        time.sleep(0.5) # 0.5s待つ これがないと文末が途切れる

        # StreamとPyAudioインスタンスを終了
        stream.stop_stream()
        stream.close()
        p.terminate()

def voicebox_speech(text):
    mutex_lock = Lock()
    query = {
        'speaker': 1,
        'text': text
    }
    response = requests.post(
        'http://127.0.0.1:50021/audio_query?' + urllib.parse.urlencode(query))
    query = response.content
    headers = {'Content-Type': 'application/json'}
    response = requests.post(
        'http://127.0.0.1:50021/synthesis?speaker=1', data=query, headers=headers)
    with mutex_lock:
        with open('audio.wav', 'wb') as f:
            f.write(response.content)
        playwav("audio.wav")
        os.remove("audio.wav")
    return True

voicebox_speech("こんにちは、ずんだもんです")

これでPythonクライアントが完成しました。voicebox_speech関数に喋らせたいテキストを渡すだけで、ずんだもんの声が再生されます。PCの音量を上げて、ぜひお楽しみください。

まとめ

この記事では、VOICEBOXを使ってPythonで簡単にずんだもんの声を再現する方法をご紹介しました。VOICEBOXは非常に使いやすく、Pythonから簡単にアクセスできるため、様々な用途で活用できます。ずんだもんの声を使って楽しいプロジェクトを作ってみてくださいね。