import requests import json import speech_recognition as sr from gtts import gTTS import os import time from playsound import playsound # --- ASETUKSET --- # Cerebrium URL ja Funktio BASE_URL = "https://api.aws.eu-west-2.cerebrium.ai/v4/p-33f43168/autosuni-voice-agent-finnish" FUNCTION_NAME = "run" # Yleensä "run", "predict" tai joskus tyhjä. FULL_URL = f"{BASE_URL}/{FUNCTION_NAME}" if FUNCTION_NAME else BASE_URL # API Avain (antamastasi koodista) API_KEY = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcm9qZWN0SWQiOiJwLTMzZjQzMTY4IiwiaWF0IjoxNzU0MjgwMDAyLCJleHAiOjIwNjk4NTYwMDJ9.W4BHXgc6PQme2Te6Iahqr2DYgd5xWsRsILBKcGr27JhMCEqxXcH8dUEmaRm8fmZ-BBkIRx1jMqPk_wxHmxTwJqwKhelCEsJZbREdVfqVgZe3Zeh2FEvWnS-TuxEFDFBJX_-LZEHwW1lwoexATkbg1NYmo_4Y3hNnNuQ6lo8BH6LQXPmCa2_Prta6SWx9Ga_ffB4JekKVDeyb0oCzNTv0NaJqwEyH0RCzhpbsN9oPDb4nzi-4BPSLpJia_u932zyg7WA-yVHgh_H3a5sI-XafBrR1jng0mWp0MqVyrYFgYfAGXy2sPIyTdBOMfw2GyCgoycAm9lnrTLyJncEP5Q9jWQ" def speak(text): """ Muuttaa tekstin puheeksi (TTS) ja soittaa sen. """ print(f"🤖 Agent: {text}") try: # Generoidaan ääni Google TTS:llä (suomi) tts = gTTS(text=text, lang='fi') filename = "response.mp3" # Poistetaan vanha tiedosto jos olemassa (Windows-lukitusongelmien välttämiseksi) if os.path.exists(filename): try: os.remove(filename) except PermissionError: pass tts.save(filename) playsound(filename) except Exception as e: print(f"⚠️ Virhe äänen toistossa: {e}") def listen_to_mic(): """ Kuuntelee mikrofonia ja palauttaa tunnistetun tekstin. """ r = sr.Recognizer() with sr.Microphone() as source: print("\n🎤 Puhu nyt... (Odotetaan syötettä)") # Säädetään taustamelu r.adjust_for_ambient_noise(source, duration=0.5) try: # Kuunnellaan (timeout=5s odotus, phrase_time_limit=10s puhuminen) audio = r.listen(source, timeout=5, phrase_time_limit=15) print("⏳ Käsitellään...") # Tunnistetaan puhe (Google Speech API, ilmainen) text = r.recognize_google(audio, language="fi-FI") print(f"👤 Sinä: {text}") return text except sr.WaitTimeoutError: print("❌ En kuullut puhetta.") return None except sr.UnknownValueError: print("❌ En ymmärtänyt puhetta.") return None except sr.RequestError as e: print(f"❌ Virhe puheentunnistuspalvelussa: {e}") return None def send_to_cerebrium(user_text): """ Lähettää tekstin Cerebrium API:lle ja palauttaa vastauksen. """ headers = { 'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json' } # Payload juuri kuten esimerkissäsi payload = json.dumps({ "prompt": user_text }) try: response = requests.request("POST", FULL_URL, headers=headers, data=payload) if response.status_code == 200: data = response.json() # Yritetään löytää vastausteksti eri kentistä # Cerebrium palauttaa usein: "result", "message", "response" tai suoraan listan if isinstance(data, dict): return data.get("result") or data.get("message") or data.get("response") or str(data) elif isinstance(data, list) and len(data) > 0: return data[0] # Jos vastaus on lista else: return str(data) else: print(f"⚠️ API Virhe {response.status_code}: {response.text}") return "Valitettavasti en saanut yhteyttä palvelimeen." except Exception as e: print(f"⚠️ Yhteysvirhe: {e}") return "Tapahtui virhe yhteydessä." def main(): print("=======================================") print(" AGENTO VOICE CLIENT - AUTO-SUNI ") print("=======================================") # Alkuspiikki welcome_msg = "Hei, Auto-Sunin tekoälyavustaja linjoilla. Miten voin auttaa?" speak(welcome_msg) while True: # 1. Kuuntele user_input = listen_to_mic() if user_input: # Lopetusehto if "lopeta" in user_input.lower() or "kiitos ja näkemiin" in user_input.lower(): speak("Kiitos yhteydenotosta. Hyvää päivänjatkoa.") break # 2. Lähetä API:lle ai_response = send_to_cerebrium(user_input) # 3. Puhu vastaus if ai_response: speak(ai_response) # Pieni tauko luupin välissä time.sleep(0.5) if __name__ == "__main__": main()