From babf26cf6d9e4ceddbf663a0e8a954112f7d4ba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sat, 23 May 2026 06:31:28 +0400 Subject: [PATCH] =?UTF-8?q?v83:=20=D0=BE=D0=B1=D1=80=D0=B5=D0=B7=D0=BA?= =?UTF-8?q?=D0=B0=200.2=D1=81=20=D0=BD=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=20(ffmpeg=20=D0=B2=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D1=81=D0=B8)=20=E2=80=94=20=D0=BD=D0=B0=D0=B4=D1=91?= =?UTF-8?q?=D0=B6=D0=BD=D0=B5=D0=B5=20=D0=B1=D1=80=D0=B0=D1=83=D0=B7=D0=B5?= =?UTF-8?q?=D1=80=D0=BD=D0=BE=D0=B3=D0=BE=20WAV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/proxy.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/server/proxy.py b/server/proxy.py index f2e9ba8..7fb30b3 100644 --- a/server/proxy.py +++ b/server/proxy.py @@ -1,6 +1,9 @@ #!/usr/bin/env python3 from flask import Flask, request, Response import requests +import subprocess +import tempfile +import os app = Flask(__name__) GROQ_BASE = "https://api.groq.com" @@ -15,13 +18,17 @@ CORS = { def options(path): return Response(status=204, headers=CORS) -# Generic proxy for ALL Groq paths @app.route("/", methods=["GET", "POST", "PUT", "DELETE", "PATCH"]) def proxy(subpath): url = f"{GROQ_BASE}/{subpath}" hdrs = {} if request.headers.get("Authorization"): hdrs["Authorization"] = request.headers["Authorization"] + + # Trim 0.2s from audio before sending to Whisper (server-side ffmpeg) + if subpath == "v1/audio/transcriptions" and request.method == "POST": + return proxy_transcription(url, hdrs) + if request.headers.get("Content-Type"): hdrs["Content-Type"] = request.headers["Content-Type"] r = requests.request(request.method, url, headers=hdrs, @@ -30,5 +37,48 @@ def proxy(subpath): out["Content-Type"] = r.headers.get("Content-Type", "application/json") return Response(r.iter_content(8192), status=r.status_code, headers=out) +def proxy_transcription(url, hdrs): + audio = request.files.get('file') if request.files else None + if not audio: + hdrs["Content-Type"] = request.headers.get("Content-Type", "") + r = requests.post(url, headers=hdrs, data=request.get_data(), timeout=60) + out = dict(CORS) + out["Content-Type"] = r.headers.get("Content-Type", "application/json") + return Response(r.iter_content(8192), status=r.status_code, headers=out) + + with tempfile.NamedTemporaryFile(suffix='.webm', delete=False) as tmp_in: + audio.save(tmp_in) + tmp_in_path = tmp_in.name + + tmp_out_path = tmp_in_path + '.wav' + + try: + subprocess.run([ + 'ffmpeg', '-y', '-ss', '0.2', + '-i', tmp_in_path, + '-f', 'wav', tmp_out_path + ], check=True, capture_output=True, timeout=15) + + files = {'file': ('audio.wav', open(tmp_out_path, 'rb'), 'audio/wav')} + data = {} + if request.form.get('model'): + data['model'] = request.form['model'] + if request.form.get('language'): + data['language'] = request.form['language'] + + r = requests.post(url, headers=hdrs, data=data, files=files, timeout=60) + except Exception as e: + print(f"[trim] ffmpeg failed: {e}, forwarding original") + hdrs["Content-Type"] = request.headers.get("Content-Type", "") + r = requests.post(url, headers=hdrs, data=request.get_data(), timeout=60) + finally: + os.unlink(tmp_in_path) + if os.path.exists(tmp_out_path): + os.unlink(tmp_out_path) + + out = dict(CORS) + out["Content-Type"] = r.headers.get("Content-Type", "application/json") + return Response(r.iter_content(8192), status=r.status_code, headers=out) + if __name__ == "__main__": app.run(host="127.0.0.1", port=8765)