• Tidak ada hasil yang ditemukan

ボイスチェンジャーについて - 明治大学

N/A
N/A
Protected

Academic year: 2025

Membagikan "ボイスチェンジャーについて - 明治大学"

Copied!
12
0
0

Teks penuh

(1)

ボイスチェンジャーについて

2020年度卒業レポート

木村友祐 2021 年 2 月 24 日

目 次

1 イントロ、ボイスチェンジャーの仕組みについて 1

2 Mathematicaにより周波数を調べる方法 2

3 リング変調 5

3.1 リング変調とは . . . . 5

3.2 録音した音をリング変調してみる . . . . 5

3.3 ボイスチェンジされた音を元に戻す . . . . 8

3.4 2回ボイスチェンジすると? . . . . 10

4 終わりに 11

5 付録 12

6 参考文献 12

1 イントロ、ボイスチェンジャーの仕組みについて

私はぼんやりと卒業研究では音に関することをしたいなと思っていたのだが、そ うすることになって先生からもらった本の中で一番興味のある分野がこのボイス チェンジャーについてだったので、これを取り扱うことにした。

 ここでボイスチェンジャーとは何か一度説明しておく。ボイスチェンジャーと はその字のごとく、声を変えられるシステムである。ニュースなどでインタビュー

(2)

する方がだれかわからないようにするために声を変える時などに使われる。

 そのボイスチェンジャーには「イコライザー」や「フォルマント変換」などいく つかやり方があるが、今回は「リング変調」という仕組みを使ったボイスチェン ジャーのプログラムをしてみた。

2 Mathematica により周波数を調べる方法

ボイスチェンジャーで実際の音の信号がどう変わるかを解析するに当たって準 備が必要なので、それを見ていく。

 『信号処理とフーリエ変換』という授業内でも説明されているMathematicaで 周波数を調べるという方法で今回音の解析を行っていった。(桂田[2])

 以下では、録音したファイルをMathematicaを使って周波数を調べる手段を述 べている。

ファイルを読み書きするには、作業フォルダを変更する必要がある。

SetDirectory[" /aoki/wavechange"]

“aaa.wav”のファイルを読み取る。

(“aaa.wav”は、私があー、と普通に話す時の感じで発した音を録音したファ イルである。)

(snd = Import["aaa.wav", "Sound"])

読み込んだ信号のリストを得る。

(tbl = snd[[1, 1, 1]];

sr = snd[[1, 2]])

srから3秒分のデータを取り出してプロットしてみる。

(3)

音が鳴り始める56000番目あたりの音から1秒分取り出して、1600個プロッ トした。

tb=Take[tbl,56000+1,56000+sr];

g=ListPlot[tb,Joined->True, PlotRange->{1,1600},-0.5,0.5]

音が鳴り出してから1秒間の信号を離散フーリエ変換して、1600個のcを見 る。

(離散フーリエ変換について:

xを周期Tの関数とする時、N Nを固定して、

 ω=ωN=exp2πiN 更に、jZに対して  tj=jf racT N, xj=x(tj)

とおく。 xjは周期Nの数列である。フーリエ係数cnを台形公式で近似し たものを離散フーリエ係数Cnとすると、

Cn=T1N1

j=1 x(tj)exp(2πinT tj)NT   =N1N1

j=0 ω(−jn)xj

 が成り立つ。Cnもnについて周期Nの数列である。

 写像xjCnを離散フーリエ変換という。

(4)

)(参考:松山[3])

ピークが120-135で出ているのでさらに範囲を絞る。

 この時は、自分のあーと発した声のピークは約127Hzであると言える。(Math- ematicaのFourier関数は最初のデータを1ではなく0から数えることから1ずれ ることを考慮している。)

(5)

3 リング変調

3.1 リング変調とは

リング変調とは、どんな仕組みなのか。

 リング変調とは、音データにサイン波を掛け合わせて新しい信号を得る仕組み のことである。 例えば、音データが振幅ac、周波数fcのサイン波の場合、振幅 am、周波数 fmのサイン波をかけ合わせると次のようになる。

