Was macht viral-voice?
Einmaliges Setup: bash setup.sh. Skripte in dieser Anleitung befinden sich neben dieser Datei, verwende daher ihren vollständigen Pfad.
1. Eine Stimme auswählen
Frage den Benutzer, welche er möchte, und sei direkt bei den Vor- und Nachteilen:
| Option | Kosten | Qualität | Zeitsteuerung der Untertitel |
|---|---|---|---|
| Kostenlose Stimme (Standard) | Kostenlos | Deutlich, etwas flach | Exakt, jedes Wort leuchtet beim Sprechen auf |
| ElevenLabs | Deren kostenpflichtiger Tarif oder kostenloses Guthaben | Am natürlichsten | Exakt, wenn das Modell Zeitstempel liefert |
| Eigene Stimme | Kostenlos | Am persönlichsten | Geschätzt pro Zeile. Enger, wenn taktweise aufgenommen |
Die eigene Stimme ist in der Regel am besten, weil man hört, wenn es jemand ernst meint. Ein gesichtsloses Reel muss nicht stimmlos sein.
# Kostenlose Stimme. Wählt Midhun für Malayalam. --voice ml-IN-SobhanaNeural für die andere Malayalam-Stimme.
python3 voice.py <projekt>
# ElevenLabs. Benötigt ELEVENLABS_API_KEY und eine Stimmen-ID. Malayalam benötigt ein Modell, das es unterstützt, wie eleven_v3.
python3 voice.py <projekt> --engine elevenlabs --voice <stimmen-id> --model eleven_v3
# Eigene Aufnahme, ein Durchlauf des gesamten Skripts in Reihenfolge
python3 voice.py <projekt> --engine file --audio aufnahme.m4a
# Eigene Aufnahme, eine Datei pro Takt (voice/b1.m4a, voice/b2.m4a). Die Zeitsteuerung ist so genauer.
python3 voice.py <projekt> --engine file --audio voice/
Audio aus anderen Tools funktioniert ebenfalls über --engine file. Wenn also ein Sprachgenerierungstool angeschlossen ist, generiere eine Datei pro Takt und übergib den Ordner.
Bei Aufnahmen wird jede Zeile anhand der Wortlänge zwischen Pausen zeitlich eingeordnet, sodass ein Untertitel bei einem einzelnen langen Durchlauf bis zu etwa einer Sekunde abweichen kann. In unserem Test mit einem echten 48-sekündigen Malayalam-Reel lagen die meisten Untertitel innerhalb einer halben Sekunde. Wenn es nicht passt, nimm taktweise auf.
Die kostenlose Stimme läuft über den Edge-Vorlesedienst von Microsoft durch das Open-Source-Tool edge-tts. Es ist keine offizielle API, daher könnte sie sich ändern oder nicht mehr funktionieren, und jeder, der sie für Kunden- oder kommerzielle Arbeiten nutzt, sollte zuerst die Bedingungen prüfen. Sage dies, wenn der Benutzer Videos für ein Unternehmen erstellt.
2. Jemand muss zuhören
Du kannst Audio nicht durch diese Tools hören, und timing.json zeigt nur die Wörter aus dem Skript, niemals, was die Stimme tatsächlich gesagt hat. Nichts hier kann also die Aussprache bestätigen. Bitte den Benutzer, voice.wav anzuhören, oder wenn ein Transkriptionstool angeschlossen ist, transkribiere es und vergleiche. Sage klar, dass es ungehört bleibt, wenn keines von beidem geschieht.
Wenn die Stimme ein Wort falsch ausspricht, füge "tts" zu diesem Takt in script.json hinzu, mit einer Schreibweise, die es richtig ausspricht, und führe es erneut aus. Der Untertitel verwendet weiterhin say. Behalte möglichst die gleiche Anzahl von Wörtern in tts wie in say. Wenn sie abweichen, gibt voice.py einen Hinweis aus und die Zeitsteuerung des Untertitels für diesen Takt wird zu einer Schätzung.
Wenn eine Zeile gehetzt klingt, ändere --rate (Standard +8%). --gap legt die Pause zwischen den Takten fest.
Die Längenschätzungen von lint_script.py und timing.py sind nur grob und können 10 bis 15 % zu kurz sein. Die tatsächliche Länge gibt voice.py aus. Um eine Zielzeit zu erreichen, ändere --rate oder kürze Wörter und führe es dann erneut aus.
3. Das Bild noch einmal ansehen
Die echte Stimme hat alles verschoben, also schau vor dem endgültigen Rendern nach:
node <viral-animate-ordner>/render.mjs <projekt> --stills beats
Öffne stills/beats.jpg. Bewegungen, die an k, d oder kit.at gebunden sind, sind der Stimme gefolgt. Alles mit festen Sekunden darin ist es nicht, also korrigiere diese in scenes.js.
4. Soundeffekte
sfx.py läuft automatisch: ein leiser Schlag am Anfang und ein leises Whoosh bei jedem Taktwechsel. Für ein ruhiges, emotionales Stück schalte diese mit "sfx_auto": false in script.json aus. Um weitere hinzuzufügen, liste sie auf, auf einem Wort, damit sie synchron bleiben:
"sfx": [{ "beat": "b2", "word": "charger", "kind": "pop", "db": -14 }]
Verwende "at": 1.1 anstelle von word für Sekunden innerhalb des Taktes. Ein Wort, das der Takt nicht sagt, stoppt mit einer klaren Meldung. Arten:
| Art | Klingt wie | Gut für |
|---|---|---|
whoosh swell | Aufsteigende Luft | Wechsel, hereinfliegende Dinge |
swipe | Schnelles Streifen von Luft | Schnelle Bewegungen |
pop | Kleiner runder Plopp | Erscheinende Dinge |
tick | Winziger trockener Tick | Zähler, kleine Momente |
click | Scharfer Schalterklick | Lichtschalter, Knöpfe |
knock | Knöchel auf Holz | Türen, Tische |
thump | Tiefer Schlag | Eröffnungen, große Enthüllungen |
stamp | Harter Schlag mit Gewicht | Urteile, einen Punkt landen |
Sie sind alle synthetisch, daher gibt es kein Lizenzrisiko. Das Paket fügt keine Musik hinzu: Es hält die Stimme klar und vermeidet Urheberrechtsverletzungen. Wenn der Benutzer Musik wünscht, kann er sie im Instagram-Editor hinzufügen.
5. Fertigstellen
python3 finish.py <projekt>
Dies rendert das Bild in voller Qualität auf der echten Stimmenzeitsteuerung, mischt die Effekte ein, stellt die Lautstärke auf etwa -14 LUFS ein und schreibt final.mp4. Füge --no-render hinzu, um nur den Ton neu zu mischen.
Testversionen: Um die anderen Hooks zu testen, kopiere den Projektordner, setze das say eines anderen Hooks in b1 und dessen label in das oberste label, und führe dann voice.py und finish.py auf der Kopie aus. Bewegungen, die an k, d oder kit.at gebunden sind, folgen. Überprüfe, ob jedes kit.at-Wort noch im neuen Hook ist.
Gehe dann zu /viral-check. Bezeichne das Reel nicht als fertig, bevor das geschehen ist.