1256 lines
87 KiB
Plaintext
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
|
|
}
|