Forschung·Grafik & 3D·geprüft 2026-08-02
Was fehlt einem freien 3D-Kopfmodell, damit es niemanden mehr abschreckt — und was davon lässt sich ohne Künstler:in nachrüsten?

Vom kahlen Kopf zum Erzähler — zehn Schritte im Browser

Wir haben Googles GNM-Kopfmodell zu einem sprechenden Vortragenden ausgebaut, der einen Foliensatz erzählt und dabei in der Ecke des Bildschirms sitzt. Alles rechnet der Browser selbst — ohne Server, ohne Grafikkarte, ohne Netz. Dieser Bericht zeigt die Bilder nach jedem einzelnen Schritt, samt der Stellen, an denen wir uns geirrt haben.

Experimentell·Horizont: Bald
Der Befund

Ein freies parametrisches Kopfmodell wird erst durch Augen, Lidschlag und Brauen zum Gesicht — alles drei liegen als Daten im Modell, nur nicht als benannte Regler. Der Weg dorthin ist lineare Algebra, keine Handarbeit.

Autor
mana (aufbauend auf google/GNM)
Venue
Eigene Untersuchung (2026)
Lizenz
Unser Code AGPL-3.0, die abgeleiteten Modelldaten Apache 2.0 (GNM)
0,28 ms
Rechenzeit je Bild für den vollständigen Kopf des Erzählers — Ausdruck, Pose und Normalen, im Browser, auf der CPU. Das ist ein Sechzigstel eines 60-Hertz-Budgets
parity_test.ts gegen numpy, Profil des Erzählers mit 5.998 Punkten
Die Methode

Im Juli haben wir gezeigt, dass sich Googles Kopfmodell GNM kürzen und im Browser rechnen lässt — 0,20 Millisekunden für einen vollständigen Kopf, ohne Server und ohne Python. Was dabei entstand, war ein Beweis, kein Gesicht: ein kahler, blasser Kopf, der zwar die richtige Form hatte, aber niemanden ansah.

Dieser Bericht ist der zweite Teil. Wir haben den Kopf einen Foliensatz erzählen lassen und ihn danach in zehn Schritten überarbeitet — nach jedem Schritt ein Bild, damit nachvollziehbar bleibt, was tatsächlich etwas gebracht hat und was nicht.

Links der Kopf nach dem ersten Durchstich, rechts derselbe Kopf zehn Schritte später — mit Augen, Brauen, Haaren und Hauttextur

Der Aufbau: der Ton ist die Uhr

Der Erzähler sitzt unten rechts in der Ecke, die Folie füllt den Rest. Alles, was er braucht, wird vorgebacken: Aus dem Sprechtext entsteht Ton, aus dem Ton eine Lautstärke-Hüllkurve und Wortmarken, aus Text und Marken eine Mundspur. Zur Laufzeit spielt die Seite das nur noch ab.

Das ist die wichtigste Entscheidung im ganzen Aufbau. Ein gebackener Vortrag ist eine Handvoll Dateien: 815 Kilobyte Kopfmodell, 563 Kilobyte Ton für 68 Sekunden Rede, 77 Kilobyte Spuren. Er braucht kein Netz, keinen Schlüssel und keine Grafikkarte — und läuft weiter, wenn unsere Infrastruktur ausfällt.

Die zweite Entscheidung: audio.currentTime ist die einzige Uhr. Mundstellung, Untertitel, das Aufdecken der Stichpunkte und der Fortschrittsbalken hängen alle daran. Damit gibt es keine zweite Zeitachse, die auseinanderlaufen könnte. Die Untertitel fallen dabei kostenlos ab — die Wortmarken werden für die Lippen ohnehin gebraucht.

Der fertige Foliensatz: Titel und Stichpunkte links, der Erzähler unten rechts, Untertitel unten mittig wie im Film

Die zehn Schritte

Elf Bilder desselben Kopfes: vom blassen Durchstich über Verschattung, Augen, Lidschlag, Brauen, Sakkaden, Gesichtsfarbe, feineres Netz, Unsymmetrie und Haare bis zur Hauttextur

