Pythonで日本語と英語のテキストを音声ファイルに変換する方法

この記事は公開から1年以上経過しています。

無償で利用できるAI音声合成エンジンSpeech5 TTSVOICEBOXを使い、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弱あります。通信環境にご注意ください。

サンプル音声(音量注意):

日本語音声の読み上げの場合

VOICEBOX:voicebox engine

サンプルソースコード

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プロセスが残るため手動で終了が必要です。

サンプル音声(音量注意):


実行環境のハードウェアスペックにもよると思いますが、どちらも実用レベルとして使える印象です。


以上です。

シェアする

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

フォローする