如何在python中将音频文件(wav格式)拼接成1秒的拼接?
Posted
技术标签:
【中文标题】如何在python中将音频文件(wav格式)拼接成1秒的拼接?【英文标题】:How to splice an audio file (wav format) into 1 sec splices in python? 【发布时间】:2016-04-22 17:22:06 【问题描述】:我正在寻找一个 python 函数来将音频文件(wav 格式)拼接成 1 秒持续时间的拼接,并将每个新的拼接(1 秒持续时间)存储到一个新的 .wav 文件中。
【问题讨论】:
我会从numpy.io.wavfile
开始
numpy中不存在,你可能指的是scipy.io.wavfile
。
如果您愿意使用外部库,请在下面查看我的回答,该回答简洁明了。
【参考方案1】:
真正简单易用的pydub
模块,详细内容在here和here以上
pydub
有一个名为make_chunks
的方法,您可以在milliseconds
中指定chunk length
。
make_chunks(your_audio_file_object, chunk_length_ms)
这是一个将 wav 文件拆分为一秒块的工作代码。我有一个 8.5 秒的文件,所以程序创建了 9 个一秒的块 playable
。根据音频持续时间,最后一个块会更小。
from pydub import Audiosegment
from pydub.utils import make_chunks
myaudio = AudioSegment.from_file("myAudio.wav" , "wav")
chunk_length_ms = 1000 # pydub calculates in millisec
chunks = make_chunks(myaudio, chunk_length_ms) #Make chunks of one sec
#Export all of the individual chunks as wav files
for i, chunk in enumerate(chunks):
chunk_name = "chunk0.wav".format(i)
print "exporting", chunk_name
chunk.export(chunk_name, format="wav")
输出
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
exporting chunk0.wav
exporting chunk1.wav
exporting chunk2.wav
exporting chunk3.wav
exporting chunk4.wav
exporting chunk5.wav
exporting chunk6.wav
exporting chunk7.wav
exporting chunk8.wav
>>>
【讨论】:
使用 python 代替,sox 是播放音频文件的好工具:***.com/questions/16125614/… 你太棒了;) 如何保存这些块并用于以后的语音处理?chunk.export
方法将可播放的音频块导出到文件(此处为.wav),您可以稍后将其用于音频处理。保存以上块(chunk0.wav ... 到 .. chunk8.wav)在您从上面运行脚本的同一文件夹中。
我正在使用相同的代码来切片音频文件。但我不断收到以下错误:AttributeError:'str'对象没有属性'export'。谁能告诉我这里出了什么问题?【参考方案2】:
您是否考虑过仅使用 numpy 将文件切成采样率长度的切片,可能会将每个切片附加到 numpy 数组列表中。然后,您可以使用您选择的音频工具遍历您的 np.arrays 列表,将每个列表写入声音文件,我个人喜欢声音文件。
import numpy as np
import soundfile as sf
# read into a numpy array
data, sr = sf.read('filename.format')
# split
split = []
noSections = int(np.ceil(len(data) / sr))
for i in range(noSections):
# get 1 second
temp = data[i*sr:i*sr + sr] # this is for mono audio
# temp = data[i*sr:i*sr + sr, :] # this is for stereo audio; uncomment and comment line above
# add to list
split.append(temp)
for i in range(noSections):
# format filename
filename = 'filename_.format'.format()
# write to file
sf.write(filename, split[i], sr)
我知道还有其他一些使用不同库函数的答案,但这很好,很纯粹,对我希望的任何事情都有好处
【讨论】:
以上是关于如何在python中将音频文件(wav格式)拼接成1秒的拼接?的主要内容,如果未能解决你的问题,请参考以下文章
如何用C语言编写程序将多个wav文件拼接成一个音频wav文件并播放