Der Sprung liegt zwischen Bild 1 und Bild 3. Verschattung, Augen und Lidschlag machen aus einer Maske ein Gesicht. Alles danach ist Feinschliff — sichtbar, aber nicht mehr entscheidend. Wer wenig Zeit hat, baut diese drei und hört auf.

Bemerkenswert ist, wie wenig davon Handarbeit war. Zwei der drei entscheidenden Schritte sind gelöste Gleichungen, keine gestalterischen Entscheidungen:

Die Iris steht nicht im Netz — beim Vergröbern überlebte kein einziger Iris- und Pupillenpunkt. Statt das Netz feiner zu machen, wird die Iris aus dem Winkel zwischen Punkt und Blickachse gerechnet. Das überlebt jede Netzdichte, und erst dadurch wandert der Blick sichtbar: Ohne farbige Iris dreht sich nur eine weiße Kugel, und niemand sieht es.

Der Lidschlag war dieselbe Rechnung wie unsere Mundstellungen. GNM hat kein Lidgelenk und keine Achse namens „Auge zu" — aber die 68 Gesichts-Landmarken sind baryzentrisch aus je drei Punkten gemischt und damit linear in den Koeffizienten. Die Lidöffnung ist also ein lineares Funktional, und die Frage „welche Koeffizienten schließen das Auge?" hat eine exakte Lösung. Der Ruhespalt von 7,26 Millimetern schließt sich auf ein Hundertstel genau.

Was wir nachgemessen und dabei widerlegt haben

Wir wollten dem Gesicht Unsymmetrie geben — perfekt spiegelgleiche Gesichter lesen sich sofort als Computergrafik. Die naheliegende Annahme war, dass mehr Identitäts-Achsen mehr Unsymmetrie bringen.

Sie bringen fast keine. Von 6 auf 40 aktive Achsen hebt sich die mittlere Links-Rechts-Abweichung von 0,16 auf 0,21 Millimeter; echte Gesichter liegen im Millimeterbereich. GNMs Identitäts-Basis ist praktisch symmetrisch. Wer dort nach Unsymmetrie sucht, sucht an der falschen Stelle — wir legen sie deshalb als leichte Verwindung auf die Ruheform und holen den einen Anteil, den das Modell wirklich hergibt, aus den seitengetrennten Augen-Achsen.

Vier Fehler, die teurer aussahen als sie waren

Der Vollständigkeit halber, weil alle vier typisch sind:

Die Seite wurde heruntergeladen statt angezeigt. Unser kleiner Server hat die Dateiendung aus dem Anfragepfad gelesen — und / hat keine. Die Startseite ging als unbekannter Dateityp raus. Der eigentliche Schaden war ein anderer: Auch alle automatischen Bildschirmfotos hingen daran fest, und wir haben das über vier verschiedene Konfigurationen hinweg der Bildaufnahme angelastet statt dem Server.

Beim Lidschlag stimmte der Takt nicht — was erst auffiel, als jemand hinsah. Nachgemessen waren es 61 Lidschläge je Minute statt der menschlichen 10 bis 20, bei einer mittleren Dauer von 0,057 statt 0,10 bis 0,40 Sekunden. Die Ursache war ein Taktgeber, der sich selbst laufend änderte; dadurch sprang die Phase und es kamen lauter abgeschnittene Halb-Lidschläge heraus. Darin steckte noch ein zweiter, schärferer Fehler: Am letzten Bild eines Lidschlags ergab eine Division in Gleitkomma 1.0000000000000002 statt 1. Damit wurde die Basis einer Potenz mit gebrochenem Exponenten winzig negativ — und das ist keine Zahl. Der ungültige Wert lief über die Pose in jeden einzelnen Punkt des Kopfes und schob ihn aus dem Bild. Genau ein Bild, genau an dieser Zeit.

Und als das Zahnfleisch eine eigene Gewebe-Kennung bekam, bekam es eine höhere Nummer als die Augen. Eine Abfrage prüfte nur „Kennung größer gleich Augapfel" — womit 508 Zahnfleischpunkte plötzlich als Auge zählten und die berechnete Augenmitte zum Mund zogen. Sichtbare Folge: Die Augenbrauen verschwanden, weil ihr Band relativ zur Augenmitte gesetzt wird. Eine fehlende Obergrenze in einer Bedingung.

