【问题标题】:How to splice an audio file (wav format) into 1 sec splices in python?如何在python中将音频文件(wav格式)拼接成1秒的拼接?
【发布时间】:2016-04-22 17:22:06
【问题描述】:

我正在寻找一个 python 函数来将音频文件(wav 格式)拼接成 1 秒持续时间的拼接,并将每个新的拼接(1 秒持续时间)存储到一个新的 .wav 文件中。

【问题讨论】:

  • 我会从numpy.io.wavfile开始
  • numpy中不存在,你可能指的是scipy.io.wavfile
  • 如果您愿意使用外部库,请在下面查看我的回答,该回答简洁明了。

标签: python audio


【解决方案1】:

真正简单易用的pydub模块,详细内容在herehere以上

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 = "chunk{0}.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 是播放音频文件的好工具:stackoverflow.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)
 

我知道还有其他一些使用不同库函数的答案,但这很好,很纯粹,对我希望的任何事情都有好处

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多