はじめに
以前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