如何从wav中间时间范围。蟒

时间:2017-10-23 23:27:01

标签: python numpy audio wav

我需要从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)

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以非常轻松地使用pydub切片中间8秒。 有关pydub are here的详情 您可以安装为pip install pydub

我有一个持续时间为348秒的wav文件,中间8秒被切成薄片。

>>> song.duration_seconds
348.05551020408166  

您还可以使用不同的文件格式,例如wavmp3m4aogg等进行导入(转换为数据段)和导出。

源代码

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)