2016-10-12 5 views
0

며칠 전에 a sounddevice 라이브러리를 Python 2.7.5에 설치했습니다. 내 사운드 컨트롤러에 키를 누른 후 사운드 배열을 만들고 그 위에 몇 가지 효과를 추가하려고합니다. 그러나 나는 내 코드가 쓸모 만드는 0.1 ~ 0.2 초 거대한 지연을 얻을 :파이어 폭스에서 사운드 장치를 사용하여 사운드 배열을 조작하는 동안 대기 시간이 너무 길어졌습니다

import numpy as np 
import sounddevice as sd 
import time 
import math 

#we're making a sound array with a 5 seconds length noisy sound and playing it: 
duration=5 
framerate = 44100 
array=0.02*np.random.uniform(-1, 1, framerate*duration) 
sd.play(array, framerate) 

t=time.time() 
while(True): 
    signal=raw_input("push ENTER to hear a beep") 
    start_iter=int(framerate*(time.time()-t)) 
    end_iter=min(start_iter+framerate/4, len(array)) 

    #we're trying to change our data array and play a beep signal of 0.25 second after each ENTER press instantly 
    for i in range(start_iter, end_iter): 
     array[i]=0.05*math.sin(440*2*math.pi*i/44100.) 
    if end_iter==len(array): break #safe exit of a process after 5 seconds has passed 

는 간단하게하기 위해, 내 소리 배열은 시끄러운 소리 내 효과는 440Hz로 경고음으로 구성되어 있습니다. 나는 파이 게임 라이브러리를 사용하여 가능할 수있는 MIDI 입력 대신 raw_input()을 사용했습니다 (Python 3.x에서는 "input"). 내 코드는 작동하지만 Enter 키를 누를 때마다 신호음이 울리기 전에 짧은 지연 시간이 들립니다. 삭제할 수 있습니까? 그렇지 않은 경우 지연없이 라이브 사운드 스트림을 재생할 수있는 다른 라이브러리가 있습니까?

답변

0

sounddevice.default.latency으로 원하는 대기 시간을 지정할 수 있습니다. 그러나 이것은 이고 지연 시간은이며 실제 대기 시간은 하드웨어 및 호스트 API에 따라 다를 수 있습니다. sounddevice.Stream.latency으로 실제 대기 시간을 예측할 수 있습니다.

기본적으로 sounddevice 모듈은 더 강력한 동작을 제공하기 위해 PortAudio의 높은 대기 시간 설정을 사용합니다. PortAudio의 설정을으로 낮추거나 원하는 숫자 값 (초)을 시도 할 수 있습니다. 당신은 시간을보다 잘 제어하려면

import sounddevice as sd 
sd.default.latency = 'low' 

또는, 당신은 물론 또한 play()

latency 인수를 사용할 수 있습니다, 당신은 사용자 정의 콜백 함수를 작성 할 수 있습니다. 여기서 time 인수를 사용할 수 있으며 콜백 함수 외부에서는 sounddevice.Stream.time을 사용할 수 있습니다.

callback 인수를 사용하지 않고 스트림을 시작한 다음 sounddevice.Stream.write()을 사용해도됩니다. 대기 시간에 어떤 영향을 줄지는 모르겠지만 시도해 볼만한 가치가있을 수 있습니다.

다른 라이브러리에 대해서는 이미 PyGame을 사용하고있는 것 같기 때문에 오디오 출력용으로 사용할 수도 있습니다. 다른 대기 시간이있을 수도 있고 그렇지 않을 수도 있습니다.

글 머리 기호가 PortAudio에 메모리 주소를 제공하는 동안 배열을 조작하므로 코드가 스레드로부터 안전한지 여부는 알 수 없습니다. 이런 식으로 구현하는 것은 좋은 생각이 아닙니다.