s(n) =acsin

(2πfcn fs

) amsin

(2πfmn fs

)

(0≤n ≤N 1) ...(1)

そして、この式は次のように展開することができる。

s(n) = acam

2 cos(2π(fc+fm)n fs

) + acam

2 cos(2π(fc−fm)n fs

) (0≤n≤N 1)

これはすなわち、周波数fcと周波数fmのサイン波から、周波数fc+fmと周波数

|fc−fm|のコサイン波が生成されるということになります。

このように、音データにサイン波を掛け合わせることで周波数特性を変化させ、そ の結果として音色を変化させることがリング変調によるボイスチェンジャの原理 になっています。

3.2 録音した音をリング変調してみる

このリング変調を使ったボイスチェンジのプログラムを実行して行くのだが、リ アルタイム処理でのボイスチェンジの前にまずはあらかじめ録音しておいた音声 ファイルをボイスチェンジして見て、その音の周波数特性などを見ていきたいと 思います。

 まず、録音をしたwaveファイルをリング変調を用いてボイスチェンジするプロ グラムはこうなっている。(青木[1]の第1章のプログラムを参考にして作った。)  また、青木[1]で使われていた“wave.h”はMac環境では使えなかったので、修

正した“wave mk.h”を使っている。この修正箇所については、付録として後に載

せておく。

”wavechange.c” ソースコード

(6)

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include "wave_mk.h"

int main(void) {

MONO_PCM pcm0, pcm1;

int n,fs;

double am,fm;

wave_read_16bit_mono(&pcm0, "aaa.wav"); /* 音データの入力 */

pcm1.fs = pcm0.fs; /* 標本化周波数 */

pcm1.bits = pcm0.bits; /* 量子化精度 */

pcm1.length = pcm0.length; /* 音データの長さ */

printf("length= %d\n",pcm1.length);

pcm1.s = calloc(pcm1.length, sizeof(double)); /* 音データ */

fs = pcm0.fs; /* 標本化周波数 */

am = 1.0; /* 振幅 */

fm = 300.0; /* 周波数 */

for (n = 0; n < pcm1.length; n++) {

pcm1.s[n] = am * sin(2.0 * M_PI * fm * n / fs) *pcm0.s[n]; /* 音 データのコピー */

printf("%f \n ",pcm1.s[n]);

}

wave_write_16bit_mono(&pcm1, "aaachange.wav"); /* 音データの出 力 */

free(pcm0.s);

free(pcm1.s);

(7)

return 0;

}

 このプログラム内の“aaa.wav”が、“aaachange.wav”では、テレビのニュースな どでプライバシーを保護する際にきくような音に変わっている。

 このプログラムでは、(1)式のamを1、fmを300Hzに設定している。

 このボイスチェンジの前と後でどのように音が変化したかを詳しく見るために、

準備の段落で行なった手段に従いMathematicaを使って詳しく見て行くことにし た。(参考:桂田[2])

 まず、”aaa.wav”での解析結果は、私があああと普通に発した音の周波数は約 127Hzになった。次に、”aaachange.wav”で同様の解析を行った時の波形について は次のようになった。

図 1: “aaachange.wav” 図 2: “aaa.wav”

 解析結果としては、約173Hzのところが一番高い波ではあるが、次に約427Hz のところでも高い波が見られるというような結果になった。

 これは、リング変調の仕組み通り、元の音の周波数127Hzと、ボイスチェンジ するためにかけあわせたサイン波の周波数fm300Hzを足したもの、つまりfc+fm である427Hz,そして|fc−fm|である173Hzという結果が出た。

 次に、ギターの5弦の2フレットを押さえてドの音を出したものをボイスチェン

(8)

ジしたらどうなるかやって見た。

(“guitar5gen.wav”はギターの5弦の2フレットを押さえてドの音を出したものを 録音したwaveファイル、“guitar5genchange.wav”はそれをリング変調でボイス チェンジしたwaveファイル)

図 3: “guitar5gen.wav” 図 4: “guitar5genchange.wav”

 この結果としては、“guitar5gen.wav”での音の周波数は約124Hzになった。

