前提・実現したいこと
pythonによって編集したwavファイルを指定したフォルダに書き出したい。
発生している問題・エラーメッセージ
C:\Users\bluej\Anaconda3\lib\site-packages\ipykernel_launcher.py:43: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead --------------------------------------------------------------------------- PermissionError Traceback (most recent call last) <ipython-input-137-0da17bdc14a7> in <module>() 78 dangry=os.path.join(label,'angry/') 79 print(dangry) ---> 80 division (angry,angryl,dangry) <ipython-input-137-0da17bdc14a7> in division(bb, base_dir, opath) 67 outd = struct.pack("h" * len(Y), *Y) 68 #writeaudio(ch,width,frr,outd,opath) ---> 69 ww = wave.open(opath,'w') 70 ww.setnchannels(ch) 71 ww.setsampwidth(width) ~\Anaconda3\lib\wave.py in open(f, mode) 510 return Wave_read(f) 511 elif mode in ('w', 'wb'): --> 512 return Wave_write(f) 513 else: 514 raise Error("mode must be 'r', 'rb', 'w', or 'wb'") ~\Anaconda3\lib\wave.py in __init__(self, f) 303 self._i_opened_the_file = None 304 if isinstance(f, str): --> 305 f = builtins.open(f, 'wb') 306 self._i_opened_the_file = f 307 try: PermissionError: [Errno 13] Permission denied: './diva/angry/'
#ソースコード
import wave import struct from scipy import fromstring, int16 import os path='./' angry=os.path.join(path,'angry') angryl = os.listdir(angry) happy=os.path.join(path,'happy') happyl = os.listdir(happy) normal = os.path.join(path,'normal') normall= os.listdir(normal) def tt(fr,fn): #音源のながさ return 1.0*(fr)/(fn) def calcfr(time,ch,frr): #フレーム数の計算 return int(time*ch*frr) def writeaudio(ch,wd,fr,outd,outp):#ファイルの書き出し ww = wave.open(outp,'w') ww.setnchannels(ch) ww.setsampwidth(width) ww.setframerate(fr) ww.writeframes(outd) ww.close() def division (bb,base_dir,opath): for dir in base_dir: start=0 end=0 apath=os.path.join(bb,dir) #path拾いつつ初期化 wr = wave.open(apath, 'r') width= wr.getsampwidth() ch=wr.getnchannels() frr= wr.getframerate() frn = wr.getnframes() data=wr.readframes(wr.getnframes()) wr.close() X=fromstring(data,dtype=int16) alt=tt(frr,frn) num = int(alt/3) for i in range (num): start = 3 * i end = start + 3 outf='dir'+'i'+'.wav' Y=X[calcfr(start,ch,frr):calcfr(end,ch,frr)] outd=struct.pack("h"*len(Y)*Y) # writeaudio(ch,width,frr,outd,opath) ww = wave.open(opath,'w') ww.setnchannels(ch) ww.setsampwidth(width) ww.setframerate(frr) ww.writeframes(outd) ww.close() if alt%3 > 0: start = alt-3 end = alt outf='dir'+'i'+'.wav' Y=X[calcfr(start,ch,frr):calcfr(end,ch,frr)] outd = struct.pack("h" * len(Y), *Y) #writeaudio(ch,width,frr,outd,opath) ww = wave.open(opath,'w') ww.setnchannels(ch) ww.setsampwidth(width) ww.setframerate(frr) ww.writeframes(outd) ww.close() label=os.path.join(path,'diva/') dangry=os.path.join(label,'angry/') print(dangry) division (angry,angryl,dangry)
試したこと
関数を利用せずに、実装を試みた。
保存するフォルダを変えた。
python.exeの許可において読み取り専用の部分を外した。
指定したフォルダの読み取り専用の部分を外した
補足情報(FW/ツールのバージョンなど)
wavファイルを3秒ごとに分割するプログラムですが、permission deniedによって保存できません。
環境はWindows10で、anacondaの最新バージョンを使用し、jupyterによってソースコードを編集
しています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/04 06:34 編集