これまで say
コマンド、 VOICEVOX
及び voicevox_core
、 MeloTTS
を使って文章を発話する処理を実装してきた。その機能は、テキストエディタで文章を書く事が多い僕にとっては、文章を音声で聞く事で推敲作業の役に立つ。また動画制作、ゲーム内のキャラクターやライブ配信での発話など、用途はいろいろと考えられる。これからの時代では、文章は読むものではなく聞くものになる。だからこの機能に取り組む事には意味があると考えている。
voicevox_core
の最新版を調べていた所、 AivisSpeech
というツール及びサービスが公開されている事を知った。実装を確認してみると、 AivisSpeech
は VOICEVOX
をベースにして拡張されていた。 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
を使って発話する方法を確認する事にした。
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環境の構築方法は、最近は 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から実行するための拡張の実装も、いずれ行いたい。
ZIPをダウンロードして展開するという方法もある。