Modにはカスタムボイスを追加するものがあります。声優を起用して完全に新規に制作されたものはどうしようもありませんが、バニラの英語ボイスをただコピーしただけのものであれば、同じボイスの日本語ボイスをコピーすれば日本語化できるはずです。これを機械的に処理してみました。
必要なもの
- LazyVoiceFinder
- Yakitori Audio Converter
- PHP
PHPスクリプト
copy_same_dialogue_file.php (php)
<?php
define('MASTER_CSV', 'LazyVoiceFinder_export.csv');
define('VANILLA_DIR', 'vanilla');
define('MOD_DIR', 'mod');
try {
$vanilla_csv_file = VANILLA_DIR . '/' . MASTER_CSV;
$mod_csv_file = MOD_DIR . '/' . MASTER_CSV;
if ( !file_exists($vanilla_csv_file) ) {
throw new Exception( $vanilla_csv_file . ' not exists.' );
}
if ( !file_exists($mod_csv_file) ) {
throw new Exception( $mod_csv_file . ' not exists.' );
}
$vanilla_data = [];
parse_vanilla_csv($vanilla_csv_file);
parse_mod_csv($mod_csv_file);
} catch (Exception $e) {
echo $e->GetMessage() . PHP_EOL;
}
function parse_vanilla_csv($csv_filename)
{
global $vanilla_data;
$fp = fopen($csv_filename, 'r');
if ( !$fp ) {
throw new Exception('could not open csv file - ' . $csv_filename);
}
$csv_line_count = 0;
$fuz_count = 0;
// ヘッダ行を読み捨てる
fgets($fp);
$csv_line_count++;
while ( !feof($fp) ) {
$ary = fgetcsv($fp);
$csv_line_count++;
// CSVですらない不正な行(ファイルの末尾など)
if ( !is_array($ary) ) {
continue;
}
// カラムの数が合わない不正な行
if ( count($ary) != 8 ) {
continue;
}
// セリフが存在しない行
$dialogue = trim($ary[6]);
if ( strlen($dialogue) == 0 ) {
continue;
}
$fuz_count++;
$fuz_file = $ary[4];
$vanilla_data[$fuz_file] = $ary[6];
}
fclose($fp);
echo $csv_filename . PHP_EOL;
echo ' csv_line: ' . $csv_line_count . PHP_EOL;
echo ' fuz: ' . $fuz_count . PHP_EOL;
}
function parse_mod_csv($csv_filename)
{
global $vanilla_data;
$fp = fopen($csv_filename, 'r');
if ( !$fp ) {
throw new Exception('could not open csv file - ' . $csv_filename);
}
$csv_line_count = 0;
$fuz_count = 0;
$match_count = 0;
// ヘッダ行を読み捨てる
fgets($fp);
$csv_line_count++;
while ( !feof($fp) ) {
$ary = fgetcsv($fp);
$csv_line_count++;
// CSVですらない不正な行(ファイルの末尾など)
if ( !is_array($ary) ) {
continue;
}
// カラムの数が合わない不正な行
if ( count($ary) != 8 ) {
continue;
}
// セリフが存在しない行
$dialogue = trim($ary[6]);
if ( strlen($dialogue) == 0 ) {
continue;
}
$fuz_count++;
$fuz_file = $ary[4];
$dialogue = $ary[6];
$key = array_search($dialogue, $vanilla_data);
if ( $key ) {
$match_count++;
copy_fuz_file($key, $fuz_file);
}
}
fclose($fp);
echo $csv_filename . PHP_EOL;
echo ' csv_line: ' . $csv_line_count . PHP_EOL;
echo ' fuz: ' . $fuz_count . PHP_EOL;
echo ' match: ' . $match_count . PHP_EOL;
}
function copy_fuz_file($copy_from, $copy_to)
{
$copy_from = VANILLA_DIR . '/' . $copy_from;
$copy_to = MOD_DIR . '/' . $copy_to;
if ( !file_exists($copy_from) ) {
throw new Exception($copy_from . ' not exists.');
}
if ( file_exists($copy_to) ) {
throw new Exception($copy_to . ' already exists.');
}
copy($copy_from, $copy_to);
}
手順
作業用フォルダを用意します。
作業用フォルダの中に、vanillaとmodというフォルダを作ります。
LazyVoiceFinderを使って、バニラの音声一覧を表示してcsvをエクスポートします。csvファイルはvanillaフォルダの中に置きます。このcsvは英語が望ましいです。ファイル名はデフォルトのままLazyVoiceFinder_export.csvです。
同じくLazyVoiceFinderを使って、Modの音声一覧を表示してcsvをエクスポートします。csvファイルはmodフォルダの中に置きます。このcsvも英語が望ましいです。
csvの中身を英語にする理由は、翻訳でゆらぎが発生して一致しなくなることを防ぐためです。
LazyVoiceFinderを使って、バニラの音声のfuzファイル一式をvanillaフォルダの中に置きます。この音声データは日本語にします。fuzファイルはvanillaフォルダのすぐ下に起き、サブフォルダは作りません。
作業用フォルダに前述のPHPスクリプトを置いて実行します。