一つの曲から「声」を取り出せるシステム【中間発表】
システムの概要
○開発動機
私は、音楽が好き。小さいころから毎日たくさん曲を聞いて成長してきた。高校に入って、聞くだけでなく作る側にも回ってみたいと思いDTMを始めた。そこで、数か月前にiZotopeという会社がRX7というPluginを開発した。その中に歌とベース、ドラムに自動で分解することができる機能があった。価格は40000円と高く、自分でも作りたいと思った。
○完成イメージ
曲の中にある「声」と「楽器」が一緒に流れているものを、作成したシステムに入れると、自動で「声」と「楽器」の二つのファイルにするシステム
システムの詳細
○搭載する機能の紹介
【要件定義】
・声の周波数を学習させる
・一つの曲をシステムに読み込ませる
・FFT(高速フーリエ変換)を行い純音に分解
・声の周波数を学習させたデータより声を摘出
・残りの純音から伴奏を摘出
・摘出したそれぞれのデータを二つのファイルにする
【開発計画】
1)環境の作成
AnacondaからJupyterでPythonの環境を構築。
2)FFTを実装する
import numpy as np
F=np.fft.fft(f)
np.fft.fftを使うことでFFTを実行することができる
3)音源を関数に変換する←イマココ
.wavや.mp3のファイルを周波数と時間の関数に変換することでFFTが可能になる
4)関数をFFTして純音(Sin波)に変換する
純音に分解し、後の計算に純音の関数を与える
5)声の周波数の構造を与える
人の声は複雑なように見えて、楽器より特徴があるため、その特徴を認識させる
6)純音から声を摘出する
前の認識させた声の特徴から、純音を組み合わせて声を作成する
7)音源の関数から声を摘出する
作成した声を最初の音源の関数から摘出し、差から伴奏の音を摘出する
○取り組んだ内容
【流れ】
・音の分解とは何かについて理解を深める
声や、楽器。電車などの環境音はすべて純音(sin波)に分解できることを知った
純音に分解する方法はフーリエ変換を使った
・離散フーリエ変換の理解を深めた
一つの関数から離散的な値を取り出し、その値をフーリエ変換するというもの
この離散フーリエ変換を高速に繰り返す処理を高速フーリエ変換
・FFTの理解を深める
プログラムを組むことで簡単に処理を行える
簡単にFFTやグラフの表示を実装できるライブラリがある
・PythonでFFTを実装した
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
sample = 32
n = np.arange(sample)
cycle = 4
f = np.sin(2 * np.pi * cycle * (n/sample) )
F = np.fft.fft(f)
plt.plot( (np.abs(F) / sample * 2)[:int(sample / 2 ) + 1 ] )
実行結果
これで一つのsin波を高速フーリエ変換することができた
二つ以上の場合も試してみることにした
sample = 128
n = np.arange(sample)
cycle1 = 2
cycle2 = 6
f = np.sin(2 * np.pi * cycle1 * (n / sample) ) + np.sin(2 * np.pi * cycle2 * (n / sample) )
plt.figure(figsize = (8,4) )
plt.plot(f)
実行結果
F = np.fft.fft(f)
plt.plot( (np.abs(F) / sample * 2)[:int(sample / 2) + 1] )
実行結果
これで二つの音が分解できていることが分かった
○こだわった点
PythonのNumpyに含まれているFFTを使えば簡単にできるフーリエ変換できますが、どういうものか理解してから実装することにした
○苦労した点
数学Ⅲや物理を受けていないと理解できないような、高校生には難しい内容が多々あった
その都度物理の先生、数学の先生に直接聞きに行った
Pythonをほとんど覚えていなかった
【開発環境】
○AnacondaからJupyterを使い、Pythonを実行した
・Anaconda
Pyhon本体と多くのライブラリなどをまとめたPythonパッケージ
パッケージ管理と展開がとても簡単に行うことができる
・Jupyter notebook
プログラムや説明、実行結果をまとめて管理ができるデータ分析に特化したツール
・Python
文法が単純化されたプログラミング言語である
2学期への意気込み
このシステムを完成、もしくは完成に近づけてAOの入試に使えたらなと考えているため1学期のようにのんびりやっていくのではなく、わからなかったらすぐ調べて実行したいと思います。
夏休みがコロナの影響で短くなりましたすが、この期間もできるかぎりシステム開発を進めて早く完成させたいと思います。
つづきの記事はこちらからお読みください。