次に、“guitar5genchange.wav”での周波数は、約176Hzと、約424Hzのところで高 い波が見られて、これもしっかりリング変調の仕組み通りサイン波の周波数同士を足 したものと、引いたものの絶対値という結果が出た。また、この“guitar5gen.wav”

と“guitar5genchange.wav”の結果の方が、とてもわかりやすく出ている。

 これらの結果から、リング変調の仕組みがこのプログラムでは実行できているこ とと、混じり気の少ない音であればあるほどその結果はわかりやすいものになっ ていることがわかる。

3.3 ボイスチェンジされた音を元に戻す

リング変調でボイスチェンジされた音を元に戻すことはできるのかプログラム を使ってやってみた。そのプログラムは下記のものである。

ソースコード

(9)

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include "wave_mk.h"

int main(void) {

MONO_PCM pcm0, pcm1;

int n,fs;

double am,fm;

wave_read_16bit_mono(&pcm0, "aaachange.wav"); /* 音データの入 力 */

pcm1.fs = pcm0.fs; /* 標本化周波数 */

pcm1.bits = pcm0.bits; /* 量子化精度 */

pcm1.length = pcm0.length; /* 音データの長さ */

printf("length= %d\n",pcm1.length);

pcm1.s = calloc(pcm1.length, sizeof(double)); /* 音データ */

fs = pcm0.fs; /* 標本化周波数 */

am = 1.0; /* 振幅 */

fm = 300.0; /* 周波数 */

for (n = 0; n < pcm1.length; n++) {

pcm1.s[n] = pcm0.s[n]/(am * sin(2.0 * M_PI * fm * n / fs)) ; /* 音 データのコピー */

printf("%f \n ",pcm1.s[n]);

}

wave_write_16bit_mono(&pcm1, "motoaaa.wav"); /* 音データの出 力 */

free(pcm0.s);

(10)

free(pcm1.s);

return 0;

}

 このプログラムは、3.2で使われた”aaachange.wav”にリング変調の際に掛け合 わせた振幅am,周波数fmを割ることで、元の音に近いファイル”motoaaa.wav”を 生成したものになっています。

 この“motoaaa.wav”が元の音に近いものになっているかを、スペクトルを見て

確認すると次のようにかなり近いものに戻っていることがわかります。

図 5: “aaa.wav” 図 6: “motoaaa.wav”

3.4 2 回ボイスチェンジすると?

 では、ボイスチェンジしたものもう一度ボイスチェンジする、すなわち2回 ボイスチェンジしたものはどういうスペクトルを描くのか見て見たいと思います。

  スペクトルの前に、簡単にどのようにして2回ボイスチェンジしたかを説明して おくと、先述の”wavechange.c”に1度ボイスチェンジされた”guitar5genchange.wav”

(11)

を入力して、2回ボイスチェンジされたwaveファイル”guitar5gennikai.wav”を生 成するという流れである。

 それでは、スペクトルを見比べてみよう。

図 7:

“guitar5gen.wav”

図 8:

“guitar5genchange.wav”

図 9:

“guitar5gennikai.wav”

 これを見ると、“guitar5gen.wav”と“guitar5gennikai.wav”はピークが約

124Hzでほとんど同じところになっている。これも、リング変調の式から考えると

足し引きした周波数のコサイン波が出てくることから考えると妥当な結果になっ ているのではないかと思われる。

 しかし、“guitar5gen.wav”と“guitar5gennikai.wav”の2つは同じような高さ に聞こえるものの、元に戻そうとするプログラムで生成されたものほど同じ音に は聞こえない。これはスペクトルから読み取れる限り、ピーク以外の部分がリン グ変調される際にいくつもできていることからそうなっているのではないかと読 み取れる。

4 終わりに

様々な実験をする際に、ギターの1音をボイスチェンジしてみた時より人の声 をボイスチェンジしてみた時の方がかなり音のスペクトルが複雑になっていたこ とから、ボイスチェンジを使えばプライバシー保護はかなりできているんだな、と 感じた。 また、リング変調についての色々な実験を行いリング変調の仕組みは サイン波の周波数の足し引きでできている簡単な仕組みであることはわかったが、

