gpt4 book ai didi

Python:在播放过程中改变声音的速度

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:56 25 4
gpt4 key购买 nike

这是我的第一篇文章。是否可以在播放过程中更改播放速度?我想模拟汽车发动机的声音,为此第一步是根据发动机的转速改变循环样本的速度。我知道如何通过更改波形文件的速率来提高使用 pyaudio 的完整样本的速度,但我希望连续更改速率。如果不使用 scikits.samplerate 包(允许重新采样(并且很旧))或 pysonic(超旧),这是否可能?

这就是我现在所拥有的:

import pygame, sys
import numpy as np
import pyaudio
import wave
from pygame.locals import *
import random as rd
import os
import time

pygame.init()

class AudioFile:
chunk = 1024

def __init__(self, file, speed):
""" Init audio stream """
self.wf = wave.open(file, 'rb')
self.speed = speed
self.p = pyaudio.PyAudio()
self.stream = self.p.open(
format = self.p.get_format_from_width(self.wf.getsampwidth()),
channels = 1,
rate = speed,
output = True)

def play(self):
""" Play entire file """
data = self.wf.readframes(self.chunk)
while data != '':
self.stream.write(data)

def close(self):
""" Graceful shutdown """
self.stream.close()
self.p.terminate()

a = AudioFile("wave.wav")
a.play()

最佳答案

你应该能够用 numpy 做一些事情。我对 Wave 等不太熟悉,我希望你的 play() 方法以某种方式在循环内包含 readframes() (正如我尝试在这里做的那样),但你可能可以从中得到这个想法

def play(self):
""" Play entire file """
x0 = np.linspace(0.0, self.chunk - 1.0, self.chunk)
x1 = np.linspace(0.0, self.chunk - 1.0, self.chunk * self.factor) # i.e. 0.5 will play twice as fast
data = ''
while data != '':
f_data = np.fromstring(self.wf.readframes(self.chunk),
dtype=np.int).astype(np.float) # need to use floats for interpolation
if len(f_data) < self.chunk:
x1 = x1[:int(len(f_data) * self.factor)]
data = np.interp(x1, x0, f_data).astype(np.int)
self.stream.write(data)

显然,这对整个游戏使用相同的加速或减速因子。如果您想在游戏中更改它,则必须在 while 循环内修改 x1。

关于Python:在播放过程中改变声音的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38165103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com