Alle drei sahen nach einem grundsätzlichen Problem aus und waren je eine Zeile. Zwei davon hätte kein Test gefunden, weil sie nur an einem einzigen Zeitpunkt oder in einem einzigen Bild auftreten — deshalb tastet ein Test die Zeitkurven jetzt in Halbmillisekunden-Schritten ab.

Ein vierter kam später dazu, und er ist der lehrreichste. Die Modelldatei bekam einen Anhang: ein Byte je Punkt, das sagt, ob dort Haut, Lederhaut oder Zahn ist. Ganz ans Ende gestellt, ausdrücklich in der Annahme, ältere Leser würden ihn folgenlos überlesen. Das tun sie nicht. Der Leser auf der Spiel-Engine-Seite prüft als Erstes die Versionsnummer der Datei — und fiel aus, lange bevor er den ignorierbaren Anhang überhaupt erreichte. Ein Anhang ist erst dann verträglich, wenn die Leser eine Versions-Spanne akzeptieren. Gefunden haben wir es nicht beim Ändern, sondern erst zwei Tage später beim Nachmessen: Auf dieser Seite lief kein Test mit, seit das Format sich änderte.

Wo es aufhört

Der Kopf ist ein Prüfstand, keine App. Die Zähne bleiben grob, das Haar bleibt kurz, die Hautmaserung ist gerechnet und nicht fotografiert. In der Anwendungsgröße — der Erzähler ist rund 250 Pixel breit — trägt das alles; in einer Großaufnahme nicht.

Ein Schritt aus der Prüfstands-Ecke ist trotzdem gemacht: Es gibt jetzt einen zweiten Foliensatz, der nicht von der Technik handelt, sondern vom Verein. Der Erzähler ist dort Mittel und nicht mehr Thema — und das ist die eigentliche Probe darauf, ob er trägt.

Nachtrag: eine Zahl, die keine war

Zwei Tage nach dem ersten Bericht maßen wir die Spiel-Engine-Seite nach und bekamen das Achtfache heraus — einunddreißig Millisekunden statt vier, bei einem Modell, das um anderthalb Prozent gewachsen war. Es lag weder am Modell (gleiche Achsen, gleiche Dateigröße) noch an der Engine (dieselbe Fassung seit Juni) noch an der Maschine allgemein (der Browser-Wert stimmte weiter).

Es lag an der Messung. Sie bestand aus zwanzig Durchläufen, ohne Aufwärmen, einmal ausgeführt, direkt im Anschluss an eine schwere Rechenschleife. Wir haben denselben alten Test viermal hintereinander laufen lassen: 4,3 — 5,4 — 6,4 — 8,6 Millisekunden. Dieselbe Maschine, dieselben Daten, derselbe Befehl. Der erste Lauf auf kühlem Gerät war das schöne Ende dieser Spanne, und genau er stand im Bericht.

Gemessen wird jetzt anders: aufwärmen, die Zahl der Durchläufe so wählen, dass mindestens eine Drittelsekunde zusammenkommt, fünf Runden fahren und die beste nehmen — Störungen machen immer nur langsamer, nie schneller — und die schlechteste Runde daneben ausweisen, damit die Streuung sichtbar bleibt.

Und dann die unbequeme Fortsetzung: Es reicht nicht. Auch mit dem besseren Verfahren wandert dieselbe Messung auf demselben Gerät im Lauf eines Tages zwischen 4,7 und 11,2 Millisekunden. Der Grund stand in der Prozessliste — auf dem Laptop rechneten zeitweise mehrere andere Sitzungen mit. Kein Verfahren innerhalb eines Programms kann eine belegte Maschine herausrechnen; ein Minimum aus fünf Runden entfernt kurze Ausreißer, keine dauerhafte Fremdlast.

Deshalb sagt der Test es jetzt selbst: Liegt die schlechteste Runde mehr als ein Viertel über der besten, schreibt er „Maschine unruhig, Zahl nicht zitierfähig“ dazu.

