コンテンツにスキップ

音声フォーマットコンバータ

音声フォーマットコンバータについて

音声フォーマットコンバータ (krkraudio) は、吉里吉里で再生する音声ファイルの形式を変換したり、音量を揃えたりするツールです。標準ツール のひとつです。

  • WAV・Ogg Vorbis・Ogg Opus を相互に変換します
  • 変換のときに音量を変えたり、ラウドネス (聞こえの大きさ) を指定の値に揃えたりできます
  • ループ情報 (.sli ファイル) があれば、変換先にも書き出します
  • 音声のラウドネスとピークを測定できます
  • 口パク用に、一定間隔ごとの音量を書き出せます

変換した音声と .sli は、吉里吉里本体で開けることを確認しています。

扱える形式

形式 読み込み 書き出し
WAV 整数 PCM 8 / 16 / 24 / 32bit、浮動小数点 32 / 64bit (WAVE_FORMAT_EXTENSIBLE も可) 16bit / 24bit / 32bit float
Ogg Vorbis (.ogg) ○ 品質 (VBR) を指定
Ogg Opus (.opus) ○ ビットレートを指定 (既定は自動)
  • 形式はファイルの中身で判定します (拡張子は問いません)
  • 出力ファイルの名前は、元のファイル名の拡張子を .ogg / .opus / .wav に替えたものです
  • サンプルレートとチャンネル数は元のままです。ただし Ogg Opus は常に 48kHz になります (Opus から WAV / Vorbis へ変換した場合も 48kHz のままです)
  • Ogg Vorbis / Ogg Opus のコメント (タグ) は変換先に引き継ぎます (ENCODER と、ReplayGain・R128 関係のタグは除きます)。WAV へ変換するとタグはなくなります
  • 16bit / 24bit の WAV に書き出すとき、音量を上げて ±1.0 を超えた部分は切り詰められます (音割れします)。32bit float では切り詰めません

ループ情報 (.sli) の引き継ぎ

変換元に «ファイル名.sli» (ループチューナ で作るループ情報) があれば、変換先にも «出力ファイル名.sli» を書き出します。

.sli の位置はサンプル単位なので、サンプルレートが変わるとき (Opus へ変換するとき) は、リンクとラベルの位置を新しいサンプルレートに換算 (四捨五入) します。たとえば 44.1kHz の音声で 44100 の位置は、Opus では 48000 になります。

Note: 換算で 1 サンプル未満の誤差が出たり、非可逆圧縮で波形がわずかに変わったりするため、継ぎ目の聞こえ方が変わることがあります。重要なループは、変換後のファイルをループチューナで開いて確かめてください。krkrloop --cli check で、.sli の位置が音声の範囲内かどうかを調べることもできます。

.sli を本体が読めない書式だった場合は、.sli だけ書き出さずに変換します。

音量の扱い

吉里吉里本体での音量の扱い

吉里吉里本体は、圧縮音声のデコード時に次のゲインを適用します (詳しくは コマンドラインオプション の «サウンドのゲイン» を参照)。

  • Ogg Opus のヘッダゲイン (出力ゲイン)
    Opus ファイルのヘッダに書かれたゲインは、本体が常に適用します。波形を書き換えずに音量を変えられます。
  • Ogg Vorbis の ReplayGain タグ
    replaygain_track_gain / replaygain_album_gain タグは、本体を -ogg_rg=track (または album) で起動したときだけ適用されます。既定 (none) では使われません。

音量を変える (--gain)

指定した dB だけ音量を変えます (正の値で大きく、負の値で小さくなります)。

  • Opus へ変換する場合: ヘッダゲインに書きます。波形は変えません
  • Vorbis / WAV へ変換する場合: 波形に焼き込みます

Opus を Opus 以外へ変換するときは、元の Opus のヘッダゲインを波形に焼き込みます (本体で鳴っていた音量のままになります)。Opus から Opus へ変換するときは、元のヘッダゲインに指定のゲインを加えたものを、新しいヘッダゲインにします。

ラウドネスを揃える (--normalize)

