Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python

PyAudio でリアルタイム再生録音・音加工(モノラル録音⇒ステレオ再生)の実装テンプレート

概要 Python で音声や音楽をリアルタイム再生・録音するライブラリとしてはPyAudioが良く知られています。 今回は、PyAudio を使って再生と録音を同時に行う方法を紹介します。 このサンプルコードを使うことで、ディレイやリバーブ、声質変換といった音声加…

Perfume The Best "P Cubed" の全52曲をテンポ特徴でクラスタ分析

事始め Perfume のベストアルバム Perfume The Best “P Cubed” を購入しました。 これまで(~2018年)の楽曲の中から全50曲 + 新曲2曲が収録されています。 全52曲。なかなかのデータ数です。 そういえば、最近のPerfumeの楽曲ってFuture BassやDub系が増え…

Pythonで曲の楽器構成やAメロ・Bメロ・サビのタイムラインをプロット

やりたいこと 時系列信号・データを扱っていると、その信号に対する各種イベント・ラベル(例:どんな音が鳴っているか)を時間とともに表示したいと思うことが多々あります。 そこで、Pythonの matplotlib で時間波形に対するイベント(ラベル)のタイムラ…

matplotlib: 棒グラフでハッチパターンを使う

やりたいこと 論文など、白黒印刷が想定される紙媒体や、色の見え方の個人差に考慮したメディアでの棒グラフの作り方として、ハッチパターンを使ったものがよく使われています。 今回は、matplotlib でハッチパターンの棒グラフを描画してみます。 解決方法 …

adjustText: matplotlib の散布図でラベルの重なりを自動調整

問題点 matplotlib の散布図などのプロットの際に、各点にラベルを付けてプロットしたい場合、下の図のようにラベルが重なってしまうため、ラベル付きプロットを諦めることが多々ありました。 図1: 散布図 (Before) 解決方法 ラベルの配置を制御する方法を探…

Python (LibROSA) で音高 ・クロマ特徴を算出する方法

はじめに 音楽の分析では、メロディー、ハーモニー、リズムの3つ要素から特徴を捉えるのが重要です。 特にハーモニーに関しては、音楽理論による体系化(例:コード、コード進行)が出来ています。そのため、 分析した結果の意味付けがしやすいので、計算機…

matplotlib: 棒グラフの色を階級ごとに度数に応じてグラデーション

やりたいこと シンプルで綺麗なグラフは、得なことが多いです。 見た人の思考や感性に訴えかけ、新たな発見や次のステップへの道筋を示してくれます。または、相手によってはグラフ自体に価値がある場面もあります。 しかし、そんなグラフを人手で作りこむの…

Mutagenチートシート: MP3, AAC (.m4a), FLACのタグ・メタデータ抽出

Mutagen チートシート オーディオデータのタグ・メタデータ抽出に便利なPythonモジュール Mutagen。 この記事では、よく使う3つのコーデックでのメタデータ抽出でよく使いそうな、 mutagen オブジェクトのキーおよびインスタンス変数をまとめました。 https…

Python: Mutagenで複数のAAC (.m4a) 音源からタグ・メタ情報を抽出

はじめに 音楽分析を行う時には、音響信号だけでなく、大量の音源からのメタデータの抽出・編集・読み込み・書き込みが必要となることがあります。 手動でメタデータを管理する場合、 Mp3tag のようなソフトウェアを使うのが楽ですが、大量の音源のメタデー…

Python: オブジェクトフィールドを辞書型に変換

やりたいこと class Data(): def __init__(self, a, b, c): self.a = a self.b = b self.c = c data = Data() Python上でデータをいじることになると、オブジェクトフィールド(クラス変数/インスタンス変数)から辞書型にパパっと変換したいと思うことが多…

matplotlib: xticks/yticksで設定した軸ラベルの重なりを整える

やりたいこと python のmatplotlib を用いて時系列データをプロットするとき、時系列のラベルが大量にあるせいで、 xticks, yticks で設定した軸ラベルが重なってしまうことがあります。plt.xticks の rotation オプションでラベルを回転させれば多少マシに…

Pythonで楽曲のリズム・テンポ分析: テンポグラム (Tempogram)

はじめに 楽曲分析では、メロディー、ハーモニー、リズムの3大要素から特徴を捉えるのが大事です。 ハーモニーに関しては、音楽理論による体系化(コード、コード進行など)が出来ていることもあり、計算機による分析も他の要素よりも普及しています。 一方…

Numpy: 1次元配列から、特定の値の範囲のみを抽出した1次元配列を作る

