Spaces:
Running
Running
| import yt_dlp | |
| import os | |
| import uuid | |
| from openai import OpenAI | |
| USE_OPENAI = False # True → OpenAI Whisper, False → Nebius | |
| if USE_OPENAI: | |
| client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) | |
| STT_MODEL = "gpt-4o-transcribe" | |
| else: | |
| client = OpenAI( | |
| base_url="https://api.tokenfactory.nebius.com/v1/", | |
| api_key=os.environ["NEBIUS_API_KEY"] | |
| ) | |
| STT_MODEL = "gpt-whisper-1" | |
| def transcribe_from_url(url: str) -> str: | |
| """ | |
| Stable IG/TikTok/YT reel transcribe | |
| → forced audio extraction MP3 | |
| → removes video-only DASH problem | |
| """ | |
| if not os.getenv("OPENAI_API_KEY"): | |
| raise RuntimeError("Brak OPENAI_API_KEY") | |
| tmp = f"/tmp/{uuid.uuid4().hex}.mp3" | |
| ydl_opts = { | |
| "format": "bestaudio/best", # nie mp4 — tylko audio | |
| "postprocessors": [{ | |
| "key": "FFmpegExtractAudio", | |
| "preferredcodec": "mp3", | |
| "preferredquality": "192" | |
| }], | |
| "outtmpl": tmp.replace(".mp3", ".%(ext)s"), | |
| "quiet": True, | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| ydl.download([url]) | |
| audio_file = tmp | |
| if not os.path.exists(audio_file): | |
| raise RuntimeError("Audio extraction failed – IG returned no audio stream") | |
| with open(audio_file, "rb") as f: | |
| transcript = client.audio.transcriptions.create( | |
| model="gpt-4o-transcribe", | |
| file=f | |
| ) | |
| return transcript.text |