Die ehrliche Auskunft lautet damit: In der Spiel-Engine kostet ein Kopf zwischen einem Drittel und zwei Dritteln eines Bildes bei sechzig Bildern je Sekunde. Das trägt für eine Begleitfigur und für nichts darüber hinaus. Uns ist dieser Nachtrag lieber als die schönere Zahl — eine Kennzahl ohne angegebene Streuung ist eine Behauptung, keine Messung.

Der ehrlichste Satz zum Schluss ist derselbe wie beim ersten Bericht: Wir erzeugen Gesichter, wir vermessen keine. Sobald reale Personen eingelesen würden, entstünden biometrische Daten. Diese Grenze steht, und sie ist der Grund, warum ein Modell wie GNM für uns überhaupt der richtige Weg ist.

Vereins-Bezug

Was das für uns bedeutet

  • Der teuerste Schritt war nicht der aufwendigste. Ein Gesicht wird nicht durch mehr Polygone lebendig, sondern durch drei Dinge, die alle fast nichts kosten: Verschattung in den Mulden, Augen mit sichtbarer Iris und ein Lidschlag. Danach war der Kopf eine Person — alles Weitere war Feinschliff.
  • Nichts davon braucht eine Fremdleistung. Kein Modellierdienst, keine Bildgenerierung, keine laufenden Kosten. Der fertige Erzähler ist eine Datei von 815 Kilobyte plus vorgebackenem Ton; er läuft offline weiter, wenn unsere Infrastruktur ausfällt.
  • Der Kopf ist damit als Begleitfigur einsetzbar: als Erzähler vor einem Foliensatz, als Vortragender in Erklärstücken, als Gegenüber in Lern-Apps. Für Menschen, die lieber zuhören als lesen, ist das ein echter Zugang — und er entsteht ohne Videoproduktion.
  • Wir erzeugen Gesichter, wir vermessen keine. Solange keine realen Personen eingelesen werden, entstehen keine biometrischen Daten. Diese Grenze ist bewusst gesetzt und gilt weiter.
Der Plan

