Идея: Прослушивать микрофон пользователя и в режиме реального времени (возможная задержка до 500 мс) изменять высоту звука и воспроизводить его на устройстве вывода (Virtual Audio Cable).
from librosa.effects import pitch_shift
...
def pitch_shift_callback(in_data, frame_count, time_info, status):
pitch_value = 6
audio_data = np.frombuffer(in_data, dtype=np.float32)
shifted_audio_data = pitch_shift(audio_data, sr=44100, n_steps=pitch_value)
out_data = shifted_audio_data.tobytes()
return (out_data, pyaudio.paContinue)
...
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=44100,
input_device_index=SETTINGS["INPUT_DEVICE"],
output_device_index=SETTINGS["OUTPUT_DEVICE"],
input=True, output=True,
stream_callback=pitch_shift_callback,
frames_per_buffer=2048)
У меня довольно мощный компьютер, но при обработке я получаю прерывистый эффект между чанками.
Я пробовал увеличивать и уменьшать размер чанков, но это не помогает.
Я также изучал, почему это происходит. Если вы оставите необработанный звук и просто установите
time.sleep(0.05)
, то этот прерывистый эффект также появится.
def pitch_shift_callback(in_data, frame_count, time_info, status):
time.sleep(0.01)
return (in_data, pyaudio.paContinue)
Скорее всего это связано с тем, что между чанками появляются "дырки" длительностью по 0,01сек и этого достаточно, чтобы запороть аудиодорожку.
Кто-то знает как это можно пофиксить? (возможно использовать какой-то другой алгоритм)