- Eine Aufnahme mit
/audio/transcriptionstranskribieren - Nach Zeitangaben fragen, die nicht jedes Modell liefert
- Entscheidungen und Action Items gegen ein Schema extrahieren
- Damit umgehen, dass das Transkript nie sagt, wer spricht
- Eine lange Aufnahme aufteilen, ohne die Uhr zu verlieren
Setup
Du brauchst Python 3.9 oder neuer, dasrequests-Paket und einen Venice-API-Schlüssel. Siehe API-Schlüssel erzeugen, falls du noch keinen hast. Bring irgendeine Aufnahme eines Gesprächs mit, in wav, mp3, m4a, flac, aac, mp4, ogg oder webm.
1. Die Aufnahme transkribieren
/audio/transcriptions ist OpenAI-kompatibel und nimmt einen Multipart-Upload entgegen. Die Datei muss ein echter File-Part sein, denn base64 wird an diesem Endpunkt nicht akzeptiert.
Ruf
GET /models?type=asr für die aktuelle Liste auf, statt diese hier festzupinnen, denn der Katalog ändert sich.
2. Nach Zeitangaben fragen
Zeitstempel sind das, was Notizen überprüfbar macht, also ist das die Entscheidung, auf die es am meisten ankommt — und der Standard liefert sie dir nicht:timestamps ein Objekt statt einer Liste, und der Schlüssel darin hängt vom Modell ab. Whisper gruppiert nach Phrasen, Scribe nach Wörtern:
3. Die Notizen extrahieren
Beschreib die Notizen, die du willst, als Schema, damit das Ergebnis ein Datensatz ist statt Prosa, die du parsen musst:disable_thinking ist aus demselben Grund da, aus dem es in jeden Extraktionsschritt gehört. Das Schema entscheidet bereits die Form der Antwort, also bringt es nichts, ein Reasoning-Modell dafür zu bezahlen, darüber nachzudenken, und macht die Kosten jedes Laufs vom letzten verschieden. Strukturierte Daten aus Dokumenten extrahieren misst diesen Unterschied.
Lass es auf einem 53-sekündigen Standup laufen, und die Notizen kommen mit angehängter Uhr zurück:
spoken_at ist echt. Spring zu 19,6 Sekunden und du hörst den Satz, der die Aufgabe erzeugt hat.
Gib dem Modell Zeilen ohne Zeiten, und jedes
spoken_at kommt als 0 zurück. Das Feld ist erforderlich, das Modell hat nichts, was es hineinschreiben könnte, und ein erforderliches Feld ist eine Aufforderung, etwas zu produzieren, statt einer Einladung zu sagen, dass es nichts weiß. Das ist immer dann eine Erinnerung wert, wenn ein Schema zu funktionieren scheint: dass die Form stimmt, ist nicht dasselbe wie dass die Werte stimmen.4. Niemand ist markiert
Zwei Dinge in dieser Ausgabe sind falsch, und beide kommen vom selben Ort. Die Verantwortliche für den Rollout heißtMay. Ihr Name ist Mei. Spracherkennung ist bei Eigennamen am unzuverlässigsten, und Namen sind genau das, was für die Zuordnung gebraucht wird, also ist das der Fehler, den du erwarten solltest, nicht der unglückliche.
Der letzte Eintrag ist unassigned, obwohl ihn jemand offenkundig übernommen hat. Der Satz war „I’ll ask legal today and report back tomorrow”, und das Transkript hält die Wörter fest, ohne festzuhalten, wer sie gesagt hat.
Das Zweite ist kein Bug, den du beheben kannst. Kein Venice-Transkriptionsmodell führt Diarisierung durch, es gibt also kein speaker-Feld, nach dem du bei irgendeinem greifen könntest. Das Transkript ist ein stimmenloser Textstrom, und Aufgaben können nur zugeordnet werden, wenn ein Name laut gesprochen wird, wie in „Tomas, can you put the deprecation notice in the changelog”.
Das Erste kannst du beheben, indem du dem Modell sagst, wer im Raum war:
May wird zu Mei Lin aufgelöst, weil das Modell jetzt eine kurze Liste hat, gegen die es abgleichen kann, und die Verantwortlichen tragen vollständige Namen, die dein Task-Tracker nachschlagen kann. Der dritte Eintrag bleibt korrekterweise unassigniert. Eine Teilnehmerliste behebt Verhören, und nichts stellt Information wieder her, die die Aufnahme nie getragen hat.
5. Länger als eine Anfrage
Uploads sind auf 25 MB begrenzt, was bei unkomprimiertem Audio schneller erreicht ist, als man denkt, und ein langes Meeting ist es ohnehin wert, aufgeteilt zu werden, damit ein Fehlschlag dich nicht die ganze Transkription kostet. Für WAV-Dateien reicht die Standardbibliothek aus, ohne ffmpeg:offset in timed_lines da:
awesome., um die Lücke am Ende des Chunks zu füllen, und machte aus einer Zeile drei.
Die Zeiten sind noch richtig, und der Notizschritt findet die Aufgabe weiterhin. Was verloren geht, ist der Name — und von dem hängt die Zuordnung ab.
Komprimierte Formate lassen sich so nicht zerschneiden, denn ein MP3 kannst du mit der Standardbibliothek nicht an einer Frame-Grenze schneiden. Nutz dafür ffmpeg:
Alles zusammen
Nächste Schritte
- Poste die Action Items in deinem Tracker, mit den Namen der Verantwortlichen, die die Teilnehmerliste aufgelöst hat.
- Lies die Zusammenfassung mit Text-to-Speech vor, für Leute, die den Call verpasst haben.
- Such über vergangene Meetings hinweg, indem du Transkripte mit Embeddings speicherst.
- Lass einen Agenten entscheiden, wann er transkribiert und wann er aus Notizen antwortet, die er schon hat, mit Einen tool-nutzenden Agenten mit Function Calling bauen.
Speech-to-Text
Referenz für den Transkriptions-Endpunkt.
Strukturierte Daten aus Dokumenten extrahieren
Dieselbe schemazentrierte Extraktion, angewandt auf Dateien.
Strukturierte Antworten
Wie json_schema eine Completion einschränkt.
Voice Cloning
Gib der Zusammenfassung eine eigene Stimme.