Files
everyone-can-use-english/1000-hours/public/jupyter-notebooks/edge-tts-valcab-pronounciation.ipynb
2024-08-25 12:23:34 +08:00

1256 lines
87 KiB
Plaintext

{
"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": null,
"id": "77deb08f-fec3-4327-b2f9-1c893aacaddc",
"metadata": {
"collapsed": true,
"jupyter": {
"outputs_hidden": true
}
},
"outputs": [],
"source": [
"%pip install edge-tts pygame"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "71d35cd9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The history saving thread hit an unexpected error (DatabaseError('database disk image is malformed')).History will not be written to the database.\n",
"pygame 2.6.0 (SDL 2.28.4, Python 3.12.2)\n",
"Hello from the pygame community. https://www.pygame.org/contribute.html\n"
]
}
],
"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)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "4146f92e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['en-US-GuyNeural', 'en-US-AriaNeural']\n",
"applying\n",
"../audios/applying-us-male.mp3 exists, skipping...\n",
"../audios/applying-us-female.mp3 exists, skipping...\n",
"\n",
"carrying\n",
"../audios/carrying-us-male.mp3 exists, skipping...\n",
"../audios/carrying-us-female.mp3 exists, skipping...\n",
"\n",
"crying\n",
"../audios/crying-us-male.mp3 exists, skipping...\n",
"../audios/crying-us-female.mp3 exists, skipping...\n",
"\n",
"denying\n",
"../audios/denying-us-male.mp3 exists, skipping...\n",
"../audios/denying-us-female.mp3 exists, skipping...\n",
"\n",
"qualifying\n",
"../audios/qualifying-us-male.mp3 created\n",
"../audios/qualifying-us-female.mp3 created\n",
"\n",
"replying\n",
"../audios/replying-us-male.mp3 exists, skipping...\n",
"../audios/replying-us-female.mp3 exists, skipping...\n",
"\n",
"satisfying\n",
"../audios/satisfying-us-male.mp3 exists, skipping...\n",
"../audios/satisfying-us-female.mp3 exists, skipping...\n",
"\n",
"specifying\n",
"../audios/specifying-us-male.mp3 exists, skipping...\n",
"../audios/specifying-us-female.mp3 exists, skipping...\n",
"\n",
"spying\n",
"../audios/spying-us-male.mp3 exists, skipping...\n",
"../audios/spying-us-female.mp3 exists, skipping...\n",
"\n"
]
}
],
"source": [
"\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 = False\n",
"only_us = True\n",
"if only_us:\n",
" voices = voices[:2]\n",
" print(voices)\n",
"\n",
"words = \"\"\"\n",
"applying,\n",
"carrying,\n",
"crying,\n",
"denying,\n",
"qualifying,\n",
"replying,\n",
"satisfying,\n",
"specifying,\n",
"spying,\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.replace(\" \", \"-\")}-{regions[i]}-{genders[i]}.mp3'\n",
" await generate_edge_tts_audio(w, filename, voice=voice, verbose=True, overwrite=False, play=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "2d46cde4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"she-will-cherish-those-memories-and-ever-hold-them-close-to-her-heart_openai.mp3\n"
]
}
],
"source": [
"def get_openai_tts_audio(text, path, performer='alloy'):\n",
" \n",
" from openai import OpenAI\n",
" from dotenv import load_dotenv\n",
" load_dotenv()\n",
" client = OpenAI(\n",
" )\n",
" \n",
" with client.audio.speech.with_streaming_response.create(\n",
" model=\"tts-1\",\n",
" voice=performer,\n",
" input=text.strip()\n",
" ) as response:\n",
" response.stream_to_file(path)\n",
" \n",
"sentence = \"She will cherish those memories and ever hold them close to her heart.\"\n",
"\n",
"# remove all punctuation at the end of sentence,\n",
"# replace all spaces and punctuations in the sentence with dash\n",
"audio_filename_openai = sentence.strip().translate(str.maketrans(',.?! ', '-----')).replace(\"--\", \"-\").lower().rstrip('-') + '_openai.mp3'\n",
"audio_filename_msedge = sentence.strip().translate(str.maketrans(',.?! ', '-----')).replace(\"--\", \"-\").lower().rstrip('-') + '_msedge.mp3'\n",
"\n",
"print(audio_filename_openai)\n",
"# get_openai_tts_audio(sentence, audio_filename_openai, performer='alloy')\n",
"# await generate_edge_tts_audio(sentence, audio_filename_msedge, voice=\"en-US-GuyNeural\", verbose=True, overwrite=True, play=True)\n",
"\n",
"for voice in [\"alloy\", \"nova\"]:\n",
" get_openai_tts_audio(sentence, f'../audios/{sentence.replace(\" \", \"-\")}-{voice}.mp3', performer=voice)\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7f219eb1",
"metadata": {},
"outputs": [],
"source": [
"from openai import OpenAI\n",
"import os\n",
"import IPython\n",
"from datetime import datetime\n",
"from mutagen.mp3 import MP3\n",
"from mutagen.id3 import ID3, APIC, TPE1, TALB, TCON\n",
"from dotenv import load_dotenv\n",
"from pydub import AudioSegment\n",
"\n",
"load_dotenv()\n",
"client = OpenAI(\n",
")\n",
"\n",
"def get_openai_tts_audio(text, filename, performer=\"alloy\"):\n",
"\n",
" # check artwork.png and ending.mp3 files exist\n",
" if not os.path.isfile('Artwork.png') or not os.path.isfile('ending.mp3'):\n",
" print(\"Either Artwork.png or ending.mp3 file not found.\")\n",
" return\n",
"\n",
" # split the text into lines\n",
" text = markdown_to_text(text).split(\"\\n\")\n",
" # remove empty lines\n",
" text = [t for t in text if t]\n",
"\n",
" for t in text:\n",
" speech_file_path = f'temp-{text.index(t)}.mp3'\n",
" rspd_audio = client.audio.speech.create(\n",
" model=\"tts-1\",\n",
" voice=performer,\n",
" input=t.strip()\n",
" ) \n",
" rspd_audio.stream_to_file(speech_file_path)\n",
" # output a progress percentage \n",
" # keep updating within a line\n",
" print(f\"\\rprocessing: {round((text.index(t)+1)/len(text)*100)}%\", end='...')\n",
" print(\"\\n\")\n",
"\n",
" # create an audio of 1 second of silence\n",
" temp_audio = AudioSegment.silent(duration=1000)\n",
" for t in text:\n",
" seg = AudioSegment.from_file(f'temp-{text.index(t)}.mp3')\n",
" temp_audio += seg + AudioSegment.silent(duration=1500)\n",
" # delete the temp file\n",
" os.remove(f'temp-{text.index(t)}.mp3')\n",
" temp_audio.export('~temp.mp3', format='mp3')\n",
" speech = AudioSegment.from_file('~temp.mp3')\n",
" ending = AudioSegment.from_file('ending.mp3')\n",
" combined = speech + ending\n",
" os.remove('~temp.mp3')\n",
" if filename:\n",
" # if filename has no extension, add .mp3\n",
" if filename.endswith('.mp3'):\n",
" speech_file_path = filename\n",
" else:\n",
" speech_file_path = f'{filename}.mp3' \n",
" else:\n",
" speech_file_path = f'{datetime.now().strftime(\"%Y%m%d_%H%M%S\")}_{performer}.mp3'\n",
" combined.export(speech_file_path, format='mp3')\n",
" print(f\"Audio file saved as {speech_file_path}\")\n",
"\n",
" image_file = 'Artwork.png'\n",
" artist = 'tts'\n",
" album = 'Daily Speech Training'\n",
" genre = 'SPEECH'\n",
"\n",
" add_metadata(speech_file_path, image_file, artist, album, genre)\n",
" IPython.display.Audio(speech_file_path)\n",
"\n",
" return f'{speech_file_path} created successfully.'\n",
"\n"
]
},
{
"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": 55,
"id": "7350bdce",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"../audios/are-us-male.mp3\n"
]
},
{
"ename": "APIConnectionError",
"evalue": "Connection error.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mConnectError\u001b[0m Traceback (most recent call last)",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpx/_transports/default.py:69\u001b[0m, in \u001b[0;36mmap_httpcore_exceptions\u001b[0;34m()\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 69\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpx/_transports/default.py:233\u001b[0m, in \u001b[0;36mHTTPTransport.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m map_httpcore_exceptions():\n\u001b[0;32m--> 233\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mreq\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(resp\u001b[38;5;241m.\u001b[39mstream, typing\u001b[38;5;241m.\u001b[39mIterable)\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py:216\u001b[0m, in \u001b[0;36mConnectionPool.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_close_connections(closing)\n\u001b[0;32m--> 216\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;66;03m# Return the response. Note that in this case we still have to manage\u001b[39;00m\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# the point at which the response is closed.\u001b[39;00m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py:196\u001b[0m, in \u001b[0;36mConnectionPool.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 194\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 195\u001b[0m \u001b[38;5;66;03m# Send the request on the assigned connection.\u001b[39;00m\n\u001b[0;32m--> 196\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mconnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 197\u001b[0m \u001b[43m \u001b[49m\u001b[43mpool_request\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\n\u001b[1;32m 198\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 199\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ConnectionNotAvailable:\n\u001b[1;32m 200\u001b[0m \u001b[38;5;66;03m# In some cases a connection may initially be available to\u001b[39;00m\n\u001b[1;32m 201\u001b[0m \u001b[38;5;66;03m# handle a request, but then become unavailable.\u001b[39;00m\n\u001b[1;32m 202\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 203\u001b[0m \u001b[38;5;66;03m# In this case we clear the connection and try again.\u001b[39;00m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpcore/_sync/http_proxy.py:317\u001b[0m, in \u001b[0;36mTunnelHTTPConnection.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 316\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m Trace(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstart_tls\u001b[39m\u001b[38;5;124m\"\u001b[39m, logger, request, kwargs) \u001b[38;5;28;01mas\u001b[39;00m trace:\n\u001b[0;32m--> 317\u001b[0m stream \u001b[38;5;241m=\u001b[39m \u001b[43mstream\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart_tls\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 318\u001b[0m trace\u001b[38;5;241m.\u001b[39mreturn_value \u001b[38;5;241m=\u001b[39m stream\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpcore/_sync/http11.py:383\u001b[0m, in \u001b[0;36mHTTP11UpgradeStream.start_tls\u001b[0;34m(self, ssl_context, server_hostname, timeout)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mstart_tls\u001b[39m(\n\u001b[1;32m 378\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 379\u001b[0m ssl_context: ssl\u001b[38;5;241m.\u001b[39mSSLContext,\n\u001b[1;32m 380\u001b[0m server_hostname: Optional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 381\u001b[0m timeout: Optional[\u001b[38;5;28mfloat\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 382\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m NetworkStream:\n\u001b[0;32m--> 383\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_stream\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart_tls\u001b[49m\u001b[43m(\u001b[49m\u001b[43mssl_context\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mserver_hostname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpcore/_backends/sync.py:152\u001b[0m, in \u001b[0;36mSyncStream.start_tls\u001b[0;34m(self, ssl_context, server_hostname, timeout)\u001b[0m\n\u001b[1;32m 148\u001b[0m exc_map: ExceptionMapping \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 149\u001b[0m socket\u001b[38;5;241m.\u001b[39mtimeout: ConnectTimeout,\n\u001b[1;32m 150\u001b[0m \u001b[38;5;167;01mOSError\u001b[39;00m: ConnectError,\n\u001b[1;32m 151\u001b[0m }\n\u001b[0;32m--> 152\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmap_exceptions\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexc_map\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 153\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mtry\u001b[39;49;00m\u001b[43m:\u001b[49m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/contextlib.py:158\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[0;34m(self, typ, value, traceback)\u001b[0m\n\u001b[1;32m 157\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 158\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgen\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mthrow\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 159\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 160\u001b[0m \u001b[38;5;66;03m# Suppress StopIteration *unless* it's the same exception that\u001b[39;00m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;66;03m# was passed to throw(). This prevents a StopIteration\u001b[39;00m\n\u001b[1;32m 162\u001b[0m \u001b[38;5;66;03m# raised inside the \"with\" statement from being suppressed.\u001b[39;00m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpcore/_exceptions.py:14\u001b[0m, in \u001b[0;36mmap_exceptions\u001b[0;34m(map)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(exc, from_exc):\n\u001b[0;32m---> 14\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m to_exc(exc) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexc\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n",
"\u001b[0;31mConnectError\u001b[0m: [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1000)",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mConnectError\u001b[0m Traceback (most recent call last)",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_base_client.py:978\u001b[0m, in \u001b[0;36mSyncAPIClient._request\u001b[0;34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001b[0m\n\u001b[1;32m 977\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 978\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 979\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_should_stream_response_body\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 981\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 982\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 983\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m httpx\u001b[38;5;241m.\u001b[39mTimeoutException \u001b[38;5;28;01mas\u001b[39;00m err:\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpx/_client.py:914\u001b[0m, in \u001b[0;36mClient.send\u001b[0;34m(self, request, stream, auth, follow_redirects)\u001b[0m\n\u001b[1;32m 912\u001b[0m auth \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_build_request_auth(request, auth)\n\u001b[0;32m--> 914\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_handling_auth\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 915\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 916\u001b[0m \u001b[43m \u001b[49m\u001b[43mauth\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mauth\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 917\u001b[0m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 918\u001b[0m \u001b[43m \u001b[49m\u001b[43mhistory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 919\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 920\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpx/_client.py:942\u001b[0m, in \u001b[0;36mClient._send_handling_auth\u001b[0;34m(self, request, auth, follow_redirects, history)\u001b[0m\n\u001b[1;32m 941\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 942\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_handling_redirects\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 943\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 944\u001b[0m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 945\u001b[0m \u001b[43m \u001b[49m\u001b[43mhistory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhistory\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 946\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 947\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpx/_client.py:979\u001b[0m, in \u001b[0;36mClient._send_handling_redirects\u001b[0;34m(self, request, follow_redirects, history)\u001b[0m\n\u001b[1;32m 977\u001b[0m hook(request)\n\u001b[0;32m--> 979\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_single_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpx/_client.py:1015\u001b[0m, in \u001b[0;36mClient._send_single_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 1014\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m request_context(request\u001b[38;5;241m=\u001b[39mrequest):\n\u001b[0;32m-> 1015\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mtransport\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1017\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(response\u001b[38;5;241m.\u001b[39mstream, SyncByteStream)\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpx/_transports/default.py:232\u001b[0m, in \u001b[0;36mHTTPTransport.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 220\u001b[0m req \u001b[38;5;241m=\u001b[39m httpcore\u001b[38;5;241m.\u001b[39mRequest(\n\u001b[1;32m 221\u001b[0m method\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mmethod,\n\u001b[1;32m 222\u001b[0m url\u001b[38;5;241m=\u001b[39mhttpcore\u001b[38;5;241m.\u001b[39mURL(\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 230\u001b[0m extensions\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mextensions,\n\u001b[1;32m 231\u001b[0m )\n\u001b[0;32m--> 232\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmap_httpcore_exceptions\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 233\u001b[0m \u001b[43m \u001b[49m\u001b[43mresp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mreq\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/contextlib.py:158\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[0;34m(self, typ, value, traceback)\u001b[0m\n\u001b[1;32m 157\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 158\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgen\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mthrow\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 159\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 160\u001b[0m \u001b[38;5;66;03m# Suppress StopIteration *unless* it's the same exception that\u001b[39;00m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;66;03m# was passed to throw(). This prevents a StopIteration\u001b[39;00m\n\u001b[1;32m 162\u001b[0m \u001b[38;5;66;03m# raised inside the \"with\" statement from being suppressed.\u001b[39;00m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/httpx/_transports/default.py:86\u001b[0m, in \u001b[0;36mmap_httpcore_exceptions\u001b[0;34m()\u001b[0m\n\u001b[1;32m 85\u001b[0m message \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(exc)\n\u001b[0;32m---> 86\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m mapped_exc(message) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexc\u001b[39;00m\n",
"\u001b[0;31mConnectError\u001b[0m: [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1000)",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mAPIConnectionError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[55], line 17\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28mprint\u001b[39m(filename)\n\u001b[1;32m 16\u001b[0m \u001b[38;5;66;03m# await generate_edge_tts_audio(sentence, filename, voice=voice, verbose=True, overwrite=True, play=True)\u001b[39;00m\n\u001b[0;32m---> 17\u001b[0m \u001b[43mget_openai_tts_audio\u001b[49m\u001b[43m(\u001b[49m\u001b[43msentence\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mperformer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvoice\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 21\u001b[0m \u001b[38;5;66;03m# get_openai_tts_audio(sentence, f'../audios/{sentence.replace(\" \", \"-\")}-alloy.mp3', performer='alloy')\u001b[39;00m\n\u001b[1;32m 22\u001b[0m \u001b[38;5;66;03m# get_openai_tts_audio(sentence, f'../audios/{sentence.replace(\" \", \"-\")}-nova.mp3', performer='nova')\u001b[39;00m\n",
"Cell \u001b[0;32mIn[21], line 9\u001b[0m, in \u001b[0;36mget_openai_tts_audio\u001b[0;34m(text, path, performer)\u001b[0m\n\u001b[1;32m 5\u001b[0m load_dotenv()\n\u001b[1;32m 6\u001b[0m client \u001b[38;5;241m=\u001b[39m OpenAI(\n\u001b[1;32m 7\u001b[0m )\n\u001b[0;32m----> 9\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mclient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maudio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mspeech\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwith_streaming_response\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtts-1\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 11\u001b[0m \u001b[43m \u001b[49m\u001b[43mvoice\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mperformer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtext\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrip\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 14\u001b[0m \u001b[43m \u001b[49m\u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream_to_file\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_response.py:615\u001b[0m, in \u001b[0;36mResponseContextManager.__enter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 614\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__enter__\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m _APIResponseT:\n\u001b[0;32m--> 615\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_request_func\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 616\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__response\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/resources/audio/speech.py:85\u001b[0m, in \u001b[0;36mSpeech.create\u001b[0;34m(self, input, model, voice, response_format, speed, extra_headers, extra_query, extra_body, timeout)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 56\u001b[0m \u001b[38;5;124;03mGenerates audio from the input text.\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[38;5;124;03m timeout: Override the client-level default timeout for this request, in seconds\u001b[39;00m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 84\u001b[0m extra_headers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAccept\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapplication/octet-stream\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m(extra_headers \u001b[38;5;129;01mor\u001b[39;00m {})}\n\u001b[0;32m---> 85\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_post\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 86\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m/audio/speech\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 87\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmaybe_transform\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 88\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[1;32m 89\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43minput\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 90\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmodel\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 91\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mvoice\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mvoice\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 92\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mresponse_format\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mresponse_format\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 93\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mspeed\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mspeed\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 94\u001b[0m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[43m \u001b[49m\u001b[43mspeech_create_params\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mSpeechCreateParams\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 97\u001b[0m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmake_request_options\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 98\u001b[0m \u001b[43m \u001b[49m\u001b[43mextra_headers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_headers\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextra_query\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_query\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextra_body\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_body\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\n\u001b[1;32m 99\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 100\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m_legacy_response\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mHttpxBinaryResponseContent\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 101\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_base_client.py:1271\u001b[0m, in \u001b[0;36mSyncAPIClient.post\u001b[0;34m(self, path, cast_to, body, options, files, stream, stream_cls)\u001b[0m\n\u001b[1;32m 1257\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpost\u001b[39m(\n\u001b[1;32m 1258\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 1259\u001b[0m path: \u001b[38;5;28mstr\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1266\u001b[0m stream_cls: \u001b[38;5;28mtype\u001b[39m[_StreamT] \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 1267\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m ResponseT \u001b[38;5;241m|\u001b[39m _StreamT:\n\u001b[1;32m 1268\u001b[0m opts \u001b[38;5;241m=\u001b[39m FinalRequestOptions\u001b[38;5;241m.\u001b[39mconstruct(\n\u001b[1;32m 1269\u001b[0m method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpost\u001b[39m\u001b[38;5;124m\"\u001b[39m, url\u001b[38;5;241m=\u001b[39mpath, json_data\u001b[38;5;241m=\u001b[39mbody, files\u001b[38;5;241m=\u001b[39mto_httpx_files(files), \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39moptions\n\u001b[1;32m 1270\u001b[0m )\n\u001b[0;32m-> 1271\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m cast(ResponseT, \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mopts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m)\u001b[49m)\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_base_client.py:942\u001b[0m, in \u001b[0;36mSyncAPIClient.request\u001b[0;34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001b[0m\n\u001b[1;32m 933\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrequest\u001b[39m(\n\u001b[1;32m 934\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 935\u001b[0m cast_to: Type[ResponseT],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 940\u001b[0m stream_cls: \u001b[38;5;28mtype\u001b[39m[_StreamT] \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 941\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m ResponseT \u001b[38;5;241m|\u001b[39m _StreamT:\n\u001b[0;32m--> 942\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 943\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 944\u001b[0m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 945\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 946\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 947\u001b[0m \u001b[43m \u001b[49m\u001b[43mremaining_retries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mremaining_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 948\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_base_client.py:1002\u001b[0m, in \u001b[0;36mSyncAPIClient._request\u001b[0;34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001b[0m\n\u001b[1;32m 999\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEncountered Exception\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 1001\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m retries \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m-> 1002\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_retry_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1003\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1004\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1005\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1006\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1007\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1008\u001b[0m \u001b[43m \u001b[49m\u001b[43mresponse_headers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 1009\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1011\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRaising connection error\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1012\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m APIConnectionError(request\u001b[38;5;241m=\u001b[39mrequest) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_base_client.py:1080\u001b[0m, in \u001b[0;36mSyncAPIClient._retry_request\u001b[0;34m(self, options, cast_to, remaining_retries, response_headers, stream, stream_cls)\u001b[0m\n\u001b[1;32m 1076\u001b[0m \u001b[38;5;66;03m# In a synchronous context we are blocking the entire thread. Up to the library user to run the client in a\u001b[39;00m\n\u001b[1;32m 1077\u001b[0m \u001b[38;5;66;03m# different thread if necessary.\u001b[39;00m\n\u001b[1;32m 1078\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(timeout)\n\u001b[0;32m-> 1080\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1081\u001b[0m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1082\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1083\u001b[0m \u001b[43m \u001b[49m\u001b[43mremaining_retries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mremaining\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1084\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1085\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1086\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_base_client.py:1002\u001b[0m, in \u001b[0;36mSyncAPIClient._request\u001b[0;34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001b[0m\n\u001b[1;32m 999\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEncountered Exception\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 1001\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m retries \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m-> 1002\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_retry_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1003\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1004\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1005\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1006\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1007\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1008\u001b[0m \u001b[43m \u001b[49m\u001b[43mresponse_headers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 1009\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1011\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRaising connection error\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1012\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m APIConnectionError(request\u001b[38;5;241m=\u001b[39mrequest) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_base_client.py:1080\u001b[0m, in \u001b[0;36mSyncAPIClient._retry_request\u001b[0;34m(self, options, cast_to, remaining_retries, response_headers, stream, stream_cls)\u001b[0m\n\u001b[1;32m 1076\u001b[0m \u001b[38;5;66;03m# In a synchronous context we are blocking the entire thread. Up to the library user to run the client in a\u001b[39;00m\n\u001b[1;32m 1077\u001b[0m \u001b[38;5;66;03m# different thread if necessary.\u001b[39;00m\n\u001b[1;32m 1078\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(timeout)\n\u001b[0;32m-> 1080\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1081\u001b[0m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1082\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1083\u001b[0m \u001b[43m \u001b[49m\u001b[43mremaining_retries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mremaining\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1084\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1085\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1086\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniconda/base/lib/python3.12/site-packages/openai/_base_client.py:1012\u001b[0m, in \u001b[0;36mSyncAPIClient._request\u001b[0;34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001b[0m\n\u001b[1;32m 1002\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_retry_request(\n\u001b[1;32m 1003\u001b[0m input_options,\n\u001b[1;32m 1004\u001b[0m cast_to,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1008\u001b[0m response_headers\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 1009\u001b[0m )\n\u001b[1;32m 1011\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRaising connection error\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 1012\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m APIConnectionError(request\u001b[38;5;241m=\u001b[39mrequest) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 1014\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\n\u001b[1;32m 1015\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHTTP Response: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%i\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 1016\u001b[0m request\u001b[38;5;241m.\u001b[39mmethod,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1020\u001b[0m response\u001b[38;5;241m.\u001b[39mheaders,\n\u001b[1;32m 1021\u001b[0m )\n\u001b[1;32m 1022\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrequest_id: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, response\u001b[38;5;241m.\u001b[39mheaders\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mx-request-id\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n",
"\u001b[0;31mAPIConnectionError\u001b[0m: Connection error."
]
}
],
"source": [
"# generate sentences using edge-tts\n",
"sentences = \"\"\"\n",
"It's our pleasure.\n",
"\"\"\"\n",
"# split the sentences into lines\n",
"sentences = [s for s in sentences.strip().split(\"\\n\") if s]\n",
"for sentence in sentences:\n",
" # get the first three worrds and replace the first with 'sentence', join them with '-'ArithmeticError\n",
" # filename = f'../audios/sentence-{sentence.split(\" \")[1]}-{sentence.split(\" \")[2]}.mp3'\n",
" # for voice in [\"en-US-GuyNeural\", \"en-US-AriaNeural\"]:\n",
" for voice in [\"alloy\", \"nova\"]:\n",
"\n",
" filename = f'../audios/{sentence.rstrip(\",.!?\").replace(\"'\", \"\").replace(\" \", \"-\")}-us-{voice}.mp3'.replace(\"alloy\", \"male\").replace(\"nova\", \"female\")\n",
" # filename = f'../audios/{sentence.rstrip(\",.!?\").replace(\"'\", \"\").replace(\" \", \"-\")}-us-{voice}.mp3'.replace(\"en-US-GuyNeural\", \"male\").replace(\"en-US-AriaNeural\", \"female\")\n",
" print(filename)\n",
" # await generate_edge_tts_audio(sentence, filename, voice=voice, verbose=True, overwrite=True, play=True)\n",
" get_openai_tts_audio(sentence, filename, performer=voice)\n",
" \n",
" \n",
"\n",
" # get_openai_tts_audio(sentence, f'../audios/{sentence.replace(\" \", \"-\")}-alloy.mp3', performer='alloy')\n",
" # get_openai_tts_audio(sentence, f'../audios/{sentence.replace(\" \", \"-\")}-nova.mp3', performer='nova')\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "fce6bb10",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"airplane,airport,backyard,bedroom,birthday,blackboard,bookstore,brainstorm,breakfast,classroom,cupcake,daydream,dishwasher,doorbell,downtown,earthquake,everyday,eyewitness,firefighter,football,greenhouse,handwriting,headache,highway,homework,iceberg,jellyfish,laptop,lighthouse,mailbox,moonlight,notebook,nobody,pancake,postcard,rainbow,sailboat,sandbox,seashore,skateboard,snowflake,spaceship,sunflower,sunshine,superhero,tablecloth,toothbrush,toothpaste,typewriter,underwater,upstairs,volleyball,waterfall,watermelon,weekend,wheelchair,windmill,workshop,unhappy,unknown,unusual,redo,review,return,incomplete,invisible,inside,disagree,disappear,disconnect,preview,predict,preschool,misunderstand,misplace,mislead,nonstick,nonprofit,nonviolent,overeat,overwork,overheat,submarine,subtitle,subconscious,international,interact,interrupt,transport,transfer,transform,underpaid,underestimate,underground,superhuman,supermarket,supervisor,semicircle,semifinal,semiconscious,antibiotic,antifreeze,antisocial,devalue,defrost,decode,enable,enrich,encourage,empower,embrace,employ,nonexistent,nonsense,nonprofit,midnight,midterm,midfield,readable,manageable,comfortable,visible,flexible,edible,natural,musical,personal,helpful,joyful,careful,hopeless,fearless,endless,quickly,slowly,happily,development,agreement,improvement,kindness,darkness,happiness,teacher,runner,faster,actor,inventor,conductor,artist,scientist,pianist,celebration,decision,creation,education,suggestion,transportation,admission,confusion,extension,dangerous,nervous,famous,active,creative,attractive,artistic,athletic,energetic,reality,ability,simplicity,performance,importance,acceptance,difference,independence,existence,aquarium,aquatic,aqueduct,audience,audio,audition,benefit,benevolent,benefactor,century,percent,centennial,dictionary,predict,dictate,conduct,produce,reduce,fracture,fraction,infraction,project,inject,reject,judicial,prejudice,judgment,malnutrition,malicious,malfunction,maternal,maternity,matriarch,transmit,admit,submit,mortal,mortician,mortify,multiple,multiply,multinational,pendant,suspend,depend,transport,export,import,describe,manuscript,subscription,section,dissect,intersect,sensation,sensitive,consent,inspect,spectator,spectacle,construct,structure,destruct,telephone,television,telegraph,terrestrial,territory,terrain,vacant,vacuum,evacuate,video,vision,invisible,\n"
]
}
],
"source": [
"def read_lines_from_file(file_path):\n",
" with open(file_path, 'r') as file:\n",
" return file.readlines()\n",
"\n",
"import re\n",
"words = ''\n",
"# read lines from ../../sounds-of-american-english/6-vocabulary.md\n",
"lines = read_lines_from_file('../../sounds-of-american-english/6-vocabulary.md')\n",
"for line in lines:\n",
" # whether line is markdown list item start with \\d. or ' * '\n",
" # regex\n",
" if (re.match(r'^\\d+\\.', line) or re.match(r'^\\s*\\*\\s', line)) and 'span>' in line:\n",
" # remove starting ^\\d+\\.\\s* or '^\\s*\\*\\s*'\n",
" line = re.sub(r'^\\d+\\.\\s*|\\s*\\*\\s*', '', line)\n",
" # get the first word\n",
" word = line.split(' ')[0]\n",
" # append to words followed a comma\n",
" words += word + ','\n",
"print(words)\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "a11bcf2e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['en-US-GuyNeural', 'en-US-AriaNeural']\n",
"airplane\n",
"../audios/airplane-us-male.mp3 created\n",
"../audios/airplane-us-female.mp3 created\n",
"airport\n",
"../audios/airport-us-male.mp3 created\n",
"../audios/airport-us-female.mp3 created\n",
"backyard\n",
"../audios/backyard-us-male.mp3 created\n",
"../audios/backyard-us-female.mp3 created\n",
"bedroom\n",
"../audios/bedroom-us-male.mp3 created\n",
"../audios/bedroom-us-female.mp3 created\n",
"birthday\n",
"../audios/birthday-us-male.mp3 created\n",
"../audios/birthday-us-female.mp3 created\n",
"blackboard\n",
"../audios/blackboard-us-male.mp3 created\n",
"../audios/blackboard-us-female.mp3 created\n",
"bookstore\n",
"../audios/bookstore-us-male.mp3 created\n",
"../audios/bookstore-us-female.mp3 created\n",
"brainstorm\n",
"../audios/brainstorm-us-male.mp3 created\n",
"../audios/brainstorm-us-female.mp3 created\n",
"breakfast\n",
"../audios/breakfast-us-male.mp3 created\n",
"../audios/breakfast-us-female.mp3 created\n",
"classroom\n",
"../audios/classroom-us-male.mp3 exists, skipping...\n",
"../audios/classroom-us-female.mp3 exists, skipping...\n",
"cupcake\n",
"../audios/cupcake-us-male.mp3 created\n",
"../audios/cupcake-us-female.mp3 created\n",
"daydream\n",
"../audios/daydream-us-male.mp3 created\n",
"../audios/daydream-us-female.mp3 created\n",
"dishwasher\n",
"../audios/dishwasher-us-male.mp3 created\n",
"../audios/dishwasher-us-female.mp3 created\n",
"doorbell\n",
"../audios/doorbell-us-male.mp3 exists, skipping...\n",
"../audios/doorbell-us-female.mp3 exists, skipping...\n",
"downtown\n",
"../audios/downtown-us-male.mp3 created\n",
"../audios/downtown-us-female.mp3 created\n",
"earthquake\n",
"../audios/earthquake-us-male.mp3 created\n",
"../audios/earthquake-us-female.mp3 created\n",
"everyday\n",
"../audios/everyday-us-male.mp3 created\n",
"../audios/everyday-us-female.mp3 created\n",
"eyewitness\n",
"../audios/eyewitness-us-male.mp3 created\n",
"../audios/eyewitness-us-female.mp3 created\n",
"firefighter\n",
"../audios/firefighter-us-male.mp3 created\n",
"../audios/firefighter-us-female.mp3 created\n",
"football\n",
"../audios/football-us-male.mp3 created\n",
"../audios/football-us-female.mp3 created\n",
"greenhouse\n",
"../audios/greenhouse-us-male.mp3 created\n",
"../audios/greenhouse-us-female.mp3 created\n",
"handwriting\n",
"../audios/handwriting-us-male.mp3 exists, skipping...\n",
"../audios/handwriting-us-female.mp3 exists, skipping...\n",
"headache\n",
"../audios/headache-us-male.mp3 created\n",
"../audios/headache-us-female.mp3 created\n",
"highway\n",
"../audios/highway-us-male.mp3 created\n",
"../audios/highway-us-female.mp3 created\n",
"homework\n",
"../audios/homework-us-male.mp3 created\n",
"../audios/homework-us-female.mp3 created\n",
"iceberg\n",
"../audios/iceberg-us-male.mp3 created\n",
"../audios/iceberg-us-female.mp3 created\n",
"jellyfish\n",
"../audios/jellyfish-us-male.mp3 created\n",
"../audios/jellyfish-us-female.mp3 created\n",
"laptop\n",
"../audios/laptop-us-male.mp3 created\n",
"../audios/laptop-us-female.mp3 created\n",
"lighthouse\n",
"../audios/lighthouse-us-male.mp3 created\n",
"../audios/lighthouse-us-female.mp3 created\n",
"mailbox\n",
"../audios/mailbox-us-male.mp3 created\n",
"../audios/mailbox-us-female.mp3 created\n",
"moonlight\n",
"../audios/moonlight-us-male.mp3 created\n",
"../audios/moonlight-us-female.mp3 created\n",
"notebook\n",
"../audios/notebook-us-male.mp3 created\n",
"../audios/notebook-us-female.mp3 created\n",
"nobody\n",
"../audios/nobody-us-male.mp3 created\n",
"../audios/nobody-us-female.mp3 created\n",
"pancake\n",
"../audios/pancake-us-male.mp3 created\n",
"../audios/pancake-us-female.mp3 created\n",
"postcard\n",
"../audios/postcard-us-male.mp3 created\n",
"../audios/postcard-us-female.mp3 created\n",
"rainbow\n",
"../audios/rainbow-us-male.mp3 created\n",
"../audios/rainbow-us-female.mp3 created\n",
"sailboat\n",
"../audios/sailboat-us-male.mp3 created\n",
"../audios/sailboat-us-female.mp3 created\n",
"sandbox\n",
"../audios/sandbox-us-male.mp3 created\n",
"../audios/sandbox-us-female.mp3 created\n",
"seashore\n",
"../audios/seashore-us-male.mp3 created\n",
"../audios/seashore-us-female.mp3 created\n",
"skateboard\n",
"../audios/skateboard-us-male.mp3 created\n",
"../audios/skateboard-us-female.mp3 created\n",
"snowflake\n",
"../audios/snowflake-us-male.mp3 created\n",
"../audios/snowflake-us-female.mp3 created\n",
"spaceship\n",
"../audios/spaceship-us-male.mp3 created\n",
"../audios/spaceship-us-female.mp3 created\n",
"sunflower\n",
"../audios/sunflower-us-male.mp3 created\n",
"../audios/sunflower-us-female.mp3 created\n",
"sunshine\n",
"../audios/sunshine-us-male.mp3 exists, skipping...\n",
"../audios/sunshine-us-female.mp3 exists, skipping...\n",
"superhero\n",
"../audios/superhero-us-male.mp3 created\n",
"../audios/superhero-us-female.mp3 created\n",
"tablecloth\n",
"../audios/tablecloth-us-male.mp3 created\n",
"../audios/tablecloth-us-female.mp3 created\n",
"toothbrush\n",
"../audios/toothbrush-us-male.mp3 created\n",
"../audios/toothbrush-us-female.mp3 created\n",
"toothpaste\n",
"../audios/toothpaste-us-male.mp3 created\n",
"../audios/toothpaste-us-female.mp3 created\n",
"typewriter\n",
"../audios/typewriter-us-male.mp3 created\n",
"../audios/typewriter-us-female.mp3 created\n",
"underwater\n",
"../audios/underwater-us-male.mp3 created\n",
"../audios/underwater-us-female.mp3 created\n",
"upstairs\n",
"../audios/upstairs-us-male.mp3 exists, skipping...\n",
"../audios/upstairs-us-female.mp3 exists, skipping...\n",
"volleyball\n",
"../audios/volleyball-us-male.mp3 created\n",
"../audios/volleyball-us-female.mp3 created\n",
"waterfall\n",
"../audios/waterfall-us-male.mp3 created\n",
"../audios/waterfall-us-female.mp3 created\n",
"watermelon\n",
"../audios/watermelon-us-male.mp3 created\n",
"../audios/watermelon-us-female.mp3 created\n",
"weekend\n",
"../audios/weekend-us-male.mp3 created\n",
"../audios/weekend-us-female.mp3 created\n",
"wheelchair\n",
"../audios/wheelchair-us-male.mp3 created\n",
"../audios/wheelchair-us-female.mp3 created\n",
"windmill\n",
"../audios/windmill-us-male.mp3 created\n",
"../audios/windmill-us-female.mp3 created\n",
"workshop\n",
"../audios/workshop-us-male.mp3 created\n",
"../audios/workshop-us-female.mp3 created\n",
"unhappy\n",
"../audios/unhappy-us-male.mp3 created\n",
"../audios/unhappy-us-female.mp3 created\n",
"unknown\n",
"../audios/unknown-us-male.mp3 created\n",
"../audios/unknown-us-female.mp3 created\n",
"unusual\n",
"../audios/unusual-us-male.mp3 created\n",
"../audios/unusual-us-female.mp3 created\n",
"redo\n",
"../audios/redo-us-male.mp3 created\n",
"../audios/redo-us-female.mp3 created\n",
"review\n",
"../audios/review-us-male.mp3 created\n",
"../audios/review-us-female.mp3 created\n",
"return\n",
"../audios/return-us-male.mp3 created\n",
"../audios/return-us-female.mp3 created\n",
"incomplete\n",
"../audios/incomplete-us-male.mp3 created\n",
"../audios/incomplete-us-female.mp3 created\n",
"invisible\n",
"../audios/invisible-us-male.mp3 created\n",
"../audios/invisible-us-female.mp3 created\n",
"inside\n",
"../audios/inside-us-male.mp3 created\n",
"../audios/inside-us-female.mp3 created\n",
"disagree\n",
"../audios/disagree-us-male.mp3 created\n",
"../audios/disagree-us-female.mp3 created\n",
"disappear\n",
"../audios/disappear-us-male.mp3 created\n",
"../audios/disappear-us-female.mp3 created\n",
"disconnect\n",
"../audios/disconnect-us-male.mp3 created\n",
"../audios/disconnect-us-female.mp3 created\n",
"preview\n",
"../audios/preview-us-male.mp3 created\n",
"../audios/preview-us-female.mp3 created\n",
"predict\n",
"../audios/predict-us-male.mp3 created\n",
"../audios/predict-us-female.mp3 created\n",
"preschool\n",
"../audios/preschool-us-male.mp3 created\n",
"../audios/preschool-us-female.mp3 created\n",
"misunderstand\n",
"../audios/misunderstand-us-male.mp3 created\n",
"../audios/misunderstand-us-female.mp3 created\n",
"misplace\n",
"../audios/misplace-us-male.mp3 created\n",
"../audios/misplace-us-female.mp3 created\n",
"mislead\n",
"../audios/mislead-us-male.mp3 created\n",
"../audios/mislead-us-female.mp3 created\n",
"nonstick\n",
"../audios/nonstick-us-male.mp3 created\n",
"../audios/nonstick-us-female.mp3 created\n",
"nonprofit\n",
"../audios/nonprofit-us-male.mp3 created\n",
"../audios/nonprofit-us-female.mp3 created\n",
"nonviolent\n",
"../audios/nonviolent-us-male.mp3 created\n",
"../audios/nonviolent-us-female.mp3 created\n",
"overeat\n",
"../audios/overeat-us-male.mp3 created\n",
"../audios/overeat-us-female.mp3 created\n",
"overwork\n",
"../audios/overwork-us-male.mp3 created\n",
"../audios/overwork-us-female.mp3 created\n",
"overheat\n",
"../audios/overheat-us-male.mp3 created\n",
"../audios/overheat-us-female.mp3 created\n",
"submarine\n",
"../audios/submarine-us-male.mp3 created\n",
"../audios/submarine-us-female.mp3 created\n",
"subtitle\n",
"../audios/subtitle-us-male.mp3 created\n",
"../audios/subtitle-us-female.mp3 created\n",
"subconscious\n",
"../audios/subconscious-us-male.mp3 created\n",
"../audios/subconscious-us-female.mp3 created\n",
"international\n",
"../audios/international-us-male.mp3 exists, skipping...\n",
"../audios/international-us-female.mp3 exists, skipping...\n",
"interact\n",
"../audios/interact-us-male.mp3 created\n",
"../audios/interact-us-female.mp3 created\n",
"interrupt\n",
"../audios/interrupt-us-male.mp3 created\n",
"../audios/interrupt-us-female.mp3 created\n",
"transport\n",
"../audios/transport-us-male.mp3 created\n",
"../audios/transport-us-female.mp3 created\n",
"transfer\n",
"../audios/transfer-us-male.mp3 created\n",
"../audios/transfer-us-female.mp3 created\n",
"transform\n",
"../audios/transform-us-male.mp3 created\n",
"../audios/transform-us-female.mp3 created\n",
"underpaid\n",
"../audios/underpaid-us-male.mp3 created\n",
"../audios/underpaid-us-female.mp3 created\n",
"underestimate\n",
"../audios/underestimate-us-male.mp3 created\n",
"../audios/underestimate-us-female.mp3 created\n",
"underground\n",
"../audios/underground-us-male.mp3 created\n",
"../audios/underground-us-female.mp3 created\n",
"superhuman\n",
"../audios/superhuman-us-male.mp3 created\n",
"../audios/superhuman-us-female.mp3 created\n",
"supermarket\n",
"../audios/supermarket-us-male.mp3 created\n",
"../audios/supermarket-us-female.mp3 created\n",
"supervisor\n",
"../audios/supervisor-us-male.mp3 created\n",
"../audios/supervisor-us-female.mp3 created\n",
"semicircle\n",
"../audios/semicircle-us-male.mp3 created\n",
"../audios/semicircle-us-female.mp3 created\n",
"semifinal\n",
"../audios/semifinal-us-male.mp3 created\n",
"../audios/semifinal-us-female.mp3 created\n",
"semiconscious\n",
"../audios/semiconscious-us-male.mp3 created\n",
"../audios/semiconscious-us-female.mp3 created\n",
"antibiotic\n",
"../audios/antibiotic-us-male.mp3 created\n",
"../audios/antibiotic-us-female.mp3 created\n",
"antifreeze\n",
"../audios/antifreeze-us-male.mp3 created\n",
"../audios/antifreeze-us-female.mp3 created\n",
"antisocial\n",
"../audios/antisocial-us-male.mp3 created\n",
"../audios/antisocial-us-female.mp3 created\n",
"devalue\n",
"../audios/devalue-us-male.mp3 created\n",
"../audios/devalue-us-female.mp3 created\n",
"defrost\n",
"../audios/defrost-us-male.mp3 created\n",
"../audios/defrost-us-female.mp3 created\n",
"decode\n",
"../audios/decode-us-male.mp3 created\n",
"../audios/decode-us-female.mp3 created\n",
"enable\n",
"../audios/enable-us-male.mp3 created\n",
"../audios/enable-us-female.mp3 created\n",
"enrich\n",
"../audios/enrich-us-male.mp3 created\n",
"../audios/enrich-us-female.mp3 created\n",
"encourage\n",
"../audios/encourage-us-male.mp3 created\n",
"../audios/encourage-us-female.mp3 created\n",
"empower\n",
"../audios/empower-us-male.mp3 created\n",
"../audios/empower-us-female.mp3 created\n",
"embrace\n",
"../audios/embrace-us-male.mp3 created\n",
"../audios/embrace-us-female.mp3 created\n",
"employ\n",
"../audios/employ-us-male.mp3 created\n",
"../audios/employ-us-female.mp3 created\n",
"nonexistent\n",
"../audios/nonexistent-us-male.mp3 created\n",
"../audios/nonexistent-us-female.mp3 created\n",
"nonsense\n",
"../audios/nonsense-us-male.mp3 created\n",
"../audios/nonsense-us-female.mp3 created\n",
"nonprofit\n",
"../audios/nonprofit-us-male.mp3 exists, skipping...\n",
"../audios/nonprofit-us-female.mp3 exists, skipping...\n",
"midnight\n",
"../audios/midnight-us-male.mp3 created\n",
"../audios/midnight-us-female.mp3 created\n",
"midterm\n",
"../audios/midterm-us-male.mp3 created\n",
"../audios/midterm-us-female.mp3 created\n",
"midfield\n",
"../audios/midfield-us-male.mp3 created\n",
"../audios/midfield-us-female.mp3 created\n",
"readable\n",
"../audios/readable-us-male.mp3 created\n",
"../audios/readable-us-female.mp3 created\n",
"manageable\n",
"../audios/manageable-us-male.mp3 created\n",
"../audios/manageable-us-female.mp3 created\n",
"comfortable\n",
"../audios/comfortable-us-male.mp3 created\n",
"../audios/comfortable-us-female.mp3 created\n",
"visible\n",
"../audios/visible-us-male.mp3 created\n",
"../audios/visible-us-female.mp3 created\n",
"flexible\n",
"../audios/flexible-us-male.mp3 created\n",
"../audios/flexible-us-female.mp3 created\n",
"edible\n",
"../audios/edible-us-male.mp3 created\n",
"../audios/edible-us-female.mp3 created\n",
"natural\n",
"../audios/natural-us-male.mp3 created\n",
"../audios/natural-us-female.mp3 created\n",
"musical\n",
"../audios/musical-us-male.mp3 created\n",
"../audios/musical-us-female.mp3 created\n",
"personal\n",
"../audios/personal-us-male.mp3 created\n",
"../audios/personal-us-female.mp3 created\n",
"helpful\n",
"../audios/helpful-us-male.mp3 created\n",
"../audios/helpful-us-female.mp3 created\n",
"joyful\n",
"../audios/joyful-us-male.mp3 created\n",
"../audios/joyful-us-female.mp3 created\n",
"careful\n",
"../audios/careful-us-male.mp3 created\n",
"../audios/careful-us-female.mp3 created\n",
"hopeless\n",
"../audios/hopeless-us-male.mp3 created\n",
"../audios/hopeless-us-female.mp3 created\n",
"fearless\n",
"../audios/fearless-us-male.mp3 created\n",
"../audios/fearless-us-female.mp3 created\n",
"endless\n",
"../audios/endless-us-male.mp3 created\n",
"../audios/endless-us-female.mp3 created\n",
"quickly\n",
"../audios/quickly-us-male.mp3 created\n",
"../audios/quickly-us-female.mp3 created\n",
"slowly\n",
"../audios/slowly-us-male.mp3 created\n",
"../audios/slowly-us-female.mp3 created\n",
"happily\n",
"../audios/happily-us-male.mp3 created\n",
"../audios/happily-us-female.mp3 created\n",
"development\n",
"../audios/development-us-male.mp3 created\n",
"../audios/development-us-female.mp3 created\n",
"agreement\n",
"../audios/agreement-us-male.mp3 created\n",
"../audios/agreement-us-female.mp3 created\n",
"improvement\n",
"../audios/improvement-us-male.mp3 created\n",
"../audios/improvement-us-female.mp3 created\n",
"kindness\n",
"../audios/kindness-us-male.mp3 created\n",
"../audios/kindness-us-female.mp3 created\n",
"darkness\n",
"../audios/darkness-us-male.mp3 created\n",
"../audios/darkness-us-female.mp3 created\n",
"happiness\n",
"../audios/happiness-us-male.mp3 created\n",
"../audios/happiness-us-female.mp3 created\n",
"teacher\n",
"../audios/teacher-us-male.mp3 exists, skipping...\n",
"../audios/teacher-us-female.mp3 exists, skipping...\n",
"runner\n",
"../audios/runner-us-male.mp3 created\n",
"../audios/runner-us-female.mp3 created\n",
"faster\n",
"../audios/faster-us-male.mp3 created\n",
"../audios/faster-us-female.mp3 created\n",
"actor\n",
"../audios/actor-us-male.mp3 exists, skipping...\n",
"../audios/actor-us-female.mp3 exists, skipping...\n",
"inventor\n",
"../audios/inventor-us-male.mp3 created\n",
"../audios/inventor-us-female.mp3 created\n",
"conductor\n",
"../audios/conductor-us-male.mp3 created\n",
"../audios/conductor-us-female.mp3 created\n",
"artist\n",
"../audios/artist-us-male.mp3 created\n",
"../audios/artist-us-female.mp3 created\n",
"scientist\n",
"../audios/scientist-us-male.mp3 created\n",
"../audios/scientist-us-female.mp3 created\n",
"pianist\n",
"../audios/pianist-us-male.mp3 created\n",
"../audios/pianist-us-female.mp3 created\n",
"celebration\n",
"../audios/celebration-us-male.mp3 exists, skipping...\n",
"../audios/celebration-us-female.mp3 exists, skipping...\n",
"decision\n",
"../audios/decision-us-male.mp3 exists, skipping...\n",
"../audios/decision-us-female.mp3 exists, skipping...\n",
"creation\n",
"../audios/creation-us-male.mp3 created\n",
"../audios/creation-us-female.mp3 created\n",
"education\n",
"../audios/education-us-male.mp3 created\n",
"../audios/education-us-female.mp3 created\n",
"suggestion\n",
"../audios/suggestion-us-male.mp3 created\n",
"../audios/suggestion-us-female.mp3 created\n",
"transportation\n",
"../audios/transportation-us-male.mp3 exists, skipping...\n",
"../audios/transportation-us-female.mp3 exists, skipping...\n",
"admission\n",
"../audios/admission-us-male.mp3 created\n",
"../audios/admission-us-female.mp3 created\n",
"confusion\n",
"../audios/confusion-us-male.mp3 created\n",
"../audios/confusion-us-female.mp3 created\n",
"extension\n",
"../audios/extension-us-male.mp3 created\n",
"../audios/extension-us-female.mp3 created\n",
"dangerous\n",
"../audios/dangerous-us-male.mp3 created\n",
"../audios/dangerous-us-female.mp3 created\n",
"nervous\n",
"../audios/nervous-us-male.mp3 created\n",
"../audios/nervous-us-female.mp3 created\n",
"famous\n",
"../audios/famous-us-male.mp3 exists, skipping...\n",
"../audios/famous-us-female.mp3 exists, skipping...\n",
"active\n",
"../audios/active-us-male.mp3 created\n",
"../audios/active-us-female.mp3 created\n",
"creative\n",
"../audios/creative-us-male.mp3 created\n",
"../audios/creative-us-female.mp3 created\n",
"attractive\n",
"../audios/attractive-us-male.mp3 created\n",
"../audios/attractive-us-female.mp3 created\n",
"artistic\n",
"../audios/artistic-us-male.mp3 created\n",
"../audios/artistic-us-female.mp3 created\n",
"athletic\n",
"../audios/athletic-us-male.mp3 created\n",
"../audios/athletic-us-female.mp3 created\n",
"energetic\n",
"../audios/energetic-us-male.mp3 created\n",
"../audios/energetic-us-female.mp3 created\n",
"reality\n",
"../audios/reality-us-male.mp3 created\n",
"../audios/reality-us-female.mp3 created\n",
"ability\n",
"../audios/ability-us-male.mp3 created\n",
"../audios/ability-us-female.mp3 created\n",
"simplicity\n",
"../audios/simplicity-us-male.mp3 created\n",
"../audios/simplicity-us-female.mp3 created\n",
"performance\n",
"../audios/performance-us-male.mp3 created\n",
"../audios/performance-us-female.mp3 created\n",
"importance\n",
"../audios/importance-us-male.mp3 created\n",
"../audios/importance-us-female.mp3 created\n",
"acceptance\n",
"../audios/acceptance-us-male.mp3 created\n",
"../audios/acceptance-us-female.mp3 created\n",
"difference\n",
"../audios/difference-us-male.mp3 created\n",
"../audios/difference-us-female.mp3 created\n",
"independence\n",
"../audios/independence-us-male.mp3 created\n",
"../audios/independence-us-female.mp3 created\n",
"existence\n",
"../audios/existence-us-male.mp3 created\n",
"../audios/existence-us-female.mp3 created\n",
"aquarium\n",
"../audios/aquarium-us-male.mp3 created\n",
"../audios/aquarium-us-female.mp3 created\n",
"aquatic\n",
"../audios/aquatic-us-male.mp3 created\n",
"../audios/aquatic-us-female.mp3 created\n",
"aqueduct\n",
"../audios/aqueduct-us-male.mp3 created\n",
"../audios/aqueduct-us-female.mp3 created\n",
"audience\n",
"../audios/audience-us-male.mp3 created\n",
"../audios/audience-us-female.mp3 created\n",
"audio\n",
"../audios/audio-us-male.mp3 created\n",
"../audios/audio-us-female.mp3 created\n",
"audition\n",
"../audios/audition-us-male.mp3 created\n",
"../audios/audition-us-female.mp3 created\n",
"benefit\n",
"../audios/benefit-us-male.mp3 created\n",
"../audios/benefit-us-female.mp3 created\n",
"benevolent\n",
"../audios/benevolent-us-male.mp3 created\n",
"../audios/benevolent-us-female.mp3 created\n",
"benefactor\n",
"../audios/benefactor-us-male.mp3 created\n",
"../audios/benefactor-us-female.mp3 created\n",
"century\n",
"../audios/century-us-male.mp3 created\n",
"../audios/century-us-female.mp3 created\n",
"percent\n",
"../audios/percent-us-male.mp3 created\n",
"../audios/percent-us-female.mp3 created\n",
"centennial\n",
"../audios/centennial-us-male.mp3 created\n",
"../audios/centennial-us-female.mp3 created\n",
"dictionary\n",
"../audios/dictionary-us-male.mp3 created\n",
"../audios/dictionary-us-female.mp3 created\n",
"predict\n",
"../audios/predict-us-male.mp3 exists, skipping...\n",
"../audios/predict-us-female.mp3 exists, skipping...\n",
"dictate\n",
"../audios/dictate-us-male.mp3 created\n",
"../audios/dictate-us-female.mp3 created\n",
"conduct\n",
"../audios/conduct-us-male.mp3 created\n",
"../audios/conduct-us-female.mp3 created\n",
"produce\n",
"../audios/produce-us-male.mp3 created\n",
"../audios/produce-us-female.mp3 created\n",
"reduce\n",
"../audios/reduce-us-male.mp3 created\n",
"../audios/reduce-us-female.mp3 created\n",
"fracture\n",
"../audios/fracture-us-male.mp3 created\n",
"../audios/fracture-us-female.mp3 created\n",
"fraction\n",
"../audios/fraction-us-male.mp3 created\n",
"../audios/fraction-us-female.mp3 created\n",
"infraction\n",
"../audios/infraction-us-male.mp3 created\n",
"../audios/infraction-us-female.mp3 created\n",
"project\n",
"../audios/project-us-male.mp3 created\n",
"../audios/project-us-female.mp3 created\n",
"inject\n",
"../audios/inject-us-male.mp3 created\n",
"../audios/inject-us-female.mp3 created\n",
"reject\n",
"../audios/reject-us-male.mp3 created\n",
"../audios/reject-us-female.mp3 created\n",
"judicial\n",
"../audios/judicial-us-male.mp3 created\n",
"../audios/judicial-us-female.mp3 created\n",
"prejudice\n",
"../audios/prejudice-us-male.mp3 created\n",
"../audios/prejudice-us-female.mp3 created\n",
"judgment\n",
"../audios/judgment-us-male.mp3 created\n",
"../audios/judgment-us-female.mp3 created\n",
"malnutrition\n",
"../audios/malnutrition-us-male.mp3 created\n",
"../audios/malnutrition-us-female.mp3 created\n",
"malicious\n",
"../audios/malicious-us-male.mp3 created\n",
"../audios/malicious-us-female.mp3 created\n",
"malfunction\n",
"../audios/malfunction-us-male.mp3 created\n",
"../audios/malfunction-us-female.mp3 created\n",
"maternal\n",
"../audios/maternal-us-male.mp3 created\n",
"../audios/maternal-us-female.mp3 created\n",
"maternity\n",
"../audios/maternity-us-male.mp3 created\n",
"../audios/maternity-us-female.mp3 created\n",
"matriarch\n",
"../audios/matriarch-us-male.mp3 created\n",
"../audios/matriarch-us-female.mp3 created\n",
"transmit\n",
"../audios/transmit-us-male.mp3 created\n",
"../audios/transmit-us-female.mp3 created\n",
"admit\n",
"../audios/admit-us-male.mp3 created\n",
"../audios/admit-us-female.mp3 created\n",
"submit\n",
"../audios/submit-us-male.mp3 created\n",
"../audios/submit-us-female.mp3 created\n",
"mortal\n",
"../audios/mortal-us-male.mp3 created\n",
"../audios/mortal-us-female.mp3 created\n",
"mortician\n",
"../audios/mortician-us-male.mp3 created\n",
"../audios/mortician-us-female.mp3 created\n",
"mortify\n",
"../audios/mortify-us-male.mp3 created\n",
"../audios/mortify-us-female.mp3 created\n",
"multiple\n",
"../audios/multiple-us-male.mp3 created\n",
"../audios/multiple-us-female.mp3 created\n",
"multiply\n",
"../audios/multiply-us-male.mp3 created\n",
"../audios/multiply-us-female.mp3 created\n",
"multinational\n",
"../audios/multinational-us-male.mp3 created\n",
"../audios/multinational-us-female.mp3 created\n",
"pendant\n",
"../audios/pendant-us-male.mp3 created\n",
"../audios/pendant-us-female.mp3 created\n",
"suspend\n",
"../audios/suspend-us-male.mp3 created\n",
"../audios/suspend-us-female.mp3 created\n",
"depend\n",
"../audios/depend-us-male.mp3 created\n",
"../audios/depend-us-female.mp3 created\n",
"transport\n",
"../audios/transport-us-male.mp3 exists, skipping...\n",
"../audios/transport-us-female.mp3 exists, skipping...\n",
"export\n",
"../audios/export-us-male.mp3 created\n",
"../audios/export-us-female.mp3 created\n",
"import\n",
"../audios/import-us-male.mp3 created\n",
"../audios/import-us-female.mp3 created\n",
"describe\n",
"../audios/describe-us-male.mp3 created\n",
"../audios/describe-us-female.mp3 created\n",
"manuscript\n",
"../audios/manuscript-us-male.mp3 created\n",
"../audios/manuscript-us-female.mp3 created\n",
"subscription\n",
"../audios/subscription-us-male.mp3 created\n",
"../audios/subscription-us-female.mp3 created\n",
"section\n",
"../audios/section-us-male.mp3 created\n",
"../audios/section-us-female.mp3 created\n",
"dissect\n",
"../audios/dissect-us-male.mp3 created\n",
"../audios/dissect-us-female.mp3 created\n",
"intersect\n",
"../audios/intersect-us-male.mp3 created\n",
"../audios/intersect-us-female.mp3 created\n",
"sensation\n",
"../audios/sensation-us-male.mp3 created\n",
"../audios/sensation-us-female.mp3 created\n",
"sensitive\n",
"../audios/sensitive-us-male.mp3 created\n",
"../audios/sensitive-us-female.mp3 created\n",
"consent\n",
"../audios/consent-us-male.mp3 created\n",
"../audios/consent-us-female.mp3 created\n",
"inspect\n",
"../audios/inspect-us-male.mp3 created\n",
"../audios/inspect-us-female.mp3 created\n",
"spectator\n",
"../audios/spectator-us-male.mp3 created\n",
"../audios/spectator-us-female.mp3 created\n",
"spectacle\n",
"../audios/spectacle-us-male.mp3 created\n",
"../audios/spectacle-us-female.mp3 created\n",
"construct\n",
"../audios/construct-us-male.mp3 created\n",
"../audios/construct-us-female.mp3 created\n",
"structure\n",
"../audios/structure-us-male.mp3 created\n",
"../audios/structure-us-female.mp3 created\n",
"destruct\n",
"../audios/destruct-us-male.mp3 created\n",
"../audios/destruct-us-female.mp3 created\n",
"telephone\n",
"../audios/telephone-us-male.mp3 created\n",
"../audios/telephone-us-female.mp3 created\n",
"television\n",
"../audios/television-us-male.mp3 created\n",
"../audios/television-us-female.mp3 created\n",
"telegraph\n",
"../audios/telegraph-us-male.mp3 created\n",
"../audios/telegraph-us-female.mp3 created\n",
"terrestrial\n",
"../audios/terrestrial-us-male.mp3 created\n",
"../audios/terrestrial-us-female.mp3 created\n",
"territory\n",
"../audios/territory-us-male.mp3 created\n",
"../audios/territory-us-female.mp3 created\n",
"terrain\n",
"../audios/terrain-us-male.mp3 created\n",
"../audios/terrain-us-female.mp3 created\n",
"vacant\n",
"../audios/vacant-us-male.mp3 created\n",
"../audios/vacant-us-female.mp3 created\n",
"vacuum\n",
"../audios/vacuum-us-male.mp3 created\n",
"../audios/vacuum-us-female.mp3 created\n",
"evacuate\n",
"../audios/evacuate-us-male.mp3 created\n",
"../audios/evacuate-us-female.mp3 created\n",
"video\n",
"../audios/video-us-male.mp3 created\n",
"../audios/video-us-female.mp3 created\n",
"vision\n",
"../audios/vision-us-male.mp3 exists, skipping...\n",
"../audios/vision-us-female.mp3 exists, skipping...\n",
"invisible\n",
"../audios/invisible-us-male.mp3 exists, skipping...\n",
"../audios/invisible-us-female.mp3 exists, skipping...\n",
"\n"
]
}
],
"source": [
"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 = False\n",
"only_us = True\n",
"if only_us:\n",
" voices = voices[:2]\n",
" print(voices)\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.replace(\" \", \"-\")}-{regions[i]}-{genders[i]}.mp3'\n",
" await generate_edge_tts_audio(w, filename, voice=voice, verbose=True, overwrite=False, play=True)\n"
]
}
],
"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.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}