Wie wir es nutzen könnten

  1. 1
    Durchstich: sprechender Foliensatz im Browsergebaut
    Fünf Folien, 78 Sekunden Rede, Erzähler unten rechts. Ton, Mundspur und Wortmarken werden vorgebacken; zur Laufzeit braucht die Anzeige weder Netz noch Schlüssel noch GPU-Box. Der Ton ist die einzige Uhr — Mundstellung, Untertitel, Stichpunkte und Fortschritt hängen alle an ihm, damit keine zweite Zeitachse auseinanderlaufen kann.
  2. 2
    Verschattung aus der Krümmunggebaut
    Ohne Dunkelheit in Augenhöhlen, Nasenflügeln und Mundwinkeln liest das Auge keine Form — das Gesicht bleibt eine flache Maske. Statt einer echten Verdeckungsrechnung genügt ein Krümmungsmaß je Punkt: Liegt der Schwerpunkt der Nachbarn vor der Fläche, sitzt der Punkt in einer Mulde. Wird je Bild mitgerechnet und wirkt deshalb auch im offenen Mund.
  3. 3
    Augen: Iris aus der Blickachse statt aus dem Netzgebaut
    Der größte einzelne Sprung. Beim Vergröbern überlebten von 290 Iris- und 98 Pupillenpunkten null — die Augenhöhle war ein leerer Krater. Gelöst nicht durch mehr Punkte, sondern durch Rechnen: Der Winkel zwischen Punkt und Blickachse entscheidet, ob Lederhaut, Regenbogenhaut oder Pupille. Das überlebt jede Netzdichte, und erst dadurch wandert der Blick überhaupt sichtbar.
  4. 4
    Lidschlag exakt gelöst — wie die Visemegebaut
    Ein Gesicht, das nie blinzelt, ist tot; das fällt früher auf als jede Mundungenauigkeit. Ein Lidgelenk hat GNM nicht, und keine Achse heißt „Auge zu". Weil die 68 Landmarken baryzentrisch und damit linear in den Koeffizienten sind, ist die Lidöffnung ein lineares Funktional — „Auge zu" wird zu einem kleinsten-Quadrate-Problem mit exakter Lösung. Der Lidspalt von 7,26 mm schließt sich auf 0,01 mm genau, mit Koeffizienten unter 1,7 Standardabweichungen.
  5. 5
    Brauen anatomisch gesetzt, nicht aus der Region übernommengebaut
    GNMs Brauen-Region umfasst die halbe Stirn — als Farbe genommen ergibt das einen Schmierfleck bis zum Haaransatz. Eine Augenbraue ist ein schmaler Bogen rund 13 mm über der Augenmitte; genau so wird sie jetzt gesetzt und mit der groben Region multipliziert, damit nichts auf der Schläfe landet.
  6. 6
    Sakkaden statt Sinuskurvengebaut
    Echte Augen springen, sie gleiten nicht. Eine Sinuskurve auf der Augenachse sieht aus wie ein Scheibenwischer; ein Blick hält sein Ziel 0,3 bis 2 Sekunden und wechselt dann in rund 40 Millisekunden. Dazu öffnen sich die Augen auf lauten Silben ein wenig — die Lautstärke-Hüllkurve liegt ohnehin gebacken vor, das koppelt Gesicht und Stimme ohne Zusatzaufwand.
  7. 7
    Haare als Schalengebaut
    GNM liefert kein Haar; ein kahler Kopf liest sich als Puppe. Die Kopfhaut wird 16-mal gezeichnet, jedes Mal ein Stück weiter entlang der Normalen, und in jeder Schale bleibt weniger Fläche stehen. Aus den übrig bleibenden Säulen wird für das Auge kurzes, dichtes Haar. Kostet keine zusätzliche Rechnung je Bild — die Positionen sind dieselben wie beim Kopf.
  8. 8
    Unsymmetrie lässt sich NICHT über die Identitäts-Achsen erreichenErgebnis
    Nachgemessen: GNMs Identitäts-Achsen sind praktisch spiegelgleich. Von 6 auf 40 aktive Achsen hebt die mittlere Links-Rechts-Abweichung nur von 0,16 auf 0,21 mm — echte Gesichter liegen im Millimeterbereich. Wer über die Achsen ein unsymmetrisches Gesicht sucht, sucht an der falschen Stelle. Wir legen die Unsymmetrie deshalb als leichte Verwindung auf die Ruheform und holen den einen Anteil, den GNM hergibt, aus den seitengetrennten Augen-Achsen.
  9. 9
    Echte Textur-Koordinaten statt Näherunggebaut
    Bisher gewann je Punkt der erste Treffer — über jeder Naht schmierte damit jede Textur. Jetzt werden Nahtpunkte vor dem Vergröbern verdoppelt, gemessen 3,4 Prozent der Punkte. Darauf sitzt eine prozedurale Hautmaserung mit Poren, die den Glanz aufbricht; auf den Textur-Koordinaten statt auf der Position, damit sie beim Sprechen nicht mitwandert.
  10. 10
    Echte Wortmarken statt geschätztergebaut
    Die Zeiten für Untertitel und Mundspur waren aus der Lautstärke geraten. Jetzt geht der selbst erzeugte Ton durch den eigenen Spracherkenner, der wortgenau ausrichtet — zwei Dienste, die wir ohnehin betreiben, ergänzen sich genau hier. Die Falle liegt danach: Der Erkenner liefert seine Wortfolge, nicht unsere. Wer beide einfach der Reihe nach paart, verschiebt ab der ersten Abweichung alles; es braucht eine Ausrichtung über die ganze Folge.
  11. 11
    Untertitel, die wie Untertitel aussehengebaut
    Sie wurden aus den nackten Wörtern zusammengesetzt und hatten deshalb keine Satzzeichen — lesbar, aber ein Lauftext. Jede Wortmarke trägt jetzt ihre Zeichen-Stelle im Ausgangstext, sodass der Untertitel aus dem Original geschnitten wird statt neu zusammengefügt. Das Fenster zieht dabei auf Satzgrenzen. Derselbe Handgriff behebt eine stille Lücke: Ziffern fielen bei der Zerlegung ganz heraus, ein Sprechtext mit einer Jahreszahl bekam dort weder Mundbewegung noch Untertitel.
  12. 12
    Als Begleitfigur in eine App bringenoffen
    Der Erzähler ist bisher ein Prüfstand, keine App. Ein erster Schritt ist gemacht: Es gibt nicht mehr nur den einen Foliensatz, der von sich selbst erzählt, sondern auch einen, der den Verein vorstellt — der Erzähler ist dort Mittel statt Thema. Was weiter fehlt, ist der Kopf als geteilte Bibliothek, damit ihn auch Lern- und Kisten-Apps nutzen können.
  13. 13
    Mit unserer eigenen Stimme gemessen — und sie erzählt jetzt auchgebaut
    Der Erzähler sprach zuerst mit einer Systemstimme; damit galt auch die gemessene Lippen-Güte für eine fremde Stimme. Jetzt spricht Theo, eine unserer sieben kuratierten Vereinsstimmen, entworfen zum Vorlesen. Nachgemessen: 95,2 Prozent Reden/Schweigen-Treffer gegen 89,3 Prozent für blindes Raten. Synthetisiert wird satzweise — der Varianten-Dienst verklemmt bei langen Absätzen, und kurze Anfragen kosten im Fehlerfall einen Satz statt einer Folie.
