【ESPnet】Windows11 で ESPnet を使ってみる

はじめに

以前WSL2を使ってESPnetを使ったことがあります。
touch-sp.hatenablog.com
今回はWindows11で使ってみました。

PC環境

Windows 11
CUDA 11.8
Python 3.10

Python 3.11以降ではうまく環境構築できませんでした。

Python環境構築

pip install torch==2.4.1+cu118 torchaudio==2.4.1+cu118 --index-url https://download.pytorch.org/whl/cu118
pip install scipy==1.12.0
pip install espnet
pip install espnet_model_zoo
pip install pyopenjtalk

scipyが1.12.0より新しいと以下のエラーが出ました。

ImportError: cannot import name 'kaiser' from 'scipy.signal'



「requirements.txt」を作ったので以下の1行で環境構築可能です。

pip install -r https://raw.githubusercontent.com/dai-ichiro/myEnvironments/refs/heads/main/ESPnet/requirements_win.txt

Pythonスクリプト

テキストファイルから音声ファイルを作成するために以下のスクリプトを書きました。

import argparse
import numpy as np
import torch
from espnet2.bin.tts_inference import Text2Speech
from espnet2.utils.types import str_or_none

parser = argparse.ArgumentParser()
parser.add_argument('input_filename', help='input text file name')
parser.add_argument('output_filename', help='output wave file name')

args = parser.parse_args()

input_fname = args.input_filename
output_fname = args.output_filename

text2speech = Text2Speech.from_pretrained(
    model_tag=str_or_none('kan-bayashi/jsut_full_band_vits_prosody'),
    vocoder_tag=str_or_none('none'),
    device="cuda"
)

pause = np.zeros(30000, dtype=np.float32)

with open(input_fname, 'r', encoding="utf-8") as f:
    x = f.read()

sentence_list = x.split('<pause>')

wav_list = []

for sentence in sentence_list:
    with torch.no_grad():
        result = text2speech(sentence)["wav"]
        wav_list.append(np.concatenate([result.view(-1).cpu().numpy(), pause]))

final_wav = np.concatenate(wav_list)

# Convert float32 to int16 PCM format
max_value = np.max(np.abs(final_wav))
final_wav = (final_wav / max_value * 32767).astype(np.int16)

# Save as WAV using wave module
import wave
with wave.open(output_fname, 'wb') as wav_file:
    wav_file.setnchannels(1)  # Mono audio
    wav_file.setsampwidth(2)  # 2 bytes per sample (16-bit)
    wav_file.setframerate(text2speech.fs)  # Sample rate
    wav_file.writeframes(final_wav.tobytes())

'''
from scipy.io import wavfile
wavfile.write(filename=output_fname, rate=text2speech.fs, data=final_wav)
'''

用意するテキストファイル

このようなテキストファイルを用意しました。

首都はキャンベラ。<pause>
世界一のサンゴ礁、グレートバリアリーフが有名。

テキスト中にpauseを挿入するとそこで間をあける(無音をはさむ)ようになっています。

使い方

上記Pythonスクリプトを「tts.py」としています。

python tts.py <テキストファイル名> <出力するファイル名>

例として

python tts.py sample.txt output.wav




このエントリーをはてなブックマークに追加