Skip to content

Commit

Permalink
整理: モック版 TTS の後処理を共通化 (VOICEVOX#1417)
Browse files Browse the repository at this point in the history
* refactor: モック版 TTS の後処理を共通化

* Update voicevox_engine/dev/tts_engine/mock.py

---------

Co-authored-by: Hiroshiba <hihokaruta@gmail.com>
  • Loading branch information
tarepan and Hiroshiba authored Jun 22, 2024
1 parent 94acb66 commit 1ee81b6
Showing 1 changed file with 16 additions and 38 deletions.
54 changes: 16 additions & 38 deletions voicevox_engine/dev/tts_engine/mock.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
"""TTSEngine のモック"""

import copy
from typing import Any
from typing import Final

import numpy as np
from numpy.typing import NDArray
from pyopenjtalk import tts
from soxr import resample

from ...metas.Metas import StyleId
from ...model import AudioQuery
from ...tts_pipeline.tts_engine import TTSEngine, to_flatten_moras
from ...tts_pipeline.tts_engine import (
TTSEngine,
raw_wave_to_output_wave,
to_flatten_moras,
)
from ..core.mock import MockCoreWrapper


Expand All @@ -26,47 +29,22 @@ def synthesize_wave(
style_id: StyleId,
enable_interrogative_upspeak: bool = True,
) -> NDArray[np.float32]:
"""音声合成用のクエリに含まれる読み仮名に基づいてOpenJTalkで音声波形を生成する"""
"""音声合成用のクエリに含まれる読み仮名に基づいてOpenJTalkで音声波形を生成する。モーラごとの調整は反映されない。"""
# モーフィング時などに同一参照のqueryで複数回呼ばれる可能性があるので、元の引数のqueryに破壊的変更を行わない
query = copy.deepcopy(query)

# recall text in katakana
flatten_moras = to_flatten_moras(query.accent_phrases)
kana_text = "".join([mora.text for mora in flatten_moras])

wave = self.forward(kana_text)

# volume
wave *= query.volumeScale

raw_wave, sr_raw_wave = self.forward(kana_text)
wave = raw_wave_to_output_wave(query, raw_wave, sr_raw_wave)
return wave

def forward(self, text: str, **kwargs: dict[str, Any]) -> NDArray[np.float32]:
"""
forward tts via pyopenjtalk.tts()
参照→TTSEngine のdocstring [Mock]
Parameters
----------
text : str
入力文字列(例:読み上げたい文章をカタカナにした文字列、等)
Returns
-------
wave [NDArray[np.float32]]
音声波形データをNumPy配列で返します
Note
-------
ここで行う音声合成では、調声(ピッチ等)を反映しない
# pyopenjtalk.tts()の出力仕様
dtype=np.float64, 16 bit, mono 48000 Hz
# resampleの説明
非モック実装(decode_forward)と合わせるために、出力を24kHz、32bit浮動小数に変換した。
"""
wave, _ = tts(text)
wave /= 2**15
wave_resampled: NDArray[np.float64] = resample(wave, 48000, 24000)
return wave_resampled.astype(np.float32)
def forward(self, text: str) -> tuple[NDArray[np.float32], int]:
"""文字列から pyopenjtalk を用いて音声を合成する。"""
OJT_SAMPLING_RATE: Final = 48000
OJT_AMPLITUDE_MAX: Final = 2 ** (16 - 1)
raw_wave: NDArray[np.float64] = tts(text)[0]
raw_wave /= OJT_AMPLITUDE_MAX
return raw_wave.astype(np.float32), OJT_SAMPLING_RATE

0 comments on commit 1ee81b6

Please sign in to comment.