Python의 Wave 모듈을 사용하여 wav 파일 편집

7879 단어 파이썬scipywav
안녕하세요 여러분

Python에는 wave 모듈이라고 하는 것이 표준으로 붙어 있는 것 같고, 이 녀석을 사용하는 것으로 wav 파일을 읽거나 기입할 수 있는 것 같습니다.
이번에는 그 녀석을 사용하여 긴 wav 파일에 대해 후반을 잘라낸 짧은 wav 파일을 만드는 프로그램을 짜서 놀아 보자.

환경 준비



나는 PHPer이므로, python 환경을 준비하는 방법은 모르겠지만, 잘 사용하고 있는 keras들이의 docker 이미지가 있었으므로, 이 녀석을 사용해 버립니다. (꽤 무겁지 만)
htps : // 후 b. 도 c r. 이 m/r/gw000/케라 s-훗l/

또한, 당연히 파일을 만들어 콘솔에서 반복적으로 움직이는 것 같은 근성을 가지고 있는 것은 아니기 때문에, jupyter를 서서히 기동시켜 브라우저 경유로 움직입니다.
$ docker run --rm -v `pwd`/src:/srv -v `pwd`/data:/data -p 8888:8888 -p 6006:6006 -m 2g gw000/keras-full

메모리가 걱정이었기 때문에, 만약을 위해 2GB 확보하고 있습니다.
그 후,
htp://127.0.0.1:8888
에 브라우저로 액세스하면, jupyter가 움직이고 있으므로, 패스워드[ keras ]를 넣어, 시작합니다.

wav 로드



준비가 되었으므로, 빨리 웨이브 파일을 읽어, 그 정보를 취득해 봅시다.
jupyter에서 다음을 입력합니다.
import wave
import struct
from scipy import fromstring, int16

# ファイルを読み出し
wavf = '/data/input/test.wav'
wr = wave.open(wavf, 'r')

# waveファイルが持つ性質を取得
ch = wr.getnchannels()
width = wr.getsampwidth()
fr = wr.getframerate()
fn = wr.getnframes()

print("Channel: ", ch)
print("Sample width: ", width)
print("Frame Rate: ", fr)
print("Frame num: ", fn)
print("Params: ", wr.getparams())
print("Total time: ", 1.0 * fn / fr)

# waveの実データを取得し、数値化
data = wr.readframes(wr.getnframes())
wr.close()
X = fromstring(data, dtype=int16)

일단 여기까지 실행해 보겠습니다.
Channel:  2
Sample width:  2
Frame Rate:  44100
Frame num:  15884224
Params:  _wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=15884224, comptype='NONE', compname='not compressed')
Total time:  360.18648526077095

이런 결과가 출력됩니다.
채널이 2이므로 이 파일이 스테레오가 되어 있음을 알 수 있습니다.
또한 총 시간이 360초 = 6분으로 훨씬 긴 파일로 표시됩니다.

웨이브에 내보내기



다음에 읽은 내용을 머리로부터 90초만 꺼낸 것을 다른 파일로서 써 봅시다.
# 90秒分に相当するフレーム数を算出
time = 90
frames = int(ch * fr * time)

# 出力データを生成
outf = '/data/output/test.wav'
Y = X[:frames]
outd = struct.pack("h" * len(Y), *Y)

# 書き出し
ww = wave.open(outf, 'w')
ww.setnchannels(ch)
ww.setsampwidth(width)
ww.setframerate(fr)
ww.writeframes(outd)
ww.close()

이런 느낌입니다.
채널이 여러 개 있으면 그만큼 필요한 프레임 수가 늘어나므로 이를 고려하고 있습니다.
그리고 출력 데이터를 다시 문자열의 형식으로 고치고 나서, 읽을 때와 같은 파라미터를 지정해 내보내고 있다고 하는 느낌이군요.
그래서 실제로 파일을 만들었는지 보면,



할 수있는 것 같습니다.

요약



이번에는 Python의 표준 모듈 인 wave를 사용하여 wav 파일을 직접 편집하는 방법을 살펴 보았습니다.
그러니까 뭐라고 이야기입니다만. . .

이번은 이런 곳입니다.

참고



h tp : // 유카라 - 13. 하테나 bぉg. 코m/엔트리/2013/11/09/103848
ht tp // 덴시. bぉg. jp / shig l_p 로세신 g / py 텐 / ゔぇ_ shine _ wa ぇ

좋은 웹페이지 즐겨찾기