音声の統合ラウドネス (EBU R128) を測定し、指定の値 (LUFS) になるようにゲインを決めます。たとえば --normalize=-18 で -18 LUFS に揃えます。複数の BGM やボイスの音量感を揃えるのに使います。

ゲインの適用方法は --gain と同じです (Opus はヘッダゲイン、ほかは焼き込み)。--gain と一緒に指定すると、その値も加算されます。

Note: ラウドネスを揃えるとピークが 1.0 を超えることがあります (リミッタはかけません)。音量を大きく上げる場合は、変換後に «音量の測定» でピークを確かめてください。

ReplayGain タグ (--replaygain)

Ogg Vorbis へ変換するときに、REPLAYGAIN_TRACK_GAIN (ReplayGain 2.0 の基準 -18 LUFS に合わせるためのゲイン) と REPLAYGAIN_TRACK_PEAK (ピーク) のタグを書きます。値は、--gain / --normalize を適用した後の音声から求めます。

このタグは、本体を -ogg_rg=track で起動したときだけ効きます。波形もヘッダも変えずに、起動オプションで音量の補正を有効にしたい場合に使います。Vorbis 以外への変換では指定しても無視されます。

Note: ゲインやラウドネスを積極的に扱う場合は、本体が常にヘッダゲインを適用する Ogg Opus の利用をおすすめします。

画面での使い方

krkraudio                    画面を開く
krkraudio <ファイル>...       画面を開き、ファイルを一覧に入れる

画面はブラウザのウィンドウで開きます (起動や画面の共通事項は 標準ツール を参照)。

画面の上部は、処理するファイルの一覧です。«追加…» でファイルを追加し、«クリア» で一覧を空にします。一覧には、形式・サンプルレート・チャンネル数・長さ (秒)・ゲイン (Opus のヘッダゲイン、または Vorbis の ReplayGain タグ)・.sli の有無が表示されます。

その下に、3 つのタブがあります。

変換

一覧の全てのファイルを変換します。

  • 変換先: Ogg Vorbis / Ogg Opus / WAV
  • 品質 (Ogg Vorbis): -0.1 〜 1.0 (既定 0.4)。大きいほど高音質・大きなファイルになります
  • ビットレート (Ogg Opus): kbps 単位。0 で自動
  • ビット数 (WAV): 16 / 24 / 32 (float)
  • 音量: dB 単位 (--gain と同じ)
  • ラウドネスを ○○ LUFS に揃える: チェックすると --normalize と同じ処理をします (既定 -18)
  • ReplayGain タグを書く (Ogg Vorbis): --replaygain と同じ処理をします
  • 出力フォルダ: 空のときは、元のファイルと同じフォルダに書き出します。«参照…» で選べます
  • 上書き: チェックしないと、既にある出力ファイルは上書きせず失敗にします

«変換する» で変換を始め、«中断» で中断します。結果の一覧に、ファイルごとの出力先と、.sli を書き出したか (位置を換算した場合はそのサンプルレート)、書いた ReplayGain の値が表示されます。

音量の測定

一覧の全てのファイルについて、統合ラウドネス (EBU R128、LUFS)、ピーク (0 〜 1)、-18 LUFS にするためのゲインを測定して表示します。値は本体で鳴る音量 (Opus はヘッダゲイン込み) で表します。

口パク用の音量

一覧の先頭のファイルについて、一定間隔ごとの音量を書き出します。キャラクターの口パクの開き具合などに使います。

  • 1 秒あたり: 1 秒あたりの値の数 (既定 30)
  • 形式: JSON / CSV
  • 保存先: ファイル名を指定すると保存します。空のときは画面に表示するだけです

出力の形式は後述の「口パク用の音量の形式」を参照してください。

コマンドラインでの使い方

--cli を付けると、画面を開かずに処理します。

krkraudio --cli info     <ファイル>...
krkraudio --cli convert  <ファイル>... --to=ogg|opus|wav [--out=DIR]
                         [--quality=Q] [--bitrate=KBPS] [--bits=16|24|32]
                         [--gain=DB] [--normalize=LUFS] [--replaygain] [--force]
