wav・mp3・flacの違いをざっくり理解しよう〜音質・ファイルサイズ・圧縮方法あれこれ〜

# 概要

私は音楽・動画を扱うサービスの開発に携わっているため、今回は代表的な音声コーデックについて

- 音質とファイルサイズに関わる要素
- それぞれの圧縮方式

を調べてみました。


# 音質とファイルサイズに関わる要素

音質とファイルサイズには主に
- サンプルレート
- ビット深度
- ビットレート

が関係します。それぞれ以下で説明します。

# サンプルレート
1秒間に記録されるオーディオデータの量です。単位はbps、kbpsなどと表されます。
波に対する横方向の細かさと考えられます。

そもそも音声は滑らかな波形で表されます。

このアナログ（生音源）の波をオーディオデータとして扱うために、数値のデータに変換します。
下図のようなイメージです。
例えばCDでは44100Hzであり、これは1秒あたりサンプルを44100回記録していることになります。

サンプルレートが高い音源の音質が良い理由は、生の楽器から出るような滑らかな波形に近い形をデータとして再現できるからです。

![サンプルレート高.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/1226555d-6721-96b8-bc70-5256e07e9672.jpeg)


一方で、サンプルレートが少ないと下図のように元の波を再現しきれず音質の劣化につながります。
 
![サンプルレート低.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/421e62a8-63ae-eb30-dae6-e09734f52de5.jpeg)

## ビット深度

サンプルレートで説明したオーディオデータ1つ1つに対して割り当てる情報量を表し、
8、16、24、32bitなどが主に使われています。（CDは16bit=0～65535）
こちらは波の縦方向のデータ表現の細かさと考えられます。

![ビット深度高 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/5d7a5a33-0b4e-b836-4e0a-eb970dd3521f.jpeg)


![ビット深度低.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/2490b578-4026-77d9-94bd-026a8e38dee3.jpeg)


## ビットレート

サンプルレート（Hz）×　ビット深度（bit）×　チャンネル数　＝　ビットレート（bps）で表すことができる、１秒間当りに送受信できるデータ量です。
標準的なCDでは44.1kHz、ビット深度16bit、チャンネル数2（ステレオ）なので、

44100bps×16bit×2チャンネル=1411.2kbit/sとなります。

ストリーミングではCDに比べてビットレートは落ちますが、160kbps程度あればデータ通信量を押さえつつ音質もある程度確保できます。

> オーディオ CD のビットレートは常時、1秒間に1,411キロビット（Kbps）です。MP3 形式は96 から320Kbpsで、Spotify などのストリーミングサービスはだいたい96から160Kbpsです。

https://www.adobe.com/jp/creativecloud/video/discover/audio-bitrate.html


# 圧縮方式とコーデック

## 無圧縮（wav）

言葉の通り、圧縮していない音声ファイルです。
音質は良いですが、データ量が多くストレージを圧迫したり、DLに時間がかかるデメリットがあります。

## 非可逆圧縮（mp3）

圧縮前の状態には戻せない圧縮方式です。mp3はこの方式で圧縮されています。
ちなみにmp3にはビット深度という概念がないそうです。

また、後述のflacに比べて圧縮率が高いです。
例えば一般的にmp3で用いられる最も高いビットレートは320kbpsですが、これはwavの1,411kbpsに対して22.7%に圧縮されています。

圧縮に関わる技術として、以下のものが挙げられます。

### 聴覚心理に基づいた圧縮

人間は音をざっくりとしか判別することができないため、人間が分からない部分のデータを省略してしまおうという考え方です。

#### 1. 高音域データの省略
人間は高音の音量変化には鈍感で、多少の音量変化を判別することができません。
逆に、低い音の音量変化には敏感です。
そこで、高音域側の音量データを省略し、データ量を削減します。

#### 2. 小さい音を削る

