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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

1489閲覧

bandpassフィルタを使ってもcsvファイルのサイズが小さくならない

iface

総合スコア42

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/01/06 09:41

前提・実現したいこと・試したこと

人の声と雑音を合成させた音声ファイルを機械学習させて、音声分離させようと考えています。
合成させた音声ファイルをcsvファイルにし、機械学習させようと思っているのですが、時間的にも効率的に音声分離させるために、データサイズを小さくするべく、バンドパスフィルタ処理をすることにしました。
下のグラフは、処理を行う前の合成波形の例ですが、まずハイパスフィルタで、カットオフ周波数を0Hzから1000Hzに100Hzずつ上げていき、経過を見たのですが、データサイズに変化は見られませんでした。
この方法では、csvファイルでのデータサイズは小さくならないのでしょうか。

イメージ説明
下にソースコードを貼っておきます。
下のプログラムでは、合成させた音声ファイルにフィルタ処理を施し、wavファイルを書き出すところまでしています。
csvファイルの作成に関しては、wav2csvを用いています。

該当のソースコード

import sys import scipy.io.wavfile from scipy.io.wavfile import write from scipy.io.wavfile import read from scipy.fftpack import rfft,irfft,fftfreq import numpy as np import matplotlib.pyplot as plt #####音声ファイル読み込み##### args = sys.argv wav_filename = args[1] rate, data = scipy.io.wavfile.read(wav_filename) #time = np.arange(0,data.shape[0]/rate,1/rate) #時間軸作成 #dataを高速フーリエ変換 fft_data = np.fft.fft(data) freqList = np.fft.fftfreq(data.shape[0], d=1.0/rate) #周波数取得 fft_data2 = fft_data.copy() #####フィルタ処理##### fft_data2[(freqList < 1000)&(freqList > -1000)] = 0 #highpass #fft_data2[(freqList > 3300)|(freqList < -3300)] = 0 #lowpass data2 = np.fft.ifft(fft_data2) data2ri = data2.real.astype(np.int16) print(np.max(data)) print(np.min(data)) print(np.max(data2)) print(np.min(data2)) print(np.max(data2ri)) print(np.min(data2ri)) ####音声ファイル書き込み#### args = sys.argv wav_filename_out = args[2] data2ri.flags.writeable = True write(wav_filename_out,rate,data2ri)

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

anaconda3を使用

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

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

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

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

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

jbpb0

2021/01/06 12:38

> 時間的にも効率的に音声分離させるために、データサイズを小さくするべく が具体的に何を意味してるのかによって、やることが変わります ・csvを貯めるハードディスクの容量を節約したい ・pythonがcsvを読む速度を上げたい ・pythonが計算するときに使うメモリーの容量を節約したい/pythonの計算速度を上げたい ・他
iface

2021/01/06 12:44

機械学習させる際に学習時間を短縮したいと思ったのですが、そもそもwavファイルは形式上ファイル処理でデータ圧縮が不可能であるということがわかりました。
jbpb0

2021/01/06 12:54 編集

学習時間に関係するのは、音声ファイルのサイズではなく、pythonが扱うサイズですよ だから、mp3とかの圧縮可能なファイル形式を選んでwavの代わりに使っても、その音声ファイルをpythonが読んでからの、学習時にpythonが扱うデータ、たとえばnumpy配列のサイズが変わらなければ、学習時間は変わりませんよ pythonが音声を取り込んだ後のデータサイズは、サンプリングレートx録音時間xBITxチャンネルなので、たとえば 44kHzの16bitのステレオ音声が30秒、と決めたらデータ量は同じです それを減らすには、ローパスフィルタを通して高周波成分を無くしてからサンプリングレート(44kHz)を下げるとか、量子化のbitを減らすとか、ステレオをモノラルにするとか、録音時間を短くするとかしないと 音声ファイルのサイズと、pythonが学習時に扱うデータのサイズは、別です 音声ファイルを小さくしたからといって、pythonが学習時に扱うデータのサイズが減るわけではないので、学習時間も減りません
iface

2021/01/06 13:35

すいません。まだpythonで扱うサイズというものがピンとこないです。 また、データサイズを減らす方法として、最初にローパスフィルタを通す理由は何なのでしょうか。
jbpb0

2021/01/08 05:28

