【雑記】ゆっくりボイスをPythonから出力する

ゆっくりボイスを Python から自動出力できないかな…と思って方法を調べてみました。

ゆっくりボイスをPythonから出力する

AquesTalkPlayerをダウンロードする

ゆっくりボイスを出力するには「AquesTalkPlayer」が必要となるので、以下のページからダウンロードします。

PythonからAquesTalkを実行する

以下のPythonコードを用意します。ファイル名は「conv_yukkuri.py」としました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import subprocess

# AquesTalkPlayerの場所を指定する.
TOOL_PATH = "AquesTalkPlayer.exe"

def usage():
    print("conv_yukkuri.py [プリセット名] [セリフ] [出力ファイル]")

def main():
    argv = sys.argv
    argc = len(argv)
    if argc < 4:
        usage()
        return

    # プリセット.
    preset = argv[1]
    # セリフ.
    word = argv[2]
    # 保存ファイル名
    output = argv[3]
    
    cmd = ["start", TOOL_PATH, "/T", word, "/P", preset, "/W", output]

    subprocess.run(" ".join(cmd), shell=True)


if __name__  == '__main__':
    main()

 

これで以下のコマンドで、直接 wav ファイルを出力できるようになります。

ゆっくりボイスを出力する
> python conv_yukkuri.py れいむ ゆっくりしていってね reimu.wav

プリセットの指定

なお、速度などは外部から指定できないようで、プリセット経由で指定することになります。

追記: 複数のテキストをまとめて wav ファイルに出力する

改行を区切り文字としてまとめて wav ファイルを出力するスクリプトを書いてみました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import subprocess
import shutil

# AquesTalkPlayerの場所を指定する.
TOOL_PATH = "AquesTalkPlayer.exe"

def usage():
    print("conv_yukkuri.py [設定ファイル]")

def main():
    argv = sys.argv
    argc = len(argv)
    if argc < 2:
        usage()
        return
    
    input = sys.argv[1]
    f = open(input, "r", encoding="utf-8")
    data = f.read()
    f.close()
    
    # 出力フォルダがなければ作成
    outdir = "output"
    if os.path.exists(outdir):
        # いったん消す.
        shutil.rmtree(outdir)
    os.makedirs(outdir)
    
    
    # プリセット.
    preset = "れいむ"
    idx = 1
    page = 0
    for line in data.split("\n"):
        # セリフ.
        word = line
        if word.strip() == "":
            continue # 空文字.
        if word[0] == "#": # コメント行.
            # 改ページ.
            page += 1
            idx = 1
            continue
        
        # 保存ファイル名
        print(page, "-", idx, ":", word)
        output = "\"%s/%02d_%02d_%s.wav\""%(outdir, page, idx, word[:16])
        
        cmd = ["start", TOOL_PATH, "/T", "\""+word+"\"", "/P", preset, "/W", output]

        subprocess.run(" ".join(cmd), shell=True)
        idx += 1


if __name__  == '__main__':
    main()

例えば以下のような台本テキストを作成します。

クリックゲームチュートリアル台本

# 001_プロジェクト作成
Godot Engineを起動すると、プロジェクトマネージャーが表示されます。
ここにプロジェクト名を入れるのですが、保存先はプロジェクトパスで設定します。
パスを変えるには参照ボタンをクリック。
上ボタンを押すとパスが移動します。
フォルダをダブルクリックでそのフォルダに移動できます。
保存先が決まったら、プロジェクト名を入力します。
ここでは TestClickGame としました。
「フォルダを作成」ボタンを押すとフォルダが作られます。
「作成して編集」ボタンでプロジェクトが起動します。

# 002_Mainシーン作成
プロジェクトが起動したので、画面の構成を説明すると、
左上のシーンビューで、シーン内のノードを管理します。まだ何もシーンを作っていないので、作成ボタンが表示されています。

左下にあるのがファイルシステムで、このプロジェクト内のリソースをここで管理します。
画面中央がキャンバスです。
この上のボタンで表示モードが変更できます。
そして右上にあるのが、シーンの実行ボタンです。
メインシーンを実行したり、現在開いているシーンを実行するなどの実行モードを選んで起動できます。
まだメインシーンがないので、実行ボタンを押してもこのようなダイアログが表示されます。
今はCancelボタンを押して、閉じておきましょう。
そして左側にあるのがインスペクタで、シーンの詳細な情報が表示されたり編集できます。

ではメインシーンを作ります。2Dシーンをクリック。
するとNode2Dというシーンが作られます。2Dゲームを作るときはこのシーンが基準となります。
これをダブルクリックして「Main」という名前に変更します。
変更できたら、メニューから「シーンを保存」を選んで保存します。
保存ダイアログが表示されるので、「Main.tscn」にして、「保存」ボタンをクリック。
ファイルシステムに「Main.tscn」が保存されます。

これでゲームを実行できるようになったので、右上の実行ボタンをクリック。
メインシーンが設定されていないので、ダイアログから「現在のものを選択」を選びます。
すると何もない画面が表示されました。
×ボタンを押して閉じておきましょう。

 

このテキストファイルを以下のコマンドで実行します。

テキストファイルからwavを作る
> python conv_yukkuri.py input.txt

すると以下のように wav ファイルが output フォルダに出力されます。

参考