一つの曲から「声」を取り出せるシステム 中間発表その2
見出し画像

一つの曲から「声」を取り出せるシステム 中間発表その2

千葉県立柏の葉高等学校 情報理数科

システムの詳細

〇搭載する機能の紹介

【前回からの変更点】
音を計算で分離させる行為が思っていたより難しかったためもう一度、先行研究などの検索を行ったらオープンソースの「Spleeter」という物が開発されていることを知った。
Spleeterを使用して声と伴奏を分けた音源ファイルからさらに声のみを綺麗に取り出すためのシステムの開発のようなものに変更した。

【開発計画】
Spleeterのインストール
実際に使用したのち、出力される声だけが入っているファイルからスペクトル解析を行う。
スペクトル解析した配列からピークの周波数と、その倍音を引数にwavファイルを出力してみる。

〇取り組んだ内容

【流れ】
今学期初めに、もう一度どのように声を消すべきなのか検索をしたら、Spleeterというオープンソースのプログラムがあることを知った。
Spleeterとは
Spleeterについて詳しく調べた結果
・公式ホームページがない
・Deezer社がAIに多くの楽曲をディープラーニングさせ、学習させたプログラム
・オープンソース
・Pythonライブラリで使用可能
・開発途中
・Githubに公開
ということが分かった。
公式ホームページがないためSpleeterというプログラムを見つけることが非常に困難であった。
Spleeterを使う上でSpleeterのGithub内にあるWikiを読んだ。
軽くまとめておく 調べてわかったこと
ソース分離問題は昔から関心を持たれていた。人間は楽器の音を聞き分けるのに優れている。(カクテルパーティー効果)多くの楽曲でディープラーニングさせることでAIにも認識させることができるはず。まだ開発途中だが、多くのプログラマー(音楽ハッカー)に使ってもらいたい。他のプログラマーは多くの楽曲の情報を持っていないからこのプログラムを売り出すのはフェアじゃない、だからオープンソースで公開する。GPU搭載のパソコンであればリアルタイムの100倍早くソース分離が可能。

このgithubのwikiを読み実際に使ってみようと思った。

Spleeterのインストール

前回の記事で記載した通り、今回のシステム開発ではAnacondaからJupyter Notebookを使用し、Pythonにてシステム開発を行う。
そのため基本的なライブラリは、ほとんどインストールされていたがその中にSpleeterは含まれていなかった。
Anacondaのpromptにて実行したプログラム

git clone https://github.com/deezer/spleeter
conda install -c conda-forge spleeter
conda env create -f spleeter/conda/spleeter-cpu.yaml
conda activate spleeter.cpu

実行をしてみた結果エラーが出てきた。

EnvironmentFileNotFound: 'C:\Users\yukku\spleeter\conda\spleeter-cpu.yaml' file not found

このディレクトリにspleeter-cpu.yamlがないからエラーが起きてしまった。
なので、textからyamlファイルを作ることにしたが中に書くべき内容が分からなかったため調べたら同じエラーが発生してしまう人が投稿している記事を見つけた。
https://umeten.hatenablog.com/entry/2020/04/24/005316
状況がまったく同じだったため、そのままコピーすることにした。

name: spleeter-cpu
channels:
- conda-forge
- anaconda
dependencies:
- python=3.7
- tensorflow=1.14.0
- ffmpeg
- pandas==0.25.1
- requests
- pip
- pip:
- museval==0.3.0
- musdb==0.3.1
- norbert==0.2.1
- spleeter

自身でこのテキストファイルを作成して、上記のテキストをコピーして貼り付けた。

conda env create -f spleeter/conda/spleeter-cpu.yaml

を再実行

結果としてインストールに成功した。
だが、Spleeterのpythonの書き方が独特で難しいことが分かった。
ここからはAnaconda JupyterNotebookを使用する。

Spleeterの使用

Spleeterでは簡単に音を分けることができるとWikiに書いてあったが他のライブラリなどどまったく違う書き方であるとともに、helpを実行しても英語のhelpが表示された。

テンプレートから実行した内容

from IPython.display import Audio # sound test 
import ffmpeg
import spleeter # spleeter import
Audio(‘***.wav’) # test audio
!spleeter separate -i ‘***.wav’ -o output/ # spleeting

実行した結果エラーが起こってしまった。
!spleeter~~の書き方が間違っているようだった。
一度spleeterのhelpの表示をした。

import spleeter
!spleeter separate -h

実行結果