人間は一般的には20Hz〜20kHzの音を聴くことができますが、周波数によって聴くことのできる最低の音量が異なります。
高音と低音でごく小さい音が鳴っていても聴こえず、音量をある程度上げる必要があります。
一方、赤ちゃんの泣き声や家電のアラームなどの高さである2kHz〜4kHzは最も聞き取りやすいです。

この特性を利用し、高音と低音で聴こえないレベルの小さい音を削って、データ量を削減します。

参考: 
https://natuch.com/2015/01/21/mp3/
https://www.signia.net/ja-jp/blog/local/ja-jp/sound-frequency-and-hearing/


#### 3. 大きな音の後ろで鳴る小さな音の省略

似た周波数帯域で複数の音が同時になっている時、最も大きい音しか聴こえません。
そこで、大きな音に隠れる小さい音は削って、データ量を削減します。

### 高音域のカット
mp3では、ビットレートを落とすほど高音域がカットされ、データ量を削減します。

#### wav
こちらが無圧縮の状態の楽曲の周波数分布です。これをmp3に変換し、徐々にビットレートを下げていくとどうなるか確認してみます。

![wav.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/6c171065-53b1-2ca7-aab9-52434151df63.png)

#### mp3（320kbps）
高音域（画像右端）に注目すると、少し削られていることが分かります。

![320kbps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/a70350d2-8bf5-7aaa-4add-100361d62bc8.png)

#### mp3（256kbps）
320kbpsよりも削り幅が増えました。

![256kbps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/c6a1f2e9-e336-3614-4322-fafcda341968.png)

#### mp3（192kbps）
ここは256kbpsとあまり変化は見られませんでした。
ここまでは十分高音質と言えます。

![192kbps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/d228412c-5158-b913-cd1d-ce4619402144.png)

#### mp3（128kbps）
192kbpsと比べて、高音域の波形が崖のように削られていることが分かります。
この辺りから高音の楽器であるシンバル等の音質の低下が気になる人が増えてくると思います。

![128kbps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/968452ad-036f-f325-fde1-436ef969d065.png)

#### mp3（96kbps）
一気にカットの幅が増加しました。ここまでくると、かなり音質が気になるでしょう。

![96kbps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475547/cb59cae6-7f3b-a065-20ae-6955e26eed0d.png)

### ハフマン符号化

データの出現頻度が高いパターンには短い符号を、頻度が低いパターンには長い符号を割り当てることで、元々のデータをより短く表現する方法です。

例えば、以下のような文字列があるとして、
```
ECACDCACDBD
```
これを固定長の符号で表すと、1文字につき最低3ビット必要となります。
（2ビットの場合00、01、10、11の４種類の文字しか表せない）

以下のような文字と符号を対応させた場合、

```
  A   B   C   D   E
 000 001 010 011 100
```
メッセージは、以下のように表すことができます。

```
100010000010011010000010011001011（33ビット）
```

ここで、それぞれの文字の出現回数は
- A：2回
- B：1回
- C：4回
- D：3回
- E：1回

です。
そこで、出現頻度の高い`C`には短い符号、出現頻度の低い`B`と`E`には長めの符号を割り当てると、以下のような対応表となります。

```
A     B    C   D    E
011 　0101　  1  　11  1010
```
すると、メッセージを以下のように表すことができ、
```
101010111111011111010111（24ビット）
```

33ビットから24ビットに圧縮できました！（元々の73%）


## 可逆圧縮（flac）

Free Lossless Audio Codecの略で、音質を損なうことなく圧縮することができます。
圧縮はZipの仕組みに似ていますが、flacはオーディオ専用に設計されているため、より優れた圧縮が可能です。

### 特徴
- データ化の際に圧縮処理（エンコード）を施しますが、視聴時にもとの音源状態に復元（デコード）しながら再生します
- エンコードされたデータをデコードすると、元々のオーディオデータとビット単位で同一である（音質が劣化しない）
- デコードの処理が軽く、ハードウェアの性能が低くても問題ない

https://xiph.org/flac/

### なぜflacは音質がそのままなのにデータ量が小さくできるのか？

