如何在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文件并播放

在客户端 JavaScript 中将 WAV 转换为任何压缩音频格式

在 Python 中合并音频文件

Python3正确修改wav音频数据

如何把matlab里的音频文件转换为wav格式

怎样把(波形)声音格式(wav)转换成mp3、wma等其他音频格式?