音声フォーマットコンバータ¶
音声フォーマットコンバータについて¶
音声フォーマットコンバータ (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 なども使えます。