Ultimate Text To Speech Converter

This program uses a multiple column .csv file to create .mp3 audio files, row by row, alternating voices.

Usage

Ever wanted to create a conversational style of audio file? This script allows you to do that. The script alternates voice selection by column, so by setting different voices you can create the illusion of a conversation!

Prerequisites

You will need to install the “edge TTS” and “pydub” libraries.

pip install edge-tts
pip install pydub

How to use it

  1. Save the script below in the folder of your choice
  2. Rename the file you want to convert to audio as “input.csv” and save it in the same folder as the script. Each row will be converted to a separate audio file.
  3. Run the script
  4. The audio files are saved in the “output” folder
import asyncio
import edge_tts
import csv
import os
import subprocess

async def process_text(text, voice, output_filename):
    try:
        communicate = edge_tts.Communicate(text, voice)
        await communicate.save(output_filename)
    except RuntimeError as e:
        print(e)

async def main():
    # Read CSV
    with open('input.csv', 'r') as csv_file:
        csv_reader = csv.reader(csv_file)
        rows = list(csv_reader)

    voices = ["en-GB-SoniaNeural", "en-GB-ThomasNeural"]
    output_folder = "output"

    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for i, row in enumerate(rows, start=1):
        concatenated_audio = []

        for j, cell_text in enumerate(row):
            if cell_text.strip():
                voice = voices[j % len(voices)]
                output_filename = os.path.join(output_folder, f"{i}_{j}.mp3")
                
                try:
                    await process_text(cell_text, voice, output_filename)
                    concatenated_audio.append(output_filename)
                except RuntimeError as e:
                    print(e)

            await asyncio.sleep(0.1)  # Small gap between elements

        if concatenated_audio:
            combined_filename = os.path.join(output_folder, f"{i}.mp3")
            
            # Concatenate audio using ffmpeg
            concat_command = [
                "ffmpeg",
                "-i",
                f"concat:{'|'.join(concatenated_audio)}",
                "-c",
                "copy",
                combined_filename
            ]
            subprocess.run(concat_command, check=True)
            
            # Delete individual element audio files
            for audio_file in concatenated_audio:
                os.remove(audio_file)

    print("Finished")

loop = asyncio.new_event_loop()
loop.run_until_complete(main())
loop.close()

This script uses “Sonia” and “Thomas”, UK accented voices. At the end of this post I provide the complete list of Edge TTS voices: just replace “en-GB-SoniaNeural” and “en-GB-ThomasNeural” with your preferred voices.

Edge TTS Voices

How to read the voice labels:
EXAMPLE: en-IN-NeerjaNeural, Gender: Female
en – means the voice speaks English
IN – means the accent is Indian

