Как комбинировать streamlit_webrtc и асинсио для параллельного захвата и вывода аудио? #1818Python

Программы на Python
Ответить
Anonymous
 Как комбинировать streamlit_webrtc и асинсио для параллельного захвата и вывода аудио? #1818

Сообщение Anonymous »

Как я могу комбинировать wreamlit_webrtc и asyncio для выполнения вывода параллельно с аудио -буферизацией? Есть ли какой -нибудь пример того, как это сделать? В основном я хочу захватить аудио -поток, а затем, когда достигается определенное количество кадров (например, 5 секунд). Я запускаю прогноз. К сожалению, это много лагов и задержек, поэтому я пытаюсь запустить их параллельно с помощью Asyncio. Похоже, что это блокирует мой трубопровод, возможно, потому, что Streamlit_webrtc также использует асинсио. Итак, как правильный способ сделать это?

Код: Выделить всё

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

DEBUG = False
SAMPLE_RATE = 16000
HERE = Path(__file__).parent
logger = logging.getLogger(__name__)

# Disable eager mode for tf.v1 compatibility with tf.v2
tf.compat.v1.disable_eager_execution()

import warnings
warnings.filterwarnings('ignore')

def get_metadata(fname, section=None):
with open(fname) as f:
meta = json.load(f)

if section:
return meta[section]
return meta

MODEL_LABELS = {"ESSENTIA_genre_discogs400-discogs-effnet-1-random-forrest": get_metadata("pretrained-models/genre_discogs400-discogs-effnet-1.json", "classes")}

def load_essentia_model(model, labels, n_frames=None, overlap=None, debug=True):
embeddings_model_args = {"graphFilename": "pretrained-models/discogs-effnet-bs64-1.pb", "output": "PartitionedCall:1"}
predictions_model_args = {"graphFilename": "pretrained-models/genre_discogs400-discogs-effnet-1.pb", "input": "serving_default_model_Placeholder", "output": "PartitionedCall:0"}
embeddings_model = TensorflowPredictEffnetDiscogs(**embeddings_model_args)
predictions_model = TensorflowPredict2D(**predictions_model_args)
return embeddings_model, predictions_model

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)

async def run_inference(sound_chunk, model, embeddings_model, predictions_model, random_forrest_model, text_output, json_output):
start_process = time.time()

# Audio processing
print(f"Inference: Received sound_chunk of length {len(sound_chunk)}")
sound_chunk = sound_chunk.set_channels(1).set_frame_rate(SAMPLE_RATE)
musicnn_audio_buffer = np.array(sound_chunk.get_array_of_samples(), dtype=np.int16)
float_musicnn_audio_buffer = musicnn_audio_buffer.astype(np.float32, order='C') / 32768.0

# Run inference
likelihoods = predict_essentia(float_musicnn_audio_buffer, embeddings_model, predictions_model)
results_dict = dict(zip(MODEL_LABELS[model], np.round(np.mean(likelihoods, axis=0), 9)))

# Aggregate results into merged categories
probabilities = random_forrest_model.predict_proba(pd.DataFrame([results_dict]))
genres_dict = {genre: prob for genre, prob in zip(random_forrest_model.classes_, probabilities.flatten())}

# Display genres_dict using Streamlit
maximum = max(results_dict, key=results_dict.get)
text_output.markdown(f"**Top Tag:** {maximum, results_dict[maximum]}")
json_output.write("Genres Dict:")
json_output.json(genres_dict)

# End timing
end_process = time.time()
print(f"> Inference done.  Total processing time: {end_process - start_process:.4f}s")
print(f"Genres Dict: {genres_dict}")
print(f">===============================================================

Подробнее здесь: [url]https://stackoverflow.com/questions/79108143/how-to-combine-streamlit-webrtc-and-asyncio-for-parallel-audio-capture-and-infer[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»