Ehrlich benannt

Offene Punkte

  • Die Zähne bleiben grob. Eine Zahnreihe ist geometrisch aufwendig; beim Vergröbern zerfällt sie in einzelne Blöcke. In der eigentlichen Anwendung ist der Mund rund 40 Pixel breit, dort trägt es — bei einer Großaufnahme nicht.
  • Das Haar ist kurz und dicht. Lange Strähnen, ein Scheitel oder Bewegung im Haar kann das Schalenverfahren nicht; dafür bräuchte es echte Haargeometrie.
  • Die Hautmaserung ist prozedural, keine fotografierte Textur. Aus einem Meter Abstand trägt sie, in der Großaufnahme fehlen echte Poren, Falten und Pigmentflecken.
  • Gemessen ist weiterhin an einem Satz. Die Zahl 95,2 Prozent stammt aus einem einzigen Beispiel mit einer Stimme; für eine belastbare Zusage bräuchte es mehrere Sätze und mehrere Sprechende.
  • Der Dienst, der unsere entworfenen Stimmen synthetisiert, fällt bei jedem internen Fehler still auf eine andere Stimme zurück — mit gültigem Audio und ohne Fehlermeldung. Wir prüfen das jetzt bei jeder Anfrage, aber die Eigenschaft selbst bleibt eine Falle für jeden anderen Aufrufer.
  • In der Spiel-Engine reicht es für genau einen Kopf, und knapp: rund acht Millisekunden je Bild für das kleinste Modell, also die halbe Zeit, die ein Bild bei sechzig Bildern je Sekunde überhaupt hat. Für eine Menschenmenge braucht es einen anderen Weg. Im Browser ist das kein Thema — dort kostet derselbe Kopf ein Vierzigstel davon.
  • Drei Fehler in dieser Reihe waren unsere eigenen: Der Server lieferte die Startseite ohne Inhaltstyp aus, weshalb der Browser sie herunterlud statt anzeigte — das ließ auch alle automatischen Bildschirmfotos hängen. Als das Zahnfleisch eine eigene Gewebe-Kennung bekam, zählte es plötzlich als Auge und zog die berechnete Augenmitte zum Mund, worauf die Brauen verschwanden. Und als die Modelldatei einen Anhang bekam, lief der Leser der Spiel-Engine nicht etwa weiter, wie angenommen — er prüft die Versionsnummer und fiel aus, lange bevor er den ignorierbaren Anhang erreicht hätte. Alle drei sahen nach einem schweren Problem aus und waren je eine Zeile.
Belege

Quellen

Paper, Code, Modell und Erklärung — mit eigenem Namen daneben. Datum dort, wo es belegbar ist.

Der Forschungsradar sammelt fremde Methoden, die zu dem passen, was wir bauen. Externe Entwicklungen (Regulierung, Markt) stehen in den Recherchen; die KI-Modelle selbst im Modell-Katalog.