音に関する技術やツールについて
音声や音楽再生で使用されるオーディオファイル(フォーマット)について、ご存知の方も多いと思いますが、ほんの少し技術の話も交えて書いてみたいと思います。代表的なところでは、MP3, AAC, WMAなどがあります。
これらはオーディオ符号化規格の名前が拡張子になっています。
規格名 | 内容 |
---|---|
MP3 | MPEG-2 Audio Layer 3 |
AAC | Advanced Audio Coding (MPEG-2/4 Audio) |
WMA | Windows Media Audio |
AAC用のファイルコンテナとしては、ADIF, ADTSもあります。
- *.adif
- *.adts
形式 | AAC用のコンテナ | 備考 |
---|---|---|
ADIF | Audio Data Interchange Format | 先頭にヘッダ(蓄積系) |
ADTS | Audio Data Transport Stream | フレーム毎にヘッダ(放送系) |
あと思いつくところでは、wav(wave)やaiff。 * .wav * .aiff
WAV、AIFFは、一般的にはリニアPCM(Pules Code Moduation)の場合が多いようですが、エンコードされたビットストリームも格納できるみたいです。
形式 | ファイルコンテナ | 備考 |
---|---|---|
WAV | Wave File Format (RIFF waveform Audio Format) | Windows |
AIFF | Audio Interchange File Format | Mac OS |
画像も含まれますがmp4, 3gppなど、こちらはメディアを格納するコンテナファイルです。
- *.mp4
- *.3gpp
MP4は、説明するまでもなく動画コンテンツ等で使用されていますが、例えばH.264とAACのような組み合わせで格納されています。また、MP4はMPEG-4規格そのものではなく、MPEG-4規格の一部でファイルコンテナのフォーマットであり、*.mp4ファイルの中身はそのヘッダで表されたメディアが格納されていますので、例えばMPEG-1やMPEG-2も格納できます(MPEG規格以外も格納できますH.263、G.729とか)。 ちなみに、MPEGはISO/IEC、H.263はITU-Tになります。ITU-TのH.264も当然格納できますが、H.264は、MPEG-4 AVCとも呼ばれ、ITU-TとISO/IECの共同で策定したため同じ技術で呼び方が2個あります。ISO/IECとITU-Tでアルゴリズム的にはほぼ同じ技術でも規格として別になると互換性がなくなってしまいます。H.264とMPEG-4 AVCのように規格としても互換があるのは使う側からすると大変ありがたいと思います(ちょっと、映像の話になってしまいました)。
形式 | 画像も含めて(映像/音声の多重) |
---|---|
MP4 | MPEG-4規格の一部でメディアファイルフォーマット(ファイルコンテナ) |
AVI | Audio Video Interleave |
3GPP | 3GPP(Third Generation Partnership Project)が定めたファイルフォーマット |
3GPPも映像/音声のファイルコンテナで、こちらはAMR(Adaptive Multi Rate)が音声で使われることがあります。
規格名 | 規格 | サンプリング周波数 |
---|---|---|
AMR-NB | Adaptive Multi Rate Narrowband | 8kHz |
AMR-WB | Adaptive Multi Rate Wideband | 16kHz |
AMR
AMR(Adaptive Multi Rate)は、音声通信(携帯電話)向けの低レートの音声符号化規格です。ビットレートは、AMR-NBで4.75kbps~12.2kbpsの8種類のレート(modeと呼ばれるもの)があります。MP3やAACに比べると音声を目的にしているので、かなり低ビットレートで圧縮率が高いです。例えば、カラオケBOXにいる友達から電話がかかってきた時、声はまあまあ聞こえても流れている音楽の音質が非常に悪く感じた経験はないでしょうか。音声コーデックの通信がワイドバンドでサンプリング周波数16kHz(この時点で8kHz以上の音は聞こえません)、なおかつ低ビットレート(音声通信を目的にしている、ACELPという方式)の合成音のため、音楽の質はかなり悪くなります。 最近の高品質なものでは、EVS(Enhanced Voice Services)というものがあます。私も標準化に向けての色々を少しだけ経験しました。
MP3
MPEG-2 Audio Layer-3です。mp4ファイルやMPEG-2/4などの規格があるので、何となくMPEG-3では? と思った人がいるかも知れませんが、MP3はMPEG-2です。"3"は、Layer-3 なんですね。DVDとかでMPEG-2の場合オーディオはmp3が多いです。 MP3で検索するとアルゴリズムとしては、フィルターバンク(FB)、MDCT, 聴覚心理, ハフマン符号化、、、というキーワードが出てきます。フィルターバンク(FB)は簡単に言うと帯域分割、MDCTは、FFT(高速フーリエ変換)を聞いてピンとくる人なら分かると思いますが、時間領域から周波数帯域への変換で、私の記憶では、窓を半分ずつ重ねて変換を行っているようなイメージでした。聴覚心理は、例えば、ある周波数の音が大きい時、人間の耳にはその隣接した周波数の音は聞こえにくいということを利用して、エンコードする時に省いてしまってもバレないだろうみたいなアルゴリズムだった記憶しています。ハフマン符号化は良く知られていますが、データの出現率によって圧縮するものだと思っています。処理の順番としてはこんな感じで、実際には並行して別の処理もあるのでかなり大雑把な流れのイメージです。
- エンコード: PCM ➞ 時間領域の処理 ➞ FB ➞ MDCT ➞ 周波数分析や色々 ➞ 量子化 ➞ ハフマンエンコード
- デコード: ハフマンデコード ➞ 逆量子化 ➞ 周波数領域で色々 ➞ IMDCT ➞ 時間領域の処理 ➞ PCM
IMDCTは逆MDCTの意味で、FFTに対してのIFFTと同じ意味です。MDCT(IMDCT), FFT(IFFT)はデジタル信号処理の話になりますので、別の機会に何か書きたいと思います。
AAC
AAC(Advanced Audio Coding) は、MPEG-2 AACとこの技術を引き継いだ MPEG-4 AACがあり、私は、MPEG-2 AACのLC(Low Complexity)プロファイルのエンコーダ/デコーダをやったことがあります。おおざっぱには、MP3と同様にMPEGのAudio規格でオーディオ符号化で、MDCTを使ってます。MP3の後継なのでMP3と同条件(ビットレート)では、AACの方が品質が良いと言われてます(地デジとか)。例えば、MP3がステレオまでに対し、5.1チャネルとか最大48チャネルまで対応しています。
WMA
Windows Medioa Audioは、バージョンがかなりあり、私が携わったものはWMAの初期だったと思うのですが、バージョンが何だったか思い出せません。アルゴリズム的にはMP3やAACと同様なMDCTでした。 .wmv(Windows Media Video) の動画で、WMVと組み合わせて使用されています。例えば編集した動画の保存はみなさん何を選択されるのでしょうか。多くの方はMP4でしょうか。。。Windowsをメインに考えるのな ら、WMV(オーディオはWMA)もありかも知れません(互換性はともかく)。
WAV
私はウェブと呼んでいますが、最近はワブと呼ぶ人が多いですね(webと区別する意味でしょうか。。。)ファイルコンテナなので、中身はヘッダに書いてある音源が格納されていますが、ほぼリニアPCMですね(圧縮されてません)。たまに24bitのPCMとか、5.1chとかありましたがPCMでした。圧縮(符号化)されたものは記憶にないです。従ってファイルサイズはこれが一番大きくなりますが、圧縮しないので保存したり再生する処理は一番早く、音質もデジタル変換(ADC)された元の音です。 (もしかしたら、リニアPCM以外に、μ-Law, a-Lawなど8bitは、あるのかも知れません)
PCM
音響分野の業界では一番使っていると思います。WAVの中に入っている raw data のバイナリで、WAVヘッダが付いてないものです。なので、再生する時はサンプリング周波数とチャネル数が分かってないと再生できません。例えば、自分で再生ツールに48kHzとかステレオとか設定して再生することになります。めんどくさいですね。。。でもこれが一番シンプルなので実はありがたいです。ヘッダが付いているとヘッダ解析する必要があるためです。
最後に
ここに紹介しました音声・オーディオ符号化(WAV以外)は、PCMを符号化(エンコード)したもので、復号化(デコード)再生では、もとのPCMには戻りません(非可逆圧縮)。 ここ近年では、可逆圧縮のコーデックも研究され(ロスレスオーディオ)、例えばMPEG-4 ALSなどがあります。当然圧縮率は低いですが。。。 紹介できなかったものもたくさんあると思います。例えば、Ogg, Opusなどがありますが、今回は経験がなく紹介することができませんでした(勉強します :sweat: )。