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

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

Похожие вопросы
Wanted. Санкт-Петербург
До 120 000 ₽
Wanted. Санкт-Петербург
от 80 000 до 150 000 ₽
от 60 000 до 120 000 ₽
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект
22 нояб. 2024, в 03:54
1500 руб./за проект