我的目標是通過筆記本電腦麥克風錄製我的聲音,並同時在python中添加效果。我需要的是類似於連接吉他或麥克風的音樂效果踏板,它會添加混響或回聲或失真等。同步錄製來自麥克風的音頻並在python中播放效果
我正在使用'pyaudio'和'wave'來錄製和播放音頻。使用'scikits.audiolab'將音頻導入爲數組,並且可以使用諸如反轉,剪輯,平鋪等功能來編輯該數組。音頻陣列的這種操作使我可以將「添加」效果添加到原始音頻。
我有一個問題,這不是一個真正的問題,它只是不是我想要的效果。假設我記錄單詞「你好」。我有我的記錄功能設置爲記錄3秒。然後我拿起這個音頻陣列並平鋪一次。現在,當我打這個回來,它會打兩次打招呼,延遲效果。但是,在這兩個hello之間有一段時間間隔'空閒空間',這是因爲在我完成打招呼後音頻仍在錄製。因此,當它重複時,單詞之間的空白空間太多。我想消除這個空的空間,以便播放更快地打招呼你好。
我的老師推薦穿線。他說我應該記錄下來,同時抓住前500個樣本,說出一個數字。他建議拍攝這500個樣本,並在錄製時播放它們。我不太清楚如何實現這一點。
我的問題是,如何同時記錄,採取前500個樣本,並創建一個新的陣列與「效果」添加到原始錄音。
import scikits.audiolab as audiolab
import pyaudio
import wave
def recordAudio():
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "audioOriginal.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* recording:")
frames = []
for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* Finished recording.")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
# Duplicate audio and save as Actual
frames, fs, encoder = audiolab.wavread('audioOriginal.wav')
audiolab.wavwrite(frames,'audioActual.wav',fs)
def playAudio():
import pyaudio
import wave
CHUNK = 1024
wf = wave.open('audioActual.wav', 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(CHUNK)
while data != '':
stream.write(data)
data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()
def reverseAudio():
frames, fs, encoder = audiolab.wavread('audioActual.wav')
audiolab.wavwrite(frames[::-1],'audioActual.wav',44100)
def revert():
frames, fs, encoder = audiolab.wavread('audioOriginal.wav')
audiolab.wavwrite(frames,'audioActual.wav',fs)
def errorSelection():
print("\nERROR.") # no option in menu
def showMenu():
print("""
1. Record audio
2. Play audio
3. Reverse audio
4. Add delay
5. Revert to original audio
T to end program.
""")
# Menu
def main():
selecciones = {"1": recordAudio, "2": playAudio, "3": reverseAudio, "5": revert}
while True:
showMenu()
seleccion = raw_input(u'What do you want to do? ')
if "t" == seleccion:
return
elif "T" == seleccion:
return
toDo = selecciones.get(seleccion, errorSelection)
toDo()
if __name__ == "__main__":
main()
這個問題是關於如何在同一時間開始播放和錄製主題:http://stackoverflow.com/q/13422186/125507雖然有可能直接做到這一點使用[回調模式] (http://people.csail.mit.edu/hubert/pyaudio/docs/#example-callback-mode-audio-io)? – endolith