質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1066閲覧

WAVファイルをkmeans法で分類したい

kirinrin0x0

総合スコア2

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/13 12:55

前提

用いているプログラミング言語:python
データセット:https://github.com/karolpiczak/ESC-50
参考にしているサイト:https://magazine.techacademy.jp/magazine/28780

音声処理初心者で、プログラミングが苦手な学生です。いろいろ調べて行っているのですが、中々答えにたどり着けずにいます。

私と同じようなことを行っているサイトがありましたら教えていただけますでしょうか。
WAVファイルをkmeans法で分類したことのある方がいらっしゃいましたら教えていただきたいです。

実現したいこと

・音声ファイルをkmeans法で分類したい
・”mix.wav”はESC-50-masterの中の音声データ2つを重ね合わせたもの

発生している問題・エラーメッセージ

・前処理の段階でエラーが出てしまう

エラーメッセージ
AttributeError Traceback (most recent call last)
Cell In[4], line 3
1 with wave.open(FILE_PATH , 'rb') as wr:
2 #前処理
----> 3 dataframe = pd.read_wav('FILE_PATH')
4 # df = pd.DataFrame(data=FILE_PATH)
5 print(df.head())

File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas_init_.py:264, in getattr(name)
260 from pandas.core.arrays.sparse import SparseArray as _SparseArray
262 return _SparseArray
--> 264 raise AttributeError(f"module 'pandas' has no attribute '{name}'")

AttributeError: module 'pandas' has no attribute 'read_wav'

該当のソースコード

python

1from matplotlib import pyplot as plt 2from sklearn import datasets, preprocessing 3from sklearn.cluster import KMeans 4import numpy as np 5import pandas as pd 6import wave 7 8#データの読み込み 9#wav=open("./ESC-50-master/audio/mix.wav") 10#sample = wav.load() 11 12# 読み込みモードでWAVファイルを開く 13FILE_PATH = "./ESC-50-master/audio/mix.wav" 14 15with wave.open(FILE_PATH , 'rb') as wr: 16 #前処理 17 dataframe = pd.read_wav('FILE_PATH') 18 # df = pd.DataFrame(data=FILE_PATH) 19 print(df.head()) 20 21 #クラスタリング用のデータの整形 22 X=df[["cat","sheep"]] 23 sc = preprocessing.StandardScaler() 24 sc.fit(X) 25 X_norm = sc.transform(X) 26 print(type(X_norm)) 27 28 #クラスタリング 29 cls = KMeans(n_clusters=2) 30 result = cls.fit(X_norm) 31 32 #結果の出力 33 plt.scatter(X_norm[:,0],X_norm[:,1], c=result.labels_) 34 plt.scatter(result.cluster_centers_[:,0],result.cluster_centers_[:,1],s=250, marker='*',c='red') 35 plt.show()

試したこと

・WAVファイルはpandasでは開けないのかと考え、WAVファイルをpandasが読み込めるファイルに変換しようと考えたができなかった。

・pandasを用いない前処理も探したが見つけることが出来なかった
・mix.wav をスペクトログラム変換したのだが、これは前処理が終わったとは言えない…?

・WAVファイルをkmeans法で分類しているサイトを探したが出てこなかった(CNNを用いているものばかりだった)

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/01/13 14:47

> WAVファイルをkmeans法で分類したい > CNNを用いているものばかりだった 「kmeans法」に拘る理由は何でしょうか?
kirinrin0x0

2023/01/14 15:29

こんばんは、コメントありがとうございます。 シンプルで初心者にも分かりやすいと聞いていたのでk-means法にこだわって調べていました。 分かりやすいものから始めて慣れたらCNNに移行しようと考えていました。
guest

回答1

0

ベストアンサー

WAVファイルはpandasでは開けないのかと考え、WAVファイルをpandasが読み込めるファイルに変換しようと考えたができなかった。

Pandasには非構造化データを読み取る機能はありません.Pandas - input/output

pandasを用いない前処理も探したが見つけることが出来なかった

NumPySciPyなどのライブラリでFFTをはじめとする前処理が可能です.

mix.wav をスペクトログラム変換したのだが、これは前処理が終わったとは言えない…?

質問掲載コードのどこでもスペクトログラム変換が実行されていません.

WAVファイルをkmeans法で分類しているサイトを探したが出てこなかった(CNNを用いているものばかりだった)

