Wenn ich von Lippensynchron spreche, meine ich selbstredent nicht, das für jeden gesprochenen Satz im Spiel nun eine eigene Animation gezeichnet werden muss. Stattdessen halte ich es für sinnvoll ein Set für die Buchstaben anzulegen. Wenn man sich nun mal beim Sprechen im Spiegel anschaut, wird man bemerken das es nichtmal notwendig ist ein Frame für jeden Buchstaben anzulegen. Bei Puzzle Agents (http://www.telltalegames.com/puzzleagent) z.b. hat es völlig ausgereicht nur für einige Buchstaben Frames zu zeichnen. Ich bin mir nicht mehr sicher welche das waren, aber ich gehe davon aus es waren unter anderem: A, O, I, M, N, S
Alleine aus diesen Frames kann man schon eine Menge Sätze bilden:
Hallo mein Name ist Hase. ALO MAIN NAMA IS ASA. Während es sich verdammt dähmlich liest, würde es in einer abgespielten Animation, zeitlich passend zum Ton, Sinn machen.
Diese Technik ist nicht neu: http://www.youtube.com/watch?v=EKE4YExWcy8
Die Frage ist allerdings ob und wie man soetwas in Visionaire umsetzen kann.
Ich würde mir eine Sprachanimation folgendermaßen vorstellen: Während Ton vom Soundfile abgespielt wird, werden Sprites mit zufälligen Lippenformen auf den Bildschirm projeziert. Sobald im Soundfile eine Pause erreicht wird, das heißt der Ton unterhalb einer bestimmten Amplitude fällt (irgendein Hintergrundrauschen wird man wohl immer haben), wird das Standartbild mit versiegelten Lippen angezeigt. In der Engine kann man maximal den Wert dieser Amplitude einstellen, eventuell in Abhängigkeit zur Durchschnitssamplitude im Soundfile. Ich glaube so etwas wäre noch am einfachsten zu implementieren. Falls kein Soundfile vorhanden ist, könnte man immer noch den eingegebenen Text als Berechnungsgrundlage für die Unterbrechungen verwenden....
Ich glaube gerade in dem Space Quest Video sieht man sehr schön wie sehr es mit der Stimme das Schauspielers harmonisiert. Z.B. wenn Wilco "Aaaaah.... Yah?" sagt. Würde hier der animationsloop spielen, wäre die Wirkung irgendwie nicht so schön.
Eine Idee die ich hätte wäre ein "spezielles" Sprachfenster. Es ist im Prinzip wie der jetzige Dialogeditor, allerdings mit der zusätzlichen Option eine Timeline zu aktivieren in der man manuel die verschiedenen Frames setzen kann. Wird ein Frame abgespielt bleibt er einfach solange aktiv bis ein anderer Frame kommt (eine Art Phonetische tabelle müsste natürlich dementsprechend angelegt werden, damit die engine versteht welcher Frame gespielt werden muss). Besser wäre natürlich eine Art Spracherkennung die minimal erkennt um welche Laute es sich handelt. Wie schon gesagt, es muss nicht perfekt sein, aber so ein kleines Detail kann einen gewaltigen Unterschied machen.
Und wie sähe dann der Workflow in dem Hasenbeispiel aus? Man müsste dann ja für jeden Laut den man Mappen will die Zeit herausfinden für diese dann einen Keyframe in Visionaire anlegen und diesem dann eine Mundform zuweisen. In deinem Hasenbeispiel wären das schon 20 Laute, wenn man die Pause mitzählt, für einen mickrigen Satz. Wieviel Zeit würde man brauchen, um all das einzugeben, für einen kleinen Satz, den man in 10s hingeschrieben hat? Und den ganzen Spaß kann man dann für die englische Synchro nochmal machen.... oO Das Resultat wäre zugegebenermaßen Qualitativ hochwertigst. Ist es aber auch den Aufwand wert? An welchen anderen Ecken müssen dann Abstriche gemacht werden, nur für Lipsync?Es ist im Prinzip wie der jetzige Dialogeditor, allerdings mit der zusätzlichen Option eine Timeline zu aktivieren in der man manuel die verschiedenen Frames setzen kann.
Das wäre natürlich die beste Methode, auch da man sehr Fehlertollerant arbeiten könnte, anders als bei einer echten Spracherkennung. Trotzdem dürfte es abartig kompliziert sein schon so etwas zu programmieren und ich bezweifle auch, dass man ohne Fachwissen zu ordentlichen Ergebnissen kommt. Hab allerdings zu diesem Thema im Netz nichts großes gefunden. Anyone?Besser wäre natürlich eine Art Spracherkennung die minimal erkennt um welche Laute es sich handelt.
Ein Lautstärkenerkennung um den Mund bei Stille geschlossen zu halten würde der Atmosphäre eines Spiels schon helfen. Allerdings wirkt es immer noch "billig" im Vergleich zu echtem Lipsync.
Es gibt einige Middlewarelösungen für z.b. die Unreal Engine die Lipsync in Echtzeit ermöglichen aber meist zuviel Rechenleistung fordern oder so teuer sind das es sich nicht lohnt. Es gibt allerdings auch Software zur Sprachanalyse von denen einige sogar für Animationen gedacht sind. Zu IBM Via Voice hatte ich gesehen das es eine freie API zum erkennen von 4 Phonemen gibt. Allerdings wüsste ich nicht ob sich das implementieren ließe und wie gut das wirklich aussehen würde. Die meisten Animationsstudios verwenden 8-12 Frames für die häufigsten Phoneme, bei 3D Animation um die 30. Software wie Lipsync Tool 4 ist in der Lage Soundfiles im Batch zu analysieren und die Timing Daten für eine Liste von Mundbewegungen zu erstellen. Man könnte also einmal alle Soundfiles abarbeiten lassen und könnte die Daten dann zur Animationssteuerung in Visionaire verwenden. Eine Echtzeitanalyse ist in kaum einem Adventure Notwendig aber echtes Lipsync wäre ein enormer Qualitätssprung.
Allerdings sind weder Via Voice noch Lipsync Tool günstige Software. Also eigentlich nur für kommerzielle Spiele eine Option.
Papagayo: http://www.lostmarble.com/papagayo/index.shtml Papagayo is licensed under the GPL (GNU General Public License). This means that you are free to download the source code to Papagayo and make modifications to the program itself (as log as you can do a little Python programming). You are free to redistribute these modifications as long as you allow anyone else access to your modified code. Download the Papagayo source code below:
Pamela: http://users.monash.edu.au/~myless/catnap/pamela3/index.html What it costs This software is freeware and open source, for personal, educational, corporate, and/or commercial use. Due to the GPL license of the sound toolkit used, PAMELA is also covered by the GPL license.
Drüben beim AGS forum werden noch einige mehr genannt, allerdings sind die kostenpflichtig (alleine schon in der anschaffung).
Edit:
Hätte das hier doch lieber in "Verbesserungswünsche" reinschreiben sollen
Ähnlich wie die Untertitel einer DVD:
1
00:00:13,637 --> 00:00:15,036
Thank you! Thank you, thank you!2
00:00:15,117 --> 00:00:17,756
ROBBIE: That's an incredibly bloody
stupid thing to do.
3
00:00:17,877 --> 00:00:19,196
- BRIONY: I wanted you to save me.
- Don't you know
4
00:00:19,277 --> 00:00:20,869
how easily you could have drowned?
5
00:00:21,197 --> 00:00:23,916
- You saved me.
- Stupid child!
Könnte man eine txt datei schreiben:
1
00:00:00,920
M.png2
00:00:01,230
O.png
3
00:00:02,329
M.png
Anstatt einer Timeline ladet man einfach die Sounddatei in die Engine. Wenn eine TXT datei mit selben Namen exisitiert, wird sie verwendet um den lipsync zu generieren. Wenn es nicht existiert wird ein normaler sprachloop benutzt.
Diese datei kann eventuell mit so einem lipsync tool generiert werden. Aber ich glaube dass man dazu im sourcecode herumpfuschen müsste.
Die Überlegung mit der externen Datei mit den Timingdaten ist auch meiner Meinung nach der sinnvollste Weg. Eine Editoroberfläche für die Einstellungen wäre wohl nur umständlich und auch nicht sonderlich effektiv nutzbar. Allerdings sollte eher die Framenummer einer Talkanimation angesprungen werden anstatt eine Grafik zu referenzieren. Dann wäre es flexibler für verschiedene Charaktere nutzbar weil dann einfach die aktive Animation gesteuert werden könnte. Man müsste sich dann auch nur einmal für eine Reihenfolge der Phoneme in der Talkanimation entscheiden, die dann beibehalten wird.
Ich hatte mich aber gerade gefragt ob das ganze mit etwas Lua Script nicht jetzt schon funktionieren könnte. Leider kann man wohl die Pausenlänge eines Frames nicht scripten. Ständig VAnimationCalledTime abzufragen um dann nach der, aus einer externen Lua Table ausgelesenen Dauer den Frame zu wechseln belastet nur unnötig das System. Den Dateinamen aus VTextLanguageSound des aktuellen Texts sollte man auch bekommen können, die aktuelle Talkanimation sowieso.