SuperZombi
@SuperZombi

Как сделать эффект «бурундука» в реальном времени (pyaudio)?

Идея: Прослушивать микрофон пользователя и в режиме реального времени (возможная задержка до 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сек и этого достаточно, чтобы запороть аудиодорожку.
Кто-то знает как это можно пофиксить? (возможно использовать какой-то другой алгоритм)
  • Вопрос задан
  • 138 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы