בינה מלאכותית מטורף
-
בינה מלאכותית מטורף באמת זה עובד לי שווה בדיקה לקחתי את המידע על ידי הבינה המלאכותית
app.py
import os
import requests
from flask import Flask, request, Response, send_file
from twilio.twiml.voice_response import VoiceResponse
import openai
import uuid
from pydub import AudioSegment
import subprocessapp = Flask(name)
סביבה / משתנים - הגדירו ENV vars
TWILIO_AUTH_TOKEN = os.environ.get("TWILIO_AUTH_TOKEN")
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
openai.api_key = OPENAI_API_KEYכתובת זמנית לשמירת קבצים
TMP_DIR = "/tmp/phonebot"
os.makedirs(TMP_DIR, exist_ok=True)1) קיבלנו שיחה נכנסת - נשדר הודעה ואז נבקש הקלטה
@app.route("/voice", methods=["POST"])
def voice():
resp = VoiceResponse()
# הודעה קצרה (בעברית)
resp.say("שלום. דבר עכשיו, אחרי הסיגנל.", voice="alice", language="he-IL")
# הקלטה — Twilio ישלח callback ל-/recording
resp.record(max_length=10, action="/recording", play_beep=True, trim="trim-silence")
# במקרה שלא הוקלט כלום
resp.say("לא קיבלתי קול. להתראות.")
return Response(str(resp), mimetype="text/xml")2) Twilio קורא כשההקלטה מוכנה (URL ל-recording_url יש ב-form)
@app.route("/recording", methods=["POST"])
def recording():
recording_url = request.values.get("RecordingUrl") # URL ל-wav של Twilio
call_sid = request.values.get("CallSid")
if not recording_url:
resp = VoiceResponse()
resp.say("אירעה שגיאה בהקלטה.")
return Response(str(resp), mimetype="text/xml")# הורדת הקובץ r = requests.get(recording_url + ".wav") # Twilio מציע .wav filename = f"{TMP_DIR}/{uuid.uuid4().hex}_in.wav" with open(filename, "wb") as f: f.write(r.content) # 3) ASR: שליחה ל-OpenAI Whisper (דוגמה באמצעות openai.Audio.transcriptions) # שים לב: אם ה-SDK/endpoint השתנה — יש להתאים לפי התיעוד העדכני של OpenAI try: with open(filename, "rb") as audio_file: # שימוש בדוגמת API; יתכן שתצטרך להתאים לקריאות עדכניות transcript = openai.Audio.transcriptions.create( file=audio_file, model="whisper-1" ) question_text = transcript["text"] except Exception as e: question_text = "" print("ASR error:", e) if not question_text: resp = VoiceResponse() resp.say("לא הצלחתי להבין. נסה שוב מאוחר יותר.") return Response(str(resp), mimetype="text/xml") print("Recognized:", question_text) # 4) שליחה ל-LLM לקבלת תשובה קצרה try: chat = openai.ChatCompletion.create( model="gpt-4o-mini", # החלף לדגם ששייך לך messages=[ {"role": "system", "content": "ענה בעברית בקצרה ובפשטות, משפט אחד או שניים."}, {"role": "user", "content": question_text} ], max_tokens=60, ) answer_text = chat["choices"][0]["message"]["content"].strip() except Exception as e: print("LLM error:", e) answer_text = "מצטער, כרגע אין לי תשובה." print("Answer:", answer_text) # 5) TTS: המרת התשובה לקובץ WAV (נשתמש ב-OpenAI TTS דמיוני; אם אין - השתמש ב-ElevenLabs/Google) tts_wav = f"{TMP_DIR}/{uuid.uuid4().hex}_tts.wav" try: # דוגמה כללית: שלח ל-OpenAI TTS או ElevenLabs כאן # --- אם אין TTS של OpenAI זמין בחשבון, החלף לקריאה ל-ElevenLabs/Google tts_resp = openai.Audio.speech.create( model="gpt-4o-mini-tts", # שם מדמה - החלף לפי תיעוד אמיתי voice="alloy", input=answer_text, format="wav" ) with open(tts_wav, "wb") as f: f.write(tts_resp) except Exception as e: print("TTS error or not available:", e) # פתרון גיבוי: השתמש ב-gTTS (לא אידיאלי לעברית) או יצירת WAV דרך שירות אחר # כאן נשמור קובץ אוטומטי דמוי פשוט - או תוכל לקרוא ל-ElevenLabs API from gtts import gTTS tmp_mp3 = tts_wav + ".mp3" gTTS(answer_text, lang="he").save(tmp_mp3) # המרה ל-wav AudioSegment.from_mp3(tmp_mp3).export(tts_wav, format="wav") # 6) אפקט רובוטי באמצעות ffmpeg (ring mod/simple vocoder) robot_wav = tts_wav.replace("_tts.wav", "_robot.wav") try: # דוגמה פשוטה: הורדת pitch ויישום ring-mod עם ffmpeg # הערה: ffmpeg צריך להיות מותקן והפקודות עשויות להשתנות # קומנדלה שמשנה pitch וקצת distortion: cmd = [ "ffmpeg", "-y", "-i", tts_wav, "-af", "asetrate=44100*0.95,aresample=44100,atempo=1.0,adelay=0|0,acrusher=bits=8:mode=full", robot_wav ] subprocess.run(cmd, check=True) except Exception as e: print("ffmpeg error:", e) # אם כשלנו - השאר את המקורי robot_wav = tts_wav # 7) החזרת TwiML שמשמיעה את ה-WAV למתקשר resp = VoiceResponse() # Twilio יכול להשמיע URL ישיר; נספק קובץ דרך endpoint משלנו play_url = request.url_root + "play/" + robot_wav.split("/")[-1] resp.play(play_url) resp.say("סיימתי. להתראות.") return Response(str(resp), mimetype="text/xml")נקודת שירות לשרת את הקבצים (פשוטה - אמורה להיות מוגנת/מוגבלת)
@app.route("/play/<filename>", methods=["GET"])
def play_file(filename):
path = f"{TMP_DIR}/{filename}"
if not os.path.exists(path):
return "Not found", 404
return send_file(path, mimetype="audio/wav")if name == "main":
app.run(host="0.0.0.0", port=5000, debug=True)מאוד מקווה שזה עובד לכולם כי אם לא תכתבו לי וימחוק ולי זה עובד בלי מפתח גישה