PR

ロボット制御③ 声を手に入れる2
無料の VOICEVOX を RaspberryPi4B で動かしてみた。

制御

前回は、Windows上で動いているVOICEVOXエンジンを使って声を出しましたが、やはり自分だけで声が出したいですね。少し正規の手順とは異なりますが、Rasberry PI 4B を自分で喋るように設定してみましたので、紹介いたします。

VOICEVOX_COREのダウンロードとインストール

ここは正規の手順ではないです。最終的には、Pythonで声を出すことが目的なので個別にダウンロードせずにライブラリを一括でダウンロードします。その後、Python用のバインディングをダウンロードしてセットアップします。

まずは、ライブラリから以下のTerminalでコマンドで入手してインストールします。

cd ~/Downloads
binary=download-linux-arm64
curl -sSfL https://github.com/VOICEVOX/voicevox_core/releases/latest/download/${binary} -o dwnload
chmod +x download
./download -o ~/voicevox_core

続いてPython用のバインディングをインストール&セットアップします。

wget https://github.com/VOICEVOX/voicevox_core/releases/download/latest/voicevox_core-0.14.3+cpu-cp38-abi3-linux_aarch64.whl
pip install voicevox_core-0.14.3+cpu-cp38-abi3-linux_aarch64.whl

1つ前の工程で不要なインストールファイルを削除します。

cd ~/voicevox_core
rm -rf model
rm libvoicevox_core.so

他にも「README.txt」や「VERSION」などのファイルもありますが、容量もさほど大きくないので残しておきました。(ほぼmodelの中のファイルサイズです)

実際に動かしてみる

実際に動かす前にサウンド再生に必要なパッケージとライブラリをインストールします。

sudo apt install python3-gst-1.0
pip install playsound

サンプルコードとして以下のソースファイルをダウンロードもしくは作成します。SPEARKER_IDのみ0から24に変更しました。24は、WhiteCULさんの楽しい時の音声です。ダウンロードしたrun.pyは、wavファイルを保存しますが、plyasoundを使ってそのまま再生までさせます。

import dataclasses
import json
import logging
from argparse import ArgumentParser
from pathlib import Path
from typing import Tuple

from playsound import playsound

import voicevox_core
from voicevox_core import AccelerationMode, AudioQuery, VoicevoxCore

SPEAKER_ID = 24


def main() -> None:
    logging.basicConfig(
        format="[%(levelname)s] %(filename)s: %(message)s", level="DEBUG"
    )
    logger = logging.getLogger(__name__)

    (acceleration_mode, open_jtalk_dict_dir, text, out) = parse_args()

    logger.debug("%s", f"{voicevox_core.METAS=}")
    logger.debug("%s", f"{voicevox_core.SUPPORTED_DEVICES=}")

    logger.info("%s", f"Initializing ({acceleration_mode=}, {open_jtalk_dict_dir=})")
    core = VoicevoxCore(
        acceleration_mode=acceleration_mode, open_jtalk_dict_dir=open_jtalk_dict_dir
    )

    logger.debug("%s", f"{core.is_gpu_mode=}")

    logger.info("%s", f"Loading model {SPEAKER_ID}")
    core.load_model(SPEAKER_ID)

    logger.debug("%s", f"{core.is_model_loaded(0)=}")

    logger.info("%s", f"Creating an AudioQuery from {text!r}")
    audio_query = core.audio_query(text, SPEAKER_ID)

    logger.info("%s", f"Synthesizing with {display_as_json(audio_query)}")
    wav = core.synthesis(audio_query, SPEAKER_ID)

    out.write_bytes(wav)
    logger.info("%s", f"Wrote `{out}`")

    playsound(out)

def parse_args() -> Tuple[AccelerationMode, Path, str, Path]:
    argparser = ArgumentParser()
    argparser.add_argument(
        "--mode",
        default="AUTO",
        type=AccelerationMode,
        help='モード ("AUTO", "CPU", "GPU")',
    )
    argparser.add_argument(
        "open_jtalk_dict_dir",
        type=Path,
        help="Open JTalkの辞書ディレクトリ",
    )
    argparser.add_argument(
        "text",
        help="読み上げさせたい文章",
    )
    argparser.add_argument(
        "out",
        type=Path,
        help="出力wavファイルのパス",
    )
    args = argparser.parse_args()
    return (args.mode, args.open_jtalk_dict_dir, args.text, args.out)


def display_as_json(audio_query: AudioQuery) -> str:
    return json.dumps(dataclasses.asdict(audio_query), ensure_ascii=False)


if __name__ == "__main__":
    main()

実際に動かしてみます。以下のコマンドを入力して実行してみます。

cd ~/voicevox_core
python ./run.py ./open_jtalk_dic_utf_8-1.11 これはテストです ./audio.wav

Rasberry PI 4Bで約17秒かかりました。スムーズに話するためには、ある程度、生成済音声ファイルを組み合わせるなど考える必要がありそうですが、最初は、考えながら話すのも良いかもです。

声:VOICEVOX:WhiteCUL

コメント

タイトルとURLをコピーしました