Как я могу комбинировать wreamlit_webrtc и asyncio для выполнения вывода параллельно с аудио -буферизацией? Есть ли какой -нибудь пример того, как это сделать? В основном я хочу захватить аудио -поток, а затем, когда достигается определенное количество кадров (например, 5 секунд). Я запускаю прогноз. К сожалению, это много лагов и задержек, поэтому я пытаюсь запустить их параллельно с помощью Asyncio. Похоже, что это блокирует мой трубопровод, возможно, потому, что Streamlit_webrtc также использует асинсио. Итак, как правильный способ сделать это?
Как я могу комбинировать wreamlit_webrtc и asyncio для выполнения вывода параллельно с аудио -буферизацией? Есть ли какой -нибудь пример того, как это сделать? В основном я хочу захватить аудио -поток, а затем, когда достигается определенное количество кадров (например, 5 секунд). Я запускаю прогноз. К сожалению, это много лагов и задержек, поэтому я пытаюсь запустить их параллельно с помощью Asyncio. Похоже, что это блокирует мой трубопровод, возможно, потому, что Streamlit_webrtc также использует асинсио. Итак, как правильный способ сделать это?[code]import json import time import json import pydub import queue import socket import joblib import librosa import asyncio import logging import numpy as np import pandas as pd import logging.handlers import streamlit as st import tensorflow as tf from pathlib import Path from pprint import pprint from streamlit_webrtc import WebRtcMode, webrtc_streamer from essentia.standard import TensorflowPredictEffnetDiscogs, TensorflowPredict2D
def predict_essentia(audio, embeddings_model, predictions_model): # Run the models #print("-> Audio to predict: ", audio.shape, audio.dtype, type(audio)) embeddings = embeddings_model(audio) predictions = predictions_model(embeddings) return predictions
async def audio_collector(webrtc_ctx, sound_chunk_queue): """Asynchronously collect audio frames from webrtc context""" while webrtc_ctx.state.playing: try: audio_frames = webrtc_ctx.audio_receiver.get_frames(timeout=1) except queue.Empty: continue
for audio_frame in audio_frames: sound = pydub.AudioSegment( data=audio_frame.to_ndarray().tobytes(), sample_width=audio_frame.format.bytes, frame_rate=audio_frame.sample_rate, channels=len(audio_frame.layout.channels) ) # Put the sound into the queue await sound_chunk_queue.put(sound)