2015年8月5日水曜日

MM: ハイレゾ音源データからCD形式への変換 - ちょっと面倒だけどフリーで高品質の SRC を使ってみた編 -

ハイレゾ音源データを,利便性のためにCDプレイヤーで聞きたい(音質がCD相当になるのは承知の上) という自分のニーズに応えるため,その方法をいくつか記事にしてきた.

今回は,CDの枠内でよりよい音質になるよう,サンプルレート変換(SRC: sample rate conversion)に気を使ってみる.windows 前提だが,他の OS でも参考位にはなるかもしれない.

概略,次のような手順だ.
  1. ssrc でサンプルレート変換 (*->44.1kHz)
  2. ffmpeg でチャネルをミックスダウン(5.1ch->2ch)
  3. ssrc でビット数を変換(*->16bits)
  4. ステップ間で,waveshop で保存し直して次のステップで読み込み可能にすることあり.
では,行ってみよう.

オーディオデータを変換する際,特に音質に影響すると言われているのが,サンプルレート変換(SRC)の部分である.ここでは,ハイレゾデータのCD形式への変換なので,ダウンサンプリングの性能が問題だ.それは実質ローパスフィルタの性能と言ってもよい.

ありがたいことに,有名どころの SRC の実装を比較できるサイトがある.INFINITE WAVE の 'SRC Comparisons(96kHz to 44.1kHz)' だ.各実装について,Sweep, 1kHz Tone (-0.1dbfs & -60dbfs), Passband, Transition, Phase, Impulse の 6 つを確認できる.これらはつまりローパスフィルタの性能指標である.理想のフィルタの特性は白線,選んだ実装の特性は緑線で表示されて比較できる.

いくつかよさそうな実装をピックアップしてみると,
  • r8brain の pro バージョンの Linear Phase (Ultra Steep) は無難かつ高性能に見える
  • brick. これは Passband がかなり理想に近い.しかし linear phase でないのか?やや独特のようだ.
  • eac3to. これは後述の SRCC を利用しているようだ.
  • libfsrc. これはライブラリなので,いろいろほかのプログラムから利用されているはず.
  • waveshop. フリーのオーディオエディタ.サンプルレート変換はそこそこ程度か.ソフト自体は何かと便利なので,今回の手順の中でも利用する.
  • SSRC. 有名.今回はこれを使う.
  • secret rabbit code. 略してSRCを狙ったっぽい?
SoX Resampler というのもよいらしい(audithallにおける解説).foobar2000 のプラグインらしい.

有料であれば話は早く,その DAW ソフト一発でぱぱっと変換できるだろう.特に,adobe audition 5.5 and cs6 (今は creative cloud に含まれるはず)のグラフは最も美しいし,ableton live もなかなかの美しさだ.正直,買えるならこれらがよいと思う.

Adobe Creative Cloud[2015年度版]12か月版 Windows/Mac対応 [ダウンロードコード]
アドビシステムズ (2013-10-01)
売り上げランキング: 15

ABLETON DAW Live9 Suite
ABLETON DAW Live9 Suite
posted with amazlet at 15.08.05
ABLETON
売り上げランキング: 4,079
本記事ではなるべくフリーもしくは廉価で行くということで,上記リストのうち SSRC を利用する.SSRC に入力できるのは wav ファイル形式なので,まずは手持ちのハイレゾ音源を wav 形式に変換(デコード)する.そのために,waveshop というフリーソフトを使う.早速 flac ファイルを読み込ませてみよう.flac ファイルの例として,LINN Records のダウンロードページで,「FLAC Studio Master Surround 5.1 channel test」を選んでダウンロードできる,surround88.flac を使うことにする(以前の記事を参照).

*このソフトは,bit-perfect, つまりデータに不要な変更を加えないのをモットーにしているようだ.今回採用した理由は,その bit-perfect というモットーのほかに,出力する wav ファイルが SSRC で実際にうまく読み込めた,ということが大きい.とにかく ffmpeg の出力を ssrc が読んでくれないのよ.waveshop で一度 flac にして,再度 wav にすると読み込めるんだけどね.
waveshop に,5.1ch flac を読み込ませた.

ここから,File -> Save As... で,ファイルの種類を Wave Files (*.wav) として保存する.
wav として保存

これで,5.1ch のハイレゾ wav ファイルが出来た.

次はこの音源データに対しサンプルレート変換を行う.この後の処理を考慮し,ビット数はまだ落とさない.コマンドラインから SSRC を実行するのだが,サンプルレートや入出力ファイル名の指定は

> ssrc.exe --rate 44100 input.wav output.wav

のようにする.実例を挙げると,

C:\work>ssrc.exe --rate 44100 surround88.wav surround441_from_surround88.wav
Shibatch sampling rate converter version 1.30

