2016-07-02 10 views
1

これは私の最初の投稿です。再生中に再生速度を変更することはできますか?私は車のエンジン音をシミュレートしたいと思います。最初のステップは、エンジンのRPMに応じてループされたサンプルの速度を変更することです。私は、waveファイルのレートを変更することでpyaudioを使って完全なサンプルの速度を上げる方法を知っていますが、レートの連続的な変更が必要です。これは、resampling(そしてかなり古くなっている)またはsuperdoldであるpysonicを可能にするscikits.samplerateパッケージを使用せずに可能ですか?Python:再生中の音の速さを変える

これは私が現時点で持っているものです。

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を変更する必要があります。

関連する問題