{ "cells": [ { "cell_type": "markdown", "id": "b94f103d-ac43-4d13-83cb-eb5090220881", "metadata": {}, "source": [ "# EdgeTTS\n", "\n", "https://github.com/rany2/edge-tts\n", "\n", "edge-tts is a Python module that allows you to use Microsoft Edge's online text-to-speech service from within your Python code or using the provided edge-tts or edge-playback command." ] }, { "cell_type": "code", "execution_count": 2, "id": "77deb08f-fec3-4327-b2f9-1c893aacaddc", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: edge-tts in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (6.1.10)\n", "Requirement already satisfied: aiohttp>=3.8.0 in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (from edge-tts) (3.9.3)\n", "Requirement already satisfied: certifi>=2023.11.17 in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (from edge-tts) (2024.2.2)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (from aiohttp>=3.8.0->edge-tts) (1.3.1)\n", "Requirement already satisfied: attrs>=17.3.0 in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (from aiohttp>=3.8.0->edge-tts) (23.2.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (from aiohttp>=3.8.0->edge-tts) (1.4.1)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (from aiohttp>=3.8.0->edge-tts) (6.0.5)\n", "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (from aiohttp>=3.8.0->edge-tts) (1.9.4)\n", "Requirement already satisfied: idna>=2.0 in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (from yarl<2.0,>=1.0->aiohttp>=3.8.0->edge-tts) (3.4)\n", "Requirement already satisfied: pygame in /opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages (2.5.2)\n" ] } ], "source": [ "%pip install edge-tts" ] }, { "cell_type": "markdown", "id": "2df59a42", "metadata": {}, "source": [ "# English Voices\n", "\n", "* voice = \"en-US-GuyNeural\" (Male)\n", "* voice = \"en-US-AnaNeural\" (Female)\n", "* voice = \"en-US-AndrewNeural\" (Male)\n", "* voice = \"en-US-AriaNeural\" (Female)\n", "* voice = \"en-US-AvaNeural\" (Female)\n", "* voice = \"en-US-BrianNeural\" (Male)\n", "* voice = \"en-US-ChristopherNeural\" (Male)\n", "* voice = \"en-US-EmmaNeural\" (Female)\n", "* voice = \"en-US-EricNeural\" (Male)\n", "* voice = \"en-US-GuyNeural\" (Male)\n", "* voice = \"en-US-JennyNeural\" (Female)\n", "* voice = \"en-US-MichelleNeural\" (Female)\n", "* voice = \"en-US-RogerNeural\" (Male)\n", "* voice = \"en-US-SteffanNeural\" (Male)\n", "* voice = \"en-GB-LibbyNeural\" (Female)\n", "* voice = \"en-GB-MaisieNeural\" (Female)\n", "* voice = \"en-GB-RyanNeural\" (Male)\n", "* voice = \"en-GB-SoniaNeural\" (Female)\n", "* voice = \"en-GB-ThomasNeural\" (Male)\n", "* voice = \"en-AU-NatashaNeural\" (Female)\n", "* voice = \"en-AU-WilliamNeural\" (Male)\n", "* voice = \"en-CA-ClaraNeural\" (Female)\n", "* voice = \"en-CA-LiamNeural\" (Male)" ] }, { "cell_type": "code", "execution_count": 2, "id": "71d35cd9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['en-US-GuyNeural', 'en-US-AriaNeural']\n", "card\n", "../audios/card_us_male.mp3 exists, overwriting...\n", "../audios/card_us_male.mp3 created\n", "../audios/card_us_female.mp3 exists, overwriting...\n", "../audios/card_us_female.mp3 created\n", " mark\n", "../audios/mark_us_male.mp3 created\n", "../audios/mark_us_female.mp3 created\n", " door\n", "../audios/door_us_male.mp3 created\n", "../audios/door_us_female.mp3 created\n", "short\n", "../audios/short_us_male.mp3 created\n", "../audios/short_us_female.mp3 created\n", "poor\n", "../audios/poor_us_male.mp3 exists, overwriting...\n", "../audios/poor_us_male.mp3 created\n", "../audios/poor_us_female.mp3 exists, overwriting...\n", "../audios/poor_us_female.mp3 created\n", "your\n", "../audios/your_us_male.mp3 created\n", "../audios/your_us_female.mp3 created\n", "focus\n", "../audios/focus_us_male.mp3 created\n", "../audios/focus_us_female.mp3 created\n", "individual\n", "../audios/individual_us_male.mp3 created\n", "../audios/individual_us_female.mp3 created\n", "\n", "about\n", "../audios/about_us_male.mp3 exists, overwriting...\n", "../audios/about_us_male.mp3 created\n", "../audios/about_us_female.mp3 exists, overwriting...\n", "../audios/about_us_female.mp3 created\n", "\n", "banana\n", "../audios/banana_us_male.mp3 created\n", "../audios/banana_us_female.mp3 created\n", "\n", "sofa\n", "../audios/sofa_us_male.mp3 created\n", "../audios/sofa_us_female.mp3 created\n", "\n", "open\n", "../audios/open_us_male.mp3 created\n", "../audios/open_us_female.mp3 created\n", "\n", "problem\n", "../audios/problem_us_male.mp3 created\n", "../audios/problem_us_female.mp3 created\n", "\n", "synthesis\n", "../audios/synthesis_us_male.mp3 created\n", "../audios/synthesis_us_female.mp3 created\n", "\n", "animal\n", "../audios/animal_us_male.mp3 created\n", "../audios/animal_us_female.mp3 created\n", "\n", "president\n", "../audios/president_us_male.mp3 created\n", "../audios/president_us_female.mp3 created\n", "\n", "pupil\n", "../audios/pupil_us_male.mp3 created\n", "../audios/pupil_us_female.mp3 created\n", "\n", "bacon\n", "../audios/bacon_us_male.mp3 created\n", "../audios/bacon_us_female.mp3 created\n", "\n", "lesson\n", "../audios/lesson_us_male.mp3 created\n", "../audios/lesson_us_female.mp3 created\n", "\n", "pilot\n", "../audios/pilot_us_male.mp3 created\n", "../audios/pilot_us_female.mp3 created\n", "\n", "circus\n", "../audios/circus_us_male.mp3 created\n", "../audios/circus_us_female.mp3 created\n", "\n", "medium\n", "../audios/medium_us_male.mp3 created\n", "../audios/medium_us_female.mp3 created\n", "\n", "support\n", "../audios/support_us_male.mp3 created\n", "../audios/support_us_female.mp3 created\n", "\n", "courageous\n", "../audios/courageous_us_male.mp3 created\n", "../audios/courageous_us_female.mp3 created\n", "\n", "famous\n", "../audios/famous_us_male.mp3 created\n", "../audios/famous_us_female.mp3 created\n", "\n", "humorous\n", "../audios/humorous_us_male.mp3 created\n", "../audios/humorous_us_female.mp3 created\n", "\n", "better\n", "../audios/better_us_male.mp3 created\n", "../audios/better_us_female.mp3 created\n", "\n", "butter\n", "../audios/butter_us_male.mp3 created\n", "../audios/butter_us_female.mp3 created\n", "\n", "teacher\n", "../audios/teacher_us_male.mp3 created\n", "../audios/teacher_us_female.mp3 created\n", "\n", "actor\n", "../audios/actor_us_male.mp3 created\n", "../audios/actor_us_female.mp3 created\n", "\n", "doctor\n", "../audios/doctor_us_male.mp3 created\n", "../audios/doctor_us_female.mp3 created\n", "\n", "editor\n", "../audios/editor_us_male.mp3 created\n", "../audios/editor_us_female.mp3 created\n", "\n", "beggar\n", "../audios/beggar_us_male.mp3 created\n", "../audios/beggar_us_female.mp3 created\n", "\n", "burglar\n", "../audios/burglar_us_male.mp3 created\n", "../audios/burglar_us_female.mp3 created\n", "\n", "collar\n", "../audios/collar_us_male.mp3 created\n", "../audios/collar_us_female.mp3 created\n", "\n", "culture\n", "../audios/culture_us_male.mp3 created\n", "../audios/culture_us_female.mp3 created\n", "\n", "figure\n", "../audios/figure_us_male.mp3 created\n", "../audios/figure_us_female.mp3 created\n", "\n", "pressure\n", "../audios/pressure_us_male.mp3 created\n", "../audios/pressure_us_female.mp3 created\n", "\n", "her\n", "../audios/her_us_male.mp3 created\n", "../audios/her_us_female.mp3 created\n", "\n", "term\n", "../audios/term_us_male.mp3 created\n", "../audios/term_us_female.mp3 created\n", "\n", "clerk\n", "../audios/clerk_us_male.mp3 created\n", "../audios/clerk_us_female.mp3 created\n", "\n", "earn\n", "../audios/earn_us_male.mp3 created\n", "../audios/earn_us_female.mp3 created\n", "\n", "earth\n", "../audios/earth_us_male.mp3 created\n", "../audios/earth_us_female.mp3 created\n", "\n", "heard\n", "../audios/heard_us_male.mp3 created\n", "../audios/heard_us_female.mp3 created\n", "\n", "bird\n", "../audios/bird_us_male.mp3 created\n", "../audios/bird_us_female.mp3 created\n", "\n", "first\n", "../audios/first_us_male.mp3 created\n", "../audios/first_us_female.mp3 created\n", "\n", "stir\n", "../audios/stir_us_male.mp3 created\n", "../audios/stir_us_female.mp3 created\n", "\n", "burn\n", "../audios/burn_us_male.mp3 created\n", "../audios/burn_us_female.mp3 created\n", "\n", "nurse\n", "../audios/nurse_us_male.mp3 created\n", "../audios/nurse_us_female.mp3 created\n", "\n", "turn\n", "../audios/turn_us_male.mp3 created\n", "../audios/turn_us_female.mp3 created\n", "\n", "word\n", "../audios/word_us_male.mp3 created\n", "../audios/word_us_female.mp3 created\n", "\n", "world\n", "../audios/world_us_male.mp3 exists, overwriting...\n", "../audios/world_us_male.mp3 created\n", "../audios/world_us_female.mp3 exists, overwriting...\n", "../audios/world_us_female.mp3 created\n", "\n", "worse\n", "../audios/worse_us_male.mp3 created\n", "../audios/worse_us_female.mp3 created\n", "\n" ] }, { "ename": "error", "evalue": "music_mpg123: corrupt mp3 file (bad tags.)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31merror\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[2], line 92\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, voice \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(voices):\n\u001b[1;32m 91\u001b[0m filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../audios/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mword\u001b[38;5;241m.\u001b[39mstrip()\u001b[38;5;241m.\u001b[39mlower()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mregions[i]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mgenders[i]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.mp3\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m---> 92\u001b[0m \u001b[38;5;28;01mawait\u001b[39;00m generate_edge_tts_audio(word\u001b[38;5;241m.\u001b[39mstrip()\u001b[38;5;241m.\u001b[39mlower(), filename, voice\u001b[38;5;241m=\u001b[39mvoice, verbose\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, overwrite\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, play\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", "Cell \u001b[0;32mIn[2], line 21\u001b[0m, in \u001b[0;36mgenerate_edge_tts_audio\u001b[0;34m(text, file_name, voice, style, verbose, play, overwrite)\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m play:\n\u001b[1;32m 20\u001b[0m pygame\u001b[38;5;241m.\u001b[39mmixer\u001b[38;5;241m.\u001b[39minit()\n\u001b[0;32m---> 21\u001b[0m \u001b[43mpygame\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmixer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmusic\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile_name\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 22\u001b[0m pygame\u001b[38;5;241m.\u001b[39mmixer\u001b[38;5;241m.\u001b[39mmusic\u001b[38;5;241m.\u001b[39mplay()\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m verbose:\n", "\u001b[0;31merror\u001b[0m: music_mpg123: corrupt mp3 file (bad tags.)" ] } ], "source": [ "import edge_tts\n", "import os\n", "import pygame\n", "import time\n", "\n", "async def generate_edge_tts_audio(text, file_name, voice='en-US-GuyNeural', style='newscast-formal', verbose=False, play=False, overwrite=False):\n", " communicate = edge_tts.Communicate(text, voice)\n", " # whether file exists?\n", " if os.path.exists(file_name):\n", " if overwrite:\n", " if verbose:\n", " print(f'{file_name} exists, overwriting...')\n", " else:\n", " if verbose:\n", " print(f'{file_name} exists, skipping...')\n", " return\n", " \n", " await communicate.save(file_name)\n", " if play:\n", " pygame.mixer.init()\n", " pygame.mixer.music.load(file_name)\n", " pygame.mixer.music.play()\n", " if verbose:\n", " print(f'{file_name} created')\n", " \n", " time.sleep(1.5)\n", "\n", "\n", "\n", "voices = [\"en-US-GuyNeural\", \"en-US-AriaNeural\", \"en-GB-RyanNeural\", \"en-GB-LibbyNeural\"]\n", "regions = ['us', 'us', 'uk', 'uk']\n", "genders = ['male', 'female', 'male', 'female']\n", "\n", "only_us = True\n", "if only_us:\n", " voices = voices[:2]\n", " print(voices)\n", "\n", "words = \"\"\"\n", "card, mark, door,short,poor,your,focus,individual,\n", "about,\n", "banana,\n", "sofa,\n", "open,\n", "problem,\n", "synthesis,\n", "animal,\n", "president,\n", "pupil,\n", "bacon,\n", "lesson,\n", "pilot,\n", "circus,\n", "medium,\n", "support,\n", "courageous,\n", "famous,\n", "humorous,\n", "better,\n", "butter,\n", "teacher,\n", "actor,\n", "doctor,\n", "editor,\n", "beggar,\n", "burglar,\n", "collar,\n", "culture,\n", "figure,\n", "pressure,\n", "her,\n", "term,\n", "clerk,\n", "earn,\n", "earth,\n", "heard,\n", "bird,\n", "first,\n", "stir,\n", "burn,\n", "nurse,\n", "turn,\n", "word,\n", "world,\n", "worse,\n", "\"\"\"\n", "\n", "for word in words.strip().split(','):\n", " print(word)\n", " for i, voice in enumerate(voices):\n", " w = word.strip().lower()\n", " if len(w) > 0:\n", " filename = f'../audios/{w}-{regions[i]}-{genders[i]}.mp3'\n", " await generate_edge_tts_audio(w, filename, voice=voice, verbose=True, overwrite=True, play=True)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "862f0948", "metadata": {}, "outputs": [], "source": [ "pygame.mixer.init()\n", "pygame.mixer.music.load(OUTPUT_FILE)\n", "pygame.mixer.music.play()" ] }, { "cell_type": "code", "execution_count": 3, "id": "00939422-fbf9-4842-b82a-b6106624c075", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files created!\n" ] } ], "source": [ "#American\n", "\n", "import asyncio\n", "import edge_tts\n", "import pygame\n", "\n", "TEXT = \"hands\"\n", "Wordlist = TEXT.split(\",\")\n", "\n", "for w in Wordlist:\n", " # for VOICE in ['en-US-GuyNeural', 'en-US-JennyNeural', 'en-GB-RyanNeural', 'en-GB-SoniaNeural']:\n", " for VOICE in ['en-US-GuyNeural', 'en-US-MichelleNeural']:\n", " w = w.strip()\n", " # OUTPUT_FILE = f\"{w}-{VOICE.replace('EricNeural', 'Guy-Male').replace('JennyNeural', 'Jenny-Female').replace('RyanNeural', 'Ryan-Male').replace('SoniaNeural', 'Sonia-Female').lower()}.mp3\"\n", " OUTPUT_FILE = f\"{w}-{VOICE.replace('EricNeural', 'Male').replace('MichelleNeural', 'Female').replace('en-', '').lower()}.mp3\"\n", " communicate = edge_tts.Communicate(w, VOICE)\n", " await communicate.save(OUTPUT_FILE) \n", "\n", "print(\"Files created!\") " ] }, { "cell_type": "code", "execution_count": 2, "id": "cecefa85-b37d-457e-9e99-e582dabdfb9f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files created!\n" ] } ], "source": [ "#American Sentence\n", "\n", "import asyncio\n", "import edge_tts\n", "import pygame\n", "\n", "TEXT = \"cat,foot\"\n", "Wordlist = TEXT.split(\",\")\n", "\n", "for w in Wordlist:\n", " # for VOICE in ['en-US-GuyNeural', 'en-US-JennyNeural', 'en-GB-RyanNeural', 'en-GB-SoniaNeural']:\n", " for VOICE in ['en-US-EricNeural', 'en-US-MichelleNeural']:\n", " w = w.strip().replace(' ', '-')\n", " # OUTPUT_FILE = f\"{w}-{VOICE.replace('EricNeural', 'Guy-Male').replace('JennyNeural', 'Jenny-Female').replace('RyanNeural', 'Ryan-Male').replace('SoniaNeural', 'Sonia-Female').lower()}.mp3\"\n", " OUTPUT_FILE = f\"{w}-{VOICE.replace('EricNeural', 'Male').replace('MichelleNeural', 'Female').replace('en-', '').lower()}.mp3\"\n", " communicate = edge_tts.Communicate(w, VOICE)\n", " await communicate.save(OUTPUT_FILE) \n", "\n", "print(\"Files created!\") " ] }, { "cell_type": "code", "execution_count": null, "id": "93f68a91-7e6b-45ef-932e-533b695e4ac1", "metadata": {}, "outputs": [], "source": [ "# ru-RU-DmitryNeural\n", "# ko-KR-InJoonNeural" ] }, { "cell_type": "code", "execution_count": 51, "id": "474c3f39-11ed-4d0a-b039-63df8b270044", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files created!\n" ] } ], "source": [ "# British\n", "\n", "import asyncio\n", "import edge_tts\n", "import pygame\n", "\n", "TEXT = \"speak, student, school, frustrate\"\n", "Wordlist = TEXT.split(\",\")\n", "\n", "for w in Wordlist:\n", " # for VOICE in ['en-US-GuyNeural', 'en-US-JennyNeural', 'en-GB-RyanNeural', 'en-GB-SoniaNeural']:\n", " for VOICE in ['en-GB-RyanNeural', 'en-GB-SoniaNeural']:\n", " w = w.strip()\n", " # OUTPUT_FILE = f\"{w}-{VOICE.replace('EricNeural', 'Guy-Male').replace('JennyNeural', 'Jenny-Female').replace('RyanNeural', 'Ryan-Male').replace('SoniaNeural', 'Sonia-Female').lower()}.mp3\"\n", " OUTPUT_FILE = f\"{w}-{VOICE.replace('RyanNeural', 'Male').replace('SoniaNeural', 'Female').replace('en-GB-', 'uk-').lower()}.mp3\"\n", " communicate = edge_tts.Communicate(w, VOICE)\n", " await communicate.save(OUTPUT_FILE) \n", "\n", "print(\"Files created!\") " ] }, { "cell_type": "code", "execution_count": 49, "id": "42ecfe3f-f3ac-4fb7-92d0-795d51972051", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files created!\n" ] } ], "source": [ "#Korean\n", "\n", "import asyncio\n", "import edge_tts\n", "import pygame\n", "\n", "TEXT = \"photo, video\"\n", "Wordlist = TEXT.split(\",\")\n", "\n", "for w in Wordlist:\n", " # for VOICE in ['en-US-GuyNeural', 'en-US-JennyNeural', 'en-GB-RyanNeural', 'en-GB-SoniaNeural']:\n", " for VOICE in ['ko-KR-InJoonNeural']:\n", " w = w.strip()\n", " # OUTPUT_FILE = f\"{w}-{VOICE.replace('EricNeural', 'Guy-Male').replace('JennyNeural', 'Jenny-Female').replace('RyanNeural', 'Ryan-Male').replace('SoniaNeural', 'Sonia-Female').lower()}.mp3\"\n", " OUTPUT_FILE = f\"{w}-{VOICE.replace('InJoonNeural', 'kr').replace('SoniaNeural', 'Female').replace('ko-KR', 'ko').lower()}.mp3\"\n", " communicate = edge_tts.Communicate(w, VOICE)\n", " await communicate.save(OUTPUT_FILE) \n", "\n", "print(\"Files created!\") " ] }, { "cell_type": "code", "execution_count": 55, "id": "95b12e63-f92d-49b4-bd51-a2b9d059fd52", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files created!\n" ] } ], "source": [ "#Chinese\n", "\n", "import asyncio\n", "import edge_tts\n", "import pygame\n", "\n", "TEXT = \"room\"\n", "Wordlist = TEXT.split(\",\")\n", "\n", "for w in Wordlist:\n", " # for VOICE in ['en-US-GuyNeural', 'en-US-JennyNeural', 'en-GB-RyanNeural', 'en-GB-SoniaNeural']:\n", " for VOICE in ['zh-CN-liaoning-XiaobeiNeural']:\n", " w = w.strip()\n", " # OUTPUT_FILE = f\"{w}-{VOICE.replace('EricNeural', 'Guy-Male').replace('JennyNeural', 'Jenny-Female').replace('RyanNeural', 'Ryan-Male').replace('SoniaNeural', 'Sonia-Female').lower()}.mp3\"\n", " OUTPUT_FILE = f\"{w}-{VOICE.replace('liaoning-XiaobeiNeural', 'zh').replace('SoniaNeural', 'Female').replace('zh-CN', 'cn').lower()}.mp3\"\n", " communicate = edge_tts.Communicate(w, VOICE)\n", " await communicate.save(OUTPUT_FILE) \n", "\n", "print(\"Files created!\") " ] }, { "cell_type": "code", "execution_count": null, "id": "2128587f-e6c8-488d-8c40-6c958b9c735e", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.2" } }, "nbformat": 4, "nbformat_minor": 5 }