|
import streamlit as st |
|
from streamlit_webrtc import webrtc_streamer, WebRtcMode |
|
import requests |
|
import av |
|
import numpy as np |
|
import wave |
|
import io |
|
|
|
st.title("Sai Vahini AI Voice Assistant ποΈ") |
|
|
|
|
|
api_url = "https://saivahini.onrender.com/process_audio" |
|
|
|
frames = [] |
|
|
|
|
|
def save_audio(frames, sample_rate=16000): |
|
audio_bytes = io.BytesIO() |
|
wf = wave.open(audio_bytes, 'wb') |
|
wf.setnchannels(1) |
|
wf.setsampwidth(2) |
|
wf.setframerate(sample_rate) |
|
wf.writeframes(b''.join(frames)) |
|
wf.close() |
|
audio_bytes.seek(0) |
|
return audio_bytes |
|
|
|
|
|
def audio_frame_callback(frame): |
|
audio = frame.to_ndarray(format="s16le") |
|
frames.append(audio.tobytes()) |
|
return av.AudioFrame.from_ndarray(audio, format="s16", layout="mono") |
|
|
|
|
|
if st.button("ποΈ Record your voice"): |
|
frames.clear() |
|
webrtc_streamer( |
|
key="audio-recorder", |
|
mode=WebRtcMode.SENDRECV, |
|
audio_frame_callback=audio_frame_callback, |
|
media_stream_constraints={"audio": True, "video": False} |
|
) |
|
|
|
|
|
if st.button("β
Stop & Process Audio"): |
|
if frames: |
|
with st.spinner("π Processing your voice..."): |
|
audio_file = save_audio(frames) |
|
|
|
response = requests.post(api_url, files={"file": ("audio.wav", audio_file, "audio/wav")}) |
|
|
|
if response.status_code == 200: |
|
result = response.json() |
|
st.success("β
AI Response:") |
|
st.write("**Transcription:**", result["transcription"]) |
|
st.write("**Answer:**", result["response"]) |
|
|
|
audio_response_url = result.get("audio") |
|
|
|
|
|
audio_content = requests.get(audio_response_url).content |
|
st.audio(audio_content, format='audio/wav') |
|
else: |
|
st.error(f"β API Error: {response.status_code}") |
|
else: |
|
st.error("β οΈ No audio captured. Please record again.") |