AivisSpeech-Engineを使って声を出す

しむどん 2024-11-22

これまで say コマンド、 VOICEVOX 及び voicevox_coreMeloTTS を使って文章を発話する処理を実装してきた。その機能は、テキストエディタで文章を書く事が多い僕にとっては、文章を音声で聞く事で推敲作業の役に立つ。また動画制作、ゲーム内のキャラクターやライブ配信での発話など、用途はいろいろと考えられる。これからの時代では、文章は読むものではなく聞くものになる。だからこの機能に取り組む事には意味があると考えている。

voicevox_core の最新版を調べていた所、 AivisSpeech というツール及びサービスが公開されている事を知った。実装を確認してみると、 AivisSpeechVOICEVOX をベースにして拡張されていた。 AivisSpeech の内部では、 VOICEVOX と同じようにコンポーネントに分かれており、発話部分は、 AivisSpeech-Engine で実装している。 AivisSpeech-Engine には、 voicevox_core のコードを含んでおり、また Style-Bert-VITS2 が使われていた。

最近公開された高性能の発話モデルに Bert-VITS2 がある。これは、 BERT を使って文章の感情を分析し、その情報を元に感情豊かな音声を VITS2 によって生成する。 Style-Bert-VITS2 では、 Bert-VITS2 を日本語の発話のために、感情や発話スタイルを自由に制御できるようにしている。

Style-Bert-VITS2 を直接使う事も検討したが、 AivisSpeech では音声データを共有するサービスも提供しており、これに乗っかる方がこちらとしては都合が良さそうだった。

そこで AivisSpeech-Engine を使って発話する方法を確認する事にした。

PythonやGitのインストール

LinuxやWindowsであっても動作させる事はできる(はず)。僕はmacOSを使っているから、macOS上(環境は以下の表の通り)に直接インストールし作業を進める。

種別 ソフトウェア
OS macOS Sonoma 14.5
パッケージマネージャ Homebrew 4.4.6

Pythonは3.11をインストールする。

brew install [email protected]

ソースコードの取得にGitを使用するため1、Gitもインストールする。

brew install git

ソースコードの取得

ソースコードはGitHubで公開されている。そこからcloneし、カレントディレクトリをリポジトリのルートディレクトリに移動する。

git clone https://github.com/Aivis-Project/AivisSpeech-Engine.git
cd AivisSpeech-Engine

Python環境の構築

Python環境の構築方法は、最近は uv などを用いる事が多そうだが、ここではベーシックな方法をできるだけ用いる。まずはvenv環境を作成し有効化する。

python3.11 -m venv .venv
source .venv/bin/activate

AivisSpeech-Engine のリポジトリには、 poetry.lock がある。パッケージのインストールにはpoetryを使った方が良さそうなので、poetryをインストールする。

pip install poetry

必要なPyhtonのパッケージをインストールする。

poetry install

音声モデルをダウンロードする。

使用する音声データはAivisSpeech Hubというサイトからダウンロードする事ができるようになっていた。今回はコードから発話させる手順を確認する事が目的のため適当なモデルとして、Anneli (NSFW)をダウンロードし、カレントディレクトリに置いた。

形式にはAIVMX形式と、AIVM形式がある。今回はAIVMX形式のもののみダウンロードした。これら2つの形式の定義については、内部で使われているaivmlibのリポジトリで説明されている。ざっくりの理解としては、AIVMXはONNX、AIVMはSafetensorであり、それぞれに独自のメタデータを含んでいるらしい。

コードを実行する

ここからはPythonを実行し、音声合成を行う。

poetry run python

必要なパッケージをインポートする。

import os.path
import pathlib
import sounddevice as sd
from voicevox_engine.aivm_manager import AivmManager
from voicevox_engine.core.core_initializer import MOCK_VER
from voicevox_engine.tts_pipeline.tts_engine import TTSEngineManager
from voicevox_engine.tts_pipeline.style_bert_vits2_tts_engine import StyleBertVITS2TTSEngine
from voicevox_engine.model import AudioQuery

モデルをロードする。Style-Bert-VITS2で用いるモデルは、Huggingfaceからダウンロードされるため、ダウンロードに時間と帯域を使う事がある。ダウンロードされたモデルはキャッシュされる。

aivm_dir_path = os.path.abspath("./")  # AVIMファイルを配置したディレクトリへのパス
aivm_manager = AivmManager(pathlib.PosixPath())
tts_engines = TTSEngineManager()
tts_engines.register_engine(StyleBertVITS2TTSEngine(aivm_manager, False, True), MOCK_VER)

音声合成に使用する発音の強弱などのクエリを生成する。

engine = tts_engines.get_engine("0.0.0")
style_id = engine.aivm_manager.get_speakers()[0].styles[0].id

text = """こんにちわ。ぼくはしむどんです。"""

accent_phrases = engine.create_accent_phrases(text, style_id)
query = AudioQuery(
        accent_phrases=accent_phrases,
        speedScale=1.0,
        intonationScale=1.0,
        tempoDynamicsScale=1.0,
        pitchScale=0.0,
        volumeScale=1.0,
        prePhonemeLength=0.1,
        postPhonemeLength=0.1,
        pauseLength=None,
        pauseLengthScale=1,
        outputSamplingRate=engine.default_sampling_rate,
        outputStereo=False,
        kana=text)

WAVE形式のデータを生成する。

wave = engine.synthesize_wave(query, style_id, enable_interrogative_upspeak=True)

生成したデータを再生する。

sd.wait(); sd.play(wave, samplerate=engine.default_sampling_rate)

正しく実行されると、「こんにちわ。ぼくはしむどんです。」という音声が発話される。

聞いてみた所、かなり自然な発話になっていた。

まとめ

AivisSpeech-Engineを使って、Pythonで文章を発話する方法を確認した。音声はかなり自然な発話になっていた。Emacsから実行するための拡張の実装も、いずれ行いたい。


1

ZIPをダウンロードして展開するという方法もある。