> pythonで扱うサイズというものがピンとこない 下記を実行してみてください wav_filename="wavファイル名" import scipy.io.wavfile rate, data = scipy.io.wavfile.read(wav_filename) print(data.dtype) # 配列の型 print(data.shape) # 配列のサイズ print(rate) # サンプリングレート print(data.shape[0]/rate) # 音声ファイルの録音時間と一致 その結果を見ると分かるように、音声ファイルの録音時間とサンプリングレートによって、音声データを格納する配列のサイズは決まってしまいます モノラルだと 録音時間xサンプリングレート、ステレオだとその2倍です また、配列の型も、音声データの量子化BITで決まります 「pythonで扱うサイズ」とは、その配列の型とサイズのことです 録音時間、サンプリングレート、BITが全く同じでも、録音されてる音はいろいろですよね 騒がしい音楽が録音されてるかもしれないし、ずーーーっと無音かもしれない そのどちらでも、録音時間、サンプリングレート、BITが同じなら、Pythonがそのデータを保持するのに必要な配列の型とサイズは同じなんですよ 配列の型とサイズが同じならば、それを使う学習に必要なメモリー量や演算量は変わりません だから、音声にフィルタをかけたりいろいろ処理しても、録音時間、サンプリングレート、BITが変わらないなら、質問者さんが狙ってるような効果はありません
jbpb0

2021/01/08 05:38

> データサイズを減らす方法として、最初にローパスフィルタを通す理由 ローパスフィルタ無しでサンプリングレートを下げると、折り返しノイズが発生するからです http://www.murmur-lab.com/2019/02/19/downsampling/
iface

2021/01/11 11:15

返信が遅くなり申し訳ありません。 詳しい説明をいただきありがとうございます。 こちらの説明でpythonで扱うサイズを理解することができました。
guest

回答2

0

ベストアンサー

圧縮というのは符号化と呼ばれる情報量が同じものを省略して書く行為によってデータ量を少なくしたり、いらないデータをそもそも書き込まないことによって実現できるものです。フィルターと圧縮は、圧縮方式によっては関係があります。例えば jpeg 画像です。jpeg 画像は写真には高調波成分が少ないことを利用し高調波を捨てることによってデータ量を抑えています。

MP3 も同じ仕組みです。実際にはもっと複雑な手法が使われていますが、大雑把に言えばいらない周波数成分をカットしています。そして大事なのが符号化です。iface さんの場合そのまま wav 形式で書き込んでいますから、何の省略もせず保存してしまっているのです。しかしこれを勝手に符号化するわけにも行きません。wav は符号化形式が決まっているからです。

これを解決するには「自分で音声ファイルフォーマットを作ってしまう」これしかありません。しかしこれはあまりにも非現実的な解決方法と言えるでしょう。そこで考えたいのは「ogg などの既存の形式に対してパラメーターを機械学習により求め最適な圧縮を行う」です。これならファイル形式を考える必要がありませんし、誰でも再生することが出来ます。

投稿2021/01/06 10:18

A_kirisaki

総合スコア2853

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

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

iface

2021/01/06 11:40

なるほどですね。 詳しい説明ありがとうございます。 「ogg などの既存の形式に対してパラメーターを機械学習により求め最適な圧縮を行う」 という方法ですが、少し時間がかかってしまいそうなので、A_kirisakiさんの回答を基に自分なりに方法考えたのですが、 「コーディック(今回はMP3を使おうと思っています)を用いてデータサイズをできる限り小さくしてまたwavファイルに戻す」 というのはどうでしょうか。
A_kirisaki

2021/01/06 11:47

wav ファイルにしてしまった時点で元通りですねー。wav ファイルというのは何も加工を加えていない「生の」音声ファイルなので別の圧縮方式で圧縮したとして同じ時間、同じサンプリングレートの音声とサイズは同じになります。画像で言うと bmp みたいなものだと思ってください。あれはわかりやすいんですが真っ白な画像でもサイズ分 0xFF で埋められてます。同じように wav ファイルもたとえ無音だったとしても無音のデータがずっと続くのです。なので wav に戻してしまっては意味がないのですね。
iface

2021/01/06 12:23

そうなんですね。では、MP3から直接csvファイルにするとサイズは小さくなると思うのですがどうでしょうか。
A_kirisaki

2021/01/06 12:33

それは多分そうだと思いますが、きれいに csv になる形式ではないと思います。wav が csv にきれいに変換できるのは波形の情報を余すことなく残しているからです。MP3 のフレームを csv に書き出したとしてもそれだけでは波形の情報を得られず何の意味もないでしょう。
iface

2021/01/06 12:39

MP3では波形の情報は得られないのですね。 では、ogg などの既存の形式に対してパラメーターを機械学習により求め最適な圧縮を行う方法の詳しい説明をいただいてもよろしいでしょうか。
A_kirisaki

2021/01/06 12:51

そこまで行くとわたしはお手上げです。おそらく論文何本か書けてしまうレベルの話なので。入力と出力の誤差を教師データとしてファイルサイズに対して最適化するフィルタを学習する、みたいなことは行われていそうです。あくまで当てずっぽうの話で申し訳ないですが。
guest

0

フィルタってのは周波数成分のフィルタなんでデータ量とはなんの関係もありません

投稿2021/01/06 09:43

y_waiwai

総合スコア87749

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

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

iface

2021/01/06 09:52

そうなんですね。 では、データサイズを小さくするにはどのような方法があるのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問