【Python】WAVファイルを等間隔に分割するプログラム【サウンドプログラミング】
どうもこんにちは。たっきーです。
もうすっかり寒くなって暖房なしの氷河期部屋じゃ息ができませんね。。。
モチベーション
機械学習用のデータ[行列(配列?)]はデータの個数が等しくしなちゃめんどくさいので等間隔に切り取りたい。
Audacityを使って手作業で切り取るのもちょっと考えたけど、等間隔に切り取る作業初めて3秒で飽きた。
ちょっと人間には厳しいので、Pythonにやらせる。
つまり、自動化して楽したい。
コード
実行すると同じディレクトリ内にoutputというディレクトリが作成され、カットしたいファイル名とカットしたい時間[sec]の入力を求められるので入力してください。
※ファイル名に.wavの記入は必要ありません。
※カットしたいWAVファイルと同じ階層にこの.pyファイルを書く必要有り
↓一秒で等間隔にカットした結果。
上手く動いた✌
参考
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
おわりに・感想
手作業でAudacityを使うと20分割するだけで10分ぐらいかかってたけど、これなら1分とかからず済むので強い💪
print文は確認用なので消したほうがスッキリするぞい。
— たっきー@ダサテプラP (@tacky0612) 2017年11月21日
MNISTはどういったデータの構造をしているのかについて考える。
どうもたっきーです。
最近、研究のモチベーションは高いけど大学に行くモチベーションはとても低い。
モチベーション
機械学習初心者なので、MNISTの784次元配列+ラベルのデータセットを分類したい対象のN次元配列+ラベルのデータセットに入れ替えると既存のコードで機械学習が簡単にできる。。。等と安直な考えでいる。
そのためにはMNISTってどんなデータの形しているのかしる必要があるので検証してみる。
環境
準備
まずはインポート
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
MNISTデータを取得する。
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
すると以下が表示される。
データの内容を表にまとめると以下になる。
ファイル名 | データ |
train-images-idx3-ubyte.gz | 学習用画像データ |
train-labels-idx1-ubyte.gz | 学習用ラベルデータ |
t10k-images-idx3-ubyte.gz | テスト用画像データ |
t10k-labels-idx1-ubyte.gz | テスト用ラベルデータ |
中身を見ていく
a = mnist.train.next_batch(1)
mnist.train.next_batch()で学習用データからデータを取り出すメソッド。
引数は取り出すデータの数。
>>>print(a)
>>>print(type(a))<class 'tuple'>
これから取り出したデータの方はタプルで、a[0]に画像データ、a[1]にラベルデータが入っていることが分かる。
試しに print(a[0])をやってみると784個の配列が表示され、print(a[1])をやってみると10個の配列が表示される。
じゃあこれらのデータの型は?
>>>print(type(a[0]))<class 'numpy.ndarray'>>>>print(type(a[1]))
<class 'numpy.ndarray'>
numpy.ndarrayらしい。
↓ドキュメント
numpy.ndarray — NumPy v1.13 Manual
要するにNumpyの配列ってことかな??(わからん)
ちなみに画像データは0〜1の値をとり、0が白、1が黒になっている。
オリジナルのデータは0〜255の整数値で各ピクセルの濃度を表しているっぽい。
0〜1に変換して正規化しているっぽい(?)
ラベルデータは 「1-of-K」という方式で表現しているらしい。
例えば0なら[1,0,0,0,0,0,0,0,0,0]で、
2なら[0,0,1,0,0,0,0,0,0,0]と言った風のある要素だけが1で、それ以外が0なベクトルのこと。
配列の個数が分類したいデータの個数で、1のある位置がその要素。(語彙がないのでうまい表現が見つからない。)
画像データとラベルデータを分ける
以下のコードでimagesに画像データの配列、labelsにラベルデータの配列が入る。 とりあえず10個分のデータ入れてみる。
images, labels = mnist.train.next_batch(10)
中身の確認をしよう。
images
IN
print(images)
OUT
[[ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] ..., [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.]]
IN
print(len(images))
OUT
10
IN
print(type(images))
OUT
<class 'numpy.ndarray'>
ほう…imagesには784個のデータの配列が10個配列としてあって、型はnumpy.ndarrayって感じかな。
もっと深く見てみよう。
images[0]
IN
print(images[0])
OUT
IN
print(len(images[0]))
OUT
784
IN
print(type(images[0]))
OUT
<class 'numpy.ndarray'>
これからimagesに格納されている各配列はひとつ分の画像データに鳴っていることが分かる。型は<class 'numpy.ndarray'>。
もっと深く。
images[0][0]
IN
print(images[0][0])
OUT
0.0
IN
print(len(images[0][0]))
OUT
TypeError: object of type 'numpy.float32' has no len()
IN
print(type(images[0][0]))
OUT
<class 'numpy.float32'>
これから、imagesの配列になにが入ってるかわかった。型はnumpy.float32。
そりゃ、print(len(images[0][0]))はデータは配列じゃないのにエラー吐かれるわ。
ラベルデータに対しても似たような結果が得られた。
ただ、print(type(labels[0][0]))関してだけ、型が<class 'numpy.float64'>だった。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (17件) を見る
Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)
- 作者: Sebastian Raschka,株式会社クイープ,福島真太朗
- 出版社/メーカー: インプレス
- 発売日: 2016/06/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
おわりに・今後・感想
今回得た配列を分類したいやつの配列に入れ替えるとどうなるのか試してみる。
このデータセットみたいに0〜1に正規化する必要があるのかな??
まぁ、そのデータセットどうやって作ろうかな…って感じではある。
(データセットってどうやってつくるのか…?)
numpy.ndarrayに分類対象の配列を入れたらいいのかな???
そしてそれに1-of-Kでラベルデータを付与すれば良い?
とりあえずMNISTライクなデータセット用意するところから始めたらいいのかな???
そもそも機械学習・深層学習はどの程度データがあればいいんや????
???ばかりが頭に浮かぶ…
機械学習畑の方、ぜひご教授ください…。
そういや関係ないけど、iPhone X発売されましたね。
ほしい。
あいひょーーーん・てん pic.twitter.com/kkidRbaYkC
— たっきー@ダサテプラP (@tacky0612) 2017年11月7日
Anacondaのアンインストール&インストール + Python2系/3系の両方をJupyter-Netebookで使えるようにする
どうも、たっきーです。最近よくものを壊します。
この前は誤ってバイト先の金庫を破壊しました。
あ??????????????????????????????????????????????????????? pic.twitter.com/jGnx9UCOl6
— たっきー@ダサテプラP (@tacky0612) 2017年11月6日
モチベーション
Anaconda-NavigatorがHigh-Sierraにアップデートしてから起動しなくなった。
パソコンが何もしてないのに壊れた キレそう。
…ので、Anacondaをアンインストール→インストールする。
あと、Python2系とPython3系の両方使いたくなった。(Python2で動くのにPython3では動かないみたいなことがよくあるのでそれの原因を特定したい。)
まぁ色々いじりすぎてごちゃごちゃしてたのできれいに掃除できたいい機会になった。
ちょっと躓いたので議事録。
環境
Anacondaアンインストール
↑これのとおりにやった。
コマンド叩くだけじゃホームディレクトリにAnacondaファイルが残るので削除を忘れない。
$ conda install anaconda-clean
$ anaconda-clean
これだけだとまだ残ってるので、Finderで /Users/HOME/anaconda を全消しする。
$ open ~/.bash_profile
# added by Anaconda3 4.3.1 installer
export PATH="/Users/hideki/anaconda/bin:$PATH"
と書かれてあるので消す。
$ python
と叩いてAnacondaが起動してなかったらアンインストール完了。
Anacondaインストール
↓ここから自分のOSにあったやつを入れる。Python3。
次へ→次へ→次へ→次へ→完了
これでPython3環境はいった(はず)
好みで他に必要なもの入れる(これはメモ)
Anacondaをアンインストールしたときにほとんど消えた。
Anaconda入れると大体入るけど他に好みでインストールする。
$ pip install wavio
$ pip install tensorflow
仮想環境構築
仮想環境作るコマンド
oppython2の部分は仮想環境名。
普通にpython2とかの方がいい。(おっPython)
$ conda create -n oppython2 python=2.7 anaconda
仮想環境に入るコマンド
$ source activate oppython2
ターミナルのユーザー名の前に(仮想環境名)と表示されてれば成功。
必要なものはこの仮想環境に入ってからpipなりcondaなりで入れる。
Jupiterの起動コマンド
$ jupyter notebook
仮想環境下でこのコマンド叩くとPython2になってる。
ちなみに仮想環境入らずに$ jupyter notebook叩くとPython3になっている。
仮想環境を抜けるコマンド
$ source deactivate
ちなみにAnaconda-Navigatorで仮想環境とかrootに何が入ってるか確認できる。
Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)
- 作者: Sebastian Raschka,株式会社クイープ,福島真太朗
- 出版社/メーカー: インプレス
- 発売日: 2016/06/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
TensorFlowで学ぶディープラーニング入門?畳み込みニューラルネットワーク徹底解説
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/28
- メディア: Kindle版
- この商品を含むブログを見る
今後とか感想とか
2系3系両方使える様になったので、2系で動くのに3系で動かないプログラムの解明したい。
研究の進捗生み出したいけど、中々こういうところで躓いて進めねーのクソ^^
がんばう💪
— たっきー@ダサテプラP (@tacky0612) 2017年11月6日