そもそも論,非構造化データをk-Means法で分類することの影響/効果を理解されての質問でしょうか.
RightCode - 【機械学習】ブログのサムネ画像をクラスタリングしてみる!
このサイトでも示されている通り,wavファイルのデータそのものに対してk-Meansを純粋に適用するだけでは,聴覚的(上記サイトでは視覚的)な特徴で分類することにはなりません.多次元配列のindex-wiseな比較がされて分類されることを許容するのなら話は別です.

追記

ESC-50を使ったdogcatのk-Means法によるクラスタリング例及びt-SNEを利用した可視化を次に示します.

Python

1import os 2import wave 3from matplotlib import pyplot as plt 4from sklearn import preprocessing 5from sklearn.cluster import KMeans 6from sklearn.manifold import TSNE 7import numpy as np 8import pandas as pd 9 10df = pd.read_csv("ESC-50-master/meta/esc50.csv") 11data = df[(df["category"] == "dog") | (df["category"] == "cat")][["filename", "category"]].values 12 13X, y = list(), list() 14for i, (file, category) in enumerate(data): 15 with wave.open(os.path.join("./ESC-50-master", "audio", file), "r") as f: 16 buf = f.readframes(1024) 17 X.append(np.frombuffer(buf, np.int16)) 18 y.append(category) 19 20cls = KMeans(n_clusters = 2).fit(X) 21reduced = TSNE(n_components = 2).fit_transform(X) 22 23plt.figure(figsize = (8, 4), dpi = 100) 24plt.scatter(reduced[:, 0], reduced[:, 1], c = cls.labels_) 25for i in range(len(y)): 26 plt.annotate(y[i], xy = (reduced[i][0], reduced[i][1])) 27plt.savefig("output.png", dpi = 100) 28plt.tight_layout() 29plt.show()

イメージ説明

2クラスタとなるようn_clustersを指定したものの,catのうち1つ(画面左端の黄点)が分離されるだけでほとんど同一クラスタと見なされました.

投稿2023/01/13 13:56

編集2023/01/16 00:43
PondVillege

総合スコア1579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kirinrin0x0

2023/01/14 15:27

回答ありがとうございます。 スペクトログラム変換は別にjupyter notebookにコードを書いていて、こちらには載せていませんでした。 シンプルで初心者にも分かりやすそうだったのでK-means法を選択しました。非構造データでも特に支障なくできるだろうと深く考えずに行っていました。 k-means法では音声ファイルは分類できないのですね...CNNで行ってみようと思います。
PondVillege

2023/01/14 16:36

> シンプルで初心者にも分かりやすそうだったのでK-means法を選択しました。 入門の内容として悪くないアルゴリズムの選択ですが... > k-means法では音声ファイルは分類できないのですね...CNNで行ってみようと思います。 分類はできます.上記のサイトで示している通り,聴覚的(上記サイトでは視覚的)な特徴で分類せず,多次元配列のindex-wiseな比較がされて分類されることになるだけです.これを許容するのか否かはっきりさせて利用すべきアルゴリズムです. もし,勉強のためにk-Meansを使うなら,分類が簡単なiris等の構造化データに対して使うべきです.最終的に音声の分類を目的としているにしても,データの解析を怠って闇雲にそこらへんに転がっている手法を適用するのは推奨しかねます.ので,meg_さんはk-Meansに拘る理由を聞き出そうとしています. たとえば,k-Meansを利用した分類には次の質疑応答で示されるような問題があります. https://qiita.com/beidaochuan/questions/fff781216e09ddcf3ec4 また, > ”mix.wav”はESC-50-masterの中の音声データ2つを重ね合わせたもの とのことですが,具体的にどのような処理で重ねたか,どのようなデータになったか,明記すべきだと思います.この操作の詳細なしでは回答者が再現性のある解決法を示すことができません.
kirinrin0x0

2023/01/15 16:52

分類はできます.上記のサイトで示している通り,聴覚的(上記サイトでは視覚的)な特徴で分類せず,多次元配列のindex-wiseな比較がされて分類されることになるだけです.これを許容するのか否かはっきりさせて利用すべきアルゴリズムです. >>「多次元配列のindex-wiseな比較」とはどういったものなのでしょうか?調べ方が悪いのか上手く検索できません… もし,勉強のためにk-Meansを使うなら,分類が簡単なiris等の構造化データに対して使うべきです. 最終的に音声の分類を目的としているにしても,データの解析を怠って闇雲にそこらへんに転がっている手法を適用するのは推奨しかねます. >>他のサイトを見るとirisデータを使っている方が多かったので、そうしようと思います。 irisデータを用いて解析をしてみた後、これからの音声処理を行うにあたって何をするのが良いでしょうか? たとえば,k-Meansを利用した分類には次の質疑応答で示されるような問題があります. https://qiita.com/beidaochuan/questions/fff781216e09ddcf3ec4 >>手本と違う分類をしてしまう時もあるんですね... 具体的にどのような処理で重ねたか,どのようなデータになったか,明記すべきだと思います.この操作の詳細なしでは回答者が再現性のある解決法を示すことができません. >>スマホアプリの「音楽編集」で2つの音を重ね、wavファイルで保存しました。
PondVillege

