Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"Comprendiendo la clase Interface","local":"understanding-the-interface-class","sections":[{"title":"Cómo crear una Interface","local":"how-to-create-an-interface","sections":[],"depth":2},{"title":"Un ejemplo sencillo con audio","local":"a-simple-example-with-audio","sections":[],"depth":2},{"title":"Manejo de múltiples entradas y salidas","local":"handling-multiple-inputs-and-outputs","sections":[{"title":"El método launch()","local":"the-launch-method","sections":[],"depth":3}],"depth":2},{"title":"✏️ ¡Apliquémoslo!","local":"lets-apply-it","sections":[],"depth":2}],"depth":1}"/> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/entry/start.D4wCRYX6.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/DcQ7sreP.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/BA_dZbsI.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/entry/app.59qebFfG.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/C0jRxzmK.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/DvbUaM1Q.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/DgDM5ZAs.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/DsnmJJEf.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/nodes/0.-8BZhIja.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/C3nIf8Go.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/nodes/46.DmZBAiho.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/DX9wbpOW.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/r2R_RyXK.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/chunks/Khighb8g.js" rel="modulepreload"> | |
| <!--1r0y3gn--><meta name="hf:doc:metadata" content="{"title":"Comprendiendo la clase Interface","local":"understanding-the-interface-class","sections":[{"title":"Cómo crear una Interface","local":"how-to-create-an-interface","sections":[],"depth":2},{"title":"Un ejemplo sencillo con audio","local":"a-simple-example-with-audio","sections":[],"depth":2},{"title":"Manejo de múltiples entradas y salidas","local":"handling-multiple-inputs-and-outputs","sections":[{"title":"El método launch()","local":"the-launch-method","sections":[],"depth":3}],"depth":2},{"title":"✏️ ¡Apliquémoslo!","local":"lets-apply-it","sections":[],"depth":2}],"depth":1}"/><!----> | |
| <link href="/docs/course/pr_1343/es/_app/immutable/assets/0.tn0RQdqM.css" rel="modulepreload"> <!--[--><!--[0--><!--[--><!--[0--><!--[--><p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"><div class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----></span> <span>Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg><!----></button></div> <!--[-1--><!--]--></div><!----> <!--[0--><h1 class="relative group"><a id="understanding-the-interface-class" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#understanding-the-interface-class"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Comprendiendo la clase Interface</span></h1><!--]--><!----> <div class="flex space-x-1 absolute z-10 right-0 top-0"><a href="https://discuss.huggingface.co/t/chapter-9-questions" target="_blank"><img alt="Ask a Question" class="!m-0" src="https://img.shields.io/badge/Ask%20a%20question-ffcb4c.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTEgMTA0IDEwNiI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMyMzFmMjA7fS5jbHMtMntmaWxsOiNmZmY5YWU7fS5jbHMtM3tmaWxsOiMwMGFlZWY7fS5jbHMtNHtmaWxsOiMwMGE5NGY7fS5jbHMtNXtmaWxsOiNmMTVkMjI7fS5jbHMtNntmaWxsOiNlMzFiMjM7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5EaXNjb3Vyc2VfbG9nbzwvdGl0bGU+PGcgaWQ9IkxheWVyXzIiPjxnIGlkPSJMYXllcl8zIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MS44NywwQzIzLjcxLDAsMCwyMi44MywwLDUxYzAsLjkxLDAsNTIuODEsMCw1Mi44MWw1MS44Ni0uMDVjMjguMTYsMCw1MS0yMy43MSw1MS01MS44N1M4MCwwLDUxLjg3LDBaIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNTIuMzcsMTkuNzRBMzEuNjIsMzEuNjIsMCwwLDAsMjQuNTgsNjYuNDFsLTUuNzIsMTguNEwzOS40LDgwLjE3YTMxLjYxLDMxLjYxLDAsMSwwLDEzLTYwLjQzWiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTc3LjQ1LDMyLjEyYTMxLjYsMzEuNiwwLDAsMS0zOC4wNSw0OEwxOC44Niw4NC44MmwyMC45MS0yLjQ3QTMxLjYsMzEuNiwwLDAsMCw3Ny40NSwzMi4xMloiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik03MS42MywyNi4yOUEzMS42LDMxLjYsMCwwLDEsMzguOCw3OEwxOC44Niw4NC44MiwzOS40LDgwLjE3QTMxLjYsMzEuNiwwLDAsMCw3MS42MywyNi4yOVoiLz48cGF0aCBjbGFzcz0iY2xzLTUiIGQ9Ik0yNi40Nyw2Ny4xMWEzMS42MSwzMS42MSwwLDAsMSw1MS0zNUEzMS42MSwzMS42MSwwLDAsMCwyNC41OCw2Ni40MWwtNS43MiwxOC40WiIvPjxwYXRoIGNsYXNzPSJjbHMtNiIgZD0iTTI0LjU4LDY2LjQxQTMxLjYxLDMxLjYxLDAsMCwxLDcxLjYzLDI2LjI5YTMxLjYxLDMxLjYxLDAsMCwwLTQ5LDM5LjYzbC0zLjc2LDE4LjlaIi8+PC9nPjwvZz48L3N2Zz4="/></a><!----> <!--[0--><a href="https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter9/section3.ipynb" target="_blank"><img alt="Open In Colab" class="!m-0" src="https://colab.research.google.com/assets/colab-badge.svg"/></a><!--]--> <!--[0--><a href="https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter9/section3.ipynb" target="_blank"><img alt="Open In Studio Lab" class="!m-0" src="https://studiolab.sagemaker.aws/studiolab.svg"/></a><!--]--></div><!----> <p>En esta sección examinaremos más de cerca la clase <code>Interface</code> y comprenderemos los parámetros principales utilizados para crear una.</p> <!--[1--><h2 class="relative group"><a id="how-to-create-an-interface" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#how-to-create-an-interface"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Cómo crear una Interface</span></h2><!--]--><!----> <p>Notarás que la clase <code>Interface</code> tiene 3 parámetros obligatorios:</p> <p><code>Interface(fn, inputs, outputs, ...)</code></p> <p>Estos parámetros son:</p> <ul><li><code>fn</code>: la función de predicción que envuelve la interfaz de Gradio. Esta función puede tomar uno o más parámetros y devolver uno o más valores.</li> <li><code>inputs</code>: el tipo o tipos de componentes de entrada. Gradio proporciona muchos componentes prediseñados como <code>"image"</code> o <code>"mic"</code>.</li> <li><code>outputs</code>: el tipo o tipos de componentes de salida. De nuevo, Gradio proporciona muchos componentes prediseñados, por ejemplo <code>"image"</code> o <code>"label"</code>.</li></ul> <p>Para obtener una lista completa de componentes, <a href="https://gradio.app/docs" rel="nofollow">consulta la documentación de Gradio</a>. Cada componente prediseñado se puede personalizar instanciando la clase correspondiente al componente.</p> <p>Por ejemplo, como vimos en la <a href="/course/chapter9/2">sección anterior</a>, en lugar de pasar <code>"textbox"</code> al parámetro <code>inputs</code>, puedes pasar un componente <code>Textbox(lines=7, label="Prompt")</code> para crear un cuadro de texto con 7 líneas y una etiqueta.</p> <p>Veamos otro ejemplo, esta vez con un componente <code>Audio</code>.</p> <!--[1--><h2 class="relative group"><a id="a-simple-example-with-audio" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#a-simple-example-with-audio"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Un ejemplo sencillo con audio</span></h2><!--]--><!----> <p>Como mencionamos anteriormente, Gradio ofrece muchas entradas y salidas diferentes. | |
| Así que construyamos una <code>Interface</code> que trabaje con audio.</p> <p>En este ejemplo, construiremos una función de audio a audio que toma un archivo de audio y simplemente lo invierte.</p> <p>Utilizaremos el componente <code>Audio</code> para la entrada. Al usar el componente <code>Audio</code>, puedes especificar si deseas que la fuente (<code>source</code>) del audio sea un archivo que el usuario suba o un micrófono con el que el usuario grabe su voz. En este caso, configurémoslo como <code>"microphone"</code>. Por diversión, añadiremos una etiqueta a nuestro <code>Audio</code> que diga “Speak here…“.</p> <p>Además, nos gustaría recibir el audio como un arreglo de NumPy para poder “invertirlo” fácilmente. Por lo tanto, estableceremos el <code>"type"</code> en <code>"numpy"</code>, lo que pasa los datos de entrada como una tupla de (<code>sample_rate</code>, <code>data</code>) a nuestra función.</p> <p>También utilizaremos el componente de salida <code>Audio</code>, que puede renderizar automáticamente una tupla con una tasa de muestreo y un arreglo de NumPy como un archivo de audio reproducible. En este caso, no necesitamos hacer ninguna personalización, por lo que usaremos el atajo de cadena <code>"audio"</code>.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> Copied</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">reverse_audio</span>(<span class="hljs-params">audio</span>): | |
| sr, data = audio | |
| reversed_audio = (sr, np.flipud(data)) | |
| <span class="hljs-keyword">return</span> reversed_audio | |
| mic = gr.Audio(source=<span class="hljs-string">"microphone"</span>, <span class="hljs-built_in">type</span>=<span class="hljs-string">"numpy"</span>, label=<span class="hljs-string">"Speak here..."</span>) | |
| gr.Interface(reverse_audio, mic, <span class="hljs-string">"audio"</span>).launch()<!----></pre></div><!----> <p>El código anterior producirá una interfaz como la siguiente (si tu navegador no te pide permisos de micrófono, <a href="https://huggingface.co/spaces/course-demos/audio-reverse" target="_blank">abre la demo en una pestaña separada</a>).</p> <iframe src="https://course-demos-audio-reverse.hf.space" frameborder="0" height="250" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> <p>¡Ahora deberías poder grabar tu voz y escucharte hablando al revés: espeluznante 👻!</p> <!--[1--><h2 class="relative group"><a id="handling-multiple-inputs-and-outputs" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#handling-multiple-inputs-and-outputs"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Manejo de múltiples entradas y salidas</span></h2><!--]--><!----> <p>Supongamos que tenemos una función más compleja, con múltiples entradas y salidas. | |
| En el siguiente ejemplo, tenemos una función que toma un índice desplegable, un valor de control deslizante y un número, y devuelve una muestra de audio de un tono musical.</p> <p>Observa cómo pasamos una lista de componentes de entrada y salida, y comprueba si puedes seguir lo que está sucediendo.</p> <p>La clave aquí es que cuando pasas:</p> <ul><li>una lista de componentes de entrada, cada componente corresponde a un parámetro en orden.</li> <li>una lista de componentes de salida, cada componente corresponde a un valor retornado.</li></ul> <p>El siguiente fragmento de código muestra cómo se alinean tres componentes de entrada con los tres argumentos de la función <code>generate_tone()</code>:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> Copied</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr | |
| notes = [<span class="hljs-string">"C"</span>, <span class="hljs-string">"C#"</span>, <span class="hljs-string">"D"</span>, <span class="hljs-string">"D#"</span>, <span class="hljs-string">"E"</span>, <span class="hljs-string">"F"</span>, <span class="hljs-string">"F#"</span>, <span class="hljs-string">"G"</span>, <span class="hljs-string">"G#"</span>, <span class="hljs-string">"A"</span>, <span class="hljs-string">"A#"</span>, <span class="hljs-string">"B"</span>] | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">generate_tone</span>(<span class="hljs-params">note, octave, duration</span>): | |
| sr = <span class="hljs-number">48000</span> | |
| a4_freq, tones_from_a4 = <span class="hljs-number">440</span>, <span class="hljs-number">12</span> * (octave - <span class="hljs-number">4</span>) + (note - <span class="hljs-number">9</span>) | |
| frequency = a4_freq * <span class="hljs-number">2</span> ** (tones_from_a4 / <span class="hljs-number">12</span>) | |
| duration = <span class="hljs-built_in">int</span>(duration) | |
| audio = np.linspace(<span class="hljs-number">0</span>, duration, duration * sr) | |
| audio = (<span class="hljs-number">20000</span> * np.sin(audio * (<span class="hljs-number">2</span> * np.pi * frequency))).astype(np.int16) | |
| <span class="hljs-keyword">return</span> (sr, audio) | |
| gr.Interface( | |
| generate_tone, | |
| [ | |
| gr.Dropdown(notes, <span class="hljs-built_in">type</span>=<span class="hljs-string">"index"</span>), | |
| gr.Slider(minimum=<span class="hljs-number">4</span>, maximum=<span class="hljs-number">6</span>, step=<span class="hljs-number">1</span>), | |
| gr.Number(value=<span class="hljs-number">1</span>, label=<span class="hljs-string">"Duration in seconds"</span>), | |
| ], | |
| <span class="hljs-string">"audio"</span>, | |
| ).launch()<!----></pre></div><!----> <iframe src="https://course-demos-generate-tone.hf.space" frameborder="0" height="450" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> <!--[2--><h3 class="relative group"><a id="the-launch-method" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#the-launch-method"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>El método launch()</span></h3><!--]--><!----> <p>Hasta ahora, hemos utilizado el método <code>launch()</code> para iniciar la interfaz, pero no hemos profundizado en lo que hace realmente.</p> <p>Por defecto, el método <code>launch()</code> iniciará la demo en un servidor web que se ejecuta localmente. Si estás ejecutando tu código en un notebook de Jupyter o Colab, Gradio incrustará la GUI de la demo en el notebook para que puedas usarla fácilmente.</p> <p>Puedes personalizar el comportamiento de <code>launch()</code> mediante diferentes parámetros:</p> <ul><li><code>inline</code> - si se debe mostrar la interfaz integrada en notebooks de Python.</li> <li><code>inbrowser</code> - si se debe abrir automáticamente la interfaz en una nueva pestaña del navegador predeterminado.</li> <li><code>share</code> - si se debe crear un enlace públicamente compartible desde tu computadora para la interfaz. ¡Algo así como un enlace de Google Drive!</li></ul> <p>¡Cubriremos el parámetro <code>share</code> con mucho más detalle en la siguiente sección!</p> <!--[1--><h2 class="relative group"><a id="lets-apply-it" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#lets-apply-it"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>✏️ ¡Apliquémoslo!</span></h2><!--]--><!----> <p>Construyamos una interfaz que te permita hacer una demo de un modelo de <strong>reconocimiento de voz</strong> (<em>speech recognition</em>). | |
| Para hacerlo interesante, aceptaremos <em>tanto</em> una entrada de micrófono como un archivo subido.</p> <p>Como de costumbre, cargaremos nuestro modelo de reconocimiento de voz utilizando la función <code>pipeline()</code> de 🤗 Transformers. | |
| Si necesitas un repaso rápido, puedes volver a <a href="/course/chapter1/3">esa sección en el Capítulo 1</a>. A continuación, implementaremos una función <code>transcribe_audio()</code> que procese el audio y devuelva la transcripción. Finalmente, envolveremos esta función en una <code>Interface</code> con el componente <code>Audio</code> para las entradas y simplemente texto para la salida. En conjunto, el código para esta aplicación es el siguiente:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> Copied</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline | |
| <span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr | |
| model = pipeline(<span class="hljs-string">"automatic-speech-recognition"</span>) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">transcribe_audio</span>(<span class="hljs-params">audio</span>): | |
| transcription = model(audio)[<span class="hljs-string">"text"</span>] | |
| <span class="hljs-keyword">return</span> transcription | |
| gr.Interface( | |
| fn=transcribe_audio, | |
| inputs=gr.Audio(<span class="hljs-built_in">type</span>=<span class="hljs-string">"filepath"</span>), | |
| outputs=<span class="hljs-string">"text"</span>, | |
| ).launch()<!----></pre></div><!----> <p>Si tu navegador no te pide permisos de micrófono, <a href="https://huggingface.co/spaces/course-demos/audio-reverse" target="_blank">abre la demo en una pestaña separada</a>.</p> <iframe src="https://course-demos-asr.hf.space" frameborder="0" height="550" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> <p>¡Eso es todo! Ahora puedes usar esta interfaz para transcribir audio. Observa que al pasar el parámetro <code>optional</code> como <code>True</code>, permitimos al usuario proporcionar un micrófono o un archivo de audio (o ninguno, pero eso devolverá un mensaje de error).</p> <p>¡Sigue adelante para ver cómo compartir tu interfaz con los demás!</p> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/course/blob/main/chapters/es/chapter9/3.mdx" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg><!----> <span><span class="underline">Update</span> on GitHub</span></a><!----> <p></p><!--]--><!----><!--]--><!--]--><!--]--> <!--[-1--><!--]--><!--]--> | |
| <script> | |
| { | |
| __sveltekit_ll1x5r = { | |
| base: "/docs/course/pr_1343/es", | |
| assets: "/docs/course/pr_1343/es" | |
| }; | |
| const element = document.currentScript.parentElement; | |
| Promise.all([ | |
| import("/docs/course/pr_1343/es/_app/immutable/entry/start.D4wCRYX6.js"), | |
| import("/docs/course/pr_1343/es/_app/immutable/entry/app.59qebFfG.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 46], | |
| data: [null,null], | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 31.3 kB
- Xet hash:
- f17d5a068bc91ccc7f2db97927fa3b54a115886327bdfc16f3dfa33ef480ec9d
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.