【バンドマン向け】pythonを使って音源をサンプリングする方法

## はじめに
こんにちは。大学院生ITストラテジストの岩附陽太です。
今回は、バンドマン向けにpythonを使って音源をサンプリングする方法をお伝えします。

自分は大学の軽音楽サークルでシンセサイザーを弾いています。その際、原曲と同じ音を出したいけど、同じ音色がシンセサイザーの音色リストの中にない場合があります。その際、原曲から楽器の音を切り出して使うことがよくあります。今回はその手法の共有になります。今回はプログラミングをしたことがない人向けに少し丁寧に解説します。

## おおまかなステップ
０：pythonの使用環境を作成する
１：Youtubeからpythonを使いmp4動画として動画をダウンロードする。
２：mp4動画をwavファイルに変換する。
３：wavを音源分離して、各パートの音にわける。
４：分けたパートの音を、時間的に切り出す。

## 使用するライブラリ・ツール
・YoutubeDL
・numpy
・ffmpeg
・pydub
・DemucsGUI

## 注意点
この記事は、身内間の営利目的でないライブ演奏を想定したhow-toの紹介になります。この記事の技術を悪用したトラブル等に関しては一切責任を持ちません。特に、動画の悪用や他者との権利関係の侵害などは、使用者個人が注意してください。

またこの記事は後輩からどのようにサンプリングしているか聞かれたため書いているので、プログラミング超初心者向けに書いてます。

## ０：pythonの使用環境を作成する
他にわかりやすい[資料](https://www.useful-python.com/env-python-vscode-windows/)があるので、基本的にそれらを参考にしてください。
要は
①：pythonそのものをインストール。
②：Visual Studio Codeをインストール
③：Visual Studio Codeのpython用拡張機能をインストール
してくれたら大丈夫です。パスの探し方も入力の仕方も参考資料に載ってます。

## １：Youtubeからpythonを使いmp4動画として動画をダウンロードする。

[参考資料](https://tt-tsukumochi.com/archives/2028)

まず、必要なライブラリをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/1985d2a6-8fa3-a3fd-d47f-7c66d90282ec.png)

こんな感じで左上のTerminalってところで新しいターミナルを開いてください。開いたらそこにこういうコードを打ち込みます。

```言語:yt-dlp
python -m pip install -U yt-dlp
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/56094392-ed4d-ae3a-5999-eefed5d8abc6.png)

これがpythonのpipというパッケージ管理ツールで、ライブラリ（他の人が作ったツールの塊）をインストールするということです。

そこで以下のコードを実行してください。

```python:Use yt-dlp
from yt_dlp import YoutubeDL
# ダウンロード条件を設定する。今回は画質・音質ともに最高の動画をダウンロードする
ydl_opts = {'format': 'best'}

# 動画のURLを指定
with YoutubeDL(ydl_opts) as ydl:
    #ファイル名は手動で変えること
    ydl.download(['https://www.youtube.com/watch?v=L3ViNGDyymA&ab_channel=%E3%82%89%E3%81%B5%E3%81%A9%E3%82%93'])
```

コードを実行するというのは以下のようにやります。まずpythonのファイルを作ります。左上のNewFileです。適当な名前で保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/7ee329e9-e405-d78b-f155-f9b401f5ae0e.png)

ここにコードをコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/39ebd059-3222-447c-c994-1fba3c9d7824.png)

右上の実行ボタン▷を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/c830b2bf-2b87-1f08-49dd-adeec07ff07b.png)

ファイルの中にmp4動画が保存されます。

## ２：mp4動画をwavファイルに変換する。

必要なライブラリをインストールします。Numpyをインストールします。
```言語:numpy
pip install numpy
```

次が今回の最難関です。ffmpegをインストールします。パスを通すだけなのですが、初心者はそれが難しいのでそこもフォローします。

[参考資料](https://qiita.com/studio_haneya/items/a2a6664c155cfa90ddcf)

①まず[ffmpegのダウンロードページ](https://ffmpeg.org/download.html)でwindowsを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/8268392d-ed4b-ae39-b691-61597a11e50d.png)

②Windows builds by BtBNを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/8d34e8bb-cb71-e141-7daf-849dc98105c3.png)

③ffmpeg-master-latest-win64-gpl.zipを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/0c456ed1-9459-d2cb-e81b-7bada8193811.png)

④zipファイルを展開します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/02c10b3d-2e9b-cc09-30e0-19af4cc59738.png)

⑤展開したファイルを適当なフォルダに移動します。ここではDocumentの配下に置きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/2f131160-d1b5-dddf-c6c4-a09d65330f51.png)

⑥移動したファイルをクリックして、中のbinに対して右クリックしてPATHのコピーを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/5763c4f4-6f62-0ab1-692a-83c8dedcd23d.png)

⑦検索窓で環境変数と検索し、システム環境変数の編集を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/f1f61623-5643-6083-3f2d-074a363685b6.png)

⑧右下の環境変数を選びます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/9bf90e37-b71a-19f4-4548-7e1ce0bec004.png)

⑨システム環境変数の新規追加を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/db740726-69cf-18eb-91e6-7b60cd8060d3.png)

⑩環境変数名をffmpeg、先ほどコピーしたPATHを変数値に追加し、OKを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/022cf237-4223-8d0a-224e-aaf49641efca.png)

⑪VScodeのターミナルで、ffmpegと入力し、Enterを押します。以下のように出たらOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/a4937e48-b22c-6218-4bcb-2466da65c45b.png)

⑫ターミナルでpipを使ってffmpeg-pythonをインストールします。
```言語:ffmpeg-python
pip install ffmpeg-python
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/6882facc-157b-ef4a-0d1b-d0381b65f5b7.png)

