声を作ってみた・読み上げ編

Mod作成

概要

セリフのテキストをVOICEVOXに読み上げさせて音声データを作り、ゲームに適用します。

声質はVOICEVOXに完全に依存します。

今回はシンスの声をWhiteCULというキャラクタの声に置き換えてみました。

必要なもの

  • LazyVoiceFinder
  • VOICEVOX
  • Yakitori Audio Converter
  • 表計算ソフト(Microsoft Excelまたは類似ソフト)
  • PHP for Windows

Excelだけは市販の有料ソフトですが、無料の類似ソフトを使うこともできます。

PHPは私が慣れているので。

手順

作業用フォルダを作る

作業用フォルダを作ります。今回はSynth Voice WhiteCULという名前でデスクトップに作成しました。

デスクトップに作ったのは各種アプリから指定しやすくするためです。

音声一覧データを作る

LazyVoiceFinderを起動します。

Fallout4.esmを開きます。

Voice Typeに synthgen1male01 を指定します。

Voice Typeはsynthgen1male01、02、03の3種類あるようですが、セリフは同じで声だけが違うようなので、01だけでいいです。

メニューからファイルcsvファイルのエクスポートを選び、csvファイルを保存します。

保存された LazyVoiceFinder_export.csv を作業用フォルダに入れます。

セリフデータを作る

LazyVoiceFinder_export.csvをExcelで開きます。

必要なのは6列目のセリフだけなので、他の列をすべて削除します。

1列目を挿入して、キャラクター名を入力します。今回はWhiteCULとしました。詳細はVOICEVOXのヘルプに書いてあります。

以下のようになります。

WhiteCUL,交戦する
WhiteCUL,戦闘を開始します
WhiteCUL,ロックオン中

voicevox.txtという名前で保存して、作業用フォルダに入れます。

音声データを作る

VOICEVOXを起動します。

メニューから設定オプションを開きます。保存書き出しファイル名パターンで先頭が「$連番$_」となるように設定します。先頭さえ合っていれば、あとは何でもいいです。

設定の例はこのようになります。

$連番$_$テキスト$

あらかじめ右側のプリセットを調整しておきます。音量最大、話速を早めにするのがオススメです。

メニューからファイルテキスト読み込みvoicevox.txtを読み込みます。

必要に応じて調整を加えます。

メニューからファイル音声書き出しでwavファイルを出力します。

たまにエンジンエラーというのが出て書き出しに失敗しますが、1つ書き出しで補います。

wavファイルはすべて作業用フォルダに移動します。

リネームする

以下のPHPスクリプトを使うことで全自動でリネームできます。

rename_wav.php (php)

<?php
define('MASTER_CSV', 'LazyVoiceFinder_export.csv');

try {
    $dir = getcwd();
    $fuz_list = [];

    parse_csv(MASTER_CSV);
    //print_r($fuz_list);
    parse_dir($dir);
} catch (Exception $e) {
    echo $e->GetMessage() . PHP_EOL;
}

function parse_csv($csv_filename)
{
    global $fuz_list;

    $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_list[] = $ary[4];
        $fuz_count++;
    }

    fclose($fp);

    //echo 'csv_line_count: ' . $csv_line_count . PHP_EOL;
    //echo 'fuz_count: ' . $fuz_count . PHP_EOL;
}

function parse_dir($dir)
{
    $dh = opendir($dir);

    if ( !$dh ) {
        throw new Exception('could not open dir - ' . $dir);
    }

    while ( $file = readdir($dh) ) {
        if ( preg_match('/\.wav$/', $file) ) {
            if ( preg_match('/^(\d{3})_.+\.wav$/', $file, $matches) ) {
                $file_number = $matches[1];

                rename_wav($file, $file_number);
            } else {
                //echo 'invalid wav filename - ' . $file . PHP_EOL;
            }
        }
    }

    closedir($dh);
}

function rename_wav($wav_filename, $file_number)
{
    global $fuz_list;

    //echo $file_number . ' ' . $wav_filename . PHP_EOL;

    $fuz_index = intval($file_number) - 1;

    if ( !array_key_exists($fuz_index, $fuz_list) ) {
        throw new Exception('fuz index not exists - ' . $fuz_index);
    }

    $new_filename = $fuz_list[$fuz_index];
    $new_filename = str_replace('.fuz', '.wav', $new_filename);

    //echo $new_filename . PHP_EOL;

    if ( !file_exists($new_filename) ) {
        rename($wav_filename, $new_filename);
    }
}

fuzに変換する

Yakitori Audio Converterを使って変換します。

Modを作成する

MO2で適当な名前でModを作成します。VOICEVOX Synth Voiceとしました。

以下のパスを作成して、fuzファイルを起きます。

Sound\Voice\fallout4.esm\synthgen1male01

動作確認

作ったModを有効化してLazyVoiceFinderを起動すれば、再生することができます。

おわりに

他のキャラクタを使ってsynthgen1male02、synthgen1male03の声も作ればバリエーションが増えます。音声一覧データはsynthgen1male01~03で共通です。

シンスは人造人間という設定なので機械的な音声でも違和感が少なく、VOICEVOXの声質は向いていると思いました。

一方で、シンス以外のNPCのセリフを作るとなると、まだ違和感がかなりあり、あまり向いていません。ボイスチェンジャーを使う方が良さそうだと思います。

タイトルとURLをコピーしました