是否可以在Python中播放.wav文件的某个部分?
我希望有一个函数play(file, start, length)
从file
秒开始播放音频文件start
,并在length
秒后停止播放。这是可能的,如果是的话,我需要哪个库?
答案 0 :(得分:1)
这是可能的,在python中可以很容易。
Pyaudio是一个不错的图书馆,您可以用来播放音频!
首先你需要解码音频文件(wav,mp3等)这一步转换音频数据的数字(short int或float32)。
你是否需要转换等效位置点的秒数来切割感兴趣位置的信号,这样做可以将你的帧速率乘以你想要的秒数!
这是wav文件的一个简单示例:
import pyaudio
import sys
import numpy as np
import wave
import struct
File='ederwander.wav'
start = 12
length=7
chunk = 1024
spf = wave.open(File, 'rb')
signal = spf.readframes(-1)
signal = np.fromstring(signal, 'Int16')
p = pyaudio.PyAudio()
stream = p.open(format =
p.get_format_from_width(spf.getsampwidth()),
channels = spf.getnchannels(),
rate = spf.getframerate(),
output = True)
pos=spf.getframerate()*length
signal =signal[start*spf.getframerate():(start*spf.getframerate()) + pos]
sig=signal[1:chunk]
inc = 0;
data=0;
#play
while data != '':
data = struct.pack("%dh"%(len(sig)), *list(sig))
stream.write(data)
inc=inc+chunk
sig=signal[inc:inc+chunk]
stream.close()
p.terminate()
答案 1 :(得分:1)
我知道这是一个相当古老的问题,但我只需要完全相同的东西,对我而言,ederwander的例子似乎有点过于复杂。
这是我的简短(和评论)解决方案:
import pyaudio
import wave
# set desired values
start = 7
length = 3
# open wave file
wave_file = wave.open('myWaveFile.wav', 'rb')
# initialize audio
py_audio = pyaudio.PyAudio()
stream = py_audio.open(format=py_audio.get_format_from_width(wave.getsampwidth()),
channels=wave_file.getnchannels(),
rate=wave_file.getframerate(),
output=True)
# skip unwanted frames
n_frames = int(start * wave_file.getframerate())
wave_file.setpos(n_frames)
# write desired frames to audio buffer
n_frames = int(length * wave_file.getframerate())
frames = wave_file.readframes(n_frames)
stream.write(frames)
# close and terminate everything properly
stream.close()
py_audio.terminate()
wave_file.close()