{"id":2429,"date":"2023-11-19T00:15:12","date_gmt":"2023-11-18T23:15:12","guid":{"rendered":"https:\/\/theroamingworkshop.cloud\/b\/?p=2429"},"modified":"2024-02-01T18:55:09","modified_gmt":"2024-02-01T17:55:09","slug":"%f0%9f%90%b8coqui-ai-tts-ultra-rapida-generacion-y-clonacion-de-voz-a-partir-de-texto-multilenguaje","status":"publish","type":"post","link":"https:\/\/theroamingworkshop.cloud\/b\/2429\/%f0%9f%90%b8coqui-ai-tts-ultra-rapida-generacion-y-clonacion-de-voz-a-partir-de-texto-multilenguaje\/","title":{"rendered":"\ud83d\udc38Coqui-AI\/TTS: ultra r\u00e1pida generaci\u00f3n y clonaci\u00f3n de voz a partir de texto multilenguaje"},"content":{"rendered":"\n<p>Hace unos meses tra\u00eda el repositorio TorToiSe-TTS que facilitaba much\u00edsmo la generaci\u00f3n de voz a partir de texto, aunque solo se dispon\u00eda de modelos en ingl\u00e9s. <\/p>\n\n\n\n<p><a href=\"https:\/\/theroamingworkshop.cloud\/b\/2066\/%f0%9f%90%a2tortoise-tts-generacion-de-voz-a-partir-de-texto-con-ia\/\">https:\/\/theroamingworkshop.cloud\/b\/2066<\/a><\/p>\n\n\n\n<p>Pero el mundo de la IA avanza tan r\u00e1pido, que hoy os traigo una evoluci\u00f3n que desbanca por completo al anterior post, con generaci\u00f3n de voces complejas en cuesti\u00f3n de segundos y multilenguaje: <strong>Coqui-AI TTS<\/strong>.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/coqui-ai\/TTS\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/coqui-ai\/TTS<\/a><\/p>\n\n\n\n<div id=\"menu\" style=\"padding:20px 20px 20px 20px; border-left:2px solid darkgrey;\">\n<p style=\"font-weight:bold;\">Contenido<\/p>\n<\/div>\n<script>\nvar text;\nvar element;\n\nfunction fillmenu(){\n\nfor (let i=0; i<window.document.getElementsByTagName(\"h2\").length; i++){\nelement = window.document.getElementsByTagName(\"h2\")[i];\ntext = \"\u25b9 \"+element.innerHTML;\nvar newelement = document.createElement(\"a\");\nnewelement.innerHTML=text;\nvar postid=window.document.getElementsByTagName(\"article\")[0].id;\nvar url = \"https:\/\/theroamingworkshop.cloud\/b\/?p=\"+postid.substr(5,postid.length)+\"#\"+element.id;\nnewelement.setAttribute(\"href\", url);\nnewelement.appendChild(document.createElement(\"br\"));\nwindow.document.getElementById(\"menu\").appendChild(newelement);\n}\n}\n\nif(window.location.href.includes(\"tag\")){\n\n}else{\nwindow.setTimeout(fillmenu,2000);\n}\n\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"version-web\">Versi\u00f3n web<\/h2>\n\n\n\n<p>Si tienes prisa y no quieres liarte, puedes usar el espacio gratuito de huggingface, y tendr\u00e1s tu clonaci\u00f3n de voz en pocos segundos:<\/p>\n\n\n\n<p><a href=\"https:\/\/huggingface.co\/spaces\/coqui\/xtts\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/huggingface.co\/spaces\/coqui\/xtts<\/a><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Escribe el texto a generar<\/li>\n\n\n\n<li>Selecciona el idioma<\/li>\n\n\n\n<li>Sube tu fichero de referencia<\/li>\n\n\n\n<li>Configura el resto de opciones (marca las casillas: Cleanup Reference Voice, Do not use language auto-detect, Agree)<\/li>\n\n\n\n<li>Solicita tu clonaci\u00f3n al servidor (Send)<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"instalacion\">Instalaci\u00f3n<\/h2>\n\n\n\n<p>En cuanto a la instalaci\u00f3n local:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Necesitar\u00e1s <strong>python<\/strong> &gt; 3.9, &lt; 3.12.<\/li>\n\n\n\n<li>RAM: no necesita tanta como para generaci\u00f3n de im\u00e1genes. <strong>4GB<\/strong> deber\u00edan bastar.<\/li>\n\n\n\n<li>Crea una carpeta para el proyecto, por ejemplo \"text-2-speech\". Usando un terminal de Linux:<br><kbd>mkdir text-2-speech<\/kbd><\/li>\n\n\n\n<li>Es conveniente crear un entorno de python espec\u00edfico para evitar incompatibilidad de paquetes, para lo que debes instalar el paquete <strong>python3-venv<\/strong>. Yo crear\u00e9 el entorno TTSenv:<br><kbd>cd text-2-speech<\/kbd><br><kbd>python3 -m venv TTSenv<\/kbd><\/li>\n\n\n\n<li>Activa el entorno en el terminal:<br><kbd>source TTSenv\/bin\/activate<\/kbd><\/li>\n\n\n\n<li>Si solo necesitas generaci\u00f3n de voz (sin clonaci\u00f3n ni entrenamiento), instala directamente TTS en python:<br><kbd>pip install TTS<\/kbd><\/li>\n\n\n\n<li>Sin embargo, yo instalar\u00e9 el repositorio completo de <strong>Coqui-AI TTS<\/strong>:<br><kbd>git clone https:\/\/github.com\/coqui-ai\/TTS<\/kbd><br><kbd>cd TTS<\/kbd><br><kbd>pip install -e .[all<\/kbd>]<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Comprobaci\u00f3n de modelos de lenguaje y voces<\/h2>\n\n\n\n<p>Lo primero que puedes hacer es comprobar los modelos disponibles para transformar tu texto a voz en distintos idiomas.<\/p>\n\n\n\n<p>En el terminal escribe lo siguiente:<\/p>\n\n\n\n<p><kbd>tts --list_models<\/kbd><\/p>\n\n\n\n<p style=\"width:100%;height:200px;overflow-y:visible;overflow-x:hidden;background-color:lightgrey;padding:5px 5px 5px 5px;\"><code style=\"background-color:transparent\">\nNo API token found for \ud83d\udc38Coqui Studio voices - https:\/\/coqui.ai \n<br>Visit \ud83d\udd17https:\/\/app.coqui.ai\/account to get one.\n<br>Set it as an environment variable `export COQUI_STUDIO_TOKEN=<token>`\n<br>\n<br>\n<br> Name format: type\/language\/dataset\/model\n<br> 1: tts_models\/multilingual\/multi-dataset\/xtts_v2 [already downloaded]\n<br> 2: tts_models\/multilingual\/multi-dataset\/xtts_v1.1 [already downloaded]\n<br> 3: tts_models\/multilingual\/multi-dataset\/your_tts\n<br> 4: tts_models\/multilingual\/multi-dataset\/bark [already downloaded]\n<br> 5: tts_models\/bg\/cv\/vits\n<br> 6: tts_models\/cs\/cv\/vits\n<br> 7: tts_models\/da\/cv\/vits\n<br> 8: tts_models\/et\/cv\/vits\n<br> 9: tts_models\/ga\/cv\/vits\n<br> 10: tts_models\/en\/ek1\/tacotron2\n<br> 11: tts_models\/en\/ljspeech\/tacotron2-DDC\n<br> 12: tts_models\/en\/ljspeech\/tacotron2-DDC_ph\n<br> 13: tts_models\/en\/ljspeech\/glow-tts\n<br> 14: tts_models\/en\/ljspeech\/speedy-speech\n<br> 15: tts_models\/en\/ljspeech\/tacotron2-DCA\n<br> 16: tts_models\/en\/ljspeech\/vits\n<br> 17: tts_models\/en\/ljspeech\/vits--neon\n<br> 18: tts_models\/en\/ljspeech\/fast_pitch\n<br> 19: tts_models\/en\/ljspeech\/overflow\n<br> 20: tts_models\/en\/ljspeech\/neural_hmm\n<br> 21: tts_models\/en\/vctk\/vits\n<br> 22: tts_models\/en\/vctk\/fast_pitch\n<br> 23: tts_models\/en\/sam\/tacotron-DDC\n<br> 24: tts_models\/en\/blizzard2013\/capacitron-t2-c50\n<br> 25: tts_models\/en\/blizzard2013\/capacitron-t2-c150_v2\n<br> 26: tts_models\/en\/multi-dataset\/tortoise-v2\n<br> 27: tts_models\/en\/jenny\/jenny\n<br> 28: tts_models\/es\/mai\/tacotron2-DDC [already downloaded]\n<br> 29: tts_models\/es\/css10\/vits [already downloaded]\n<br> 30: tts_models\/fr\/mai\/tacotron2-DDC\n<br> 31: tts_models\/fr\/css10\/vits\n<br> 32: tts_models\/uk\/mai\/glow-tts\n<br> 33: tts_models\/uk\/mai\/vits\n<br> 34: tts_models\/zh-CN\/baker\/tacotron2-DDC-GST\n<br> 35: tts_models\/nl\/mai\/tacotron2-DDC\n<br> 36: tts_models\/nl\/css10\/vits\n<br> 37: tts_models\/de\/thorsten\/tacotron2-DCA\n<br> 38: tts_models\/de\/thorsten\/vits\n<br> 39: tts_models\/de\/thorsten\/tacotron2-DDC\n<br> 40: tts_models\/de\/css10\/vits-neon\n<br> 41: tts_models\/ja\/kokoro\/tacotron2-DDC\n<br> 42: tts_models\/tr\/common-voice\/glow-tts\n<br> 43: tts_models\/it\/mai_female\/glow-tts\n<br> 44: tts_models\/it\/mai_female\/vits\n<br> 45: tts_models\/it\/mai_male\/glow-tts\n<br> 46: tts_models\/it\/mai_male\/vits\n<br> 47: tts_models\/ewe\/openbible\/vits\n<br> 48: tts_models\/hau\/openbible\/vits\n<br> 49: tts_models\/lin\/openbible\/vits\n<br> 50: tts_models\/tw_akuapem\/openbible\/vits\n<br> 51: tts_models\/tw_asante\/openbible\/vits\n<br> 52: tts_models\/yor\/openbible\/vits\n<br> 53: tts_models\/hu\/css10\/vits\n<br> 54: tts_models\/el\/cv\/vits\n<br> 55: tts_models\/fi\/css10\/vits\n<br> 56: tts_models\/hr\/cv\/vits\n<br> 57: tts_models\/lt\/cv\/vits\n<br> 58: tts_models\/lv\/cv\/vits\n<br> 59: tts_models\/mt\/cv\/vits\n<br> 60: tts_models\/pl\/mai_female\/vits\n<br> 61: tts_models\/pt\/cv\/vits\n<br> 62: tts_models\/ro\/cv\/vits\n<br> 63: tts_models\/sk\/cv\/vits\n<br> 64: tts_models\/sl\/cv\/vits\n<br> 65: tts_models\/sv\/cv\/vits\n<br> 66: tts_models\/ca\/custom\/vits\n<br> 67: tts_models\/fa\/custom\/glow-tts\n<br> 68: tts_models\/bn\/custom\/vits-male\n<br> 69: tts_models\/bn\/custom\/vits-female\n<br> 70: tts_models\/be\/common-voice\/glow-tts\n<br>\n<br> Name format: type\/language\/dataset\/model\n<br> 1: vocoder_models\/universal\/libri-tts\/wavegrad\n<br> 2: vocoder_models\/universal\/libri-tts\/fullband-melgan [already downloaded]\n<br> 3: vocoder_models\/en\/ek1\/wavegrad\n<br> 4: vocoder_models\/en\/ljspeech\/multiband-melgan\n<br> 5: vocoder_models\/en\/ljspeech\/hifigan_v2\n<br> 6: vocoder_models\/en\/ljspeech\/univnet\n<br> 7: vocoder_models\/en\/blizzard2013\/hifigan_v2\n<br> 8: vocoder_models\/en\/vctk\/hifigan_v2\n<br> 9: vocoder_models\/en\/sam\/hifigan_v2\n<br> 10: vocoder_models\/nl\/mai\/parallel-wavegan\n<br> 11: vocoder_models\/de\/thorsten\/wavegrad\n<br> 12: vocoder_models\/de\/thorsten\/fullband-melgan\n<br> 13: vocoder_models\/de\/thorsten\/hifigan_v1\n<br> 14: vocoder_models\/ja\/kokoro\/hifigan_v1\n<br> 15: vocoder_models\/uk\/mai\/multiband-melgan\n<br> 16: vocoder_models\/tr\/common-voice\/hifigan\n<br> 17: vocoder_models\/be\/common-voice\/hifigan\n\n<br> Name format: type\/language\/dataset\/model\n<br> 1: voice_conversion_models\/multilingual\/vctk\/freevc24 [already downloaded]\n<\/code><\/p>\n\n\n\n<p>O f\u00edltralo seg\u00fan tu idioma con <strong>grep<\/strong>, por ejemplo para espa\u00f1ol:<\/p>\n\n\n\n<p><kbd>tts --list_models | grep \"\/es\"<\/kbd><\/p>\n\n\n\n<p style=\"width:100%;height:50px;overflow-y:visible;overflow-x:hidden;background-color:lightgrey;padding:5px 5px 5px 5px;\"><code style=\"background-color:transparent\">\n 28: tts_models\/es\/mai\/tacotron2-DDC [already downloaded]\n<br> 29: tts_models\/es\/css10\/vits [already downloaded]\n<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"texto-a-voz\">Texto a voz<\/h2>\n\n\n\n<p>Con esto ya puedes generar voz a partir de texto en cuesti\u00f3n de segundos y en el idioma que prefieras.<\/p>\n\n\n\n<p>En el terminal, escribe lo siguiente, especificando el modelo adecuado:<\/p>\n\n\n\n<p><kbd><kbd>tts --text \"Ahora puedo hablar en espa\u00f1ol!\" --model_name \"tts_models\/es\/css10\/vits\" --out_path output\/tts-es.wav<\/kbd><\/kbd><\/p>\n\n\n\n<p>Aseg\u00farate de que el directorio de salida existe, y de que eliges el nombre dle modelo correto. La primera vez se descargar\u00e1n los archivos necesarios y deber\u00e1s aceptar la licencia de Coqui-AI. Despu\u00e9s la generaci\u00f3n se realiza en cuesti\u00f3n de segundos:<\/p>\n\n\n\n<iframe style=\"border:0; width:100%;height:250px\" src=\"https:\/\/theroamingworkshop.cloud\/aM\/tts-es.php\"><\/iframe>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"clonacion\">Clonaci\u00f3n de voz<\/h2>\n\n\n\n<p>Por \u00faltimo, lo realmente impresionante de este modelo es la clonaci\u00f3n de voz a partir de unos pocos segundos de grabaci\u00f3n de audio.<\/p>\n\n\n\n<p>Igual que en el post anterior, yo he tomado unos 30 segundos de la voz de Ultr\u00f3n de escenas de la pel\u00edcula <em>Los Vengadores: la era de Ultr\u00f3n<\/em>.<\/p>\n\n\n\n<p>Muestra en espa\u00f1ol:<\/p>\n\n\n\n<iframe style=\"border:0; width:100%;height:250px\" src=\"https:\/\/theroamingworkshop.cloud\/aM\/ultron-es.php\"><\/iframe>\n\n\n\n<p>Muestra en ingl\u00e9s:<\/p>\n\n\n\n<iframe style=\"border:0; width:100%;height:250px\" src=\"https:\/\/theroamingworkshop.cloud\/aM\/ultron-en.php\"><\/iframe>\n\n\n\n<p>Ahora, preparamos un script de python donde parametrizaremos todo lo necesario, que a grandes rasgos har\u00e1 lo siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Importar torch y TTS<br><kbd>import torch<br>from TTS.api import TTS<\/kbd><\/li>\n\n\n\n<li>Definir dispositivo de memoria (cuda o cpu). Con usar cpu sobra. Cuda puede petar.<br><kbd>device=\"cpu\"<\/kbd><\/li>\n\n\n\n<li>Definir el texto a generar.<br><kbd>txt=\"Voz generada a partir de texto\"<\/kbd><\/li>\n\n\n\n<li>Definir la muestra de audio de referencia (archivos .wav de unos 30 segundos)<br><kbd>sample=\"\/voice-folder\/voice.wav\"<\/kbd><\/li>\n\n\n\n<li>Llamada al modelo TTS<br><kbd>tts1=TTS(\"model_name\").to(device)<\/kbd><\/li>\n\n\n\n<li>Creaci\u00f3n del fichero<br><kbd>tts1.tts_to_file(txt, speaker_wav=sample, language=\"es\", file_path=\"output-folder\/output-file.wav\")<\/kbd><\/li>\n<\/ul>\n\n\n\n<p>Yo lo he llamado <strong>TRW-clone.py<\/strong> y queda as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import torch\nfrom TTS.api import TTS\n\n# Get device ('cuda' or 'cpu')\ndevice=\"cpu\"\n\n#Define text\ntxt=\"Bienvenido a este nuevo art\u00edculo del blog. Disfruta de tu visita.\"\n#txt=\"Welcome to this new block post... Enjoy your visit!\"\n\n#Define audio sample\nsample=\"..\/my-voices\/ultron-es\/mix.wav\"\n#sample=\"..\/my-voices\/ultron-en\/mix.wav\"\n\n#Run cloning\ntts1 = TTS(\"tts_models\/multilingual\/multi-dataset\/xtts_v2\").to(device)\n\ntts1.tts_to_file(txt, speaker_wav=sample, language=\"es\", file_path=\"..\/output\/ultron-es.wav\")<\/code><\/pre>\n\n\n\n<p>Ejec\u00fatalo desde la carpeta TTS donde se encuentra el repositorio completo:<\/p>\n\n\n\n<p><kbd>cd TTS<br>python3 TRW-clone.py<\/kbd><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"resultados\">Resultados<\/h2>\n\n\n\n<p>Aqu\u00ed te dejo los resultados obtenidos en mis primeras pruebas.<\/p>\n\n\n\n<p>Espa\u00f1ol:<\/p>\n\n\n\n<iframe style=\"border:0; width:100%;height:250px\" src=\"https:\/\/theroamingworkshop.cloud\/aM\/ultron-es2.php\"><\/iframe>\n\n\n\n<p>Ingl\u00e9s:<\/p>\n\n\n\n<iframe style=\"border:0; width:100%;height:250px\" src=\"https:\/\/theroamingworkshop.cloud\/aM\/ultron-en2.php\"><\/iframe>\n\n\n\n<p>Con un par de iteraciones podr\u00e1s obtener resultados realmente espectaculares.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"804\" style=\"aspect-ratio: 1920 \/ 804;\" width=\"1920\" controls src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2023\/11\/Ultron-TTS.mp4\"><\/video><\/figure>\n\n\n\n<p>Cualquier duda o comentario a\u00fan la puedes dejar en <strong>Twitter\/X<\/strong><\/p>\n\n\n\n<p>\ud83d\udc26 <code><a rel=\"noreferrer noopener\" href=\"https:\/\/twitter.com\/roamingworkshop\" target=\"_blank\">@RoamingWorkshop<\/a><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace unos meses tra\u00eda el repositorio TorToiSe-TTS que facilitaba much\u00edsmo la generaci\u00f3n de voz a partir de texto, aunque solo se dispon\u00eda de modelos en ingl\u00e9s. https:\/\/theroamingworkshop.cloud\/b\/2066 Pero el mundo de la IA avanza tan r\u00e1pido, que hoy os traigo una evoluci\u00f3n que desbanca por completo al anterior post, con generaci\u00f3n de voces complejas en [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2423,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[590,45],"tags":[335,325,337,323,319,321,327,329,331,333],"class_list":["post-2429","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ia","category-programas","tag-ai","tag-artifitial-intelligence","tag-ia","tag-inteligencia-artificial","tag-text-to-speech","tag-texto-a-voz","tag-tortoise","tag-tts","tag-voces","tag-voices","post-preview"],"_links":{"self":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/2429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/comments?post=2429"}],"version-history":[{"count":9,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/2429\/revisions"}],"predecessor-version":[{"id":2589,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/2429\/revisions\/2589"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media\/2423"}],"wp:attachment":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media?parent=2429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/categories?post=2429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/tags?post=2429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}