質問編集履歴

2 現状図と理想図を加え、要点だけを書き足しました。余計な説明は省きました。

monmi_monmi

monmi_monmi score 12

2016/05/10 16:41  投稿

Pythonの探索システムで詰まっています
###前提・実現したいこと
###問題
Pythonで以下サイト様を参考に類似楽曲システムを作っている最中です。
http://aidiary.hatenablog.com/entry/20121014/1350211413
このサイトでは指定したディレクトリ直下のmp3フォルダを探索してそれぞれの形式に変換しているのですが、指定したディレクトリの最下層まで探索してくれるコードに書きかえようとしていますが、うまく組み合わせられません。
このサイトでは指定したディレクトリ直下のmp3フォルダを探索してそれぞれの形式に変換しています。指定したディレクトリの最下層まで探索してくれたら便利だなぁと思ってコードを作り変えているのですが、うまく組み合わせられません。
###やりたいこと
現在のコードでは、こうなります。
![現在の状態](6c7af691569aa01b9342b408769ca929.png)
↑これを
![理想状態](4f28dde772f354cf363b792d3a230640.png)
↑こうしたいです。こうするとmfccファイルとrawファイルが作れます。
コードをどう修正するとmfcc-mp3-raw-...といった感じにできるのでしょう?
###発生している問題・エラーメッセージ
コピー先のパスと保存先のパスが合わないため、.mfcと.rawが作成できない状態です
```
$ python mp3_to_mfcc.py mp3 mfcc/ raw/
LAME 3.99.5 64bits (http://lame.sf.net)
Autoconverting from stereo to mono. Setting encoding to mono mode.
Resampling: input 44.1 kHz output 16 kHz
.
.
.
sh: raw/mp3/Archive/Benny Green/Jazz at the Bistro/01 Ask Me Now.raw: No such file or directory
sh: raw/mp3/Archive/Benny Green/Jazz at the Bistro/01 Ask Me Now.raw: No such file or directory
sh: mfcc/mp3/Archive/Benny Green/Jazz at the Bistro/01 Ask Me Now.mfc: No such file or directory
```
###該当のソースコード
拡張子変換についての関数とかは関係なさそうなので、問題がありそうな部分だけ載せておきます。
```Python
#coding:utf-8
import os
import sys
import shutil
def find_all_files(mp3Dir):
   for root, dirs, files in os.walk(mp3Dir):
       yield root
       for file in files:
           yield os.path.join(root, file)
if __name__ == "__main__":
   if len(sys.argv) != 4:
       print "usage: python print_mfcc.py [mp3dir] [mfccdir] [rawdir]"
       sys.exit()
   mp3Dir = sys.argv[1]
   mfccDir = sys.argv[2]
   rawDir = sys.argv[3]
   if not os.path.exists(mfccDir):
       os.mkdir(mfccDir)
   if not os.path.exists(rawDir):
       os.mkdir(rawDir)
   shutil.rmtree(mfccDir)
   shutil.rmtree(rawDir)
   shutil.copytree(mp3Dir, mfccDir, True, ignore = shutil.ignore_patterns('*.mp3'))
   shutil.copytree(mp3Dir, rawDir, True, ignore = shutil.ignore_patterns('*.mp3'))
   for file in find_all_files(mp3Dir):
       if not file.endswith(".mp3"):
           continue       
       mp3File = file
       mfccFile = os.path.join(mfccDir, file.replace(".mp3", ".mfc"))
       rawFile = os.path.join(rawDir, file.replace(".mp3", ".raw"))
       try:       
           mp3ToRaw(mp3File,"temp.raw")               
           extractCenter("temp.raw", rawFile, 15)
           calcMFCC(rawFile,mfccFile)
           print "%s => %s" % (mp3File, mfccFile)
           os.remove("temp.raw")
       except:
           continue   
```
###これが問題の原因?
os.walk()では指定したディレクトリを含めたパスになります。↓
mp3/
mp3/.DS_Store
mp3/A
mp3/A/.DS_Store
mp3/A/B
mp3/A/a.mp3
mp3/A/B/.DS_Store
mp3/A/B/b.mp3
mp3/A/B/c.mp3
mp3/A/B/d.mp3
一方、shutil.copytree(src,dst)はコピーしたいディレクトリsrcの内容、つまりsrc以下のディレクトリまたはファイルをdstにコピーするので、上のコードの場合
raw/
raw/.DS_Store
raw/A
raw/A/.DS_Store
raw/A/B
raw/A/B/.DS_Store
のようになります。
os.walk()でトップディレクトリをAに変更するか、copytreeでディレクトリのをrawとAの間にmp3というディレクトリを入れることによって解決できると思われます。
しかしどう実装すれば実現するかが分からないです。
コードをどう変えればいいのか、わかる方いれば宜しくお願いします。
  • Python

    34218 questions

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

1 文を修正しました

monmi_monmi

monmi_monmi score 12

2016/05/10 08:59  投稿

