我需要从wav的音频数据中间提取 8秒。文件与长度0:27秒。
- 所有我已经做过的事情,中间的9秒分为wav。在3个部分上文件并取中间部分,但它是9s我需要8s。
如何在numpy数组中找到位数?
import scipy.io.wavfile
import pyaudio
import numpy as np
(samplRate,data)=scipy.io.wavfile.read('Track48.wav')
print
CHANNELS=2
p= pyaudio.PyAudio()
#
nine_sec=len(data)/3
eight_sec=2*len(data)/3
stream = p.open(format=pyaudio.paInt16,
channels=CHANNELS,
rate=44100,
output=True
)
cuted_data=data[nine_sec:eight_sec]
newdata = cuted_data.astype(np.int16).tostring()
stream.write(newdata)
print(cuted_data)
感谢您的帮助。
答案 0 :(得分:1)
您可以非常轻松地使用pydub
切片中间8秒。
有关pydub are here的详情
您可以安装为pip install pydub
我有一个持续时间为348秒的wav文件,中间8秒被切成薄片。
>>> song.duration_seconds
348.05551020408166
您还可以使用不同的文件格式,例如wav
,mp3
,m4a
,ogg
等进行导入(转换为数据段)和导出。
源代码
from pydub import AudioSegment
from pydub.playback import play
song = AudioSegment.from_wav("music.wav")
#slice middle eight seconds of audio
midpoint = song.duration_seconds // 2
left_four_seconds = (midpoint - 4) * 1000 #pydub workds in milliseconds
right_four_seconds = (midpoint + 4) * 1000 #pydub workds in milliseconds
eight_sec_slice = song[left_four_seconds:right_four_seconds ]
#Play slice
play(eight_sec_slice )
#or save to file
eight_sec_slice.export("eight_sec_slice.wav", format="wav")
正如您所见,中间8秒切片的长度完全符合要求。
>>> eight_sec_slice.duration_seconds
8.0
答案 1 :(得分:0)
我知道这个问题很旧,但是有人可能喜欢我想提供的仅使用numpy的解决方案。不需要pydub
。
import scipy.io.wavfile as wavfile
fs, data - wavefile.read("Track48.wav")
# number of samples N
N = data.shape[0]
# Convert seconds to samples
eight_secs_in_samples = float(fs)*8 # time = number_of_samples / rate
midpoint_sample = N//2 # Midpoint of sample
# substract 4 seconds from midpoint
left_side = midpoint_sample-(eight_secs_in_samples//2)
# Add 4 seconds from midpoint up
right_side = midpoint_sample + (eight_secs_in_samples//2)
# The midpoint of samples is therefore:
mid8secs = array_data[int(left_side):int(right_side)] # this range contains the required samples
# Save the file
wavfile.write("eightSecSlice.wav",fs,mid8secs)