krkraudio --cli loudness <ファイル>...
krkraudio --cli lipsync  <ファイル> [--fps=30] [--format=json|csv] [--out=FILE]
オプション 意味
--to=ogg\|opus\|wav 変換先の形式 (convert では必須)
--out=DIR convert: 出力フォルダ (なければ作ります。省略時は元のファイルと同じフォルダ)
lipsync: 出力ファイル (省略時は標準出力)
--quality=Q Ogg Vorbis の品質 -0.1 〜 1.0 (既定 0.4)
--bitrate=KBPS Ogg Opus のビットレート (既定: 自動)
--bits=16\|24\|32 WAV のビット数 (既定 16。32 は float)
--gain=DB 音量を変える (Opus はヘッダゲイン、ほかは波形に焼き込み)
--normalize=LUFS 統合ラウドネスをこの値に揃える (例 -18)
--replaygain Ogg Vorbis に REPLAYGAIN_TRACK_GAIN / PEAK を書く
--force 出力先が既にあっても上書きする
--fps=N lipsync: 1 秒あたりの値の数 (既定 30)
--format=json\|csv lipsync: 出力形式 (既定 json)
--json info / convert / loudness の結果を JSON で出す
--quiet 進捗を出さない

出力先が入力と同じファイルになる場合 (WAV を同じフォルダに WAV へ変換する場合など) は変換しません。--out で別のフォルダを指定してください。

例

> krkraudio --cli info bgm.wav out/bgm.opus
bgm.wav: wav 44100 Hz 2 ch 3.000 秒 (132300 サンプル) 16bit
out/bgm.opus: opus 48000 Hz 2 ch 3.000 秒 (144000 サンプル) ヘッダゲイン -6.00 dB
    ENCODER=krkrz_tools

WAV を Opus に変換する (.sli は 48kHz に換算されます):

> krkraudio --cli convert bgm.wav --to=opus --out=out
変換  bgm.wav → out/bgm.opus  (.sli 44100 → 48000 Hz)

BGM をまとめて Ogg Vorbis にし、-18 LUFS に揃える:

krkraudio --cli convert bgm/*.wav --to=ogg --quality=0.5 --normalize=-18 --out=data/bgm

ボイスを Opus にし、ヘッダゲインで 6dB 下げる:

krkraudio --cli convert voice/*.wav --to=opus --gain=-6 --out=data/voice

ラウドネスの測定:

> krkraudio --cli loudness bgm.wav out/bgm.opus
bgm.wav: -11.14 LUFS / ピーク 0.3000 / ReplayGain -6.86 dB
out/bgm.opus: -17.10 LUFS / ピーク 0.1535 / ReplayGain -0.90 dB

«ReplayGain» は、-18 LUFS にするためのゲインです。

終了コード

コード 意味
0 成功
2 失敗 (読めないファイルがある、出力先が既にある、など)

複数のファイルを処理する場合、失敗したファイルがあっても残りのファイルの処理は続けます。

口パク用の音量の形式

Note: この出力形式は暫定です。今後、母音の推定などを加える際に変わる可能性があります。

音声を «1 / fps» 秒ごとの区間に分け、区間ごとに、全チャンネルを混ぜた音の RMS (実効値) とピーク (絶対値の最大) を 0 〜 1 で出力します。Opus はヘッダゲインを適用した音量で計算します。

JSON の場合:

{"source":"voice.wav","fps":10,"frames":10,"rms":[0.35353,0.35353,...],"peak":[0.49997,0.49997,...]}
メンバ 内容
source 音声のファイル名
fps 1 秒あたりの値の数
frames 値の数
rms 区間ごとの RMS の配列
peak 区間ごとのピークの配列

CSV の場合:

frame,time,rms,peak
0,0.0000,0.35353,0.49997
1,0.1000,0.35353,0.49997
...

frame は区間の番号、time は区間の開始時刻 (秒) です。

再生中の音量をその場で得たい場合は、本体の WaveSoundBuffer.getSoundLevel なども使えます。