Pythonのパス指定について質問です。(探索システム)
Pythonの探索システムで詰まっています
###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)Pythonで以下サイト様を参考に類似楽曲システムを作っている最中です。
Pythonで以下サイト様を参考に類似楽曲システムを作っている最中です。
http://aidiary.hatenablog.com/entry/20121014/1350211413
このサイトでは指定したディレクトリ直下のmp3フォルダを探索してそれぞれの形式に変換しているのですが、指定したディレクトリの最下層まで探索してくれるコードに書きかえようとしています。
このサイトでは指定したディレクトリ直下のmp3フォルダを探索してそれぞれの形式に変換しているのですが、指定したディレクトリの最下層まで探索してくれるコードに書きかえようとしていますが、うまく組み合わせられません。
###発生している問題・エラーメッセージ
コピー先のパスと保存先のパスが合わないため、.mfcと.rawが作成できない状態です
```
$ python mp3_to_mfcc.py mp3 mfcc/ raw/
LAME 3.99.5 64bits (http://lame.sf.net)
Autoconverting from stereo to mono. Setting encoding to mono mode.
Resampling: input 44.1 kHz output 16 kHz
.
.
.
sh: raw/mp3/Archive/Benny Green/Jazz at the Bistro/01 Ask Me Now.raw: No such file or directory
sh: raw/mp3/Archive/Benny Green/Jazz at the Bistro/01 Ask Me Now.raw: No such file or directory
sh: mfcc/mp3/Archive/Benny Green/Jazz at the Bistro/01 Ask Me Now.mfc: No such file or directory
```
###該当のソースコード
拡張子変換についての関数とかは関係なさそうなので、問題がありそうな部分だけ載せておきます。  
```Python
#coding:utf-8
import os
import sys
import shutil
from distutils.dir_util import copy_tree  
#  mp3_to_mfcc.py  
#  MP3からMFCCを抽出  
 
def mp3ToRaw(mp3File, rawFile):  
   #  mp3を16kHz,32bitでリサンプリング  
   os.system("lame --resample 16 -b 32 -a '%s' temp.mp3" % mp3File)  
   os.system("lame --decode temp.mp3 temp.wav")  
   os.system("sox temp.wav %s" % rawFile)  
   os.remove("temp.mp3")  
   os.remove("temp.wav")  
 
 
def calcNumSample(rawFile):  
   #1サンプルはshort型なので ファイルサイズ / 2 する  
   filesize = os.path.getsize("temp.raw")  
   numsample = filesize / 2  
   return numsample  
 
 
def extractCenter(inFile, outFile, period):  
   #  波形のサンプル数を求める  
   numSample = calcNumSample(inFile)  
   print "DD"  
 
   fs = 16000  
   center = numSample / 2  
   start = center - fs*period  
   end = center + fs*period  
     
   if start < 0:  
       start = 0  
   if end > numSample - 1:  
       end = numSample - 1  
     
    # SPTKのbcutコマンドで切り出す  
   os.system(" bcut +s -s %d -e %d < '%s' > '%s' " % (start, end, "temp.raw", rawFile))  
     
 
def calcMFCC(rawFile, MFCCFile):  
   #fs = 16000  
   #Frames = 400 sample  
   #Shift_width = 160 sample  
   #Channels = 40  
   #MFCC = 19 dimension + Energy  
   #  
   os.system("x2x +sf < '%s' | frame -l 400 -p 160 | mfcc -l 400 -f 16 -n 40 -m 19 -E > '%s'" % (rawFile, MFCCFile))  
def find_all_files(mp3Dir):
   for root, dirs, files in os.walk(mp3Dir):
       yield root
       for file in files:
           yield os.path.join(root, file)
if __name__ == "__main__":
   if len(sys.argv) != 4:
       print "usage: python print_mfcc.py [mp3dir] [mfccdir] [rawdir]"
       sys.exit()
   mp3Dir = sys.argv[1]
   mfccDir = sys.argv[2]
   rawDir = sys.argv[3]
   if not os.path.exists(mfccDir):
       os.mkdir(mfccDir)
   if not os.path.exists(rawDir):
       os.mkdir(rawDir)
   shutil.rmtree(mfccDir)
   shutil.rmtree(rawDir)
   shutil.copytree(mp3Dir, mfccDir, True, ignore = shutil.ignore_patterns('*.mp3'))
   shutil.copytree(mp3Dir, rawDir, True, ignore = shutil.ignore_patterns('*.mp3'))
   for file in find_all_files(mp3Dir):
       if not file.endswith(".mp3"):
           continue       
       mp3File = file
       mfccFile = os.path.join(mfccDir, file.replace(".mp3", ".mfc"))
       rawFile = os.path.join(rawDir, file.replace(".mp3", ".raw"))
       try:       
           mp3ToRaw(mp3File,"temp.raw")               
           extractCenter("temp.raw", rawFile, 15)
           calcMFCC(rawFile,mfccFile)
           print "%s => %s" % (mp3File, mfccFile)
           os.remove("temp.raw")
       except:
           continue   
```
###原因
###これが問題の原因?
os.walk()では指定したディレクトリを含めたパスになります。↓
mp3/
mp3/.DS_Store
mp3/A
mp3/A/.DS_Store
mp3/A/B
mp3/A/a.mp3
mp3/A/B/.DS_Store
mp3/A/B/b.mp3
mp3/A/B/c.mp3
mp3/A/B/d.mp3
一方、shutil.copytree(src,dst)はコピーしたいディレクトリsrcの内容、つまりsrc以下のディレクトリまたはファイルをdstにコピーするので、上のコードの場合
raw/
raw/.DS_Store
raw/A
raw/A/.DS_Store
raw/A/B
raw/A/B/.DS_Store
のようになります。
os.walk()でトップディレクトリをAに変更するか、copytreeでディレクトリのをrawとAの間にmp3というディレクトリを入れることによって解決できると思われます。
宜しくお願いします。
しかしどう実装すれば実現するかが分からないです。
コードをどう変えればいいのか、わかる方いれば宜しくお願いします。
  • Python

    34218 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る