frequency : 88200 -> 44100
attenuation : 0dB
bits per sample : 24 -> 24
nchannels : 6
length : 89451558 bytes, 56.3439 secs
dither type : none

 100% processed, ETA =   0sec

C:\work>

のようになる.

次に,マルチチャンネルサラウンド(5.1chサラウンド)から2chステレオにミックスダウンする.この処理には ffmpeg を使う.当方では zeranoe ビルドのバイナリを使った.
チャネル数を 5.1(=6) -> 2 に変更(ミックスダウン)し,ビット数は 24 ビットのままで保持する場合,

> ffmpeg.exe -i input.wav -ac 2 -acodec pcm_s24le output.wav

のように実行する.例を見てみよう.

C:\work>ffmpeg.exe -i surround441_from_surround88.wav -ac 2 -acodec pcm_s24le st
ereo441.wav
ffmpeg version N-69608-g9dc45d1 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (GCC)
  configuration: --enable-gpl (多分コンパイル時のオプションが大量に表示される)
  libavutil      54. 18.100 / 54. 18.100
  (lib** のバージョン表示が続く)
Guessed Channel Layout for  Input Stream #0.0 : 5.1
Input #0, wav, from 'surround441_from_surround88.wav':
  Duration: 00:00:56.34, bitrate: 6350 kb/s
    Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 44100 Hz, 6 channels,
 s32 (24 bit), 6350 kb/s
Output #0, wav, to 'stereo441.wav':
  Metadata:
    ISFT            : Lavf56.19.100
    Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s32
 (24 bit), 2116 kb/s
    Metadata:
      encoder         : Lavc56.21.102 pcm_s24le
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s24le (native) -> pcm_s24le (native))
Press [q] to stop, [?] for help
size=   14559kB time=00:00:56.34 bitrate=2116.8kbits/s
video:0kB audio:14559kB subtitle:0kB other streams:0kB global headers:0kB muxing
 overhead: 0.000684%

これで 2ch / 24bits / 44.1kHz の wav ファイル stereo441.wav ができた.もう一歩だ.
88kHz->44.1kHz, 5.1ch->2ch とした wav ファイルを waveshop で読み込んで確認.

ビット数の変換には,再び ssrc を使う.ffmpeg の出力ファイルがそのままでは読み込みできないので,面倒だが waveshop で保存し直す.上の例で言うと,
  1. stereo441.wav を waveshop で開く.
  2. save as で,stereo441re.flac として保存.
  3. waveshop を閉じる.
  4. stereo441re.flac を waveshop で開く.
  5. save as で,stereo441re.wav として保存.
大変面倒だが,これで stereo441.wav は ssrc から読めるはず.もう少しシンプルにやる方法もあるかもしれない.
さて,次にビット数を減らす.本来ここではディザリングを行うことで音質保持への寄与が見込めるのだが,今回はとりあえず省く(ちなみに,ssrc はディザリングのオプションも持っている).

c:\work>ssrc --bits 16 stereo441re.wav stereo441_16bits.wav
Shibatch sampling rate converter version 1.30

frequency : 44100 -> 44100
attenuation : 0dB
bits per sample : 24 -> 16
nchannels : 2
length : 14908602 bytes, 56.3439 secs
dither type : none

 100% processed, ETA =  17sec

c:\work>

これで完成となる.再び waveshop で確認してみよう.
88kHz->44.1kHz, 5.1ch->2ch, 24bits->16bits とした wav ファイルを waveshop で読み込んで確認.
どうやら無事に出来たようである.

手順をまとめると,
  1. ssrc でサンプルレート変換 (*->44.1kHz)
    1.  ssrc.exe --rate 44100 88_24_51.wav 441_24_51.wav
  2. ffmpeg でチャネルをミックスダウン(5.1ch->2ch)
    1. ffmpeg.exe -i 441_24_51.wav -ac 2 -acodec pcm_s24le 441_24_2.wav
  3. waveshop で,wav ファイルを正規化(ssrc で読めるように保存し直す)
    1. 441_24_2.wav を waveshop で開く.
    2. save as で,441_24_2_re.flac として保存.
    3. waveshop を閉じる.
    4. 441_24_2_re.flac を waveshop で開く.
    5. save as で,441_24_2_re.wav として保存.
  4. ssrc でビット数を変換(*->16bits)
    1. ssrc --bits 16 441_24_2_re.wav 441_16_2.wav
  5. 完成.441_16_2.wav を CD に焼きましょう.
大変面倒であった.次の課題は,手順のシンプル化(バッチ化)とディザリングになる予定.

1 件のコメント:

  1. 初めまして大変参考になりました。
    今回、SSRCが1.30から大幅に1.31にアップデートされました
    機会があればぜひ取り上げて検証して頂ければうれしいです。

    1.31ver私の環境?ではなぜか変換ができませんでした(win7 32bit)

    http://shibatch.sourceforge.net/

    •Mar 14, 2016 : SSRC 1.31 is released.

    返信削除