2023/01/15 17:58

> 「多次元配列のindex-wiseな比較」とはどういったものなのでしょうか? 先に示したサイトの以下の画像前後にある内容が,それです. https://rightcode.co.jp/wp-content/uploads/2019/09/image_distance.png 画像で言うところのpixel-wiseな比較による話で展開されています. > irisデータを用いて解析をしてみた後、これからの音声処理を行うにあたって何をするのが良いでしょうか? irisのテーブルデータで解析ができたのであれば,そのコードを音声データ用に書き換えて,クラスタリングによる分類に取り組んでみたら良いのではないでしょうか. 質問のコードを見た感じ, * Pandas.DataFrameの使い方がよくわかっていない(テーブルデータ用の読み込み方を使っている) * 結果出力にあたって,テーブルデータ用の表示方法を利用している 等の改善の余地が多々見られます. これらを音声データ読み込みができるよう,書き換えれるかどうかは質問者のスキル次第ですが,よくわからなければPythonの基礎から振り返るべきです. > スマホアプリの「音楽編集」で2つの音を重ね、wavファイルで保存しました。 2つ重ねた理由と目的を伺ってもよろしいでしょうか.
kirinrin0x0

2023/01/16 01:17

先に示したサイトの以下の画像前後にある内容が,それです. 画像で言うところのpixel-wiseな比較による話で展開されています. >>ありがとうございます。 irisのテーブルデータで解析ができたのであれば,そのコードを音声データ用に書き換えて,クラスタリングによる分類に取り組んでみたら良いのではないでしょうか. >>音声データに書き換えるところでつまづきそうですが、頑張ります! 質問のコードを見た感じ, * Pandas.DataFrameの使い方がよくわかっていない(テーブルデータ用の読み込み方を使っている) * 結果出力にあたって,テーブルデータ用の表示方法を利用している 等の改善の余地が多々見られます. これらを音声データ読み込みができるよう,書き換えれるかどうかは質問者のスキル次第ですが,よくわからなければPythonの基礎から振り返るべきです. >>おっしゃる通りでPandas.DataFrameについて全くわかっていなかったのでサイトを真似して使っていただけでした。頑張ってみます。 2つ重ねた理由と目的を伺ってもよろしいでしょうか. >>1つのファイルには1つの音声データしか入っていないので、2つ重ねることで2つの音声データをk-means法で分類しようと思っていました。
PondVillege

2023/01/16 02:17

> 1つのファイルには1つの音声データしか入っていないので、2つ重ねることで2つの音声データをk-means法で分類しようと思っていました。 なるほど,納得が行きました.やはり未経験でデータセットの構成法を知らない状態での取り組みだったのですね. 普通,追記で示したようなX.append()で音声を重ねるということをします.ここらへんの配列処理まわりの話やデータセット構築のやり方がわからないうちは,機械学習を初めとする応用分野のコードを書くのではなく,最低限チュートリアルを済ませることを推奨します.画像や音声などの非構造化データの場合は特に配列操作に長けてなくてはままなりません. チュートリアルを済ませたら SIGNATE https://signate.jp/ などのサービスで機械学習まわりの知識を学ばれると良いでしょう
kirinrin0x0

2023/01/16 10:42

なるほど,納得が行きました.やはり未経験でデータセットの構成法を知らない状態での取り組みだったのですね. >>初心者の状態でのスタートでした。 普通,追記で示したようなX.append()で音声を重ねるということをします.ここらへんの配列処理まわりの話やデータセット構築のやり方がわからないうちは,機械学習を初めとする応用分野のコードを書くのではなく,最低限チュートリアルを済ませることを推奨します. >>どうプログラムが動いているのか、などの基本的なことと並行して今回の処理をやっていこうと思います。 画像や音声などの非構造化データの場合は特に配列操作に長けてなくてはままなりません. >>pythonを含むプログラミングには苦手意識がかなりあるので基礎から順にやっていきます! チュートリアルを済ませたら SIGNATE https://signate.jp/ などのサービスで機械学習まわりの知識を学ばれると良いでしょう >>このようなサービスがあるのですね、チュートリアルが終わり次第やってみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問