私の目標は、ラップトップ マイクを介して自分の声を録音し、同時に Python でエフェクトを追加することです。私が必要としているのは、ギターやマイクを接続してリバーブやエコー、ディストーションなどを追加するミュージック エフェクターに似たものです。
「pyaudio」と「wave」を使用してオーディオを録音および再生しています。「scikits.audiolab」を使用してオーディオを配列としてインポートし、この配列を反転、クリップ、タイルなどの関数で編集できるようにします。このオーディオ配列の操作により、元のオーディオにエフェクトを「追加」できます。
私は問題を抱えていますが、それは実際には問題ではなく、私が望む効果ではありません. 「こんにちは」という言葉を録音するとしましょう。録音機能を 3 秒間録音するように設定しています。次に、このオーディオ配列を取得して、1 回並べて表示します。これを再生すると、ハローが 2 回表示されます。これは遅延効果です。しかし、両方のこんにちはの間に「空のスペース」の時間間隔があります。これは、私が挨拶を終えた後も音声が録音されているために発生します。したがって、繰り返すと、単語間に空白が多すぎます。この空きスペースをなくして、再生で hello 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()