50a07e5e shared you an app

das ist mein code: import streamlit as st import streamlit.components.v1 as components import requests import dropbox from dotenv import load_dotenv import os # Lade Umgebungsvariablen aus der .env Datei load_dotenv() # Greife auf die Schlüssel aus den Umgebungsvariablen zu OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') AIRTABLE_API_KEY = os.getenv('AIRTABLE_API_KEY') AIRTABLE_BASE_ID = os.getenv('AIRTABLE_BASE_ID') AIRTABLE_TABLE_NAME = os.getenv('AIRTABLE_TABLE_NAME') DROPBOX_ACCESS_TOKEN = os.getenv('DROPBOX_ACCESS_TOKEN') # Initialisiere Dropbox-Client dbx = dropbox.Dropbox(DROPBOX_ACCESS_TOKEN) # Airtable URL airtable_url = f"https://api.airtable.com/v0/{AIRTABLE_BASE_ID}/{AIRTABLE_TABLE_NAME}" # Streamlit App st.title("Einreichung Schadensbericht") # Sicherstellen, dass die Session State existiert if 'transcription' not in st.session_state: st.session_state['transcription'] = "" if 'translation' not in st.session_state: st.session_state['translation'] = "" # Survey-Formular st.header("Basisinformationen") with st.form("survey_form"): datum_einmeldung = st.date_input("Datum der Einmeldung") datum_schaden = st.date_input("Datum des Schadens") eingereicht_von = st.selectbox("Eingereicht von", ["Mitarbeiter:in A", "Mitarbeiter:in B", "Mitarbeiter:in C"]) stelle_schaden = st.text_input("Stelle des Schadens") gefahr_vorhanden = st.selectbox("Gefahr vorhanden?", ["Ja", "Nein"]) bild_upload_1 = st.file_uploader("Bild Upload 1 (Totale)", type=["jpg", "jpeg", "png"]) bild_upload_2 = st.file_uploader("Bild Upload 2 (Details)", type=["jpg", "jpeg", "png"]) bild_upload_3 = st.file_uploader("Bild Upload 3 (weitere Details)", type=["jpg", "jpeg", "png"]) st.markdown("### Spracheingabe") # Textfelder für Transkription und Übersetzung, befüllt aus Session State transcription_value = st.text_area("Transkription der Spracheingabe", value=st.session_state['transcription'], key="transcription") translation_value = st.text_area("Übersetzung Text", value=st.session_state['translation'], key="translation") # HTML5-Recorder mit OpenAI-Integration und direkter Datenübertragung an Streamlit audio_recorder_html = f""" <!DOCTYPE html> <html> <head> <title>Erstellung Schadensbericht</title> <style> .instruction {{ font-size: 1.2em; margin-bottom: 5px; color: white; }} #visualizer {{ width: 100%; height: 100px; background: #000; border: 1px solid #ccc; margin-bottom: 5px; }} #transcriptionBox, #translationBox {{ display: none; /* Ausblenden der Textboxen */ }} body {{ margin: 0; padding: 0; background-color: #333; color: white; font-family: Arial, sans-serif; }} button {{ margin-right: 5px; padding: 10px 20px; background-color: #ff5722; color: white; border: none; cursor: pointer; font-size: 1em; }} button[disabled] {{ background-color: #555; cursor: not-allowed; }} audio {{ margin-top: 10px; width: 100%; }} </style> </head> <body> <p class="instruction">Nun sag der AI deine zusammenfassende Beschreibung des identifizierten Schadens.</p> <canvas id="visualizer"></canvas> <button id="recordButton">Aufnahme starten</button> <button id="stopButton" disabled>Aufnahme stoppen</button> <audio id="audioPlayback" controls></audio> <button id="sendButton" disabled>Aufnahme an AI senden</button> <textarea id="transcriptionBox"></textarea> <textarea id="translationBox"></textarea> <script> let chunks = []; let recorder; let audioContext; let analyser; let dataArray; let animationId; const recordButton = document.getElementById('recordButton'); const stopButton = document.getElementById('stopButton'); const sendButton = document.getElementById('sendButton'); const audioPlayback = document.getElementById('audioPlayback'); const visualizer = document.getElementById('visualizer'); const transcriptionBox = document.getElementById('transcriptionBox'); const translationBox = document.getElementById('translationBox'); const canvasCtx = visualizer.getContext("2d"); const openaiApiKey = '{OPENAI_API_KEY}'; navigator.mediaDevices.getUserMedia({{ audio: true }}).then(stream => {{ audioContext = new (window.AudioContext || window.webkitAudioContext)(); analyser = audioContext.createAnalyser(); const source = audioContext.createMediaStreamSource(stream); source.connect(analyser); analyser.fftSize = 2048; const bufferLength = analyser.frequencyBinCount; dataArray = new Uint8Array(bufferLength); recorder = new MediaRecorder(stream); recorder.ondataavailable = event => {{ chunks.push(event.data); }}; recorder.onstop = () => {{ const blob = new Blob(chunks, {{ type: 'audio/wav' }}); chunks = []; const audioURL = URL.createObjectURL(blob); audioPlayback.src = audioURL; audioPlayback.blob = blob; sendButton.disabled = false; cancelAnimationFrame(animationId); canvasCtx.clearRect(0, 0, visualizer.width, visualizer.height); }}; }}); function draw() {{ analyser.getByteTimeDomainData(dataArray); canvasCtx.fillStyle = 'black'; canvasCtx.fillRect(0, 0, visualizer.width, visualizer.height); canvasCtx.lineWidth = 2; canvasCtx.strokeStyle = 'white'; canvasCtx.beginPath(); const sliceWidth = visualizer.width * 1.0 / analyser.frequencyBinCount; let x = 0; for (let i = 0; i < analyser.frequencyBinCount; i++) {{ const v = dataArray[i] / 128.0; const y = v * visualizer.height / 2; if (i === 0) {{ canvasCtx.moveTo(x, y); }} else {{ canvasCtx.lineTo(x, y); }} x += sliceWidth; }} canvasCtx.lineTo(visualizer.width, visualizer.height / 2); canvasCtx.stroke(); animationId = requestAnimationFrame(draw); }} recordButton.addEventListener('click', () => {{ recorder.start(); draw(); recordButton.disabled = true; stopButton.disabled = false; }}); stopButton.addEventListener('click', () => {{ recorder.stop(); cancelAnimationFrame(animationId); canvasCtx.clearRect(0, 0, visualizer.width, visualizer.height); recordButton.disabled = false; stopButton.disabled = true; }}); sendButton.addEventListener('click', async () => {{ const formData = new FormData(); formData.append('file', audioPlayback.blob, 'recording.wav'); formData.append('model', 'whisper-1'); try {{ const response = await fetch('https://api.openai.com/v1/audio/transcriptions', {{ method: 'POST', headers: {{ 'Authorization': 'Bearer ' + openaiApiKey }}, body: formData }}); const data = await response.json(); if (!response.ok) {{ throw new Error(data.error.message); }} const transcription = data.text || 'Fehler beim Transkribieren der Audioaufnahme.'; transcriptionBox.value = transcription; // Hinzufügen des Codes zum Übersetzen der Transkription const translateResponse = await fetch('https://api.openai.com/v1/chat/completions', {{ method: 'POST', headers: {{ 'Authorization': 'Bearer ' + openaiApiKey, 'Content-Type': 'application/json' }}, body: JSON.stringify({{ model: "gpt-4", messages: [{{"role": "system", "content": "Du bist ein Übersetzer."}}, {{"role": "user", "content": 'Übersetze den folgenden Text ins Deutsche: "' + transcription + '"'}}], max_tokens: 1000 }}) }}); const translateData = await translateResponse.json(); if (!translateResponse.ok) {{ throw new Error(translateData.error.message); }} const translation = translateData.choices[0].message.content.trim(); translationBox.value = translation; // Setze die Werte in die Streamlit-Textboxen und speichere sie in der Session State window.parent.document.querySelector('textarea[aria-label="Transkription der Spracheingabe"]').value = transcription; window.parent.Streamlit.setComponentValue({{ transcription }}); window.parent.document.querySelector('textarea[aria-label="Übersetzung Text"]').value = translation; window.parent.Streamlit.setComponentValue({{ translation }}); }} catch (error) {{ console.error('Fehler beim Senden an AI:', error); transcriptionBox.value = 'Fehler beim Transkribieren der Audioaufnahme: ' + error.message; }} }}); </script> </body> </html> """ components.html(audio_recorder_html, height=400) # Submit Button muss innerhalb des Formulars definiert sein submit_button = st.form_submit_button(label="Einreichen") # Funktion zum Hochladen von Dateien zu Dropbox und Abrufen des freigegebenen Links def upload_to_dropbox(file, path): try: dbx.files_upload(file.read(), path, mute=True) shared_link_metadata = dbx.sharing_create_shared_link_with_settings(path) url = shared_link_metadata.url.replace("dl=0", "dl=1") return url except Exception as e: st.error(f"Fehler beim Hochladen der Bilder: {e}") return None # Handling der Formular-Übertragung if submit_button: try: # Sicherstellen, dass die Werte aus den Textfeldern abgerufen werden transcription_value = st.session_state['transcription'] translation_value = st.session_state['translation'] # Debugging: Ausgabe der Werte vor dem Senden an Airtable st.write("Transkription:", transcription_value) st.write("Übersetzung:", translation_value) # Felddaten vorbereiten fields = { "Datum der Einmeldung": datum_einmeldung.strftime('%Y-%m-%d') if datum_einmeldung else None, "Datum des Schadens": datum_schaden.strftime('%Y-%m-%d') if datum_schaden else None, "Eingereicht von": eingereicht_von, "Stelle des Schadens": stelle_schaden if stelle_schaden else "N/A", "Gefahr vorhanden?": gefahr_vorhanden if gefahr_vorhanden else "N/A", "Transkription der Spracheingabe": transcription_value, "Übersetzung Text": translation_value } # Dateien zu Dropbox hochladen und URLs abrufen if bild_upload_1: dropbox_path_1 = f"/Wartungsumfrage/{bild_upload_1.name}" url_1 = upload_to_dropbox(bild_upload_1, dropbox_path_1) if url_1: fields["Bild Upload 1 (Totale)"] = [{"url": url_1}] if bild_upload_2: dropbox_path_2 = f"/Wartungsumfrage/{bild_upload_2.name}" url_2 = upload_to_dropbox(bild_upload_2, dropbox_path_2) if url_2: fields["Bild Upload 2 (Details)"] = [{"url": url_2}] if bild_upload_3: dropbox_path_3 = f"/Wartungsumfrage/{bild_upload_3.name}" url_3 = upload_to_dropbox(bild_upload_3, dropbox_path_3) if url_3: fields["Bild Upload 3 (weitere Details)"] = [{"url": url_3}] # Gesamtes Datenpaket für Airtable vorbereiten data = { "fields": fields } # Debugging: Ausgabe des vollständigen Datenpakets st.write("Data to send to Airtable:", data) # Senden der Daten an Airtable headers = { "Authorization": f"Bearer {AIRTABLE_API_KEY}", "Content-Type": "application/json" } response = requests.post(airtable_url, headers=headers, json=data) # Überprüfen der Antwort if response.status_code == 200: st.success("Datensatz erfolgreich zu Airtable hinzugefügt!") else: st.error("Fehler beim Hinzufügen des Datensatzes zu Airtable.") st.write("Detailed response:", response.json()) except Exception as e: st.error("Ein Fehler ist aufgetreten:") st.write(str(e)) und das mein .env: OPENAI_API_KEY=sk-proj-fxOHEOPleDRr3K3iaLUVT3BlbkFJ01aQI5YOsKswaYLP2ggJ AIRTABLE_API_KEY=patGJ4APlX9HgIRmm.942a1a43387d4f1db5ec67923883110e8bbb951ac6a7d60a0fb6cd58b6ddc810 AIRTABLE_BASE_ID=applBxnu3ohSdmL9N AIRTABLE_TABLE_NAME=Imported table DROPBOX_ACCESS_TOKEN=sl.B7Cq46eYzW0fM589IsO4JYFujmc9wFayMWtkE4L05l2HJxq2-ckj1Jy_iYzxz563aTC4Uh1UxQOyEYTa2wW4vu9ffqkTA2rEfxFWjv3aedt0GlA3AqsqX3ESr49DJxbVZFlDouSPAL0GUhlOB_KOaRs ... das oproblekm hier ist dass im übersetzten text in der schwarzen box nichts angezei8gt wird unnd nach dem klick auf den buttin einriechen die inhalte der boxen trasnkription text und übersetzung text nicht an airtable übertragen werden... alles andere wird an airtable übertragen... löse diese probleme

Please login to use this app.