⑬これでffmpeg-pythonのインストールは完了です。

⑭次に、先ほどのmp4動画の名前は大概長いので、名前を変更します。さっきのURLだと、太陽系ディスコのオフボーカル版が入るのでTaiyouOff.mp4と名前を変えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/08a17845-7e91-0499-732f-be89d435c046.png)

⑮以下のコードを実行します。コードはこの記事を参考にしました。これでwavファイルが入ります。入力の部分は目的の動画の名前を入れてください。[参考文献](https://plantprogramer.com/ffmpeg/)

```python:ffmpeg
import numpy
import ffmpeg
import os 
# 入力 
path="TaiyouOff"
print(os.path.isfile(path+'.mp4'))
stream = ffmpeg.input(path+'.mp4') 
# 出力 
stream = ffmpeg.output(stream, path+".wav") 
# 実行
ffmpeg.run(stream)
```

## ３：wavを音源分離して、各パートの音にわける。
音源分離とは、機械学習の技術を使って、複数の楽器からなる曲を、それぞれの楽器の音に分離する技術です。分離する必要がない場合は基本的にやらなくてもいいです。

この分野自体ではSpleeterやdemcusなんかが有名です。
Demcusは以下の[記事](https://qiita.com/keisuke-okb/items/53932265a36c2544ea25)やこの[記事](https://note.com/mayu_hiraizumi/n/n02cf8212be71)が参考になります。すでにffmpegのパスも通しているので、CUIで行ける人はこっちでいいと思います。

難しいと感じる人はGUI版があります。[この記事](https://golabo.net/use_demucs_gui/)がかなり詳しいです。この通りにやれば大丈夫だと思いますが、7zという、でかいファイルを展開するためのアプリをインストールする必要があります。

音源は、ベース、ボーカル、ドラム、その他（シンセとギターなど）に分かれます。
分離の際にオプションのオーバーラップに関しては、曲によるかもですが0に近づけた方が上手く分離できている感じがしました。

## ４：分けたパートの音を、時間的に切り出す。

①必要なライブラリをインストール。Ffmpegはすでに持っているので、pydubをインストールします。ターミナルにpip install pydubと打ちます。

```言語:pydub
pip install pydub
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/34c5ada1-4a9d-7bd0-4df3-561b788e5189.png)

②以下のコードを実行します。file_pathを変更して目的のファイルのpathにしましょう。また、sound1の中を変更すると何秒から何秒までを取り出すかを決められます。単位はミリ秒です。

```python:pydub
from pydub import AudioSegment
import os

#参考(https://shamimatsu.com/python-wav-cut/)
# wavファイルのパス　例（D:\music\melody.wav）
file_path = 'TaiyouOff.wav'

# 元ファイル名に_cutをつけてリネーム
root, ext = os.path.splitext(file_path)
out_path = os.path.join(root + 'Test1' + '.wav')

# wavファイルの読み込み
sound = AudioSegment.from_wav(file_path)

# 0～10秒を抽出[0:10000]で
#ここでは33秒から33.5秒を抽出
sound1 = sound[33000:33500]
# リネームされて出力
sound1.export(out_path, format="wav")
```

こうして目的のサンプリング音源であるTaiyouOff.wavを得ることができました。あとはここの切り出す秒数を変化させて、調整しましょう。

## 終わりに

いかがだったでしょうか。Pythonには様々な人が作ってくださった便利なライブラリがあるので、ライブ演奏などでもぜひ活用していきたいですね。

今後も役に立つ技術などをご紹介できればと思います。よろしければぜひLinkdinやFacebookでお見知りおきを！今後ともよろしくお願いいたします。