この記事は公開から1年以上経過しています。
無償で利用できるAI音声合成エンジンSpeech5 TTS
とVOICEBOX
を使い、Pythonでお手軽に日本語や英語のテキストの音声読み上げを行う方法。
検証環境はLinux(Ubuntu 22)+NVIDIA RTX3060(12GB)+Python(3.10.6)です。
音声ファイルから文字起こしを行いたい場合は、こちらのエントリ「Pythonで音声ファイルから文字起こしを行う方法」をご参照ください。
英語音声の読み上げの場合
Hugging Face:microsoft/speech5_tts
サンプルソースコード
pip:
datasets
numpy
playsound
sentencepiece
soundfile
torch
transformers
main.py
import soundfile as sf
import torch
from datasets import load_dataset
from playsound import playsound
from transformers import (SpeechT5ForTextToSpeech, SpeechT5HifiGan,
SpeechT5Processor)
CACHE_DIR = 'cache'
VOICE_FILE = 'english_voice.wav'
processor = SpeechT5Processor.from_pretrained(
cache_dir=CACHE_DIR, pretrained_model_name_or_path='microsoft/speecht5_tts')
model = SpeechT5ForTextToSpeech.from_pretrained(
cache_dir=CACHE_DIR, pretrained_model_name_or_path='microsoft/speecht5_tts')
vocoder = SpeechT5HifiGan.from_pretrained(
cache_dir=CACHE_DIR, pretrained_model_name_or_path='microsoft/speecht5_hifigan')
while True:
print('読み上げたい英文を入力してください。')
input_text = input()
# テキストを英語音声ファイルに変換
inputs = processor(text=input_text, return_tensors='pt')
embeddings_dataset = load_dataset(
cache_dir=CACHE_DIR, path='Matthijs/cmu-arctic-xvectors', split='validation')
speaker_embeddings = torch.tensor(
embeddings_dataset[7306]['xvector']).unsqueeze(0)
speech = model.generate_speech(
inputs['input_ids'], speaker_embeddings, vocoder=vocoder)
sf.write(VOICE_FILE, speech.numpy(), samplerate=16000)
# 英語音声ファイルを再生
playsound(VOICE_FILE)
モデルのダウンロードサイズが700MB弱あります。通信環境にご注意ください。
サンプル音声(音量注意):
日本語音声の読み上げの場合
サンプルソースコード
pip:
playsound
psutil
requests
main.py
import json
import os
import subprocess
import time
import psutil
import requests
from playsound import playsound
VOICEBOX_API_URL = 'http://localhost:50021'
VOICE_FILE = 'japanese_voice.wav'
voicebox_bin_path = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'voicevox_engine-linux-nvidia-0.14.5.7z.001/linux-nvidia', 'run')
def is_process_running(process_name):
for process in psutil.process_iter(['exe']):
if process.info['exe'] == process_name:
return True
return False
if not is_process_running(voicebox_bin_path):
# VOICEBOX engineサーバープロセス起動
subprocess.Popen(voicebox_bin_path)
time.sleep(1)
while True:
print('読み上げたい和文を入力してください。')
input_text = input()
# テキストを日本語音声ファイルに変換
voicebox_params = (('text', input_text), ('speaker', 13))
query_response = requests.post(
f'{VOICEBOX_API_URL}/audio_query',
params=voicebox_params)
synthesis_response = requests.post(
f'{VOICEBOX_API_URL}/synthesis',
headers={'Content-Type': 'application/json'},
params=voicebox_params,
data=json.dumps(query_response.json()))
with open(VOICE_FILE, 'wb') as f:
f.write(synthesis_response.content)
# 日本語音声ファイルを再生
playsound(VOICE_FILE)
※終了方法によってはVOICEBOX engineプロセスが残るため手動で終了が必要です。
サンプル音声(音量注意):
実行環境のハードウェアスペックにもよると思いますが、どちらも実用レベルとして使える印象です。
以上です。