Name: af-ZA-AdriNeural, Gender: FemaleName: af-ZA-WillemNeural, Gender: Male
Name: am-ET-AmehaNeural, Gender: MaleName: am-ET-MekdesNeural, Gender: Female
Name: ar-AE-FatimaNeural, Gender: FemaleName: ar-AE-HamdanNeural, Gender: Male
Name: ar-BH-AliNeural, Gender: MaleName: ar-BH-LailaNeural, Gender: Female
Name: ar-DZ-AminaNeural, Gender: FemaleName: ar-DZ-IsmaelNeural, Gender: Male
Name: ar-EG-SalmaNeural, Gender: FemaleName: ar-EG-ShakirNeural, Gender: Male
Name: ar-IQ-BasselNeural, Gender: MaleName: ar-IQ-RanaNeural, Gender: Female
Name: ar-JO-SanaNeural, Gender: FemaleName: ar-JO-TaimNeural, Gender: Male
Name: ar-KW-FahedNeural, Gender: MaleName: ar-KW-NouraNeural, Gender: Female
Name: ar-LB-LaylaNeural, Gender: FemaleName: ar-LB-RamiNeural, Gender: Male
Name: ar-LY-ImanNeural, Gender: FemaleName: ar-LY-OmarNeural, Gender: Male
Name: ar-MA-JamalNeural, Gender: MaleName: ar-MA-MounaNeural, Gender: Female
Name: ar-OM-AbdullahNeural, Gender: MaleName: ar-OM-AyshaNeural, Gender: Female
Name: ar-QA-AmalNeural, Gender: FemaleName: ar-QA-MoazNeural, Gender: Male
Name: ar-SA-HamedNeural, Gender: MaleName: ar-SA-ZariyahNeural, Gender: Female
Name: ar-SY-AmanyNeural, Gender: FemaleName: ar-SY-LaithNeural, Gender: Male
Name: ar-TN-HediNeural, Gender: MaleName: ar-TN-ReemNeural, Gender: Female
Name: ar-YE-MaryamNeural, Gender: FemaleName: ar-YE-SalehNeural, Gender: Male
Name: az-AZ-BabekNeural, Gender: MaleName: az-AZ-BanuNeural, Gender: Female
Name: bg-BG-BorislavNeural, Gender: MaleName: bg-BG-KalinaNeural, Gender: Female
Name: bn-BD-NabanitaNeural, Gender: FemaleName: bn-BD-PradeepNeural, Gender: Male
Name: bn-IN-BashkarNeural, Gender: MaleName: bn-IN-TanishaaNeural, Gender: Female
Name: bs-BA-GoranNeural, Gender: MaleName: bs-BA-VesnaNeural, Gender: Female
Name: ca-ES-EnricNeural, Gender: MaleName: ca-ES-JoanaNeural, Gender: Female
Name: cs-CZ-AntoninNeural, Gender: MaleName: cs-CZ-VlastaNeural, Gender: Female
Name: cy-GB-AledNeural, Gender: MaleName: cy-GB-NiaNeural, Gender: Female
Name: da-DK-ChristelNeural, Gender: FemaleName: da-DK-JeppeNeural, Gender: Male
Name: de-AT-IngridNeural, Gender: FemaleName: de-AT-JonasNeural, Gender: Male
Name: de-CH-JanNeural, Gender: MaleName: de-CH-LeniNeural, Gender: Female
Name: de-DE-AmalaNeural, Gender: FemaleName: de-DE-ConradNeural, Gender: Male
Name: de-DE-KatjaNeural, Gender: FemaleName: de-DE-KillianNeural, Gender: Male
Name: el-GR-AthinaNeural, Gender: FemaleName: el-GR-NestorasNeural, Gender: Male
Name: en-AU-NatashaNeural, Gender: FemaleName: en-AU-WilliamNeural, Gender: Male
Name: en-CA-ClaraNeural, Gender: FemaleName: en-CA-LiamNeural, Gender: Male
Name: en-GB-LibbyNeural, Gender: FemaleName: en-GB-MaisieNeural, Gender: Female
Name: en-GB-RyanNeural, Gender: MaleName: en-GB-SoniaNeural, Gender: Female
Name: en-GB-ThomasNeural, Gender: MaleName: en-HK-SamNeural, Gender: Male
Name: en-HK-YanNeural, Gender: FemaleName: en-IE-ConnorNeural, Gender: Male
Name: en-IE-EmilyNeural, Gender: FemaleName: en-IN-NeerjaExpressiveNeural, Gender: Female
Name: en-IN-NeerjaNeural, Gender: FemaleName: en-IN-PrabhatNeural, Gender: Male
Name: en-KE-AsiliaNeural, Gender: FemaleName: en-KE-ChilembaNeural, Gender: Male
Name: en-NG-AbeoNeural, Gender: MaleName: en-NG-EzinneNeural, Gender: Female
Name: en-NZ-MitchellNeural, Gender: MaleName: en-NZ-MollyNeural, Gender: Female
Name: en-PH-JamesNeural, Gender: MaleName: en-PH-RosaNeural, Gender: Female
Name: en-SG-LunaNeural, Gender: FemaleName: en-SG-WayneNeural, Gender: Male
Name: en-TZ-ElimuNeural, Gender: MaleName: en-TZ-ImaniNeural, Gender: Female
Name: en-US-AnaNeural, Gender: FemaleName: en-US-AriaNeural, Gender: Female
Name: en-US-ChristopherNeural, Gender: MaleName: en-US-EricNeural, Gender: Male
Name: en-US-GuyNeural, Gender: MaleName: en-US-JennyNeural, Gender: Female
Name: en-US-MichelleNeural, Gender: FemaleName: en-US-RogerNeural, Gender: Male
Name: en-US-SteffanNeural, Gender: MaleName: en-ZA-LeahNeural, Gender: Female
Name: en-ZA-LukeNeural, Gender: MaleName: es-AR-ElenaNeural, Gender: Female
Name: es-AR-TomasNeural, Gender: MaleName: es-BO-MarceloNeural, Gender: Male
Name: es-BO-SofiaNeural, Gender: FemaleName: es-CL-CatalinaNeural, Gender: Female
Name: es-CL-LorenzoNeural, Gender: MaleName: es-CO-GonzaloNeural, Gender: Male
Name: es-CO-SalomeNeural, Gender: FemaleName: es-CR-JuanNeural, Gender: Male
Name: es-CR-MariaNeural, Gender: FemaleName: es-CU-BelkysNeural, Gender: Female
Name: es-CU-ManuelNeural, Gender: MaleName: es-DO-EmilioNeural, Gender: Male
Name: es-DO-RamonaNeural, Gender: FemaleName: es-EC-AndreaNeural, Gender: Female
Name: es-EC-LuisNeural, Gender: MaleName: es-ES-AlvaroNeural, Gender: Male
Name: es-ES-ElviraNeural, Gender: FemaleName: es-GQ-JavierNeural, Gender: Male
Name: es-GQ-TeresaNeural, Gender: FemaleName: es-GT-AndresNeural, Gender: Male
Name: es-GT-MartaNeural, Gender: FemaleName: es-HN-CarlosNeural, Gender: Male
Name: es-HN-KarlaNeural, Gender: FemaleName: es-MX-DaliaNeural, Gender: Female
Name: es-MX-JorgeNeural, Gender: MaleName: es-NI-FedericoNeural, Gender: Male
Name: es-NI-YolandaNeural, Gender: FemaleName: es-PA-MargaritaNeural, Gender: Female
Name: es-PA-RobertoNeural, Gender: MaleName: es-PE-AlexNeural, Gender: Male
Name: es-PE-CamilaNeural, Gender: FemaleName: es-PR-KarinaNeural, Gender: Female
Name: es-PR-VictorNeural, Gender: MaleName: es-PY-MarioNeural, Gender: Male
Name: es-PY-TaniaNeural, Gender: FemaleName: es-SV-LorenaNeural, Gender: Female
Name: es-SV-RodrigoNeural, Gender: MaleName: es-US-AlonsoNeural, Gender: Male
Name: es-US-PalomaNeural, Gender: FemaleName: es-UY-MateoNeural, Gender: Male
Name: es-UY-ValentinaNeural, Gender: FemaleName: es-VE-PaolaNeural, Gender: Female
Name: es-VE-SebastianNeural, Gender: MaleName: et-EE-AnuNeural, Gender: Female
Name: et-EE-KertNeural, Gender: MaleName: fa-IR-DilaraNeural, Gender: Female
Name: fa-IR-FaridNeural, Gender: MaleName: fi-FI-HarriNeural, Gender: Male
Name: fi-FI-NooraNeural, Gender: FemaleName: fil-PH-AngeloNeural, Gender: Male
Name: fil-PH-BlessicaNeural, Gender: FemaleName: fr-BE-CharlineNeural, Gender: Female
Name: fr-BE-GerardNeural, Gender: MaleName: fr-CA-AntoineNeural, Gender: Male
Name: fr-CA-JeanNeural, Gender: MaleName: fr-CA-SylvieNeural, Gender: Female
Name: fr-CH-ArianeNeural, Gender: FemaleName: fr-CH-FabriceNeural, Gender: Male
Name: fr-FR-DeniseNeural, Gender: FemaleName: fr-FR-EloiseNeural, Gender: Female
Name: fr-FR-HenriNeural, Gender: MaleName: ga-IE-ColmNeural, Gender: Male
Name: ga-IE-OrlaNeural, Gender: FemaleName: gl-ES-RoiNeural, Gender: Male
Name: gl-ES-SabelaNeural, Gender: FemaleName: gu-IN-DhwaniNeural, Gender: Female
Name: gu-IN-NiranjanNeural, Gender: MaleName: he-IL-AvriNeural, Gender: Male
Name: he-IL-HilaNeural, Gender: FemaleName: hi-IN-MadhurNeural, Gender: Male
Name: hi-IN-SwaraNeural, Gender: FemaleName: hr-HR-GabrijelaNeural, Gender: Female
Name: hr-HR-SreckoNeural, Gender: MaleName: hu-HU-NoemiNeural, Gender: Female
Name: hu-HU-TamasNeural, Gender: MaleName: id-ID-ArdiNeural, Gender: Male
Name: id-ID-GadisNeural, Gender: FemaleName: is-IS-GudrunNeural, Gender: Female
Name: is-IS-GunnarNeural, Gender: MaleName: it-IT-DiegoNeural, Gender: Male
Name: it-IT-ElsaNeural, Gender: FemaleName: it-IT-IsabellaNeural, Gender: Female
Name: ja-JP-KeitaNeural, Gender: MaleName: ja-JP-NanamiNeural, Gender: Female
Name: jv-ID-DimasNeural, Gender: MaleName: jv-ID-SitiNeural, Gender: Female
Name: ka-GE-EkaNeural, Gender: FemaleName: ka-GE-GiorgiNeural, Gender: Male
Name: kk-KZ-AigulNeural, Gender: FemaleName: kk-KZ-DauletNeural, Gender: Male
Name: km-KH-PisethNeural, Gender: MaleName: km-KH-SreymomNeural, Gender: Female
Name: kn-IN-GaganNeural, Gender: MaleName: kn-IN-SapnaNeural, Gender: Female
Name: ko-KR-InJoonNeural, Gender: MaleName: ko-KR-SunHiNeural, Gender: Female
Name: lo-LA-ChanthavongNeural, Gender: MaleName: lo-LA-KeomanyNeural, Gender: Female
Name: lt-LT-LeonasNeural, Gender: MaleName: lt-LT-OnaNeural, Gender: Female
Name: lv-LV-EveritaNeural, Gender: FemaleName: lv-LV-NilsNeural, Gender: Male
Name: mk-MK-AleksandarNeural, Gender: MaleName: mk-MK-MarijaNeural, Gender: Female
Name: ml-IN-MidhunNeural, Gender: MaleName: ml-IN-SobhanaNeural, Gender: Female
Name: mn-MN-BataaNeural, Gender: MaleName: mn-MN-YesuiNeural, Gender: Female
Name: mr-IN-AarohiNeural, Gender: FemaleName: mr-IN-ManoharNeural, Gender: Male
Name: ms-MY-OsmanNeural, Gender: MaleName: ms-MY-YasminNeural, Gender: Female
Name: mt-MT-GraceNeural, Gender: FemaleName: mt-MT-JosephNeural, Gender: Male
Name: my-MM-NilarNeural, Gender: FemaleName: my-MM-ThihaNeural, Gender: Male
Name: nb-NO-FinnNeural, Gender: MaleName: nb-NO-PernilleNeural, Gender: Female
Name: ne-NP-HemkalaNeural, Gender: FemaleName: ne-NP-SagarNeural, Gender: Male
Name: nl-BE-ArnaudNeural, Gender: MaleName: nl-BE-DenaNeural, Gender: Female
Name: nl-NL-ColetteNeural, Gender: FemaleName: nl-NL-FennaNeural, Gender: Female
Name: nl-NL-MaartenNeural, Gender: MaleName: pl-PL-MarekNeural, Gender: Male
Name: pl-PL-ZofiaNeural, Gender: FemaleName: ps-AF-GulNawazNeural, Gender: Male
Name: ps-AF-LatifaNeural, Gender: FemaleName: pt-BR-AntonioNeural, Gender: Male
Name: pt-BR-FranciscaNeural, Gender: FemaleName: pt-PT-DuarteNeural, Gender: Male
Name: pt-PT-RaquelNeural, Gender: FemaleName: ro-RO-AlinaNeural, Gender: Female
Name: ro-RO-EmilNeural, Gender: MaleName: ru-RU-DmitryNeural, Gender: Male
Name: ru-RU-SvetlanaNeural, Gender: FemaleName: si-LK-SameeraNeural, Gender: Male
Name: si-LK-ThiliniNeural, Gender: FemaleName: sk-SK-LukasNeural, Gender: Male
Name: sk-SK-ViktoriaNeural, Gender: FemaleName: sl-SI-PetraNeural, Gender: Female
Name: sl-SI-RokNeural, Gender: MaleName: so-SO-MuuseNeural, Gender: Male
Name: so-SO-UbaxNeural, Gender: FemaleName: sq-AL-AnilaNeural, Gender: Female
Name: sq-AL-IlirNeural, Gender: MaleName: sr-RS-NicholasNeural, Gender: Male
Name: sr-RS-SophieNeural, Gender: FemaleName: su-ID-JajangNeural, Gender: Male
Name: su-ID-TutiNeural, Gender: FemaleName: sv-SE-MattiasNeural, Gender: Male
Name: sv-SE-SofieNeural, Gender: FemaleName: sw-KE-RafikiNeural, Gender: Male
Name: sw-KE-ZuriNeural, Gender: FemaleName: sw-TZ-DaudiNeural, Gender: Male
Name: sw-TZ-RehemaNeural, Gender: FemaleName: ta-IN-PallaviNeural, Gender: Female
Name: ta-IN-ValluvarNeural, Gender: MaleName: ta-LK-KumarNeural, Gender: Male
Name: ta-LK-SaranyaNeural, Gender: FemaleName: ta-MY-KaniNeural, Gender: Female
Name: ta-MY-SuryaNeural, Gender: MaleName: ta-SG-AnbuNeural, Gender: Male
Name: ta-SG-VenbaNeural, Gender: FemaleName: te-IN-MohanNeural, Gender: Male
Name: te-IN-ShrutiNeural, Gender: FemaleName: th-TH-NiwatNeural, Gender: Male
Name: th-TH-PremwadeeNeural, Gender: FemaleName: tr-TR-AhmetNeural, Gender: Male
Name: tr-TR-EmelNeural, Gender: FemaleName: uk-UA-OstapNeural, Gender: Male
Name: uk-UA-PolinaNeural, Gender: FemaleName: ur-IN-GulNeural, Gender: Female
Name: ur-IN-SalmanNeural, Gender: MaleName: ur-PK-AsadNeural, Gender: Male
Name: ur-PK-UzmaNeural, Gender: FemaleName: uz-UZ-MadinaNeural, Gender: Female
Name: uz-UZ-SardorNeural, Gender: MaleName: vi-VN-HoaiMyNeural, Gender: Female
Name: vi-VN-NamMinhNeural, Gender: MaleName: zh-CN-XiaoxiaoNeural, Gender: Female
Name: zh-CN-XiaoyiNeural, Gender: FemaleName: zh-CN-YunjianNeural, Gender: Male
Name: zh-CN-YunxiNeural, Gender: MaleName: zh-CN-YunxiaNeural, Gender: Male
Name: zh-CN-YunyangNeural, Gender: MaleName: zh-CN-liaoning-XiaobeiNeural, Gender: Female
Name: zh-CN-shaanxi-XiaoniNeural, Gender: FemaleName: zh-HK-HiuGaaiNeural, Gender: Female
Name: zh-HK-HiuMaanNeural, Gender: FemaleName: zh-HK-WanLungNeural, Gender: Male
Name: zh-TW-HsiaoChenNeural, Gender: FemaleName: zh-TW-HsiaoYuNeural, Gender: Female
Name: zh-TW-YunJheNeural, Gender: MaleName: zu-ZA-ThandoNeural, Gender: Female
Name: zu-ZA-ThembaNeural, Gender: Male,