usage: spleeter separate [-h] [-a AUDIO_ADAPTER] [-p CONFIGURATION]
                        [--verbose] -i INPUTS [INPUTS ...] [-o OUTPUT_PATH]
                        [-f FILENAME_FORMAT] [-d DURATION] [-s OFFSET]
                        [-c {wav,mp3,ogg,m4a,wma,flac}] [-b BITRATE] [-m]
                        [-B {tensorflow,librosa,auto}]
optional arguments:
 -h, --help            show this help message and exit
 -a AUDIO_ADAPTER, --adapter AUDIO_ADAPTER
                       Name of the audio adapter to use for audio I/O
 -p CONFIGURATION, --params_filename CONFIGURATION
                       JSON filename that contains params
 --verbose             Shows verbose logs
 -i INPUTS [INPUTS ...], --inputs INPUTS [INPUTS ...]
                       List of input audio filenames
 -o OUTPUT_PATH, --output_path OUTPUT_PATH
                       Path of the output directory to write audio files in
 -f FILENAME_FORMAT, --filename_format FILENAME_FORMAT
                       Template string that will be formatted to
                       generatedoutput filename. Such template should be
                       Python formattablestring, and could use {filename},
                       {instrument}, and {codec}variables.
 -d DURATION, --duration DURATION
                       Set a maximum duration for processing audio (only
                       separate offset + duration first seconds of the input
                       file)
 -s OFFSET, --offset OFFSET
                       Set the starting offset to separate audio from.
 -c {wav,mp3,ogg,m4a,wma,flac}, --codec {wav,mp3,ogg,m4a,wma,flac}
                       Audio codec to be used for the separated output
 -b BITRATE, --birate BITRATE
                       Audio bitrate to be used for the separated output
 -m, --mwf             Whether to use multichannel Wiener filtering for
                       separation
 -B {tensorflow,librosa,auto}, --stft-backend {tensorflow,librosa,auto}
                       Who should be in charge of computing the stfts.
                       Librosa is faster than tensorflow on CPU and uses less
                       memory. "auto" will use tensorflow when GPU
                       acceleration is available and librosa when not.


outputのファイルのパス定義にはクオーテーションをつける必要がないことを知った。
また、どうやら設定をすれば伴奏と声の2種類以外の分離方法も可能らしい。
エラーを起こしていた部分を直して再度実行した。
使用した曲はDOVAのカワサキヤスヒロ氏のランプ、空に輝く星を見上げながらをのせます。

from IPython.display import Audio # sound test 
import ffmpeg
import spleeter # spleeter import
Audio(‘ランプ.mp3’) # test audio
!spleeter separate -i ランプ.mp3 -o output/ # spleeting
!spleeter separate -i 空に輝く星を見上げながら.mp3 -o output/ # spleeting

(※担当の教員より 「空に輝く星を見上げながら」はデータサイズが大きく、そのままではnoteにアップロードできなかったので圧縮しました。)

どうでしょうか。まだ、かさかさした音が残っています。
この声だけを取り出したとされるファイルからフーリエ変換を行い、一番大きい周波数から倍数を取って、出力すれば、声が取り出せると考えた。

フーリエ変換を行う

spleeterを使用し、分離した音源ファイルはパス指定ができるので、その指定したパスに出力されるファイルをそのまま高速フーリエ変換してピーク値を取り出し、逆フーリエ変換してwav出力すればいいと考えた。

前学期の記事でフーリエ変換についてまとめたが、逆フーリエ変換でつまづいてしまった。

現段階では逆フーリエ変換をするところで開発が止まっている。

【前回からの進展】

〇こだわった点
 自分にも見やすいようにコメントアウトをつけたことや、ファイルの整理を行い自身が今何をやっているのかわかりやすい環境にした。

〇苦労した点
 spleeterのインストールがうまくできず1か月ほどこれだけに時間を割いてしまったこと。

【開発環境】
 windows10 pro
 Anaconda Jupyter NoteBook

3学期に取り組みたいこと

引き続き、逆フーリエ変換を行い、出来次第プログラムの開発に戻ろうと考えている。

よろしければシェアもお願いします。
千葉県立柏の葉高等学校 情報理数科
千葉県立柏の葉高等学校 情報理数科の公式note / 全国専門学科「情報科」高等学校長会 事務局 / 日本で唯一の「情報理数科」の高校 / 【投稿内容】◇専門教科「情報」の授業 ◇情報理数科独自の取り組み ◇Google Workspace&Microsoft Teamsの活用