[{"data":1,"prerenderedAt":592},["ShallowReactive",2],{"blog-local-text-to-speech-pipeline-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":35,"cover":57,"og":58,"expertise":59,"locales":60,"lang":62,"title":64,"description":65,"coverAlt":66,"metaTitle":67,"takeaways":68,"faq":74,"toc":90,"blocks":118,"others":366},"local-text-to-speech-pipeline","2026-10-01",11,"llmops",[9,10,11,12,13],"Text-to-speech","Audio","Kokoro","FFmpeg","Vue",[15,16,17,18,19,20,21,22,23,24],"local text-to-speech","text-to-speech pipeline","kokoro tts","piper tts","bark tts comparison","narrate blog posts","wav to m4a ffmpeg","aac 192 kbit\u002Fs faststart","vue audio player","onnx tts mac",[26,29,32],{"name":27,"url":28},"Speech synthesis","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSpeech_synthesis",{"name":30,"url":31},"Advanced Audio Coding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAdvanced_Audio_Coding",{"name":33,"url":34},"ESpeak","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FESpeak",[36,39,42,45,48,51,54],{"title":37,"url":38},"Kokoro onnx: runtime bindings","https:\u002F\u002Fgithub.com\u002Fthewh1teagle\u002Fkokoro-onnx",{"title":40,"url":41},"Kokoro-82M model card","https:\u002F\u002Fhuggingface.co\u002Fhexgrad\u002FKokoro-82M",{"title":43,"url":44},"Piper text-to-speech","https:\u002F\u002Fgithub.com\u002Frhasspy\u002Fpiper",{"title":46,"url":47},"Bark by Suno","https:\u002F\u002Fgithub.com\u002Fsuno-ai\u002Fbark",{"title":49,"url":50},"FFmpeg AAC encoder documentation","https:\u002F\u002Fffmpeg.org\u002Fffmpeg-codecs.html#aac",{"title":52,"url":53},"torch.load weights_only documentation","https:\u002F\u002Fpytorch.org\u002Fdocs\u002Fstable\u002Fgenerated\u002Ftorch.load.html",{"title":55,"url":56},"ESpeak NG phonemizer","https:\u002F\u002Fgithub.com\u002Fespeak-ng\u002Fespeak-ng","\u002Fimages\u002Fblog\u002Flocal-text-to-speech-pipeline\u002Fcover.webp","\u002Fimages\u002Fblog\u002Flocal-text-to-speech-pipeline\u002Fog.jpg","ai-engineer",[61,62,63],"en","de","hu","Lokales Text-to-Speech im großen Maßstab: 95 Artikel mit offenen Modellen vertont","Drei offene TTS-Modelle auf einem Laptop: wie 95 Artikel zu 153 Minuten Sprachausgabe wurden — von SQLite-Zeilen über chunkierte Synthese und 192-kbit\u002Fs-AAC bis zum Player, der mit der Seite mitläuft.","Wellendiagramm der Sprachpipeline: Datenbankzeilen werden in Sätze zerlegt, von einem lokalen Modell synthetisiert, zu AAC kodiert und über einen klebenden Tab am Bildschirmrand abgespielt.","Lokales TTS im großen Maßstab · Balázs Csorba",[69,70,71,72,73],"Lokales TTS kehrt die Ökonomie des Vertonens um: 95 Artikel und 153 Minuten Audio kosten etwa 35 Minuten Rechenzeit und null API-Gebühren — die Grenzkosten eines zusätzlichen Artikels sind Strom.","Die Modellwahl ist in dieser Größenordnung eine Tempo-Qualitäts-Pareto-Front, kein Benchmark-Kampf: Piper war am schnellsten, Bark kam nie fertig, und Kokoro v1.0 (82M, ONNX) gewann bei der Prosodie mit etwa dem Vierfachen der Echtzeit.","An Satzgrenzen chunken, bis 400 Zeichen, mit 80 ms Stille zwischen den Stücken; cleverere Schnittpunkte bringen fast nichts, was Hörer bemerken würden.","WAV ist ein Arbeitsformat, kein Auslieferungsformat: AAC mit 192 kbit\u002Fs und faststart reduzierte 406 MB auf 181 MB und macht Dauer und Spulen funktionierbar, bevor die Datei vollständig geladen ist.","Im prerenderten Player schlagen Medienereignisse Annahmen: loadedmetadata kann vor der Hydration feuern, deshalb muss die Dauer bei durationchange, canplay und mount neu gelesen werden — Zustand abonnieren, nicht Benachrichtigungen.",[75,78,81,84,87],{"q":76,"a":77},"Warum keine gehostete Text-to-Speech-API?","Weil bei 95 Artikeln die verrechneten Kosten bei jeder Änderung und jedem Neuaufbau zählen und weil Reproduzierbarkeit wichtiger ist: derselbe Text mit derselben Modellversion erzeugt nächstes Jahr dieselbe Datei. Gehostete Stimmen gewinnen weiterhin bei expressiver Spitze, aber nicht bei der Ökonomie eines ganzen Archivs.",{"q":79,"a":80},"Welches Modell klingt am besten?","Kokoro v1.0 — und es ist das ausgelieferte: 82 Millionen Parameter, natürliche Betonung, saubere Behandlung von Zahlen und Produktnamen. Piper mit der LibriTTS-Stimme ist knapp dahinter und deutlich schneller. Bark ist am expressivsten der drei, war aber für dieses Volumen zu langsam.",{"q":82,"a":83},"Wie lange dauert der komplette Lauf?","Etwa 35 Minuten für alle 95 Artikel auf einem Apple-Silicon-Laptop — rund 4,5-fache Echtzeit — mit weniger als 2 GB Spitzenauslastung. Ein einzelner Artikel wird in etwa 20 Sekunden neu erzeugt.",{"q":85,"a":86},"Warum AAC (M4A) statt MP3 oder Opus?","Bei 192 kbit\u002Fs sind die Codec-Unterschiede für Sprache unhörbar, deshalb entscheidet das Format: AAC läuft nativ überall, auch in Safari, faststart macht die Dauer sichtbar, bevor der Download endet, und Opus wäre kleiner, hat aber außerhalb von WebM ungleichmäßige Browserunterstützung.",{"q":88,"a":89},"Gibt es die Vertonung auch auf Deutsch und Ungarisch?","Noch nicht. Die Vertonung liest das englische Original jedes Artikels; die Player-Oberfläche selbst ist vollständig auf Deutsch, Englisch und Ungarisch lokalisiert.",[91,94,97,100,103,106,109,112,115],{"id":92,"title":93},"why-local","Warum lokales Text-to-Speech",{"id":95,"title":96},"model-shootout","Drei Modelle, ein Laptop",{"id":98,"title":99},"the-pipeline","Die Erzeugungspipeline",{"id":101,"title":102},"wav-to-aac","WAV ist ein Arbeitsformat, kein Auslieferungsformat",{"id":104,"title":105},"the-player","Der Player",{"id":107,"title":108},"what-broke","Was unterwegs brach",{"id":110,"title":111},"the-numbers","Die Zahlen",{"id":113,"title":114},"verdict","Was ich anders machen würde",{"id":116,"title":117},"sources","Quellen",[119,123,126,129,132,135,142,143,146,149,152,155,201,202,205,208,212,215,222,228,229,232,235,237,240,241,244,247,250,256,257,281,282,324,327,328,331,334,335],{"type":120,"content":121},"paragraph",[122],"Jeder Artikel auf dieser Seite hat jetzt eine Vertonung: 95 Beiträge, 153 Minuten Audio, erzeugt auf einem einzigen Laptop ohne einen einzigen API-Aufruf. Dieser Post ist der vollständige Bericht — wie drei offene Text-to-Speech-Modelle verglichen wurden, wie die Pipeline SQLite-Zeilen in satzgroße Synthese-Chunks verwandelt, warum das ausgelieferte Format AAC mit 192 kbit\u002Fs ist und wie der Player gebaut ist, damit die Sprache mit der Seite mitläuft.",{"type":120,"content":124},[125],"Zuerst die Zahlen, denn sie rahmen jede Entscheidung unten: 95 Artikel (45 Blogposts und 50 Tool-Reviews), 153 Minuten fertige Vertonung, etwa 35 Minuten Rechenzeit, 406 MB Zwischen-WAV reduziert auf 181 MB ausgeliefertes AAC und null Euro API-Gebühren. Alles lief auf einem Apple-Silicon-Laptop mit 16 GB Arbeitsspeicher.",{"type":127,"level":128,"id":92,"text":93},"heading",2,{"type":120,"content":130},[131],"Gehostetes Text-to-Speech ist hervorragend und wird jedes Quartal besser — aber es wird verrechnet. In diesem Umfang wächst die Rechnung mit jedem Wort, jedem Neuaufbau nach einer Änderung, jedem Experiment mit Stimme oder Tempo. Eine lokale Pipeline kehrt die Ökonomie um: Die Grenzkosten eines zusätzlichen Artikels sind ein paar Cent Strom und zwei Minuten Warten. Außerdem ist sie reproduzierbar — derselbe Text, dieselbe Modellversion und dieselbe Stimme erzeugen nächstes Jahr dieselbe Datei, und das zählt, wenn ein geänderter Artikel neu vertont werden soll, ohne dass die Stimme driftet.",{"type":120,"content":133},[134],"Es gibt einen zweiten Grund: Der Text verlässt die Maschine nicht. Der Entwurf eines noch nicht veröffentlichten Artikels wird von demselben Prozess gelesen, der ihn auch veröffentlichen wird, auf derselben Maschine — und wenn sich ein Absatz ändert, erzeugt ein Lauf über einen Slug eine Datei, nicht fünfundneunzig.",{"type":136,"variant":137,"title":138,"body":139},"callout","note","Die Randbedingung",[140],[141],"Kein GPU-Cluster und kein Cloud-Batch-Job: ein Apple-Silicon-Laptop mit 16 GB, geteilt mit allem anderen. Das begrenzte die Wahl auf Modelle, die bequem in den Speicher passen und auf der CPU nahezu in Echtzeit laufen — ein Modell mit ein paar hundert Millionen Parametern, nicht ein paar Milliarden.",{"type":127,"level":128,"id":95,"text":96},{"type":120,"content":144},[145],"Piper war der Ausgangspunkt, weil es auf die beste Art langweilig ist: ein kleines ONNX-Modell (die LibriTTS-high-Stimme wiegt etwa 137 MB), espeak-ng-Phonemisierung, 22,05 kHz Ausgabe, Erzeugung mit etwa dem Fünffachen der Echtzeit. Das Ergebnis ist sauber und konsistent — ein kompetenter Nachrichtensprecher —, aber auch gleichförmig. Lange Artikel klingen leicht flach.",{"type":120,"content":147},[148],"Das erste Hindernis betraf das Packaging, nicht die Qualität: Die vorbuildete macOS-Binary gibt es nur für x86_64, und auf Apple Silicon verweigert sie die Verlinkung gegen die arm64-espeak-ng-Bibliothek mit einem Architekturkonflikt. Das Python-Paket umgeht die Binary komplett und lief nach Minuten. Eine nützliche Erinnerung: „läuft nicht\" ist oft ein Toolchain-Problem, kein Modellproblem.",{"type":120,"content":150},[151],"Bark war das verlockendste der drei: expressiv, zu Lachen und Seufzen fähig, mit veröffentlichten Samples, die jedes andere Modell wie ein Metronome klingen lassen. Es war auch das, das nie einen brauchbaren Satz produzierte. Das aktuelle PyTorch hat das Standardverhalten von torch.load auf weights_only umgestellt, weshalb das Entpacken des Checkpoints scheiterte, bis gepatcht wurde; als das Laden lief, war die Inferenz auf der CPU so langsam, dass 95 Artikel den größten Teil eines Tages gebraucht hätten. Expressivität war diesen Preis nicht wert — Bark bleibt für diese Arbeit ein Forschungsspielzeug.",{"type":120,"content":153},[154],"Kokoro v1.0 über die kokoro-onnx-Bindings war der Fund: 82 Millionen Parameter, etwa 325 MB ONNX, 24 kHz Ausgabe, 54 Stimmen und Erzeugung mit etwa dem Vierfachen der Echtzeit bei deutlich besserer Prosodie als Piper — Sätze setzen ihre Betonung, und Zahlen und Abkürzungen klingen nicht nach dem stockenden Ton kleiner Modelle. So klingt jetzt jeder Artikel auf dieser Seite.",{"type":156,"head":157,"rows":168},"table",[158,160,162,164,166],[159],"Modell",[161],"Gewichte",[163],"Ausgabe",[165],"Tempo auf diesem Rechner",[167],"Urteil",[169,180,191],[170,172,174,176,178],[171],"Piper, LibriTTS high",[173],"etwa 137 MB, ONNX",[175],"22,05 kHz WAV",[177],"etwa 5x Echtzeit",[179],"Schnell und konsistent, leicht flach",[181,183,185,187,189],[182],"Bark von Suno",[184],"etwa 2 GB, PyTorch",[186],"24 kHz WAV",[188],"im Budget nie fertig geworden",[190],"Expressiv, hier unpraktisch",[192,194,196,197,199],[193],"Kokoro v1.0",[195],"82M, etwa 325 MB, ONNX",[186],[198],"etwa 4x Echtzeit",[200],"Natürliche Prosodie; die ausgelieferte Stimme",{"type":127,"level":128,"id":98,"text":99},{"type":120,"content":203},[204],"Die Inhaltsdatenbank ist die einzige Wahrheitsquelle, deshalb liest die Pipeline direkt aus ihr: Titel, Beschreibung, Kernaussagen und FAQ auf der einen, die Blockliste des Artikels auf der anderen Seite. Nichts wird aus der gerenderten Seite gescrapt. Wenn ein Absatz im Post steht, wird er vertont — und wenn es eine Tabelle, ein Callout oder ein Codeblock ist, wird er so zerlegt, dass ein Hörer folgen kann: Tabellenzeilen werden zu Komma-Zeilen, Callout-Titel werden wie Überschriften gesprochen, Code wird so gelesen, wie er geschrieben ist.",{"type":120,"content":206},[207],"Zwei Randbedingungen prägen die Mitte der Pipeline. Modelle schneiden langen Input ab, deshalb müssen Artikel geteilt werden; und die Prosodie darf nicht halbiert werden, deshalb müssen die Schnitte an Satzgrenzen liegen. Der Chunker ist bewusst schlicht: Sätze bis 400 Zeichen ansammeln, an der Grenze leeren, die Stücke mit 80 Millisekunden Stille verbinden. Schlauere Schnittpunkte — Absatzende, Überschriften als Intonationsreset — brachten fast nichts; der Satz ist die Einheit, die Hörer tatsächlich bemerken.",{"type":127,"level":209,"id":210,"text":211},3,"the-chunker","Der Chunker",{"type":213,"code":214},"code","def chunks(text, limit=400):\n    \"\"\"Accumulate sentences up to limit characters; never split mid-sentence.\"\"\"\n    out, buf = [], \"\"\n    for sentence in text.split(\". \"):\n        cand = (buf + \" \" + sentence).strip()\n        if len(cand) > limit and buf:\n            out.append(buf + \".\")\n            buf = sentence\n        else:\n            buf = cand\n    if buf:\n        out.append(buf)\n    return out\n\npieces = []\nfor part in chunks(article_text):\n    audio, _ = model.create(part, voice=\"af_bella\")\n    pieces.append(audio)\n    pieces.append(np.zeros(int(24000 * 0.08)))   # 80 ms between chunks\nsf.write(tmp_wav, np.concatenate(pieces), 24000)",{"type":120,"content":216},[217,221],{"tag":218,"children":219},"strong",[220],"Eine Stimme liest alle 95 Artikel."," Es ist af_bella, ausgewählt, nachdem derselbe Absatz in mehreren der 54 Stimmen erzeugt wurde. Konsistenz ist der Punkt: Der Klang des Archivs soll wie eine Publikation klingen, nicht wie eine Lotterie. Die Vertonung liest den englischen Text jedes Artikels — auch von den deutschen und ungarischen Seiten — und ist als englische Vertonung des Stücks gekennzeichnet, nicht als Übersetzung.",{"type":136,"variant":223,"title":224,"body":225},"tip","Nur Geändertes neu erzeugen",[226],[227],"Der Generator überspringt jeden Slug, dessen Ausgabedatei bereits existiert, deshalb kostet die Änderung eines Artikels eine Neuerzeugung, keinen Gesamtlauf. Ein kompletter frischer Lauf über alle 95 Artikel dauert etwa 35 Minuten — billig genug, dass auch ein vollständiger Neuaufbau eine vernünftige Wahl ist.",{"type":127,"level":128,"id":101,"text":102},{"type":120,"content":230},[231],"Der Syntheseschritt schreibt 24 kHz, 16-Bit-PCM: korrekt, spulbar, unkomprimiert — und etwa 406 MB für 153 Minuten Audio. Auf der Festplatte ist das harmlos, über das Netz ein Fehler, und auf einer Seite, die alles prerendert, wäre es die mit Abstand größte Asset-Klasse.",{"type":120,"content":233},[234],"Das ausgelieferte Format ist AAC in einem M4A-Container mit 192 kbit\u002Fs, mono. Diese Bitrate ist für Sprache großzügig — 96 bis 128 kbit\u002Fs klingen bei 24 kHz bereits transparent —, aber 192 lässt Reserve und kostet etwa ein Megabyte pro Artikel. Der Container zählt ebenso wie der Codec: faststart verschiebt das moov-Atom an den Anfang der Datei, sodass ein Browser die Dauer kennt und spulen kann, bevor der Download endet. Ohne ihn stehen Player auf 0:00 und weigern sich zu spulen, bis das letzte Byte da ist.",{"type":213,"code":236},"ffmpeg -i article.wav -c:a aac -b:a 192k -ac 1 -movflags +faststart article.m4a",{"type":120,"content":238},[239],"406 MB wurden zu 181 MB — 55 Prozent weniger, jede Datei unter 1,5 MB, ausgeliefert über ganz normale Range-Anfragen und Cache-Header. Die WAV-Dateien erreichen das Build-Output nie: Sie werden gelöscht, sobald der Encoder erfolgreich war.",{"type":127,"level":128,"id":104,"text":105},{"type":120,"content":242},[243],"Audio, das zu spät kommt, hört niemand, deshalb lädt der Player nur Metadaten: der Header geholt, die Dauer gelernt, und keine eigentlichen Samples heruntergeladen, bis der Leser auf Play drückt. Nichts startet automatisch — eine Seite, die einen anspricht, ist eine Seite, die man schließt.",{"type":120,"content":245},[246],"Jeder Artikel bekommt eine inline Leiste unter dem Inhaltsverzeichnis: Play und Pause, eine spulbare Fortschrittslinie mit aktueller und gesamter Zeit und einen Tempo-Schalter zwischen 1x, 1,25x, 1,5x und 2x. Das Spul-Element ist ein natives range-Input im Look der Seite — Tastaturnavigation und Screenreader-Semantik werden geerbt, nicht neu erfunden.",{"type":120,"content":248},[249],"Die inline Leiste ist nutzlos, sobald man darunter gescrollt hat, deshalb übernimmt ein klebender Tab am rechten Bildschirmrand. Ein IntersectionObserver beobachtet die Leiste: In dem Moment, in dem sie den Bildschirm verlässt, erscheint der Tab; zurückgescrollt, tritt er zurück. Der Tab füllt sich von unten mit dem Fortschritt — Fortschritt ist auf einen Blick lesbar —, und er respektiert prefers-reduced-motion wie der Rest der Oberfläche.",{"type":136,"variant":251,"title":252,"body":253},"warn","Der-0:00-Fehler",[254],[255],"Die erste ausgelieferte Version zeigte auf jeder Seite 0:00 als Gesamtdauer. Das Audio-Element feuert loadedmetadata beim Seitenladen, und bei schneller Verbindung mit faststart-Datei passiert das, bevor das JavaScript hydriert und seine Handler angehängt hat — das einzige Ereignis mit der Dauer ging verloren. Die Lösung, einem einzelnen Ereignis nicht mehr zu vertrauen: Die Dauer wird jetzt bei durationchange und canplay neu gelesen und beim Mount einmal geprüft. Medienereignisse in einem Player sind ein Strom, kein Nachricht — den Zustand abonnieren, nicht die Benachrichtigung.",{"type":127,"level":128,"id":107,"text":108},{"type":258,"ordered":259,"items":260},"list",false,[261,266,271,276],[262,265],{"tag":218,"children":263},[264],"Packaging schlug zweimal Modelle."," Piper lieferte eine nur-x86_64-Binary für eine arm64-Maschine, und Barks Checkpoint-Laden scheiterte, nachdem PyTorch das weights_only-Standardverhalten umstellte. Keiner dieser Fehler hatte etwas mit Sprache zu tun.",[267,270],{"tag":218,"children":268},[269],"Versionsdrift ist real."," Das kokoro-onnx-Paket übergab den speed-Parameter als int32, während das ausgelieferte Modell float erwartet — ein Einzeiler-Patch, gefunden durch Lesen eines zweizeiligen Stacktraces statt durch Raten.",[272,275],{"tag":218,"children":273},[274],"Prüfe den Ton, nicht nur die Datei."," ffprobe auf jeder Ausgabe fing Dauer-Probleme, bevor sie einen Browser erreichten; eine Datei, die existiert, ist keine Datei, die spielt.",[277,280],{"tag":218,"children":278},[279],"Alte Formate sterben schwer."," Der erste Durchlauf ließ WAVs im Build-Output zurück, gefunden nur, weil eine Anfrage eine falsche Bytezahl zurückgab.",{"type":127,"level":128,"id":110,"text":111},{"type":156,"head":283,"rows":288},[284,286],[285],"Kennzahl",[287],"Wert",[289,294,299,304,309,314,319],[290,292],[291],"Vertonte Artikel",[293],"95 (45 Blogposts, 50 Tool-Reviews)",[295,297],[296],"Fertiges Audio",[298],"153 Minuten",[300,302],[301],"Rechenzeit gesamt",[303],"etwa 35 Minuten, 4,5x Echtzeit",[305,307],[306],"Spitzenauslastung",[308],"unter 2 GB",[310,312],[311],"Zwischen-WAV",[313],"406 MB",[315,317],[316],"Ausgeliefertes AAC",[318],"181 MB, etwa 1 MB pro Artikel",[320,322],[321],"API-Kosten",[323],"0 EUR",{"type":120,"content":325},[326],"Zusammengelesen sagen die Zahlen, dass die Kosten dieser Pipeline Geduld sind, nicht Geld. Ein vollständiger Neuaufbau — nach einer Stimmenänderung oder einer Änderung, die alle Artikel betrifft — braucht deutlich unter einer Stunde auf einer Maschine, die währenddessen weiter nutzbar bleibt. Das ist das Argument für lokales Text-to-Speech in dieser Größenordnung: nicht, dass es eine gehostete Frontier-Stimme an Expressivität schlägt, sondern dass es Vertonung zur Standardwahl macht statt zur Budgetposition.",{"type":127,"level":128,"id":113,"text":114},{"type":120,"content":329},[330],"Mit Kokoro anfangen. Der Shootout war nicht umsonst — Modelle vergleichen ist, was die Wahl verteidbar macht —, aber die ausgelieferte Pipeline wäre mit Kokoro als einzigem Kandidaten identisch gewesen. Zweitens: direkt von der Synthese nach AAC kodieren und keine WAVs persistieren; das Zwischenformat fügte einen Aufräumschritt und 406 MB Dateien hinzu, die nie hätten existieren müssen. Drittens: die Medienereignisse des Players als zu abonnierenden Zustand behandeln, nicht als einzufangende Benachrichtigungen — und der Dauer-Fehler passiert nie.",{"type":120,"content":332},[333],"Offen bleibt der Umfang. Die Vertonung ist vorerst englischsprachig — eine Stimme, eine Sprache, 95 Artikel —, und Stimmen pro Sprache sind der naheliegende nächste Schritt, wenn es die deutsche und ungarische Leserschaft verlangt. Bis dahin ist die englische Vertonung auch die Aussprachehilfe für jeden Produktnamen auf der Seite — ein eigener stiller Nutzen.",{"type":127,"level":128,"id":116,"text":117},{"type":258,"ordered":336,"items":337},true,[338,343,347,351,354,358,362],[339],{"tag":340,"href":38,"children":341},"a",[342],"Kokoro onnx: Runtime-Bindings",[344],{"tag":340,"href":41,"children":345},[346],"Kokoro-82M Modellkarte",[348],{"tag":340,"href":44,"children":349},[350],"Piper Text-to-Speech",[352],{"tag":340,"href":47,"children":353},[182],[355],{"tag":340,"href":50,"children":356},[357],"FFmpeg AAC-Encoder-Dokumentation",[359],{"tag":340,"href":53,"children":360},[361],"torch.load weights_only Dokumentation",[363],{"tag":340,"href":56,"children":364},[365],"ESpeak NG Phonemisierer",[367,423,511,547],{"slug":368,"published":369,"updated":370,"minutes":371,"category":7,"tags":372,"keywords":377,"about":388,"sources":398,"cover":417,"og":418,"expertise":59,"locales":419,"lang":62,"title":420,"description":421,"coverAlt":422},"artificial-analysis-leaderboard-claude-opus-5-5","2026-09-07","2026-09-11",8,[373,374,375,376],"Claude Opus 5.5","Artificial Analysis","LLM benchmarks","LLM cost",[378,379,373,380,381,382,383,384,385,386,387],"Claude Opus 5.5 benchmark","Claude Opus 5.5 pricing","Artificial Analysis Intelligence Index","AI model leaderboard","Opus 5.5 benchmark","Opus 5.5 vs GPT-6 Astra","LLM cost per task","reasoning effort setting","Opus 5.5 pricing","best LLM September 2026",[389,392,395],{"name":390,"url":391},"Claude (language model)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FClaude_(language_model)",{"name":393,"url":394},"Large language model","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model",{"name":396,"url":397},"Benchmark (computing)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBenchmark_(computing)",[399,402,405,408,411,414],{"title":400,"url":401},"Artificial Analysis: Claude Opus 5.5 takes the top spot on the Artificial Analysis Intelligence Index (22 September 2026)","https:\u002F\u002Fartificialanalysis.ai\u002Farticles\u002Fclaude-opus-5-5",{"title":403,"url":404},"Artificial Analysis: Claude Opus 5.5 (max) model page","https:\u002F\u002Fartificialanalysis.ai\u002Fmodels\u002Fclaude-opus-5-5",{"title":406,"url":407},"Artificial Analysis: Claude Opus 5.5 (medium) model page","https:\u002F\u002Fartificialanalysis.ai\u002Fmodels\u002Fclaude-opus-5-5-medium",{"title":409,"url":410},"Artificial Analysis: Claude Opus 5 (max) model page","https:\u002F\u002Fartificialanalysis.ai\u002Fmodels\u002Fclaude-opus-5",{"title":412,"url":413},"OfficeChai: Claude Opus 5.5 creates a 5-point lead over GPT-6 Astra","https:\u002F\u002Fofficechai.com\u002Fai\u002Fclaude-opus-5-5-creates-5-point-lead-over-gpt-6-astra-jumps-to-top-spot-on-artificial-analysis-intelligence-index\u002F",{"title":415,"url":416},"Claude API docs: Models overview, context windows and prices (as of September 2026)","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fabout-claude\u002Fmodels\u002Foverview","\u002Fimages\u002Fblog\u002Fartificial-analysis-leaderboard-claude-opus-5-5\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fartificial-analysis-leaderboard-claude-opus-5-5\u002Fog.jpg",[61,62,63],"Claude Opus 5.5 holt Platz 1 bei Artificial Analysis – die eigentliche Story ist medium","Claude Opus 5.5 ist Platz 1 von 211 Modellen bei Artificial Analysis (58 Punkte). Mit Effort medium erreicht es Opus 5 für 1,34 $ statt 5,86 $ pro Aufgabe.","Horizontale Balken mit Werten im Intelligence Index: Claude Opus 5.5 mit Effort max 58, GPT-6 Astra und Claude Fable 5.1 53, Opus 5 51, Opus 5.5 mit Effort medium 51",{"slug":424,"published":425,"minutes":426,"category":7,"tags":427,"keywords":433,"about":444,"sources":453,"cover":505,"og":506,"expertise":59,"locales":507,"lang":62,"title":508,"description":509,"coverAlt":510},"agent-observability-opentelemetry","2026-08-06",12,[428,429,430,431,432],"OpenTelemetry","LLM observability","AI agents","Tracing","Evals",[434,435,436,437,438,439,440,441,442,443],"LLM agent observability OpenTelemetry","OpenTelemetry GenAI semantic conventions","how to trace LLM agents","gen_ai semantic conventions attributes","LLM token usage and cost metrics","LLM tracing sampling","PII in LLM traces","Langfuse vs Arize Phoenix vs Datadog","AI agent tracing evals","OpenTelemetry LLM tracing",[445,447,450],{"name":428,"url":446},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOpenTelemetry",{"name":448,"url":449},"Observability","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObservability_(software)",{"name":451,"url":452},"Intelligent agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIntelligent_agent",[454,457,460,463,466,469,472,475,478,481,484,487,490,493,496,499,502],{"title":455,"url":456},"OpenTelemetry: GenAI semantic conventions repository (open-telemetry\u002Fsemantic-conventions-genai)","https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions-genai",{"title":458,"url":459},"GenAI conventions: overview (status Development)","https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions-genai\u002Fblob\u002Fmain\u002Fdocs\u002Fgen-ai\u002FREADME.md",{"title":461,"url":462},"GenAI conventions: model spans, execute_tool and content capture","https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions-genai\u002Fblob\u002Fmain\u002Fdocs\u002Fgen-ai\u002Fgen-ai-spans.md",{"title":464,"url":465},"GenAI conventions: agent spans","https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions-genai\u002Fblob\u002Fmain\u002Fdocs\u002Fgen-ai\u002Fgen-ai-agent-spans.md",{"title":467,"url":468},"GenAI conventions: metrics","https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions-genai\u002Fblob\u002Fmain\u002Fdocs\u002Fgen-ai\u002Fgen-ai-metrics.md",{"title":470,"url":471},"GenAI conventions: inference token metrics","https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions-genai\u002Fblob\u002Fmain\u002Fdocs\u002Fgen-ai\u002Fgen-ai-token-metrics.md",{"title":473,"url":474},"GenAI conventions: events (gen_ai.evaluation.result)","https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions-genai\u002Fblob\u002Fmain\u002Fdocs\u002Fgen-ai\u002Fgen-ai-events.md",{"title":476,"url":477},"GenAI conventions: Model Context Protocol","https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions-genai\u002Fblob\u002Fmain\u002Fdocs\u002Fgen-ai\u002Fmcp.md",{"title":479,"url":480},"OpenTelemetry docs: GenAI conventions moved notice","https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fspecs\u002Fsemconv\u002Fgen-ai\u002F",{"title":482,"url":483},"OpenTelemetry docs: Sampling","https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fconcepts\u002Fsampling\u002F",{"title":485,"url":486},"John Hodge: The state of the OpenTelemetry GenAI semantic conventions (July 2026)","https:\u002F\u002Fjohn-hodge.com\u002Fblog\u002Fopentelemetry-genai-semantic-conventions\u002F",{"title":488,"url":489},"Langfuse docs: OpenTelemetry integration","https:\u002F\u002Flangfuse.com\u002Fdocs\u002Fopentelemetry\u002Fget-started",{"title":491,"url":492},"Langfuse repository and licence","https:\u002F\u002Fgithub.com\u002Flangfuse\u002Flangfuse",{"title":494,"url":495},"Arize Phoenix repository","https:\u002F\u002Fgithub.com\u002FArize-ai\u002Fphoenix",{"title":497,"url":498},"Arize OpenInference repository","https:\u002F\u002Fgithub.com\u002FArize-ai\u002Fopeninference",{"title":500,"url":501},"Datadog docs: OpenTelemetry instrumentation for LLM Observability","https:\u002F\u002Fdocs.datadoghq.com\u002Fllm_observability\u002Finstrumentation\u002Fotel_instrumentation\u002F",{"title":503,"url":504},"Honeycomb docs: Send data with OpenTelemetry","https:\u002F\u002Fdocs.honeycomb.io\u002Fsend-data\u002Fopentelemetry\u002F","\u002Fimages\u002Fblog\u002Fagent-observability-opentelemetry\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fagent-observability-opentelemetry\u002Fog.jpg",[61,62,63],"Observability für LLM-Agenten mit OpenTelemetry: Traces, Tokens, PII und Evals","So tracest du LLM-Agenten mit OpenTelemetry: GenAI Semantic Conventions und ihr Status, Span-Baum, Token-Metriken, Sampling, PII, Evals und Tool-Optionen.","Diagramm: Ein Agentenlauf verzweigt sich in OpenTelemetry-Spans für Modellaufrufe, Tool-Aufrufe, Token-Metriken und Eval-Ergebnisse, die an ein Trace-Backend exportiert werden.",{"slug":512,"published":513,"minutes":514,"category":7,"tags":515,"keywords":519,"about":528,"sources":533,"cover":541,"og":542,"expertise":59,"locales":543,"lang":62,"title":544,"description":545,"coverAlt":546},"llm-cost-latency-prompt-caching-routing","2026-06-01",9,[516,517,376,518],"Prompt caching","Model routing","Latency",[520,521,522,523,524,525,526,527],"prompt caching","LLM cost optimization","LLM latency","model routing","batch API LLM","LLM cost per request","cheaper LLM model","cache hit rate LLM",[529,530],{"name":393,"url":394},{"name":531,"url":532},"Latency (engineering)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLatency_(engineering)",[534,537,540],{"title":535,"url":536},"Claude API docs: Prompt caching","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fdocs\u002Fbuild-with-claude\u002Fprompt-caching",{"title":538,"url":539},"OpenAI API docs: Prompt caching","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fprompt-caching",{"title":415,"url":416},"\u002Fimages\u002Fblog\u002Fllm-cost-latency-prompt-caching-routing\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-cost-latency-prompt-caching-routing\u002Fog.jpg",[61,62,63],"Prompt-Caching und Modell-Routing: LLM-Kosten und Latenz senken","Prompt-Caching, Routing auf das kleinere Modell und Batch-APIs sind die Hebel, die LLM-Kosten und Latenz im Produktivbetrieb senken. So nutzt du jeden davon.","Vier relative Kostenbalken für eine Anfrage: teures Modell ohne Cache, billigeres Modell, gecachter Prefix und gecachter Prefix in einem Batch-Job",{"slug":548,"published":549,"minutes":371,"category":7,"tags":550,"keywords":555,"about":562,"sources":567,"cover":586,"og":587,"expertise":59,"locales":588,"lang":62,"title":589,"description":590,"coverAlt":591},"llm-evals-for-product-features","2026-05-15",[551,552,553,554],"LLM evals","LLM-as-judge","Error analysis","CI",[551,556,552,557,558,559,560,561],"AI evals","eval-driven development","pass^k vs pass@k","agent evaluation harness","regression eval suite","error analysis LLM",[563,564],{"name":393,"url":394},{"name":565,"url":566},"Software testing","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_testing",[568,571,574,577,580,583],{"title":569,"url":570},"Anthropic: Demystifying evals for AI agents (2026)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fdemystifying-evals-for-ai-agents",{"title":572,"url":573},"Hamel Husain: LLM evals FAQ (updated September 2026)","https:\u002F\u002Fhamel.dev\u002Fblog\u002Fposts\u002Fevals-faq\u002F",{"title":575,"url":576},"Shankar et al., Who Validates the Validators? (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2404.12272",{"title":578,"url":579},"Zheng et al., Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena (2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2306.05685",{"title":581,"url":582},"Yao et al., tau-bench: A Benchmark for Tool-Agent-User Interaction (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2406.12045",{"title":584,"url":585},"Anthropic: Quantifying infrastructure noise in agentic coding evals (2026)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Finfrastructure-noise","\u002Fimages\u002Fblog\u002Fllm-evals-for-product-features\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-evals-for-product-features\u002Fog.jpg",[61,62,63],"LLM-Evals für Produktfeatures: von handgelesenen Traces zum CI-Gate","LLM-Evals machen aus dem Bauchgefühl eine Testsuite: Fehleranalyse auf echten Traces, Grader-Wahl, ein validierter LLM-as-judge, pass^k und ein CI-Gate.","Pipeline von echten Traces über offenes Kodieren und eine gezählte Fehlertaxonomie bis zu Gradern, validiertem Judge und CI-Gate",1791386958474]