在 python 中播放 .wav 文件的一部分

Posted

技术标签:

【中文标题】在 python 中播放 .wav 文件的一部分【英文标题】:Play a part of a .wav file in python 【发布时间】:2013-09-10 14:34:47 【问题描述】:

是否可以在 Python 中播放 .wav 文件的特定部分?

我想要一个函数play(file, start, length),它从start 秒播放音频文件file,并在length 秒后停止播放。这可能吗?如果可以,我需要什么库?

【问题讨论】:

【参考方案1】:

这是可能的,并且在 python 中很容易。

Pyaudio 是一个不错的库,您可以使用它来播放音频!

首先您需要解码音频文件(wav、mp3 等),此步骤将音频数据转换为数字(short int 或 float32)。

您是否需要转换等效位置点的秒数以切断感兴趣位置的信号,为此将您的帧速率乘以您想要的秒数!

以下是 wav 文件的一个简单示例:

import pyaudio
import sys
import numpy as np
import wave
import struct



File='ederwander.wav'
start = 12
length=7
chunk = 1024

spf = wave.open(File, 'rb')
signal = spf.readframes(-1)
signal = np.fromstring(signal, 'Int16')
p = pyaudio.PyAudio()

stream = p.open(format =
                p.get_format_from_width(spf.getsampwidth()),
                channels = spf.getnchannels(),
                rate = spf.getframerate(),
                output = True)


pos=spf.getframerate()*length

signal =signal[start*spf.getframerate():(start*spf.getframerate()) + pos]

sig=signal[1:chunk]

inc = 0;
data=0;


#play 
while data != '':
    data = struct.pack("%dh"%(len(sig)), *list(sig))    
    stream.write(data)
    inc=inc+chunk
    sig=signal[inc:inc+chunk]


stream.close()
p.terminate()

【讨论】:

【参考方案2】:

我知道这是一个相当老的问题,但我只需要完全相同的东西,对我来说,ederwander 的例子似乎有点太复杂了。

这是我的简短(和评论)解决方案:

import pyaudio
import wave

# set desired values
start = 7
length = 3

# open wave file
wave_file = wave.open('myWaveFile.wav', 'rb')

# initialize audio
py_audio = pyaudio.PyAudio()
stream = py_audio.open(format=py_audio.get_format_from_width(wave_file.getsampwidth()),
                       channels=wave_file.getnchannels(),
                       rate=wave_file.getframerate(),
                       output=True)

# skip unwanted frames
n_frames = int(start * wave_file.getframerate())
wave_file.setpos(n_frames)

# write desired frames to audio buffer
n_frames = int(length * wave_file.getframerate())
frames = wave_file.readframes(n_frames)
stream.write(frames)

# close and terminate everything properly
stream.close()
py_audio.terminate()
wave_file.close()

【讨论】:

这很好,但最好在第 9 行使用不同的名称,因为这是分配给导入模块的名称(例如,将其称为 wave_file 或其他名称)。 @HenryDavidThorough 你完全正确,谢谢!答案已更新。 无法编辑代码(队列已满),但请注意这里仍需要重命名变量:wave.getsampwidth() --> wave_file.getsampwidth() @Neil 非常感谢,忽略了!

以上是关于在 python 中播放 .wav 文件的一部分的主要内容,如果未能解决你的问题,请参考以下文章

C ++将wav文件放入dll

Python解析Wav文件并绘制波形的方法

如何使用 python 连接两个 wav 文件?

如何在 Windows 中播放 .wav 文件?

python读取wav文件并播放[pyaudio/wave]

Python播放mp3/wav文件音频(Pygame混音器)