A small GUI wrapper to run LipGenerator.exe in batch mode on all .wav files in a folder (Skyrim lip generation).
- Windows
- A
LipGenerator/folder next tolip_gui.pythat contains:LipGenerator.exeFonixData.cdf
- Python (this workspace already contains a configured
.venv)
Tip: If you have Skyrim Special Edition installed via Steam, these files are often located under:
...\steam\steamapps\common\Skyrim Special Edition\Tools\LipGen\LipGenerator
From the workspace root:
".\.venv\Scripts\python.exe" .\lip_gui.pyIf you built it locally, the EXE is located at:
dist/LipGUI.exe
Important: put the LipGenerator/ folder (with LipGenerator.exe + FonixData.cdf) next to LipGUI.exe.
Example layout:
dist/
LipGUI.exe
LipGenerator/
LipGenerator.exe
FonixData.cdf
You can publish the tool (GUI/EXE/FAQ) on GitHub.
Important: LipGenerator.exe and FonixData.cdf are very likely third‑party files.
Do not include them in your GitHub repo or releases unless you explicitly have the rights to redistribute them.
Instead:
- Releases contain
LipGUI.exe,FAQ_EN.md,settings.json - Users place their own
LipGenerator/(withLipGenerator.exe+FonixData.cdf) next to the EXE
When you push a tag like v0.3.0, GitHub Actions automatically builds the EXE and attaches a ZIP to the GitHub Release.
LipGenerator.exe always needs the spoken text in addition to the WAV file.
The GUI supports multiple text sources:
- From
.txt: forfoo.wavthere must be afoo.txt(content = spoken text) - From filename:
Hello_World.wav→Hello World - Fixed text: same text for all files
- From a mapping file (CSV/TSV): e.g.
FormID→Text
If your text only exists inside the translated *.esp, the usual approach is:
- Export the dialogue/subtitle text from the ESP into a table (CSV/TSV).
- Ensure each voice line has an ID that matches your WAV filename.
In Skyrim, voice files are often named after the INFO FormID (8 hex characters), e.g. 000A1234.wav.
Depending on the export tool, the key might be the WAV filename or even a path — the GUI normalizes this down to the filename automatically.
Example format (TSV recommended):
000A1234 Hello, traveler.
000A1235 Welcome to Whiterun.
The GUI tries to use the first 8 hex characters as the key when the filename starts with them. If no mapping entry is found, it falls back to “Text from filename” and writes a warning to the log.
- Find WAVs: LazyVoiceFinder can scan your voice assets and export CSV.
- Get text: Export your translated lines from xTranslator (or your workflow).
- Build mapping: ideally one file that contains one key per voice line + the text.
The GUI works with many CSV/TSV exports as long as it can find columns similar to:
- Key:
FormIDorFileName/WAV/Path - Text:
Text/SubtitleorTranslated/Target
Optional (but helpful if filenames are not unique):
- Folder/voice:
Voice Type
If Voice Type exists, the GUI also tries composite keys like voicetype/filename.
If you exported one LazyVoiceFinder CSV per subfolder, you can combine them into a single mapping:
- Simplest: In the GUI, you can select multiple CSVs at once for the mapping input (the GUI merges them internally).
- Put all exported
*.csvfiles into one folder, e.g.exports/ - Run:
".\.venv\Scripts\python.exe" .\merge_lazyvoice_csv.py .\exports -o .\all_voices.tsv- In the GUI, choose
all_voices.tsvas your mapping file.
- Output files are written as
.lip. - If Preserve folder structure is enabled, subfolders are recreated under the output folder.