【问题标题】:Python: Changing the speed of sound during playbackPython:在播放过程中改变声音的速度
【发布时间】:2016-07-02 22:49:58
【问题描述】:

这是我的第一篇文章。是否可以在播放过程中更改播放速度?我想模拟汽车发动机的声音,为此第一步是根据发动机的 RPM 改变循环样本的速度。我知道如何通过改变波形文件的速率来提高使用 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()

【问题讨论】:

  • 是的,有可能,你不管什么时候改变你的音高都变了?

标签: python audio audio-processing pitch


【解决方案1】:

你应该可以用 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多