v83: обрезка 0.2с на сервере (ffmpeg в прокси) — надёжнее браузерного WAV

This commit is contained in:
“Naeel”
2026-05-23 06:31:28 +04:00
parent 73e9efad9c
commit babf26cf6d
+51 -1
View File
@@ -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("/<path:subpath>", 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)