2016-07-02 6 views
1

이것은 첫 번째 게시물입니다. 재생 중에 재생 속도를 변경할 수 있습니까? 자동차 엔진 사운드를 시뮬레이트하고 싶습니다. 첫 번째 단계는 엔진의 RPM에 따라 반복되는 샘플의 속도를 변경하는 것입니다. 웨이브 파일의 속도를 변경하여 파이 오디오 (pyaudio)를 사용하여 전체 샘플의 속도를 높이는 방법을 알고 있지만 속도의 연속적인 변경을 원합니다. resampling (그리고 꽤 오래되었습니다) 또는 pysonic (superold)을 허용하는 scikits.samplerate 패키지를 사용하지 않고 이것이 가능합니까?파이썬 : 재생 중 사운드 속도 변경하기

이것은 내가 지금 무엇을 가지고 :

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() 
+0

피치 변경 속도를 함께 변경해도 상관 없습니다. – ederwander

답변

1

당신은 NumPy와 함께 뭔가를 할 수 있어야합니다. 웨이브에 익숙하지 않아서 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을 수정해야 할 것입니다.