チャンネル 2 つとノイズだけで歌唱合成

# 概要

Mikuro さいな です. 普段はプログラミングをしたり, ピコピコ音源 (いわゆる Chiptune ジャンル) での楽曲アレンジをしたりしています ([ニコニコ動画](https://www.nicovideo.jp/user/40015175), [Audiomack](https://audiomack.com/mikuroxina/)). 今回は後者の Chiptune アレンジにて使っている, 2 チャンネルの音を使った歌声の表現について書いていこうと思います.

この記事は日本の読者を対象にしているため, とりあえず日本語の音声合成だけを解説します.

# 理論

## パルス波

パルス波とは, 音量の段階が 2 段階しかなく, その 2 段階ごとではっきり区間が分かれている下図のような波です.

![パルス波の例 その 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371948/160b8ebe-cb28-e487-f1ec-b32d1768108b.png)

[パルス波の音声](https://drive.google.com/file/d/1aqvUmjh_Zuo7ygNly3EVPAMnG0ItBY5V/view?usp=sharing)

パルス波のこのカクカクした波の形から, 矩形波, 方形波などと呼ばれることもあります. 波全体を 100% として, このパルスの幅を 0% から 50% の間で変えることができます (50% より大きくしても, 波としては 100% から引いた % と全く同じだからです). パルス波のパルス幅を明示すると, N% パルス波のようにいいます.

![パルス波の例 その 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371948/c678609c-d8a4-84e6-1c1b-b5051166425b.png)

[より短いパルス幅のパルス波の音声](https://drive.google.com/file/d/1bEgQWJG5XcCTRX0bo2kA-xc5YQj4Xyu4/view?usp=sharing)

パルス幅が短いほど, より明るい音になっているというのは感じられると思います. 不思議なことに. そこで, この「明るい感じ」が何をもって得られているのかを少し調べてみましょう.

フーリエ変換を行うことで, 波の中にどの周波数成分がどのくらいの強さで含まれているのかを解析できます. それでは, このパルス波をフーリエ変換するとどのような周波数成分になるのでしょうか. 横軸を周波数にした波の分布である, 周波数スペクトラムに描画してみましょう (画像はイコライザの描画機能によるものです).

![50% パルス波の周波数スペクトラム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371948/d7ae08e7-4efb-03f9-e131-d3a96f675971.png)

先程から鳴らしている音はすべて C4 = 523.26 Hz でした. これは画像中央の一番大きい山の周波数ですね. しかし画像を見るとそれ以外の周波数成分が含まれているようです. 残りの山はだいたい 1570, 2620, 3660, 4700, ... Hz といった感じです (縦横ともに対数軸であることに注意). どうやら周波数 $f$ の 50% パルス波には, 周波数が $2n + 1$ 倍 ($n$ は自然数) の波を含んでいると考えられます.

そして, パルス波を短くしていくとこのように周波数成分が変化します. 先程よりも明らかに山が増えました.

![12.5% パルス波の周波数スペクトラム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371948/ea78d48e-c27e-983c-c48f-31879668b40b.png)

この山の周波数も調べると, 1050, 1570, 2090, 2620, 3140, ... Hz と最初の 523.26 Hz の整数倍になっています. 山の高さも, 50% では高周波になるにつれ小さくなるだけだったのに 12.5% では再び大きくなっていく部分があります. この違いが音色の違いを生んでいそうです.

## 三角波

三角波とは, 同じ傾きで線形に上下を繰り返す下図のような波です.

![三角波の例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371948/ea003fc1-da47-a86e-5df6-c1398f2f2e4d.png)

[三角波の音声](https://drive.google.com/file/d/1zEIzyAyHkGrqT-nKuItdlpj2L4VrKH2r/view?usp=sharing)

非常に暗い音だというのは感じられると思います. 神秘的.

こちらの周波数成分は下のとおりです. 三角波の音量が小さい関係で, 先程のパルス波の結果とは縦軸をずらしています. 重ねて比較する場合はご注意ください.

![三角波の周波数スペクトラム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371948/ce7e6c21-42ad-21d2-47ea-eb0659138950.png)

こちらは 50% とほとんど同じ山の分布ではあるものの, 山の下がり具合が 50% パルス波と比べてかなり急になっています.

それでは以上の音のうち *50%/25%/12.5% パルス波* と *三角波* の中から 2 種類のみを使って, 歌唱合成のお話をしていきます.

# 実践

日本語は母音 (あ, い, う, え, お, ん) とその他子音の並びで構成されますが, シンプルな波だけではリアルな音声に近づくことは到底ありません.

しかし, 2 種類の波形を加算したものを頻繁に変えることで波の周波数成分に大きな変化が生まれます. これを用いて日本語の発音に近い音を鳴らすことで歌っているかのように聞かせます.

## 母音

まずは簡単な母音から見ていきます. 「あ」の音は非常に簡単で, 数 Hz ほど周波数をずらした 12.5% パルス波だけでそれっぽくなります.

[「あ」の音声](https://drive.google.com/file/d/1AoIhi3-oeG3yKdUOwwnmmPVasghWrqLK/view?usp=sharing)

なお, 周波数を少しずらしたことで *うなり* という現象がが生じています. この現象を数式で表すと, 一方の音の波形 $\sin (\omega - \alpha) t$, 重ねる他方 $\sin (\omega + \alpha) t$ の和は以下のようになるということです (一般の波についてはフーリエ級数で説明できるということで省略させてください).

$$
\begin{align*}
\sin (\omega - \alpha) t + \sin (\omega + \alpha) t & = \sin (\omega t - \alpha t) + \sin (\omega t + \alpha t) \\\\
& = \sin \omega t \cos \alpha t - \cos \omega t \sin \alpha t + \sin \omega t \cos \alpha t + \cos \omega t \sin \alpha t \\\\
& = 2 \sin \omega t \cos \alpha t \\\\
& = 2 \cos \alpha t \sin \omega t \\\\
\end{align*}
$$

こうして振幅が $2 \cos 2 \alpha t$ で変化するため, 音量が一定でなくなり歌声らしくビブラートのかかった音になるわけです. 以降の音も, すべて周波数を上下に 1 Hz ずらした (2 Hz 程度のビブラートがかかった) ものであることにご注意ください.

暗い感じの 50% パルス波で「お」の音を作ることが出来ます.

[「お」の音声](https://drive.google.com/file/d/1RJ5VSPP0n_KYF9yiVyl8g3JAvktpRG5h/view?usp=sharing)

「う」の場合は, 重ねる波の一方を三角波に, 他方を 25% パルス波にします.

[「う」の音声](https://drive.google.com/file/d/1DslhuK3-F0d09kOJBRhr_ilGeOUQgQUg/view?usp=sharing)

完全な「ん」の音は三角波だけで構成できます.

[「ん」の音声](https://drive.google.com/file/d/1BNw3WDm7MS73eyz-2R_SiRxwGFPTkycZ/view?usp=sharing)

「い」と「え」は非常に厄介です. というのも, 日本語この音は他の言語と比べて発音が曖昧で, 歌い方や曲の雰囲気によって使うべき波形が変わります. 基本的には 25% パルス波ですが, 12.5% パルス波を重ねて明るくしたり 50% パルス波を重ねて暗くしたりと工夫することになります. ~~ちょっとくらいサボっててもあんまりバレません.~~

[「い」や「え」に聞こえるかもしれない音声](https://drive.google.com/file/d/1TN5_Wd_9NyEx6bil8RdMiSjoD7h6_qo3/view?usp=sharing)

## 子音

先程の母音を鳴らす直前に子音の音も鳴らせば, 念願のちょっとリアルな歌唱になってきます. 流石にすべての子音を区別してチャンネル 2 つだけで表現することはできないので, ある程度のグループに分けて同じ子音を追加いまわしています. 以下, 音声サンプルは「あ」の母音に揃えています.

### 破裂音

「か」,「が」,「た」,「だ」,「ぱ」, などの音がこれです. **急激** に音量を上げながら **低** 音の雑音を鳴らすと近い音になります. しかし曲のパーカッションが激しいと聞こえにくくなり, そうなると作り込む意味があまり意味がなくなります.

[「か」の音声](https://drive.google.com/file/d/1bwbgXrBoqDDvs2GSIQqV_sDzFMUATwrt/view?usp=sharing)

### 破擦音

「ざ」,「ば」,「じゃ」, などの音がこれです. **徐々** に音量を上げながら **高** 音の雑音を鳴らすと近い音になります.

[「ざ」の音声](https://drive.google.com/file/d/1ao2FL0zNKlZWaJhBb34TYEV_wn1BxGsA/view?usp=sharing)

### 摩擦音

「は」,「さ」,「しゃ」,「ふぁ」, などの音がこれです. **徐々** に音量を上げながら **低** 音の雑音を鳴らすと近い音になります. より吐息が強い感じにしたい場合は母音を三角波に変えます (というかそうしないと分からないことが多い).

[「は」の音声](https://drive.google.com/file/d/1ZsH1_dNnffDj4i01mu_tjS1QnJqK0X5U/view?usp=sharing)

### はじき音

「ぱ」,「ば」,「ら」, などの音がこれです. 本来のパルス幅を長くしてから **急激** に短く変化させすると近い音になります.

[「ぱ」の音声](https://drive.google.com/file/d/1XGoN2m_pboNhfaKu9voUYgXgfcG3voog/view?usp=sharing)

### 口蓋音

「わ」,「や」,「ま」, の音がこれです. 本来のパルス幅を長くしてから **徐々** に短く変化させすると近い音になります. 音量の出始めを伸ばす (ADSR の Attack を大きくする) ことも多いです.

[「わ」の音声](https://drive.google.com/file/d/1LN6EPwP5FNXZwG__x4kUb1SxJ2UPadDK/view?usp=sharing)

# まとめ

以上でだいたいの解説はしました. 実際には ADSR など他のパラメータ変化の細かいタイミング調整なども加えつつ適度に手を抜いて作っています. ぜひ VOCALOID とか持ってない人でも最後に書いておいたフリー音源などを使って無理やり歌唱合成してみてください.

## 使用音源

- パルス波と三角波 [SANA_8bit_VST](https://github.com/m-masaki72/SANA_8BIT_VST)
- ノイズ [YMCK Magical 8bit Plug](https://ymck.net/app/magical-8bit-plug/)