schichtplan / app.py
mgokg's picture
Update app.py
224c987 verified
import os
import io
import streamlit as st
from groq import Groq
import requests
import soundfile as sf
import google.generativeai as genai
from audiorecorder import audiorecorder
# Umgebungsvariablen laden
groq_api_key = os.getenv('groqwhisper')
gemini_api_key = os.getenv('geminiapi')
google_api_key = os.getenv('google_search')
cx="77f1602c0ff764edb"
if not groq_api_key or not gemini_api_key:
st.error("Bitte setze die Umgebungsvariablen 'groqwhisper' und 'geminiapi'")
st.stop()
# Groq Client initialisieren
groq_client = Groq(api_key=groq_api_key)
# Gemini konfigurieren
genai.configure(api_key=gemini_api_key)
# Modellkonfiguration
generation_config = {
"temperature": 0.4,
"top_p": 0.95,
"top_k": 40,
"max_output_tokens": 8192,
"response_mime_type": "text/plain",
}
model = genai.GenerativeModel(
model_name="gemini-2.0-flash-exp",
generation_config=generation_config,
)
# Session State für Chatverlauf
if "chat_session" not in st.session_state:
st.session_state.chat_session = model.start_chat(history=[])
if "display_history" not in st.session_state:
st.session_state.display_history = []
def websearch(prompt):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
url = f"https://www.googleapis.com/customsearch/v1?key={google_api_key}&cx={cx}&q={prompt}"
response = requests.get(url, headers=headers)
data = response.json() # JSON-Daten direkt verarbeiten
# Extrahieren des Textes aus den Ergebnissen
items = data.get('items', [])
results = [item['snippet'] for item in items]
result_text = '\n'.join(results)
# Formuliere die Antwort
search_query = f"{prompt} antworte kurz und knapp. antworte auf deutsch. du findest die antwort hier: {result_text}"
#result = predict(search_query)
return result_text
def process_audio(audio_data):
"""Verarbeitet Audiodaten und gibt Transkript zurück."""
try:
sample_rate, samples = audio_data
# WAV-Datei im Speicher erstellen
with io.BytesIO() as wav_buffer:
sf.write(wav_buffer, samples, sample_rate, format='WAV')
wav_buffer.seek(0)
# Transkription mit Groq
transcription = groq_client.audio.transcriptions.create(
file=("recording.wav", wav_buffer.read(), "audio/wav"),
model="whisper-large-v3-turbo",
prompt="transcribe",
language="de",
response_format="json",
temperature=0.0
)
return transcription.text
except Exception as e:
return f"Fehler: {str(e)}"
st.subheader("Gemini-2/Websearch")
messages = st.container()
# Chatverlauf anzeigen
for role, text in st.session_state.display_history:
with st.chat_message(role):
st.markdown(text)
# Spracheingabe verarbeiten
audio_bytes = st.audio_input("Sprachnachricht aufnehmen")
if audio_bytes:
try:
audio_content = audio_bytes.getvalue()
with io.BytesIO(audio_content) as wav_io:
samples, sample_rate = sf.read(wav_io)
if len(samples.shape) > 1 and samples.shape[1] == 2:
samples = samples.mean(axis=1)
with st.spinner("Transkription..."):
transcription = process_audio((sample_rate, samples))
if transcription:
if transcription.startswith("Fehler:"):
st.error(transcription)
else:
#st.session_state.display_history.append(("user", transcription))
websearch = websearch(transcription)
full_prompt = f"{transcription}\nAntworte immer auf Deutsch\n Du findest die Antwort hier:\n{websearch}"
response = st.session_state.chat_session.send_message(full_prompt)
response_text = response.candidates[0].content.parts[0].text if response.candidates else "Keine Antwort"
messages.chat_message("assistant").write(f"{response_text}")
#st.write(response_text)
#st.session_state.display_history.append(("assistant", response_text))
#st.rerun()
except Exception as e:
st.error(f"Audioprocessing fehlgeschlagen: {str(e)}")
# Texteingabe verarbeiten
user_input = st.text_input("Schreibe deine Frage:", key="user_input")
if user_input:
websearch = websearch(user_input)
#st.session_state.display_history.append(("user", user_input))
full_prompt = f"{user_input}\nAntworte immer auf Deutsch\n antworte kurz und knapp.\n Du findest die Antwort hier:\n{websearch}"
response = st.session_state.chat_session.send_message(full_prompt)
response_text = response.candidates[0].content.parts[0].text if response.candidates else "Keine Antwort"
messages.chat_message("assistant").write(f"{response_text}")
#st.markdown(response_text)
#st.session_state.display_history.append(("assistant", response_text))
#st.rerun()