やりたいこと numpyの1次元配列 x の内、v_min 以上 v_max以下の要素だけを抽出した1次元配列 y と、対応するインデックスの1次元配列 indices を得たいとします。 >>> x array([0.20204346, 0.71742434, 0.05195665, 0.50794105, 0.08809835, 0.80818671, 0…

Pythonで楽曲のリズム・テンポ分析: Novelty Curve (楽曲変化検知曲線)

はじめに この記事では、Onset 検出や局所/大域のテンポ分析などリズム分析においてよく使われる、Novelty Curve についてPythonのコードとともに紹介します。実装と理解の助けになれば幸いです。 はじめに Novelty Curve/Function (Onset_envelope) 実装と…

librosa.core.load() のバックエンドが audioread から PySoundFile に代わった件

PySoundFile vs audioread ? LibROSAを最新版 (0.7.1) に更新したら、LibROSAの音楽信号の読込を担う load()のバックエンドが、audioreadからPySoundFileに代わったとのこと。 ただし、LibROSA 0.7.1では、PySoundFileがインストールされていない場合は代わ…

Python:Jupyter notebooksで音楽信号分析の基礎を学べるフレームワーク:FMP Notebooks

AudioLabs @ FAU の、音楽信号処理の権威、Meinard Müller 先生が、ご自身の著書 "Fundamentals of Music Processing (FMP)."に沿った教材として、Jupyter notebooks で音楽信号処理の基礎を学べるフレームワーク:FMP Notebooks を公開しています。 音楽信…

Python: LibROSA で調波打楽器音分離 (HPSS)

調波打楽器音分離とは? 一般的な楽曲では、様々な楽器音が含まれています。 そのため、元の楽曲信号から直接、音楽的な情報(例:コード進行)を分析するのは 計算機ではなかなか難しいです*1。 そこで、分析の前処理として、 打楽器の音と非打楽器(調波楽…

Python: LibROSAによるBPM自動算出の詳細 

はじめに この記事では、Python向けの音楽信号分析モジュールである LibROSAで 実装されているBPMの自動算出手法について、Pythonのコードをベースに解説します。 BPM自動算出の概要・設計の方針については、以下の記事をご参考ください。 www.wizard-notes.…

楽曲のBPMを自動算出するプログラムの作り方(Pythonサンプルコード付き)

はじめに 音楽分析では,楽曲のテンポを表す BPM (Beats Per Minute) は重要な情報です。 例えば、音楽ジャンルごとに典型的なBPM/テンポがあるので、BPM/テンポはその楽曲がどんな音楽ジャンルに属するかを知る手がかりとなります。 一般的ないくつかのジ…

Flask:オーディオファイルをjQuery.ajaxでアップロードしながら、クライアント側でローカルのファイルを再生

スクリーンショット 背景 実装戦略・参考ページ サーバへの複数オーディオファイルのアップロード(ドラッグアンドドロップ) サーバ側でのファイルアップロード処理・ファイル保存 クライアント側で、ローカルにあるオーディオファイルを再生 実装 ディレク…

Flask:Webアプリでサーバ上のオーディオファイルを再生・ダウンロード(Blueprint版、デモ付き)

概要 ディレクトリ構成 ソースコード views.py ポイント1:index.htmlの配置とディレクトリ構成 ポイント2:サーバから送るファイルの配置 run.py(一部掲載) index.html デモ 概要 前回ご紹介した、ブラウザ上でサーバ上の音源を再生するFlask実装を、Bl…

Flask:Webアプリでサーバ上のオーディオファイルを再生・ダウンロード

概要 ブラウザ上でサーバ上の音源を再生するWebアプリを、Flaskで実現するための実装例です。 ディレクトリ構成 flask_play_audio/ ├ music/ │ └ audio.mp3 ├ templates/ │ └ index.html └ app.py ソースコード app.py # -*- coding: utf-8 -*- from flask i…

LibROSA: ステレオ信号のWAV書き出し(write_wav)におけるstruct.errorの解決方法

問題点 表題の通り、以下のコードでエラーが発生します。 import librosa sr=44100 #オーディオ信号をNumpy形式でロードし、yに格納 y, sr = librosa.core.load(input_filepath, sr=sr, mono=False) # yをwavフォーマットで書き出し # ここで、yがステレオ信…

Flask+Flask-Dropzone+LibROSAで作るオーディオ信号処理基盤

はじめに 実装 index.html Flaskの主要部(app.py) オーディオ信号処理モジュール 最後に はじめに NumPyやLibROSA、scikit-learnなどのPythonの素晴らしい信号処理・統計解析モジュールを利用してオーディオ信号処理アプリを作るため、学習コストが低いマ…

ロバスト主成分分析(Robust PCA)によるメロディ・歌声抽出(Python実装)

概要 以前から気になっていた、 Robust PCAによる歌声抽出 *1 を実装し、実際の楽曲でボーカル抽出をやってみました。 Robust PCAについて Robust PCAによる歌声抽出では、楽曲を表す行列\({\bf X}\)を低ランク行列\({\bf L}\)とスパース行列\({\bf S}\)の和…

NMF2DのPython実装と楽曲への適用(和音、音色分析)

動機 近年、深層学習による音信号処理が流行しており、様々な分野で優れた成果が報告されています。 よく利用されているネットワーク設計であるCNN(畳み込みニューラルネット)を眺めてみると、単層ではNMFD、NMF2Dと似た信号処理であることに気づきます。…

Python モジュール・関数の動的なインポート

概要 開発したPythonスクリプトに対して、ユーザが処理(関数)を簡単に追加できるようにする方法として importlib が使えそうだったので、試してみました。 フォルダ構成 root/ ├ main.py └ plugins/ └ my_funcs.py 実装 ユーザが追加する関数には、あらか…

Anaconda (Windows10):conda で Permission Error

問題 Windows10において、conda update condaやconda install tensorflow で以下のようなエラーと遭遇しました Preparing transaction: done Verifying transaction: done Executing transaction: failed ERROR conda.core.link:_execute(502): An error occ…

Pythonにおける辞書型を用いた多数の実験用パラメタ・実験条件の管理について

やりたいこと 研究開発におけるパラメタの探索や、API化を見据えたPython上でのアルゴリズム開発において、 以下のような実験用パラメタの管理を考えます。 config = { "param_0": [0.01, 0.1, 1.0], "param_1": ["l1", "l2"], "param_2": [0, 10, 20, 30] }…

YouTube Data API を使って複数の音楽動画のコンテンツID・メタ情報をまとめて収集

はじめに 今回は、動画に紐づいた動画メタ情報・統計情報の抽出、およびYouTube-dlによる楽曲解析スクリプトの入力となる複数動画のコンテンツID・メタ情報を収集する方法を紹介します。 抽出には、YouTube Data API を利用します。 はじめに YouTube Data A…