From b6a98ab6606f661e81061ac2ced8381cd557aef5 Mon Sep 17 00:00:00 2001 From: Laurence Liang Date: Sun, 9 Feb 2025 12:52:00 -0500 Subject: [PATCH] Add translation --- server/app.py | 64 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/server/app.py b/server/app.py index 51d12e7..a6dea28 100644 --- a/server/app.py +++ b/server/app.py @@ -4,11 +4,16 @@ import threading import time +import speech_recognition as sr +from deep_translator import GoogleTranslator + + app = Flask(__name__) # Global variable to store the camera object camera = None + def get_camera(): """Initialize or return existing camera object""" global camera @@ -16,6 +21,7 @@ def get_camera(): camera = cv2.VideoCapture(0) return camera + def generate_frames(): """Generate frames from camera""" camera = get_camera() @@ -23,16 +29,16 @@ def generate_frames(): success, frame = camera.read() if not success: break - + # Encode frame as JPEG - ret, buffer = cv2.imencode('.jpg', frame) + ret, buffer = cv2.imencode(".jpg", frame) frame = buffer.tobytes() - + # Yield the frame in byte format - yield (b'--frame\r\n' - b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') + yield (b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + frame + b"\r\n") + -@app.route('/') +@app.route("/") def index(): """Serve a simple HTML page with the video stream""" return """ @@ -47,11 +53,14 @@ def index(): """ -@app.route('/video_feed') + +@app.route("/video_feed") def video_feed(): """Route for streaming video""" - return Response(generate_frames(), - mimetype='multipart/x-mixed-replace; boundary=frame') + return Response( + generate_frames(), mimetype="multipart/x-mixed-replace; boundary=frame" + ) + def cleanup(): """Release camera resources""" @@ -59,14 +68,43 @@ def cleanup(): if camera is not None: camera.release() -if __name__ == '__main__': + +def recognize_and_translate(): + recognizer = sr.Recognizer() + microphone = sr.Microphone() + + with microphone as source: + recognizer.adjust_for_ambient_noise(source) + while True: + try: + audio = recognizer.listen(source) + french_text = recognizer.recognize_google(audio, language="fr-FR") + english_text = GoogleTranslator(source="fr", target="en").translate( + french_text + ) + yield f"data: French: {french_text}\nEnglish: {english_text}\n\n" + except sr.UnknownValueError: + yield "data: Could not understand audio\n\n" + except sr.RequestError as e: + yield f"data: Could not request results; {e}\n\n" + except Exception as e: + yield f"data: Error: {e}\n\n" + + +@app.route("/stream") +def stream(): + return Response(recognize_and_translate(), mimetype="text/event-stream") + + +if __name__ == "__main__": # Start ngrok tunnel # public_url = ngrok.connect(5000) # print(f' * Public URL: {public_url}') - + # Register cleanup function import atexit + atexit.register(cleanup) - + # Run Flask app - app.run(host='0.0.0.0', port=5000) \ No newline at end of file + app.run(host="0.0.0.0", port=5000, threaded=True)