(12)

よりこれについて実験をするのであれば位相が違うものを元に戻す場合のプログ ラムなどは組むことができなかったのでそういう実験や、リアルタイム処理のも のについてももっと詳しい実験をしてみても面白そうだなと感じた。

5 付録

“wave mk.h”修正箇所

①文字コードを UTF に変換

②long riff chunk size; をlong riff chunk size = 0; に,long data chunk size;を long data chunk size = 0;に変換

③WAVE HEADERという型を追加

int check wave(WAVE HEADER *pcm, char *file name) という関数を追加 void wave read 16bit mono() を修正

6 参考文献 参考文献

[1] 青木直史,サウンドプログラミング入門-音響合成の基本とC言語による実装-, 技術評論社 (2013).

[2] 桂田祐史,信号処理とフーリエ変換 講義ノート,http://nalab.mind.meiji.

ac.jp/~mk/fourier/fourier-lecture-notes.pdf

[3] 松山周五郎, 音のFourier解析(明治大学理工学部数学科 卒業研究レポート) (2013).

Referensi

Dokumen terkait

メールアドレス変更・削除フォームを送信すると、入力したメールアドレス宛に メールが届きます。 左のメールが届いた場合は、メールアドレスの変 更に失敗しているため、もう一度メールアドレス 変更・削除フォームを開き、メールアドレスの変 更をやり直してください。 2... 正常にメールアドレスの変更が完了していると、全部で2通のメールが届きます。

学力に関する証明書について【神戸女子短期大学】 【注意事項】 小学校教諭二種免許状の学力に関する証明書をお求めの場合は、事前に必ず教務課へご連 絡ください。 ◆学力に関する証明書は、教育職員免許状に係る履修科目等を証明するものであり、教員免 許状の申請や追加で教員免許状を取得する場合に使用するものです。(成績証明書とは異な ります。)

9 WWW サーバ Webサーバとは… • クライアント ブラウザ のリク エストに応じてサービス Web コンテンツ を提供する計算機 or ソフトウェア. • サーバソフトウェアには多くの 種類がある. - 例:Apache, nginx, Microsoft IIS … 2020年8月Webサーバシェア サーバとは…

8.5デジタル・フィルターを作る続き 8.5.7ローパス・フィルター 低い音は通すが、高い音はカットする、ローパス・フィルターlow-pass filter を作 ろう。 最初は素朴に考える。Fe >0として、次を目標にする。 Fe 以下の周波数の信号はそのまま通し、Fe より高い周波数の信号は一切通さない。 その周波数Fe に対応する正規化角周波数 ωe

自習するなら, 例えば松坂 和夫著「集合·位相入門」岩波書 店, 1968年 の第1章§6の内容を理解すれば十分である.. x, y∈Rのとき,

8.3 コンパクト集合 「コンパクト」という言葉は「トポロジー」で学ぶ。「数学解析」の授 業ではその説明を省略し、次の定理もi ⇔ii のみ証明する。 定理 12.3 RN のコンパクト集合の特徴づけ RN の部分集合K について、次の3つの条件は互いに同値である。 i K は有界閉集合である。 ii K 内の任意の点列は収束部分列を持ち、その極限は K

2 ︱多摩大学︱学生ジャーナル︱ No.10︱ 水辺のある風景はなぜ人の心を和ませるのだろう。 私にとって多摩川は、子供のころから親しんできた「水辺のある風景」 だった。友達の犬を散歩させたり、散歩している人を探しに川べりに出 たり、お花見に行ったり、四季折々の多摩川の景色とともに沢山の思い出

9.13 適切な問題のための条件 微分方程式の解を一意に定めるためには、連続の方程式、運動方程式以外に、境界条 件や初期条件が必要になる。 この講義では、以下θやρは定数として議論を行うが、そうでない場合にどうすれば 良いか、簡単に説明しておく。 温度θの変化を考える場合、熱方程式のような方程式を導入することになる。