mp3の圧縮方式と比較すると、音質を犠牲にしないためなぜデータ量を小さくできるのかよくわかりません。
調査して分かった範囲で、理由を記載します。

#### 1. 一部のメタデータを保存しない
flacでは、wavに存在するメタデータのうち一部を保存しないようです。
その理由は、flacの目的がwavの全てを再現することではなく、<b>「オーディオデータをロスレスで圧縮すること」</b>だからです。

> なぜFLACはすべてのWAVEメタデータを保存しないのですか？
FLACがWAVEファイルを圧縮するのであれば、なぜ技術的にはWAVEファイル圧縮機ではないのですか？
>
> (デフォルトでは、flacはWAVEのメタデータを保存しませんが、後述の--keep-foreign-metadataオプションを使えば保存できます)。
>
> FLACは汎用のオーディオ・フォーマットであり、単なる圧縮WAVEファイル・フォーマットではありません。微妙な違いがある。WAVEは複雑な規格で、オーディオデータ以外にも多くの種類のデータを入れることができる。FLACの目的は、オーディオ以外のデータも含めてWAVEファイルを再現することではなく、オーディオをロスレスで圧縮することです。
https://xiph.org/flac/faq.html#general__not_wave_compressor

#### 2. ゴロム・ライス符号化（を拡張したもの）

符号化・復号の計算量が少ないのが特徴ですが、圧縮率は先に挙げたハフマン符号化と同等かそれより劣るようです。
flacでは試聴時にデコードしながら再生するため、計算量の少ないこちらが採用されているのかもしれません。

アルゴリズムは[こちら](http://www.nct9.ne.jp/m_hiroi/clisp/abcl63.html#:~:text=%E2%97%8F%E3%82%B4%E3%83%AD%E3%83%A0%E3%83%BB%E3%83%A9%E3%82%A4%E3%82%B9%E7%AC%A6%E5%8F%B7,n%20%E3%82%92%E7%AC%A6%E5%8F%B7%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)で説明されています。

<b>参考issue</b>

このissueでは、エンコードの仕様が質問されており、
そこで出た結論について以下参考PRで説明文が追加されています。

https://github.com/ietf-wg-cellar/flac-specification/issues/55

<b>参考PR</b>

https://github.com/ietf-wg-cellar/flac-specification/pull/101/files#diff-a99b89685c6e06f042383cee8977b6dbd002c784fdfddddb21a0f73d18da6020R14

このPRで追加された説明文より、ゴロム・ライス符号化を拡張したものが利用されていることが分かります。
> FLACは、Shortenで使用されている固定予測子、LPC係数量子化、ライス符号化を些細なことで拡張・改善する。




### flacの圧縮率
こちらで4461曲を圧縮した結果が掲載されています。だいたい元々の50〜60%に圧縮できるようです。

https://hbfs.wordpress.com/2012/02/07/looking-at-flac-compression-ratios/

|  | 元ファイルに対する圧縮後のサイズ（%） |
| ---- | ---- |
| 最小値 | 14.3 |
| 平均値 | 54.6 |
| 中央値 | 56.8 |
| 最頻値 | 63.0 〜 65.4 |
| 最大値 | 82.5 |

ただし、flacには圧縮レベルが0〜8まであり
8に近づくほど圧縮に時間がかかりますが、圧縮率は高くなります。

# まとめ

## wav
非圧縮で、基本的には最も音質が良い（波形が原音に近い）と考えていいですが、ファイルサイズが大きいデメリットがあります。

## mp3
ビットレートを選択し、圧縮することでwavの22.7%（320kbpsの場合）に圧縮できます。
人間の耳で聴き分けられられない音を削除するなどしてファイルサイズを小さくしているため、圧縮率は高いですが元に戻せない（非可逆圧縮）デメリットがあります。

## flac

オーディオデータを可逆圧縮しています。エンコード後、デコードしながら再生することで元々のオーディオデータと波形が一致します。
mp3に比べて圧縮率は低いですが（wavの50〜60%程度）、音質が劣化しないメリットがあります。