{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "code", "source": [ "!pip install edge-tts\n", "!pip install gradio\n", "!pip install asyncio\n", "!git clone https://github.com/hinaichigo-fox/rus-edge-tts-webui.git" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yV2b2V2vH896", "outputId": "c279c37c-3310-4e83-f823-4e78555271ae" }, "execution_count": 3, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: edge-tts in /usr/local/lib/python3.10/dist-packages (6.1.8)\n", "Requirement already satisfied: aiohttp>=3.8.0 in /usr/local/lib/python3.10/dist-packages (from edge-tts) (3.8.5)\n", "Requirement already satisfied: certifi==2023.07.22 in /usr/local/lib/python3.10/dist-packages (from edge-tts) (2023.7.22)\n", "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp>=3.8.0->edge-tts) (23.1.0)\n", "Requirement already satisfied: charset-normalizer<4.0,>=2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp>=3.8.0->edge-tts) (3.2.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp>=3.8.0->edge-tts) (6.0.4)\n", "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /usr/local/lib/python3.10/dist-packages (from aiohttp>=3.8.0->edge-tts) (4.0.3)\n", "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp>=3.8.0->edge-tts) (1.9.2)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp>=3.8.0->edge-tts) (1.4.0)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp>=3.8.0->edge-tts) (1.3.1)\n", "Requirement already satisfied: idna>=2.0 in /usr/local/lib/python3.10/dist-packages (from yarl<2.0,>=1.0->aiohttp>=3.8.0->edge-tts) (3.4)\n", "Requirement already satisfied: gradio in /usr/local/lib/python3.10/dist-packages (3.43.2)\n", "Requirement already satisfied: aiofiles<24.0,>=22.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (23.2.1)\n", "Requirement already satisfied: altair<6.0,>=4.2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.2.2)\n", "Requirement already satisfied: fastapi in /usr/local/lib/python3.10/dist-packages (from gradio) (0.103.1)\n", "Requirement already satisfied: ffmpy in /usr/local/lib/python3.10/dist-packages (from gradio) (0.3.1)\n", "Requirement already satisfied: gradio-client==0.5.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.5.0)\n", "Requirement already satisfied: httpx in /usr/local/lib/python3.10/dist-packages (from gradio) (0.24.1)\n", "Requirement already satisfied: huggingface-hub>=0.14.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.16.4)\n", "Requirement already satisfied: importlib-resources<7.0,>=1.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.0.1)\n", "Requirement already satisfied: jinja2<4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.1.2)\n", "Requirement already satisfied: markupsafe~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.1.3)\n", "Requirement already satisfied: matplotlib~=3.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.7.1)\n", "Requirement already satisfied: numpy~=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (1.23.5)\n", "Requirement already satisfied: orjson~=3.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.9.7)\n", "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from gradio) (23.1)\n", "Requirement already satisfied: pandas<3.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (1.5.3)\n", "Requirement already satisfied: pillow<11.0,>=8.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (9.4.0)\n", "Requirement already satisfied: pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,<3.0.0,>=1.7.4 in /usr/local/lib/python3.10/dist-packages (from gradio) (1.10.12)\n", "Requirement already satisfied: pydub in /usr/local/lib/python3.10/dist-packages (from gradio) (0.25.1)\n", "Requirement already satisfied: python-multipart in /usr/local/lib/python3.10/dist-packages (from gradio) (0.0.6)\n", "Requirement already satisfied: pyyaml<7.0,>=5.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.0.1)\n", "Requirement already satisfied: requests~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.31.0)\n", "Requirement already satisfied: semantic-version~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.10.0)\n", "Requirement already satisfied: typing-extensions~=4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.5.0)\n", "Requirement already satisfied: uvicorn>=0.14.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.23.2)\n", "Requirement already satisfied: websockets<12.0,>=10.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (11.0.3)\n", "Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from gradio-client==0.5.0->gradio) (2023.6.0)\n", "Requirement already satisfied: entrypoints in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (0.4)\n", "Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (4.19.0)\n", "Requirement already satisfied: toolz in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (0.12.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.14.0->gradio) (3.12.2)\n", "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.14.0->gradio) (4.66.1)\n", "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.1.0)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (0.11.0)\n", "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (4.42.1)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.4.5)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (3.1.1)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (2.8.2)\n", "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3.0,>=1.0->gradio) (2023.3.post1)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests~=2.0->gradio) (3.2.0)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests~=2.0->gradio) (3.4)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests~=2.0->gradio) (2.0.4)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests~=2.0->gradio) (2023.7.22)\n", "Requirement already satisfied: click>=7.0 in /usr/local/lib/python3.10/dist-packages (from uvicorn>=0.14.0->gradio) (8.1.7)\n", "Requirement already satisfied: h11>=0.8 in /usr/local/lib/python3.10/dist-packages (from uvicorn>=0.14.0->gradio) (0.14.0)\n", "Requirement already satisfied: anyio<4.0.0,>=3.7.1 in /usr/local/lib/python3.10/dist-packages (from fastapi->gradio) (3.7.1)\n", "Requirement already satisfied: starlette<0.28.0,>=0.27.0 in /usr/local/lib/python3.10/dist-packages (from fastapi->gradio) (0.27.0)\n", "Requirement already satisfied: httpcore<0.18.0,>=0.15.0 in /usr/local/lib/python3.10/dist-packages (from httpx->gradio) (0.17.3)\n", "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from httpx->gradio) (1.3.0)\n", "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<4.0.0,>=3.7.1->fastapi->gradio) (1.1.3)\n", "Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (23.1.0)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (2023.7.1)\n", "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.30.2)\n", "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.10.2)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio) (1.16.0)\n", "Requirement already satisfied: asyncio in /usr/local/lib/python3.10/dist-packages (3.4.3)\n", "Cloning into 'rus-edge-tts-webui'...\n", "remote: Enumerating objects: 39, done.\u001b[K\n", "remote: Counting objects: 100% (39/39), done.\u001b[K\n", "remote: Compressing objects: 100% (37/37), done.\u001b[K\n", "remote: Total 39 (delta 16), reused 0 (delta 0), pack-reused 0\u001b[K\n", "Receiving objects: 100% (39/39), 9.08 MiB | 14.64 MiB/s, done.\n", "Resolving deltas: 100% (16/16), done.\n" ] } ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 591 }, "id": "hsOlLAjoH8O_", "outputId": "775fa791-4c89-4563-97cf-6cb95a271c04" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Colab notebook detected. To show errors in colab notebook, set debug=True in launch()\n", "Running on public URL: https://129c5d18926c205c8c.gradio.live\n", "\n", "This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "
" ] }, "metadata": {} } ], "source": [ "import gradio as gr\n", "import edge_tts\n", "import asyncio\n", "import os\n", "# https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list?trustedclienttoken=6A5AA1D4EAFF4E9FB37E23D68491D6F4 - там голоса брать. думаю поймете. ShortName короче\n", "SUPPORTED_VOICES = {\n", " 'DmitryNeural-Руский(муж.)': 'ru-RU-DmitryNeural',\n", " 'SvetlanaNeural-Русский(жен.)': 'ru-RU-SvetlanaNeural',\n", " 'OstapNeural-Украинский(муж.)': 'uk-UA-OstapNeural',\n", " 'PolinaNeural-Украинский(жен.)': 'uk-UA-PolinaNeural'\n", "}\n", "\n", "# Смена голоса\n", "def changeVoice(voices):\n", " example = SUPPORTED_VOICES[voices]\n", " example_file = os.path.join(os.path.dirname(__file__), \"example/\"+example+\".wav\")\n", " return example_file\n", "\n", "# Преобразование текста в речь\n", "async def textToSpeech(text, voices, rate, volume):\n", " output_file = \"output.mp3\"\n", " voices = SUPPORTED_VOICES[voices]\n", " if (rate >= 0):\n", " rates = rate = \"+\" + str(rate) + \"%\"\n", " else:\n", " rates = str(rate) + \"%\"\n", " if (volume >= 0):\n", " volumes = \"+\" + str(volume) + \"%\"\n", " else:\n", " volumes = str(volume) + \"%\"\n", " communicate = edge_tts.Communicate(text,\n", " voices,\n", " rate=rates,\n", " volume=volumes,\n", " proxy=None)\n", " await communicate.save(output_file)\n", " audio_file = os.path.join(os.path.dirname(__file__), \"output.mp3\")\n", " if (os.path.exists(audio_file)):\n", " return audio_file\n", " else:\n", " raise gr.Error(\"Преобразование не удалось!\")\n", " return FileNotFoundError\n", "\n", "\n", "# Сбросить результат конвертации\n", "def clearSpeech():\n", " output_file = os.path.join(os.path.dirname(__file__), \"output.mp3\")\n", " if (os.path.exists(output_file)):\n", " os.remove(output_file)\n", " return None, None\n", "\n", "\n", "with gr.Blocks(css=\"style.css\", title=\"Преобразование текста в речь\") as demo:\n", " gr.Markdown(\"\"\"\n", " # Преобразование текста в речь через Microsoft Edge\n", " \"\"\")\n", " with gr.Row():\n", " with gr.Column():\n", " text = gr.TextArea(label=\"Текст\", elem_classes=\"text-area\")\n", " btn = gr.Button(\"Сгенерировать\", elem_id=\"submit-btn\")\n", " with gr.Column():\n", " voices = gr.Dropdown(choices=[\n", " \"DmitryNeural-Руский(муж.)\", \"SvetlanaNeural-Русский(жен.)\", \"OstapNeural-Украинский(муж.)\", \"PolinaNeural-Украинский(жен.)\"\n", " ],\n", " value=\"DmitryNeural-Руский(муж.)\",\n", " label=\"Голос\",\n", " info=\"Пожалуйста, выберите голос\",\n", " interactive=True)\n", "\n", " example = gr.Audio(label=\"Пример голоса\",\n", " value=\"/content/rus-edge-tts-webui/example/ru-RU-DmitryNeural.wav\",\n", " interactive=False,\n", " elem_classes=\"example\")\n", "\n", " voices.change(fn=changeVoice,inputs=voices,outputs=example)\n", " rate = gr.Slider(-100,\n", " 100,\n", " step=1,\n", " value=0,\n", " label=\"Увеличение / уменьшение скорости речи\",\n", " info=\"Скорость речи быстрее / медленнее\",\n", " interactive=True)\n", "\n", " volume = gr.Slider(-100,\n", " 100,\n", " step=1,\n", " value=0,\n", " label=\"Увеличение / уменьшение громкости звука\",\n", " info=\"Увеличить / уменьшить громкость звука\",\n", " interactive=True)\n", " audio = gr.Audio(label=\"Результат\",\n", " interactive=False,\n", " elem_classes=\"audio\")\n", " btn.click(fn=textToSpeech,\n", " inputs=[text, voices, rate, volume],\n", " outputs=[audio])\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch(share=True)\n" ] } ] }