Spaces:
Running
Running
import streamlit as st | |
from streamlit_webrtc import webrtc_streamer, WebRtcMode, ClientSettings | |
import numpy as np | |
import io | |
import wave | |
import requests | |
from audio_to_text import audio_to_text | |
import streamlit.components.v1 as components | |
# Initialize Streamlit app layout | |
st.title("Microphone Input in Streamlit") | |
# Load the custom component | |
audio_recorder_html = """ | |
<script> | |
const recordButton = document.getElementById("recordButton"); | |
const stopButton = document.getElementById("stopButton"); | |
const audioChunks = []; | |
let mediaRecorder; | |
navigator.mediaDevices.getUserMedia({ audio: true }) | |
.then(function(stream) { | |
mediaRecorder = new MediaRecorder(stream); | |
recordButton.onclick = function() { | |
mediaRecorder.start(); | |
console.log("Recording started..."); | |
}; | |
stopButton.onclick = function() { | |
mediaRecorder.stop(); | |
console.log("Recording stopped..."); | |
}; | |
mediaRecorder.ondataavailable = function(e) { | |
audioChunks.push(e.data); | |
}; | |
mediaRecorder.onstop = function(e) { | |
const audioBlob = new Blob(audioChunks, { type: "audio/wav" }); | |
const reader = new FileReader(); | |
reader.readAsDataURL(audioBlob); | |
reader.onloadend = function() { | |
const base64data = reader.result.split(',')[1]; | |
Streamlit.setComponentValue(base64data); | |
}; | |
}; | |
}); | |
</script> | |
<button id="recordButton">Start Recording</button> | |
<button id="stopButton">Stop Recording</button> | |
""" | |
# Embed the JavaScript and HTML in Streamlit | |
components.html(audio_recorder_html, height=300) | |
# Retrieve the audio data from the component (if available) | |
audio_data = st.get_query_params().get("value") | |
def audio_callback(frame): | |
# Get raw audio data from the frame | |
audio_data = frame.to_ndarray().astype(np.int16) | |
# Convert audio to text | |
transcription = audio_to_text(audio_data) | |
# Display the transcription | |
st.write("Transcription:", transcription) | |
API_URL = "https://eaa0-34-74-179-199.ngrok-free.app/generate" | |
# Optionally, send the transcription to an API | |
headers = { | |
"Content-Type": "application/json" | |
} | |
payload = { | |
"prompt": transcription | |
} | |
response = requests.post(API_URL, json=payload, headers=headers) | |
if response.status_code == 200: | |
st.write("Assistant:", response.json()) | |
else: | |
st.write("Error:", response.status_code, response.text) | |
webrtc_ctx = webrtc_streamer( | |
key="audio-only", | |
mode=WebRtcMode.SENDRECV, | |
rtc_configuration={"iceServers": [{"urls": ["stun:stun1.l.google.com:19302"]}]}, | |
media_stream_constraints={ | |
"audio": True, | |
"video": False | |
}, | |
audio_frame_callback=audio_callback | |
) | |
# Placeholder for capturing audio | |
if webrtc_ctx.state.playing: | |
st.write("Microphone is active. Speak into the microphone...") | |
else: | |
st.write("Click to start microphone input.") | |