A Python CLI utility that turns text and media files (slides, screenshots, screen recordings or video clips) into a fully narrated, perfectly timed demo video.
Built for IT professionals, sysadmins, and support teams who want to treat instructional videos like infrastructure-as-code. Stop manually recording screen captures and voiceovers every time a UI element changes. Update the script, swap the media, re-compile your video, and publish it on YouTube and other video platforms.
You can now choose between Microsoft's high-speed cloud TTS (edge-tts) or a 100% local, private, and open-source neural TTS model (kokoro) as your voice narrative engine.
A fully private, on-device engine featuring high-quality voices.
| Voice | Gender | Locale | Country / Language |
|---|---|---|---|
| af_heart (default) | Female | en-US | United States ๐บ๐ธ |
| af_alloy | Female | en-US | United States ๐บ๐ธ |
| af_aoede | Female | en-US | United States ๐บ๐ธ |
| af_bella | Female | en-US | United States ๐บ๐ธ |
| af_jessica | Female | en-US | United States ๐บ๐ธ |
| af_kore | Female | en-US | United States ๐บ๐ธ |
| af_nicole | Female | en-US | United States ๐บ๐ธ |
| af_nova | Female | en-US | United States ๐บ๐ธ |
| af_river | Female | en-US | United States ๐บ๐ธ |
| af_sarah | Female | en-US | United States ๐บ๐ธ |
| af_sky | Female | en-US | United States ๐บ๐ธ |
| am_adam | Male | en-US | United States ๐บ๐ธ |
| am_echo | Male | en-US | United States ๐บ๐ธ |
| am_eric | Male | en-US | United States ๐บ๐ธ |
| am_fenrir | Male | en-US | United States ๐บ๐ธ |
| am_liam | Male | en-US | United States ๐บ๐ธ |
| am_michael | Male | en-US | United States ๐บ๐ธ |
| am_onyx | Male | en-US | United States ๐บ๐ธ |
| am_puck | Male | en-US | United States ๐บ๐ธ |
| am_santa | Male | en-US | United States ๐บ๐ธ |
| bf_alice | Female | en-GB | United Kingdom ๐ฌ๐ง |
| bf_emma | Female | en-GB | United Kingdom ๐ฌ๐ง |
| bf_isabella | Female | en-GB | United Kingdom ๐ฌ๐ง |
| bf_lily | Female | en-GB | United Kingdom ๐ฌ๐ง |
| bm_daniel | Male | en-GB | United Kingdom ๐ฌ๐ง |
| bm_fable | Male | en-GB | United Kingdom ๐ฌ๐ง |
| bm_george | Male | en-GB | United Kingdom ๐ฌ๐ง |
| bm_lewis | Male | en-GB | United Kingdom ๐ฌ๐ง |
| ef_dora | Female | es-ES | Spain ๐ช๐ธ |
| em_alex | Male | es-ES | Spain ๐ช๐ธ |
| em_santa | Male | es-ES | Spain ๐ช๐ธ |
| ff_siwis | Female | fr-FR | France ๐ซ๐ท |
| hf_alpha | Female | hi-IN | India ๐ฎ๐ณ |
| hf_beta | Female | hi-IN | India ๐ฎ๐ณ |
| hm_omega | Male | hi-IN | India ๐ฎ๐ณ |
| hm_psi | Male | hi-IN | India ๐ฎ๐ณ |
| if_sara | Female | it-IT | Italy ๐ฎ๐น |
| im_nicola | Male | it-IT | Italy ๐ฎ๐น |
| jf_alpha | Female | ja-JP | Japan ๐ฏ๐ต (Needs misaki[ja]) |
| jf_gongitsune | Female | ja-JP | Japan ๐ฏ๐ต (Needs misaki[ja]) |
| jf_nezumi | Female | ja-JP | Japan ๐ฏ๐ต (Needs misaki[ja]) |
| jf_tebukuro | Female | ja-JP | Japan ๐ฏ๐ต (Needs misaki[ja]) |
| jm_kumo | Male | ja-JP | Japan ๐ฏ๐ต (Needs misaki[ja]) |
| pf_dora | Female | pt-BR | Brazil ๐ง๐ท |
| pm_alex | Male | pt-BR | Brazil ๐ง๐ท |
| pm_santa | Male | pt-BR | Brazil ๐ง๐ท |
| zf_xiaobei | Female | zh-CN | China ๐จ๐ณ (Needs misaki[zh]) |
| zf_xiaoni | Female | zh-CN | China ๐จ๐ณ (Needs misaki[zh]) |
| zf_xiaoxiao | Female | zh-CN | China ๐จ๐ณ (Needs misaki[zh]) |
| zf_xiaoyi | Female | zh-CN | China ๐จ๐ณ (Needs misaki[zh]) |
| zm_yunjian | Male | zh-CN | China ๐จ๐ณ (Needs misaki[zh]) |
| zm_yunxi | Male | zh-CN | China ๐จ๐ณ (Needs misaki[zh]) |
| zm_yunxia | Male | zh-CN | China ๐จ๐ณ (Needs misaki[zh]) |
| zm_yunyang | Male | zh-CN | China ๐จ๐ณ (Needs misaki[zh]) |
Use the --engine edge flag to access a massive library of high-speed, multilingual voices.
| Voice | Gender | Locale | Country / Language |
|---|---|---|---|
| af-ZA-AdriNeural | Female | af-ZA | South Africa ๐ฟ๐ฆ |
| af-ZA-WillemNeural | Male | af-ZA | South Africa ๐ฟ๐ฆ |
| am-ET-MekdesNeural | Female | am-ET | Ethiopia ๐ช๐น |
| am-ET-AmehaNeural | Male | am-ET | Ethiopia ๐ช๐น |
| ar-AE-FatimaNeural | Female | ar-AE | UAE ๐ฆ๐ช |
| ar-AE-HamdanNeural | Male | ar-AE | UAE ๐ฆ๐ช |
| ar-BH-LailaNeural | Female | ar-BH | Bahrain ๐ง๐ญ |
| ar-BH-AliNeural | Male | ar-BH | Bahrain ๐ง๐ญ |
| ar-DZ-AminaNeural | Female | ar-DZ | Algeria ๐ฉ๐ฟ |
| ar-DZ-IsmaelNeural | Male | ar-DZ | Algeria ๐ฉ๐ฟ |
| ar-EG-SalmaNeural | Female | ar-EG | Egypt ๐ช๐ฌ |
| ar-EG-ShakirNeural | Male | ar-EG | Egypt ๐ช๐ฌ |
| ar-IQ-RanaNeural | Female | ar-IQ | Iraq ๐ฎ๐ถ |
| ar-IQ-BasselNeural | Male | ar-IQ | Iraq ๐ฎ๐ถ |
| ar-JO-SanaNeural | Female | ar-JO | Jordan ๐ฏ๐ด |
| ar-JO-TaimNeural | Male | ar-JO | Jordan ๐ฏ๐ด |
| ar-KW-NouraNeural | Female | ar-KW | Kuwait ๐ฐ๐ผ |
| ar-KW-FahedNeural | Male | ar-KW | Kuwait ๐ฐ๐ผ |
| ar-LB-LaylaNeural | Female | ar-LB | Lebanon ๐ฑ๐ง |
| ar-LB-RamiNeural | Male | ar-LB | Lebanon ๐ฑ๐ง |
| ar-LY-ImanNeural | Female | ar-LY | Libya ๐ฑ๐พ |
| ar-LY-OmarNeural | Male | ar-LY | Libya ๐ฑ๐พ |
| ar-MA-MounaNeural | Female | ar-MA | Morocco ๐ฒ๐ฆ |
| ar-MA-JamalNeural | Male | ar-MA | Morocco ๐ฒ๐ฆ |
| ar-OM-AyshaNeural | Female | ar-OM | Oman ๐ด๐ฒ |
| ar-OM-AbdullahNeural | Male | ar-OM | Oman ๐ด๐ฒ |
| ar-QA-AmalNeural | Female | ar-QA | Qatar ๐ถ๐ฆ |
| ar-QA-MoazNeural | Male | ar-QA | Qatar ๐ถ๐ฆ |
| ar-SA-ZariyahNeural | Female | ar-SA | Saudi Arabia ๐ธ๐ฆ |
| ar-SA-HamedNeural | Male | ar-SA | Saudi Arabia ๐ธ๐ฆ |
| ar-SY-AmanyNeural | Female | ar-SY | Syria ๐ธ๐พ |
| ar-SY-LaithNeural | Male | ar-SY | Syria ๐ธ๐พ |
| ar-TN-ReemNeural | Female | ar-TN | Tunisia ๐น๐ณ |
| ar-TN-HediNeural | Male | ar-TN | Tunisia ๐น๐ณ |
| ar-YE-MaryamNeural | Female | ar-YE | Yemen ๐พ๐ช |
| ar-YE-SalehNeural | Male | ar-YE | Yemen ๐พ๐ช |
| az-AZ-BanuNeural | Female | az-AZ | Azerbaijan ๐ฆ๐ฟ |
| az-AZ-BabekNeural | Male | az-AZ | Azerbaijan ๐ฆ๐ฟ |
| bg-BG-KalinaNeural | Female | bg-BG | Bulgaria ๐ง๐ฌ |
| bg-BG-BorislavNeural | Male | bg-BG | Bulgaria ๐ง๐ฌ |
| bn-BD-NabanitaNeural | Female | bn-BD | Bangladesh ๐ง๐ฉ |
| bn-BD-PradeepNeural | Male | bn-BD | Bangladesh ๐ง๐ฉ |
| bn-IN-TanishaaNeural | Female | bn-IN | India ๐ฎ๐ณ |
| bn-IN-BashkarNeural | Male | bn-IN | India ๐ฎ๐ณ |
| bs-BA-VesnaNeural | Female | bs-BA | Bosnia ๐ง๐ฆ |
| bs-BA-GoranNeural | Male | bs-BA | Bosnia ๐ง๐ฆ |
| ca-ES-JoanaNeural | Female | ca-ES | Spain ๐ช๐ธ |
| ca-ES-EnricNeural | Male | ca-ES | Spain ๐ช๐ธ |
| cs-CZ-VlastaNeural | Female | cs-CZ | Czechia ๐จ๐ฟ |
| cs-CZ-AntoninNeural | Male | cs-CZ | Czechia ๐จ๐ฟ |
| cy-GB-NiaNeural | Female | cy-GB | United Kingdom ๐ฌ๐ง |
| cy-GB-AledNeural | Male | cy-GB | United Kingdom ๐ฌ๐ง |
| da-DK-ChristelNeural | Female | da-DK | Denmark ๐ฉ๐ฐ |
| da-DK-JeppeNeural | Male | da-DK | Denmark ๐ฉ๐ฐ |
| de-AT-IngridNeural | Female | de-AT | Austria ๐ฆ๐น |
| de-AT-JonasNeural | Male | de-AT | Austria ๐ฆ๐น |
| de-CH-LeniNeural | Female | de-CH | Switzerland ๐จ๐ญ |
| de-CH-JanNeural | Male | de-CH | Switzerland ๐จ๐ญ |
| de-DE-AmalaNeural | Female | de-DE | Germany ๐ฉ๐ช |
| de-DE-KatjaNeural | Female | de-DE | Germany ๐ฉ๐ช |
| de-DE-SeraphinaMultilingualNeural | Female | de-DE | Germany ๐ฉ๐ช |
| de-DE-ConradNeural | Male | de-DE | Germany ๐ฉ๐ช |
| de-DE-FlorianMultilingualNeural | Male | de-DE | Germany ๐ฉ๐ช |
| de-DE-KillianNeural | Male | de-DE | Germany ๐ฉ๐ช |
| el-GR-AthinaNeural | Female | el-GR | Greece ๐ฌ๐ท |
| el-GR-NestorasNeural | Male | el-GR | Greece ๐ฌ๐ท |
| en-AU-NatashaNeural | Female | en-AU | Australia ๐ฆ๐บ |
| en-AU-WilliamMultilingualNeural | Male | en-AU | Australia ๐ฆ๐บ |
| en-CA-ClaraNeural | Female | en-CA | Canada ๐จ๐ฆ |
| en-CA-LiamNeural | Male | en-CA | Canada ๐จ๐ฆ |
| en-GB-LibbyNeural | Female | en-GB | United Kingdom ๐ฌ๐ง |
| en-GB-MaisieNeural | Female | en-GB | United Kingdom ๐ฌ๐ง |
| en-GB-SoniaNeural | Female | en-GB | United Kingdom ๐ฌ๐ง |
| en-GB-RyanNeural | Male | en-GB | United Kingdom ๐ฌ๐ง |
| en-GB-ThomasNeural | Male | en-GB | United Kingdom ๐ฌ๐ง |
| en-HK-YanNeural | Female | en-HK | Hong Kong ๐ญ๐ฐ |
| en-HK-SamNeural | Male | en-HK | Hong Kong ๐ญ๐ฐ |
| en-IE-EmilyNeural | Female | en-IE | Ireland ๐ฎ๐ช |
| en-IE-ConnorNeural | Male | en-IE | Ireland ๐ฎ๐ช |
| en-IN-NeerjaExpressiveNeural | Female | en-IN | India ๐ฎ๐ณ |
| en-IN-NeerjaNeural | Female | en-IN | India ๐ฎ๐ณ |
| en-IN-PrabhatNeural | Male | en-IN | India ๐ฎ๐ณ |
| en-KE-AsiliaNeural | Female | en-KE | Kenya ๐ฐ๐ช |
| en-KE-ChilembaNeural | Male | en-KE | Kenya ๐ฐ๐ช |
| en-NG-EzinneNeural | Female | en-NG | Nigeria ๐ณ๐ฌ |
| en-NG-AbeoNeural | Male | en-NG | Nigeria ๐ณ๐ฌ |
| en-NZ-MollyNeural | Female | en-NZ | New Zealand ๐ณ๐ฟ |
| en-NZ-MitchellNeural | Male | en-NZ | New Zealand ๐ณ๐ฟ |
| en-PH-RosaNeural | Female | en-PH | Philippines ๐ต๐ญ |
| en-PH-JamesNeural | Male | en-PH | Philippines ๐ต๐ญ |
| en-SG-LunaNeural | Female | en-SG | Singapore ๐ธ๐ฌ |
| en-SG-WayneNeural | Male | en-SG | Singapore ๐ธ๐ฌ |
| en-TZ-ImaniNeural | Female | en-TZ | Tanzania ๐น๐ฟ |
| en-TZ-ElimuNeural | Male | en-TZ | Tanzania ๐น๐ฟ |
| en-US-AnaNeural | Female | en-US | United States ๐บ๐ธ |
| en-US-AriaNeural | Female | en-US | United States ๐บ๐ธ |
| en-US-AvaMultilingualNeural | Female | en-US | United States ๐บ๐ธ |
| en-US-AvaNeural | Female | en-US | United States ๐บ๐ธ |
| en-US-EmmaMultilingualNeural | Female | en-US | United States ๐บ๐ธ |
| en-US-EmmaNeural | Female | en-US | United States ๐บ๐ธ |
| en-US-JennyNeural | Female | en-US | United States ๐บ๐ธ |
| en-US-MichelleNeural | Female | en-US | United States ๐บ๐ธ |
| en-US-AndrewMultilingualNeural | Male | en-US | United States ๐บ๐ธ |
| en-US-AndrewNeural | Male | en-US | United States ๐บ๐ธ |
| en-US-BrianMultilingualNeural | Male | en-US | United States ๐บ๐ธ |
| en-US-BrianNeural | Male | en-US | United States ๐บ๐ธ |
| en-US-ChristopherNeural | Male | en-US | United States ๐บ๐ธ |
| en-US-EricNeural | Male | en-US | United States ๐บ๐ธ |
| en-US-GuyNeural | Male | en-US | United States ๐บ๐ธ |
| en-US-RogerNeural | Male | en-US | United States ๐บ๐ธ |
| en-US-SteffanNeural | Male | en-US | United States ๐บ๐ธ |
| en-ZA-LeahNeural | Female | en-ZA | South Africa ๐ฟ๐ฆ |
| en-ZA-LukeNeural | Male | en-ZA | South Africa ๐ฟ๐ฆ |
| es-AR-ElenaNeural | Female | es-AR | Argentina ๐ฆ๐ท |
| es-AR-TomasNeural | Male | es-AR | Argentina ๐ฆ๐ท |
| es-BO-SofiaNeural | Female | es-BO | Bolivia ๐ง๐ด |
| es-BO-MarceloNeural | Male | es-BO | Bolivia ๐ง๐ด |
| es-CL-CatalinaNeural | Female | es-CL | Chile ๐จ๐ฑ |
| es-CL-LorenzoNeural | Male | es-CL | Chile ๐จ๐ฑ |
| es-CO-SalomeNeural | Female | es-CO | Colombia ๐จ๐ด |
| es-CO-GonzaloNeural | Male | es-CO | Colombia ๐จ๐ด |
| es-CR-MariaNeural | Female | es-CR | Costa Rica ๐จ๐ท |
| es-CR-JuanNeural | Male | es-CR | Costa Rica ๐จ๐ท |
| es-CU-BelkysNeural | Female | es-CU | Cuba ๐จ๐บ |
| es-CU-ManuelNeural | Male | es-CU | Cuba ๐จ๐บ |
| es-DO-RamonaNeural | Female | es-DO | Dominican Rep. ๐ฉ๐ด |
| es-DO-EmilioNeural | Male | es-DO | Dominican Rep. ๐ฉ๐ด |
| es-EC-AndreaNeural | Female | es-EC | Ecuador ๐ช๐จ |
| es-EC-LuisNeural | Male | es-EC | Ecuador ๐ช๐จ |
| es-ES-ElviraNeural | Female | es-ES | Spain ๐ช๐ธ |
| es-ES-XimenaNeural | Female | es-ES | Spain ๐ช๐ธ |
| es-ES-AlvaroNeural | Male | es-ES | Spain ๐ช๐ธ |
| es-GQ-TeresaNeural | Female | es-GQ | Equatorial Guinea ๐ฌ๐ถ |
| es-GQ-JavierNeural | Male | es-GQ | Equatorial Guinea ๐ฌ๐ถ |
| es-GT-MartaNeural | Female | es-GT | Guatemala ๐ฌ๐น |
| es-GT-AndresNeural | Male | es-GT | Guatemala ๐ฌ๐น |
| es-HN-KarlaNeural | Female | es-HN | Honduras ๐ญ๐ณ |
| es-HN-CarlosNeural | Male | es-HN | Honduras ๐ญ๐ณ |
| es-MX-DaliaNeural | Female | es-MX | Mexico ๐ฒ๐ฝ |
| es-MX-JorgeNeural | Male | es-MX | Mexico ๐ฒ๐ฝ |
| es-NI-YolandaNeural | Female | es-NI | Nicaragua ๐ณ๐ฎ |
| es-NI-FedericoNeural | Male | es-NI | Nicaragua ๐ณ๐ฎ |
| es-PA-MargaritaNeural | Female | es-PA | Panama ๐ต๐ฆ |
| es-PA-RobertoNeural | Male | es-PA | Panama ๐ต๐ฆ |
| es-PE-CamilaNeural | Female | es-PE | Peru ๐ต๐ช |
| es-PE-AlexNeural | Male | es-PE | Peru ๐ต๐ช |
| es-PR-KarinaNeural | Female | es-PR | Puerto Rico ๐ต๐ท |
| es-PR-VictorNeural | Male | es-PR | Puerto Rico ๐ต๐ท |
| es-PY-TaniaNeural | Female | es-PY | Paraguay ๐ต๐พ |
| es-PY-MarioNeural | Male | es-PY | Paraguay ๐ต๐พ |
| es-SV-LorenaNeural | Female | es-SV | El Salvador ๐ธ๐ป |
| es-SV-RodrigoNeural | Male | es-SV | El Salvador ๐ธ๐ป |
| es-US-PalomaNeural | Female | es-US | United States ๐บ๐ธ |
| es-US-AlonsoNeural | Male | es-US | United States ๐บ๐ธ |
| es-UY-ValentinaNeural | Female | es-UY | Uruguay ๐บ๐พ |
| es-UY-MateoNeural | Male | es-UY | Uruguay ๐บ๐พ |
| es-VE-PaolaNeural | Female | es-VE | Venezuela ๐ป๐ช |
| es-VE-SebastianNeural | Male | es-VE | Venezuela ๐ป๐ช |
| et-EE-AnuNeural | Female | et-EE | Estonia ๐ช๐ช |
| et-EE-KertNeural | Male | et-EE | Estonia ๐ช๐ช |
| fa-IR-DilaraNeural | Female | fa-IR | Iran ๐ฎ๐ท |
| fa-IR-FaridNeural | Male | fa-IR | Iran ๐ฎ๐ท |
| fi-FI-NooraNeural | Female | fi-FI | Finland ๐ซ๐ฎ |
| fi-FI-HarriNeural | Male | fi-FI | Finland ๐ซ๐ฎ |
| fil-PH-BlessicaNeural | Female | fil-PH | Philippines ๐ต๐ญ |
| fil-PH-AngeloNeural | Male | fil-PH | Philippines ๐ต๐ญ |
| fr-BE-CharlineNeural | Female | fr-BE | Belgium ๐ง๐ช |
| fr-BE-GerardNeural | Male | fr-BE | Belgium ๐ง๐ช |
| fr-CA-SylvieNeural | Female | fr-CA | Canada ๐จ๐ฆ |
| fr-CA-AntoineNeural | Male | fr-CA | Canada ๐จ๐ฆ |
| fr-CA-JeanNeural | Male | fr-CA | Canada ๐จ๐ฆ |
| fr-CA-ThierryNeural | Male | fr-CA | Canada ๐จ๐ฆ |
| fr-CH-ArianeNeural | Female | fr-CH | Switzerland ๐จ๐ญ |
| fr-CH-FabriceNeural | Male | fr-CH | Switzerland ๐จ๐ญ |
| fr-FR-DeniseNeural | Female | fr-FR | France ๐ซ๐ท |
| fr-FR-EloiseNeural | Female | fr-FR | France ๐ซ๐ท |
| fr-FR-VivienneMultilingualNeural | Female | fr-FR | France ๐ซ๐ท |
| fr-FR-HenriNeural | Male | fr-FR | France ๐ซ๐ท |
| fr-FR-RemyMultilingualNeural | Male | fr-FR | France ๐ซ๐ท |
| ga-IE-OrlaNeural | Female | ga-IE | Ireland ๐ฎ๐ช |
| ga-IE-ColmNeural | Male | ga-IE | Ireland ๐ฎ๐ช |
| gl-ES-SabelaNeural | Female | gl-ES | Spain ๐ช๐ธ |
| gl-ES-RoiNeural | Male | gl-ES | Spain ๐ช๐ธ |
| gu-IN-DhwaniNeural | Female | gu-IN | India ๐ฎ๐ณ |
| gu-IN-NiranjanNeural | Male | gu-IN | India ๐ฎ๐ณ |
| he-IL-HilaNeural | Female | he-IL | Israel ๐ฎ๐ฑ |
| he-IL-AvriNeural | Male | he-IL | Israel ๐ฎ๐ฑ |
| hi-IN-SwaraNeural | Female | hi-IN | India ๐ฎ๐ณ |
| hi-IN-MadhurNeural | Male | hi-IN | India ๐ฎ๐ณ |
| hr-HR-GabrijelaNeural | Female | hr-HR | Croatia ๐ญ๐ท |
| hr-HR-SreckoNeural | Male | hr-HR | Croatia ๐ญ๐ท |
| hu-HU-NoemiNeural | Female | hu-HU | Hungary ๐ญ๐บ |
| hu-HU-TamasNeural | Male | hu-HU | Hungary ๐ญ๐บ |
| id-ID-GadisNeural | Female | id-ID | Indonesia ๐ฎ๐ฉ |
| id-ID-ArdiNeural | Male | id-ID | Indonesia ๐ฎ๐ฉ |
| is-IS-GudrunNeural | Female | is-IS | Iceland ๐ฎ๐ธ |
| is-IS-GunnarNeural | Male | is-IS | Iceland ๐ฎ๐ธ |
| it-IT-ElsaNeural | Female | it-IT | Italy ๐ฎ๐น |
| it-IT-IsabellaNeural | Female | it-IT | Italy ๐ฎ๐น |
| it-IT-DiegoNeural | Male | it-IT | Italy ๐ฎ๐น |
| it-IT-GiuseppeMultilingualNeural | Male | it-IT | Italy ๐ฎ๐น |
| iu-Cans-CA-SiqiniqNeural | Female | iu-Cans-CA | Inuktitut (Syllabics, Canada) |
| iu-Cans-CA-TaqqiqNeural | Male | iu-Cans-CA | Inuktitut (Syllabics, Canada) |
| iu-Latn-CA-SiqiniqNeural | Female | iu-Latn-CA | Inuktitut (Latin, Canada) |
| iu-Latn-CA-TaqqiqNeural | Male | iu-Latn-CA | Inuktitut (Latin, Canada) |
| ja-JP-NanamiNeural | Female | ja-JP | Japan ๐ฏ๐ต |
| ja-JP-KeitaNeural | Male | ja-JP | Japan ๐ฏ๐ต |
| jv-ID-SitiNeural | Female | jv-ID | Indonesia ๐ฎ๐ฉ |
| jv-ID-DimasNeural | Male | jv-ID | Indonesia ๐ฎ๐ฉ |
| ka-GE-EkaNeural | Female | ka-GE | Georgia ๐ฌ๐ช |
| ka-GE-GiorgiNeural | Male | ka-GE | Georgia ๐ฌ๐ช |
| kk-KZ-AigulNeural | Female | kk-KZ | Kazakhstan ๐ฐ๐ฟ |
| kk-KZ-DauletNeural | Male | kk-KZ | Kazakhstan ๐ฐ๐ฟ |
| km-KH-SreymomNeural | Female | km-KH | Cambodia ๐ฐ๐ญ |
| km-KH-PisethNeural | Male | km-KH | Cambodia ๐ฐ๐ญ |
| kn-IN-SapnaNeural | Female | kn-IN | India ๐ฎ๐ณ |
| kn-IN-GaganNeural | Male | kn-IN | India ๐ฎ๐ณ |
| ko-KR-SunHiNeural | Female | ko-KR | South Korea ๐ฐ๐ท |
| ko-KR-HyunsuMultilingualNeural | Male | ko-KR | South Korea ๐ฐ๐ท |
| ko-KR-InJoonNeural | Male | ko-KR | South Korea ๐ฐ๐ท |
| lo-LA-KeomanyNeural | Female | lo-LA | Laos ๐ฑ๐ฆ |
| lo-LA-ChanthavongNeural | Male | lo-LA | Laos ๐ฑ๐ฆ |
| lt-LT-OnaNeural | Female | lt-LT | Lithuania ๐ฑ๐น |
| lt-LT-LeonasNeural | Male | lt-LT | Lithuania ๐ฑ๐น |
| lv-LV-EveritaNeural | Female | lv-LV | Latvia ๐ฑ๐ป |
| lv-LV-NilsNeural | Male | lv-LV | Latvia ๐ฑ๐ป |
| mk-MK-MarijaNeural | Female | mk-MK | North Macedonia ๐ฒ๐ฐ |
| mk-MK-AleksandarNeural | Male | mk-MK | North Macedonia ๐ฒ๐ฐ |
| ml-IN-SobhanaNeural | Female | ml-IN | India ๐ฎ๐ณ |
| ml-IN-MidhunNeural | Male | ml-IN | India ๐ฎ๐ณ |
| mn-MN-YesuiNeural | Female | mn-MN | Mongolia ๐ฒ๐ณ |
| mn-MN-BataaNeural | Male | mn-MN | Mongolia ๐ฒ๐ณ |
| mr-IN-AarohiNeural | Female | mr-IN | India ๐ฎ๐ณ |
| mr-IN-ManoharNeural | Male | mr-IN | India ๐ฎ๐ณ |
| ms-MY-YasminNeural | Female | ms-MY | Malaysia ๐ฒ๐พ |
| ms-MY-OsmanNeural | Male | ms-MY | Malaysia ๐ฒ๐พ |
| mt-MT-GraceNeural | Female | mt-MT | Malta ๐ฒ๐น |
| mt-MT-JosephNeural | Male | mt-MT | Malta ๐ฒ๐น |
| my-MM-NilarNeural | Female | my-MM | Myanmar ๐ฒ๐ฒ |
| my-MM-ThihaNeural | Male | my-MM | Myanmar ๐ฒ๐ฒ |
| nb-NO-PernilleNeural | Female | nb-NO | Norway ๐ณ๐ด |
| nb-NO-FinnNeural | Male | nb-NO | Norway ๐ณ๐ด |
| ne-NP-HemkalaNeural | Female | ne-NP | Nepal ๐ณ๐ต |
| ne-NP-SagarNeural | Male | ne-NP | Nepal ๐ณ๐ต |
| nl-BE-DenaNeural | Female | nl-BE | Belgium ๐ง๐ช |
| nl-BE-ArnaudNeural | Male | nl-BE | Belgium ๐ง๐ช |
| nl-NL-ColetteNeural | Female | nl-NL | Netherlands ๐ณ๐ฑ |
| nl-NL-FennaNeural | Female | nl-NL | Netherlands ๐ณ๐ฑ |
| nl-NL-MaartenNeural | Male | nl-NL | Netherlands ๐ณ๐ฑ |
| pl-PL-ZofiaNeural | Female | pl-PL | Poland ๐ต๐ฑ |
| pl-PL-MarekNeural | Male | pl-PL | Poland ๐ต๐ฑ |
| ps-AF-LatifaNeural | Female | ps-AF | Afghanistan ๐ฆ๐ซ |
| ps-AF-GulNawazNeural | Male | ps-AF | Afghanistan ๐ฆ๐ซ |
| pt-BR-FranciscaNeural | Female | pt-BR | Brazil ๐ง๐ท |
| pt-BR-ThalitaMultilingualNeural | Female | pt-BR | Brazil ๐ง๐ท |
| pt-BR-AntonioNeural | Male | pt-BR | Brazil ๐ง๐ท |
| pt-PT-RaquelNeural | Female | pt-PT | Portugal ๐ต๐น |
| pt-PT-DuarteNeural | Male | pt-PT | Portugal ๐ต๐น |
| ro-RO-AlinaNeural | Female | ro-RO | Romania ๐ท๐ด |
| ro-RO-EmilNeural | Male | ro-RO | Romania ๐ท๐ด |
| ru-RU-SvetlanaNeural | Female | ru-RU | Russia ๐ท๐บ |
| ru-RU-DmitryNeural | Male | ru-RU | Russia ๐ท๐บ |
| si-LK-ThiliniNeural | Female | si-LK | Sri Lanka ๐ฑ๐ฐ |
| si-LK-SameeraNeural | Male | si-LK | Sri Lanka ๐ฑ๐ฐ |
| sk-SK-ViktoriaNeural | Female | sk-SK | Slovakia ๐ธ๐ฐ |
| sk-SK-LukasNeural | Male | sk-SK | Slovakia ๐ธ๐ฐ |
| sl-SI-PetraNeural | Female | sl-SI | Slovenia ๐ธ๐ฎ |
| sl-SI-RokNeural | Male | sl-SI | Slovenia ๐ธ๐ฎ |
| so-SO-UbaxNeural | Female | so-SO | Somalia ๐ธ๐ด |
| so-SO-MuuseNeural | Male | so-SO | Somalia ๐ธ๐ด |
| sq-AL-AnilaNeural | Female | sq-AL | Albania ๐ฆ๐ฑ |
| sq-AL-IlirNeural | Male | sq-AL | Albania ๐ฆ๐ฑ |
| sr-RS-SophieNeural | Female | sr-RS | Serbia ๐ท๐ธ |
| sr-RS-NicholasNeural | Male | sr-RS | Serbia ๐ท๐ธ |
| su-ID-TutiNeural | Female | su-ID | Indonesia ๐ฎ๐ฉ |
| su-ID-JajangNeural | Male | su-ID | Indonesia ๐ฎ๐ฉ |
| sv-SE-SofieNeural | Female | sv-SE | Sweden ๐ธ๐ช |
| sv-SE-MattiasNeural | Male | sv-SE | Sweden ๐ธ๐ช |
| sw-KE-ZuriNeural | Female | sw-KE | Kenya ๐ฐ๐ช |
| sw-KE-RafikiNeural | Male | sw-KE | Kenya ๐ฐ๐ช |
| sw-TZ-RehemaNeural | Female | sw-TZ | Tanzania ๐น๐ฟ |
| sw-TZ-DaudiNeural | Male | sw-TZ | Tanzania ๐น๐ฟ |
| ta-IN-PallaviNeural | Female | ta-IN | India ๐ฎ๐ณ |
| ta-IN-ValluvarNeural | Male | ta-IN | India ๐ฎ๐ณ |
| ta-LK-SaranyaNeural | Female | ta-LK | Sri Lanka ๐ฑ๐ฐ |
| ta-LK-KumarNeural | Male | ta-LK | Sri Lanka ๐ฑ๐ฐ |
| ta-MY-KaniNeural | Female | ta-MY | Malaysia ๐ฒ๐พ |
| ta-MY-SuryaNeural | Male | ta-MY | Malaysia ๐ฒ๐พ |
| ta-SG-VenbaNeural | Female | ta-SG | Singapore ๐ธ๐ฌ |
| ta-SG-AnbuNeural | Male | ta-SG | Singapore ๐ธ๐ฌ |
| te-IN-ShrutiNeural | Female | te-IN | India ๐ฎ๐ณ |
| te-IN-MohanNeural | Male | te-IN | India ๐ฎ๐ณ |
| th-TH-PremwadeeNeural | Female | th-TH | Thailand ๐น๐ญ |
| th-TH-NiwatNeural | Male | th-TH | Thailand ๐น๐ญ |
| tr-TR-EmelNeural | Female | tr-TR | Turkey ๐น๐ท |
| tr-TR-AhmetNeural | Male | tr-TR | Turkey ๐น๐ท |
| uk-UA-PolinaNeural | Female | uk-UA | Ukraine ๐บ๐ฆ |
| uk-UA-OstapNeural | Male | uk-UA | Ukraine ๐บ๐ฆ |
| ur-IN-GulNeural | Female | ur-IN | India ๐ฎ๐ณ |
| ur-IN-SalmanNeural | Male | ur-IN | India ๐ฎ๐ณ |
| ur-PK-UzmaNeural | Female | ur-PK | Pakistan ๐ต๐ฐ |
| ur-PK-AsadNeural | Male | ur-PK | Pakistan ๐ต๐ฐ |
| uz-UZ-MadinaNeural | Female | uz-UZ | Uzbekistan ๐บ๐ฟ |
| uz-UZ-SardorNeural | Male | uz-UZ | Uzbekistan ๐บ๐ฟ |
| vi-VN-HoaiMyNeural | Female | vi-VN | Vietnam ๐ป๐ณ |
| vi-VN-NamMinhNeural | Male | vi-VN | Vietnam ๐ป๐ณ |
| zh-CN-XiaoxiaoNeural | Female | zh-CN | China ๐จ๐ณ |
| zh-CN-XiaoyiNeural | Female | zh-CN | China ๐จ๐ณ |
| zh-CN-YunjianNeural | Male | zh-CN | China ๐จ๐ณ |
| zh-CN-YunxiNeural | Male | zh-CN | China ๐จ๐ณ |
| zh-CN-YunxiaNeural | Male | zh-CN | China ๐จ๐ณ |
| zh-CN-YunyangNeural | Male | zh-CN | China ๐จ๐ณ |
| zh-CN-liaoning-XiaobeiNeural | Female | zh-CN-liaoning | China ๐จ๐ณ |
| zh-CN-shaanxi-XiaoniNeural | Female | zh-CN-shaanxi | China ๐จ๐ณ |
| zh-HK-HiuGaaiNeural | Female | zh-HK | Hong Kong ๐ญ๐ฐ |
| zh-HK-HiuMaanNeural | Female | zh-HK | Hong Kong ๐ญ๐ฐ |
| zh-HK-WanLungNeural | Male | zh-HK | Hong Kong ๐ญ๐ฐ |
| zh-TW-HsiaoChenNeural | Female | zh-TW | Taiwan ๐น๐ผ |
| zh-TW-HsiaoYuNeural | Female | zh-TW | Taiwan ๐น๐ผ |
| zh-TW-YunJheNeural | Male | zh-TW | Taiwan ๐น๐ผ |
| zu-ZA-ThandoNeural | Female | zu-ZA | South Africa ๐ฟ๐ฆ |
| zu-ZA-ThembaNeural | Male | zu-ZA | South Africa ๐ฟ๐ฆ |
- Video-as-Code: Keep your internal documentation and helpdesk videos in version control.
- Perfectly Timed: Automatically calculates the exact duration of the generated Text-to-Speech (TTS) audio and perfectly syncs, loops, or pads your visual media to match.
- Iterative Screen Recording: Automatically exports individual
.mp4files for every slide. This allows you to listen to the generated audio for a specific step and record a screen capture that perfectly matches that exact timing. - AI-Friendly: The input format is a strict JSON array, making it incredibly easy for LLMs and AI agents to generate instructional videos automatically.
- Dual TTS Engines: Use
edge-ttsfor quick, zero-setup cloud generation, or default tokokorofor complete offline privacy and commercial-friendly open-source narration.
- Python 3.8+
- FFmpeg: Must be installed and accessible in your system's PATH.
- Ubuntu/Debian:
sudo apt install ffmpeg - macOS:
brew install ffmpeg - Windows:
winget install ffmpeg
- Ubuntu/Debian:
Clone the repository and install the required Python packages:
git clone https://github.com/yourusername/script-to-demo-video.git
cd script-to-demo-video
python -m venv venv
source venv/bin/activate # On Windows use: venv\Scripts\activate
pip install edge-tts pydub kokoro soundfile(Note: The first time you run the tool using the Kokoro engine, it will automatically download the 82M parameter model weights (~300MB) to your machine.)
Create a JSON file (e.g., demo.json) containing your script and media paths. Then, run the following command:
# Default: Uses Kokoro (local/private)
python script_to_demo_video.py demo.json
# Alternative: Uses edge-tts (cloud)
python script_to_demo_video.py demo.json --engine edgeWe recommend Kooha for screen recording or OBS Studio for professionals.
flatpak install flathub io.github.seadve.Kooha
flatpak run io.github.seadve.KoohaThe script expects a JSON array of objects. Each object represents one "slide" or "section" of your video.
[
{
"text": "Welcome to the IT Helpdesk tutorial on using BrainFrame AI. [PAUSE 1.5] Let's begin.",
"media": "assets/intro_slide.png"
},
{
"text": "[PAUSE 2.0] First, open the BrainFrame Webclient by typing the server's IP address into your browser's address bar. Press Enter. [PAUSE]",
"media": "assets/login_step.mp4",
"mix_audio": true,
"media_volume": 0.25
}
]text: The exact words the TTS engine will speak. (Note: You can insert inline tags like[PAUSE 2.0]directly into the text to force the TTS engine to pause mid-sentence or add trailing silence at the end).media: The path to your visual asset (relative to the JSON file). Supports images (.png,.jpg) and video clips (.mp4,.mov,.avi,.mkv).mix_audio: (Optional) Boolean (true/false). Set to true to keep the original audio from your video media file and mix it underneath the TTS narration.media_volume: (Optional) Float. When mix_audio is enabled, this sets the volume level of the background media (e.g., 0.25 for 25% volume).- (Legacy support: You can also use the key
imageinstead of "media").
Note on duration and chapter keys: You do not need to provide timing & chapter number! The tool will calculate the required duration and chapter number based on the generated audio and automatically update your JSON file to append a duration and chapter keys for your reference.
This tool is designed to make recording complex screencasts easy by breaking them down into manageable, pre-timed chunks.
- Capture Screenshots: Take screenshots of every screen or slide in your demo. These act as visual placeholders and help guide your script.
- Draft the Script: Enter your script and the corresponding screenshot filenames into your JSON file in presentation order.
- Compile the Draft: Run the tool to generate the video and audio.
- Review the Output: Locate the newly created [output_name]_slides folder, which contains an individual .mp4 for each section.
- Record the Final Screen: Play the generated slides (e.g., slide_02.mp4) to listen to the TTS audio. Use a screen recorder to capture your actual screen, matching your actions to the audio's pacing.
- Update and Re-compile: Update the JSON with your new video recording and run the compilation script once more to finalize the video.
You can customize the voice, volume, and output behavior using CLI flags.
| Argument | Description | Default |
|---|---|---|
script_file |
Path to the input JSON file. | Required |
output_video |
Path to save the final stitched video. (Defaults to script filename with .mp4) | Optional |
--engine |
Choose the TTS engine: edge (cloud/fast) or kokoro (local/private). |
edge |
--voice |
Exact voice name to use (e.g., en-US-AriaNeural for edge, am_fenrir for kokoro). |
None |
--gender |
Target gender if searching for a voice automatically (Edge only). | male |
--lang |
Target locale if searching for a voice automatically (e.g., en-GB, es-MX) (Edge only). |
en-US |
--volume |
Volume adjustment for the TTS output. Use percentages (Edge only). | +0% |
--captions |
Enables automatic subtitle generation and overlays them on the video. | False |
--font-size |
Sets the font size for the video captions (requires --captions). |
24 |
--font-color |
Sets the text color for the captions (e.g., white, yellow, #FFFFFF). |
white |
--list-voices |
Prints a formatted list of all available TTS voices for the Edge engine and exits. | None |
--verbose |
Shows raw standard error output from FFmpeg for debugging. | False |
To see all available voices, run:
python script_to_demo_video.py --list-voices
Once you find a voice you like, use the ShortName with the --voice flag:
python script_to_demo_video.py demo.json --voice en-GB-RyanNeural
Kokoro uses specific pre-trained voice files. By default, the script falls back to am_fenrir (a high-quality American female voice). Some other popular Kokoro voices include:
- Female:
af_heart,af_alloy,af_bella - Male:
am_fenrir,am_michael,am_puck
python script_to_demo_video.py demo.json --engine kokoro --voice am_fenrir
If you are an AI assistant generating a payload for this tool:
- Always format the output as a strict JSON array.
- Ensure the text field uses natural punctuation, as the TTS engine relies on commas and periods for proper pacing and breath pauses.
- Use the media key for all file references.
- Do not hallucinate the duration key; allow the Python execution environment to append it automatically.