【雑記】ゆっくりボイスを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 フォルダに出力されます。

参考