10. Haz que tu asistente hable

 https://docs.google.com/presentation/d/e/2PACX-1vTHAFRd6DI8h9_5SuA-ScwG28zy0CM7BxtMoks6vtUlj4v53h6xvaoB_oO7_ZducNACQ5FBXU6xzE74/pub?start=false&loop=false&delayms=3000

10. Haz que tu Asistente Hable - La "Boca" de tu Asistente

Explicación para principiantes:
¡Es momento de darle voz a tu asistente! En esta lección vamos a transformar el texto en voz hablada. Imagina que hasta ahora tu asistente era como una persona sorda que solo podía leer lo que escribías. Ahora le vamos a dar la capacidad de responderte hablando, como Siri o Alexa.

Objetivo de esta lección:

  • Instalar y configurar pyttsx3 (motor de texto a voz)

  • Hacer que el asistente diga cualquier texto

  • Entender el flujo básico de síntesis de voz

  • Prepararse para personalizar la voz

Analogía:
pyttsx3 es como un sintetizador vocal o un cantante robótico. Tú le das la letra (texto) y él la canta (habla) usando diferentes voces y estilos.


📦 Paso 1: Instalar la Librería pyttsx3

¿Qué es pyttsx3?

Es una librería Python que convierte texto en voz usando los motores de síntesis de voz que ya tiene tu computadora. No necesita internet y es completamente gratuita.

Comando de instalación:

bash

# Abre la Terminal/CMD y escribe:

pip install pyttsx3

python -m pip show pyttsx3

Proceso visual de instalación:

text

Terminal → pip install pyttsx3 → Descarga → Instala → ✅ Listo!

   💻          📦 pyttsx3         ⬇️ Internet   🔧 Sistema   ✅

Verificación de instalación:

bash

# Verifica que se instaló correctamente

pip show pyttsx3

Deberías ver algo como:

text

Name: pyttsx3

Version: 2.90

Summary: Text to Speech (TTS) library...


Tutorial de pyttsx3 – Texto a Voz en Python

🔧 Requisito previo

Instala la librería:

bash
pip install pyttsx3

 Tutorial Completo: Texto a Voz con pyttsx3

Paso 1: Instalación de la biblioteca

bash
pip install pyttsx3

Este comando instala la biblioteca pyttsx3 en tu sistema.

Paso 2: Configuración inicial (archivo 1)

python
import speech_recognition as sr
import pyttsx3

listener = sr.Recognizer()

Nota: En tu imagen aparece "port speech_recognition as sr" - debe ser "import". También "recognizer()" debe ser "Recognizer()" con mayúscula.

Paso 3: Primer ejemplo de síntesis de voz

python
import pyttsx3

# Inicializar el motor de texto a voz
engine = pyttsx3.init()

# Decir "Hola"
engine.say("Hola")
engine.runAndWait()

Línea por línea:

  1. import pyttsx3:

    • Importa la biblioteca pyttsx3, que es un motor de texto a voz (text-to-speech) offline

    • Funciona sin conexión a internet, a diferencia de otros servicios como Google Text-to-Speech

  2. engine = pyttsx3.init():

    • Inicializa el motor de síntesis de voz

    • Crea una instancia del objeto engine que usaremos para controlar la voz

    • Detecta automáticamente los controladores de voz disponibles en tu sistema (SAPI5 en Windows, nsss en Mac, espeak en Linux)

  3. engine.say("Hola"):

    • Añade el texto "Hola" a la cola de reproducción (queue)

    • No reproduce el audio inmediatamente, solo lo encola

    • Puedes encadenar múltiples say() y se reproducirán en orden

  4. engine.runAndWait():

    • Procesa TODOS los textos encolados y los reproduce

    • BLOQUEA la ejecución del programa hasta que termine de hablar

    • Vacía la cola de reproducción después de hablar


¿Por qué debe ir engine.runAndWait() después de engine.say()?

Imagina que es como un restaurante:

  • engine.say("Hola") = Haces un pedido al camarero (lo añades a la comanda)

  • engine.runAndWait() = El cocinero cocina y te sirven la comida

Si solo hicieras el pedido (say) pero no le dijeras al cocinero que cocine (runAndWait), te quedarías con hambre (el programa terminaría sin hablar).

Ejemplo visual del flujo:

python
# Sin runAndWait():
engine.say("Hola")      # "Hola" se añade a la cola (pero no se reproduce)
# El programa termina aquí sin hablar ❌

# Con runAndWait():
engine.say("Hola")      # "Hola" se añade a la cola
engine.say("Mundo")     # "Mundo" se añade a la cola (detrás de "Hola")
engine.runAndWait()     # Reproduce: "Hola... Mundo" y espera a terminar ✅
print("Ya terminé de hablar")  # Esto se ejecuta DESPUÉS de runAndWait()


Paso 4: Segundo ejemplo - frase más larga

python
import pyttsx3

# Inicializar el motor de texto a voz
engine = pyttsx3.init()

# Decir "Hola como estas?"
engine.say("Hola como estas?")
engine.runAndWait()

📝 Explicación Detallada

¿Qué hace cada parte?

  1. import pyttsx3: Importa la biblioteca que convierte texto en voz.

  2. engine = pyttsx3.init():

    • Inicializa el motor de texto a voz

    • Prepara el sistema para sintetizar voz

  3. engine.say("texto"):

    • Añade texto a la cola de reproducción

    • Puedes encadenar varios mensajes

  4. engine.runAndWait():

    • Ejecuta la síntesis de voz

    • Espera a que termine de hablar antes de continuar

********************************

Programa Completo con Mejoras

Aquí te muestro un ejemplo más completo con funcionalidades adicionales:

python
import pyttsx3

class AsistenteVoz:
    def __init__(self):
        # Inicializar el motor
        self.engine = pyttsx3.init()
        
        # Configurar propiedades de voz
        self.configurar_voz()
    
    def configurar_voz(self):
        """Configurar velocidad y volumen de la voz"""
        # Obtener y configurar velocidad
        velocidad = self.engine.getProperty('rate')
        self.engine.setProperty('rate', 150)  # Velocidad normal
        
        # Configurar volumen
        volumen = self.engine.getProperty('volume')
        self.engine.setProperty('volume', 0.9)  # 90% de volumen
    
    def hablar(self, texto):
        """Convertir texto a voz"""
        print(f"🔊 Diciendo: {texto}")
        self.engine.say(texto)
        self.engine.runAndWait()
    
    def listar_voces(self):
        """Mostrar todas las voces disponibles"""
        voces = self.engine.getProperty('voices')
        for i, voz in enumerate(voces):
            print(f"Voz {i}: {voz.name} - {voz.languages}")

# Ejemplo de uso
if __name__ == "__main__":
    asistente = AsistenteVoz()
    
    # Listar voces disponibles
    print("📋 Voces disponibles:")
    asistente.listar_voces()
    
    # Probar diferentes mensajes
    mensajes = [
        "Hola, soy un asistente de voz",
        "Estoy usando pyttsx3 en Python",
        "Puedo hablar español y otros idiomas"
    ]
    
    for mensaje in mensajes:
        asistente.hablar(mensaje)

🔧 Funciones Útiles Adicionales

python
import pyttsx3

engine = pyttsx3.init()

# Cambiar la velocidad (rate)
rate = engine.getProperty('rate')
engine.setProperty('rate', rate - 50)  # Más lento
# engine.setProperty('rate', rate + 50)  # Más rápido

# Cambiar el volumen
volume = engine.getProperty('volume')
engine.setProperty('volume', volume - 0.25)  # Bajar volumen

# Cambiar la voz (si hay múltiples instaladas)
voices = engine.getProperty('voices')
if len(voices) > 1:
    engine.setProperty('voice', voices[1].id)  # Usar segunda voz disponible

# Ejemplo completo
engine.say("Este mensaje tiene velocidad y volumen personalizados")
engine.runAndWait()

✅ Verificación de Instalación

Para verificar que todo funciona correctamente:

python
import pyttsx3

try:
    engine = pyttsx3.init()
    engine.say("Instalación exitosa")
    engine.runAndWait()
    print("✅ pyttsx3 funciona correctamente")
except Exception as e:
    print(f"❌ Error: {e}")

📌 Notas Importantes

  • Windows: pyttsx3 usa SAPI5 (funciona sin configuración adicional)

  • Linux: Puede requerir espeak o festival instalado

  • macOS: Usa NSSpeechSynthesizer

🔧 Paso 2: Importar y Configurar pyttsx3

Código básico:

python

# Importar la librería

import pyttsx3


# Inicializar el motor de voz

engine = pyttsx3.init()


# Hacer que hable

engine.say("Hola, soy tu asistente virtual")

engine.runAndWait()  # ⚠️ IMPORTANTE: Esto hace que espere a terminar de hablar

Explicación línea por línea:

python

# 1. Importamos la herramienta

import pyttsx3

#    ↑ Trae la "fábrica de voces" a nuestro proyecto


# 2. Encendemos el motor

engine = pyttsx3.init()

#    ↑ Inicializa el motor como cuando enciendes un auto


# 3. Le damos el texto a decir

engine.say("Texto a decir")

#    ↑ Como darle una partitura a un cantante


# 4. Esperamos a que termine

engine.runAndWait()

#    ↑ Como decir "espera a terminar la canción antes de hacer algo más"

⚠️ Error común: Olvidar runAndWait()

python

# ❌ INCORRECTO (no se escuchará nada):

engine.say("Hola")

# Falta: engine.runAndWait()


# ✅ CORRECTO:

engine.say("Hola")

engine.runAndWait()  # ¡Esto es esencial!


🎯 Paso 3: Tu Primer Programa que Habla

Versión mínima funcional:

python

"""

MI PRIMER ASISTENTE QUE HABLA

Versión 1.0 - Solo saluda

"""


import pyttsx3


# 1. Inicializar el motor de voz

print("🔧 Inicializando motor de voz...")

motor_voz = pyttsx3.init()


# 2. Saludar

print("🎤 El asistente va a hablar...")

motor_voz.say("¡Hola! Soy tu nuevo asistente virtual.")

motor_voz.say("Es un placer conocerte.")

motor_voz.say("¿En qué puedo ayudarte hoy?")


# 3. Ejecutar (esto hace que realmente hable)

motor_voz.runAndWait()


print("✅ El asistente terminó de hablar")

Versión interactiva:

python

"""

ASISTENTE CONVERSACIONAL BÁSICO

Versión 2.0 - Pregunta y responde

"""


import pyttsx3


def asistente_hablador():

    """Función principal del asistente"""

    

    # Configurar motor

    engine = pyttsx3.init()

    

    # Diálogo de bienvenida

    engine.say("¡Hola humano!")

    engine.say("Soy Alex, tu asistente virtual.")

    engine.say("Voy a hacerte algunas preguntas.")

    engine.runAndWait()

    

    # Pregunta 1

    respuesta1 = input("¿Cómo te llamas? ")

    engine.say(f"Mucho gusto {respuesta1}")

    engine.say("Ese es un nombre muy bonito")

    engine.runAndWait()

    

    # Pregunta 2

    respuesta2 = input("¿Cuál es tu color favorito? ")

    engine.say(f"Interesante, el {respuesta2} es un color muy bonito")

    engine.say("A mí me gusta el azul, como el cielo")

    engine.runAndWait()

    

    # Despedida

    engine.say(f"Fue un placer conocerte {respuesta1}")

    engine.say("Hasta la próxima")

    engine.runAndWait()


# Ejecutar el asistente

if __name__ == "__main__":

    asistente_hablador()


🔄 Paso 4: Entender Cómo Funciona pyttsx3 Internamente

Flujo de texto a voz:

text

Tu texto → pyttsx3 → Motor TTS → Voz digital → Parlantes

   📝        📦      🎵 SAPI5     🔢 010101      🔊

Motores disponibles en Windows:

  1. SAPI5 (Windows) - El más común

  2. nsss (macOS)

  3. espeak (Linux)

Visualización del proceso:

python

# Lo que tú escribes:

engine.say("Hola mundo")


# Lo que hace pyttsx3 internamente:

1. Recibe "Hola mundo"

2. Divide en palabras: ["Hola", "mundo"]

3. Convierte a fonemas (sonidos): /'ola 'mundo/

4. Sintetiza audio digital

5. Envía a los parlantes


🎮 Prácticas Interactivas

Ejercicio 1: Asistente Contador

python

import pyttsx3

import time


def contador_voz():

    """Asistente que cuenta en voz alta"""

    engine = pyttsx3.init()

    

    print("🔢 Iniciando conteo...")

    

    for i in range(1, 6):  # Del 1 al 5

        engine.say(f"{i}")

        print(f"🎤 Diciendo: {i}")

        engine.runAndWait()

        time.sleep(0.5)  # Espera medio segundo

    

    engine.say("¡Conteo completado!")

    engine.runAndWait()


contador_voz()

Ejercicio 2: Lector de Texto Personalizado

python

import pyttsx3


def lector_personalizado():

    """Lee cualquier texto que escribas"""

    engine = pyttsx3.init()

    

    print("📖 LECTOR DE TEXTO A VOZ")

    print("=" * 30)

    

    while True:

        texto = input("\nEscribe lo que quieres que diga (o 'salir' para terminar): ")

        

        if texto.lower() == 'salir':

            engine.say("Hasta luego, fue un placer leer para ti")

            engine.runAndWait()

            break

        

        print(f"🎤 Leyendo: {texto}")

        engine.say(texto)

        engine.runAndWait()


lector_personalizado()

Ejercicio 3: Asistente de Tareas

python

import pyttsx3


def asistente_tareas():

    """Asistente que anuncia tareas"""

    engine = pyttsx3.init()

    

    tareas = []

    

    engine.say("Bienvenido al asistente de tareas")

    engine.runAndWait()

    

    while True:

        print("\n📋 Menú:")

        print("1. Agregar tarea")

        print("2. Escuchar tareas")

        print("3. Salir")

        

        opcion = input("Selecciona una opción: ")

        

        if opcion == "1":

            tarea = input("Escribe la tarea: ")

            tareas.append(tarea)

            engine.say(f"Tarea agregada: {tarea}")

            engine.runAndWait()

            

        elif opcion == "2":

            if tareas:

                engine.say(f"Tienes {len(tareas)} tareas pendientes")

                for i, tarea in enumerate(tareas, 1):

                    engine.say(f"Tarea {i}: {tarea}")

                engine.runAndWait()

            else:

                engine.say("No tienes tareas pendientes")

                engine.runAndWait()

                

        elif opcion == "3":

            engine.say("Adiós, que tengas un buen día")

            engine.runAndWait()

            break


asistente_tareas()


🐛 Paso 5: Solución de Problemas Comunes

Problema 1: "El código se ejecuta pero no se escucha nada"

Posibles causas y soluciones:

  1. Volumen del sistema bajo:

  2. python

# Verifica el volumen del motor

engine = pyttsx3.init()

volumen = engine.getProperty('volume')

print(f"Volumen actual: {volumen}")  # Debería ser > 0.5


# Ajusta el volumen

  1. engine.setProperty('volume', 1.0)  # Máximo volumen

  2. Parlantes/audífonos no conectados:

    • Verifica la conexión física

    • Prueba con otro programa (YouTube, Spotify)

  3. runAndWait() olvidado:

  4. python

# ❌ MAL

engine.say("Hola")

# Se necesita engine.runAndWait()


# ✅ BIEN

engine.say("Hola")

  1. engine.runAndWait()

Problema 2: "La voz está en inglés (u otro idioma)"

Solución temporal (la configuraremos mejor en la siguiente lección):

python

import pyttsx3


engine = pyttsx3.init()


# Ver qué voces tienes instaladas

voces = engine.getProperty('voices')

print("Voces disponibles:")

for i, voz in enumerate(voces):

    print(f"{i}: {voz.name} - {voz.id}")


# Probar con diferentes voces

for i in range(len(voces)):

    engine.setProperty('voice', voces[i].id)

    engine.say(f"Probando voz número {i}")

    engine.runAndWait()


📊 Diagrama de Flujo Completo

text

┌─────────────────────────────────────────────────┐

│          INICIO DEL PROGRAMA                    │

├─────────────────────────────────────────────────┤

│ 1. import pyttsx3                               │

│    ↓                                            │

│ 2. engine = pyttsx3.init()                      │

│    ↓                                            │

│ 3. Preparar texto para decir                    │

│    engine.say("Texto")                          │

│    ↓                                            │

│ 4. Ejecutar síntesis de voz                     │

│    engine.runAndWait()                          │

│    ↓                                            │

│ 5. Texto → Fonemas → Audio → Parlantes          │

│    📝     →  🎵    →  🔊   →   🔊               │

└─────────────────────────────────────────────────┘


🚀 Proyecto Integrado: Asistente de Bienvenida Mejorado

python

"""

ASISTENTE DE BIENVENIDA COMPLETO

Combina entrada de usuario con respuesta hablada

"""


import pyttsx3

import time


class AsistenteVoz:

    def __init__(self, nombre="Alex"):

        """Inicializa el asistente con un nombre"""

        self.nombre = nombre

        self.engine = pyttsx3.init()

        print(f"✅ Asistente {self.nombre} inicializado")

    

    def hablar(self, texto, imprimir=True):

        """Hace que el asistente hable un texto"""

        if imprimir:

            print(f"🤖 {self.nombre}: {texto}")

        

        self.engine.say(texto)

        self.engine.runAndWait()

    

    def presentacion(self):

        """Presentación completa del asistente"""

        self.hablar(f"Hola, soy {self.nombre}, tu asistente virtual")

        time.sleep(0.5)

        self.hablar("Fui creado para ayudarte con diversas tareas")

        time.sleep(0.5)

        self.hablar("Puedo decirte la hora, el clima, hacer cálculos y mucho más")

        time.sleep(0.5)

        self.hablar("¿En qué puedo ayudarte hoy?")

    

    def conversacion_interactiva(self):

        """Conversación básica con el usuario"""

        # Saludo

        self.presentacion()

        

        # Pregunta nombre

        nombre_usuario = input("\n👤 Tu nombre: ")

        self.hablar(f"Mucho gusto {nombre_usuario}")

        

        # Pregunta edad

        try:

            edad = int(input(f"👤 {nombre_usuario}, ¿cuántos años tienes? "))

            if edad < 0 or edad > 120:

                self.hablar("Esa edad no parece correcta, pero te creo")

            elif edad < 18:

                self.hablar("Eres muy joven, ¡disfruta tu juventud!")

            elif edad < 30:

                self.hablar("Estás en la mejor etapa de la vida")

            else:

                self.hablar("La edad es solo un número, lo importante es cómo te sientes")

        except:

            self.hablar("No entendí tu edad, pero no importa")

        

        # Despedida

        self.hablar(f"Fue un placer conocerte {nombre_usuario}")

        self.hablar("Espero poder ayudarte pronto. ¡Adiós!")


# Uso del asistente

if __name__ == "__main__":

    print("=" * 50)

    print("       ASISTENTE VIRTUAL - VERSIÓN VOZ")

    print("=" * 50)

    

    # Crear asistente (puedes cambiar el nombre)

    mi_asistente = AsistenteVoz(nombre="Jarvis")

    

    # Iniciar conversación

    mi_asistente.conversacion_interactiva()


📝 Resumen de Comandos Esenciales

Comando

Qué hace

Ejemplo

pyttsx3.init()

Inicializa el motor de voz

engine = pyttsx3.init()

engine.say(texto)

Prepara texto para hablar

engine.say("Hola")

engine.runAndWait()

Ejecuta y espera a terminar

engine.runAndWait()

engine.getProperty()

Obtiene configuración actual

vol = engine.getProperty('volume')

engine.setProperty()

Cambia configuración

engine.setProperty('volume', 0.8)


🎯 Buenas Prácticas

  1. Siempre usar runAndWait() después de say()

  2. Manejar errores con try-except

  3. Controlar el ritmo con time.sleep() entre frases

  4. Probar diferentes voces para encontrar la mejor

  5. Ajustar velocidad y volumen para mejor comprensión

python

# Ejemplo de buenas prácticas

import pyttsx3

import time


engine = pyttsx3.init()


# Configuración recomendada

engine.setProperty('rate', 180)      # Velocidad moderada

engine.setProperty('volume', 0.9)    # Volumen alto


# Hablar con pausas naturales

engine.say("Hola")

engine.runAndWait()

time.sleep(0.3)  # Pequeña pausa


engine.say("¿Cómo estás?")

engine.runAndWait()


❓ Cuestionario de Repaso

Pregunta 1:

¿Qué comando es ESENCIAL para que realmente se escuche la voz después de engine.say()?

  • A) engine.speak()

  • B) engine.runAndWait()

  • C) engine.execute()

  • D) engine.talk()

Respuesta correcta: B
Explicación: runAndWait() procesa el texto en cola y hace que el asistente hable. Sin esto, el texto se prepara pero no se pronuncia.


Pregunta 2:

¿Cuál es el propósito de pyttsx3.init()?

  • A) Instalar la librería

  • B) Inicializar el motor de síntesis de voz

  • C) Configurar el micrófono

  • D) Descargar voces de internet

Respuesta correcta: B
Explicación: init() crea una instancia del motor de texto a voz que usaremos para todas las operaciones de habla.


Pregunta 3:

Si tu asistente habla en inglés pero quieres que hable en español, ¿qué deberías hacer primero?

  • A) Cambiar el idioma del sistema operativo

  • B) Verificar qué voces tienes instaladas con engine.getProperty('voices')

  • C) Reinstalar Python

  • D) Usar internet para descargar una voz nueva

Respuesta correcta: B
Explicación: Debes ver qué voces tienes disponibles en tu sistema. Windows suele tener voces en varios idiomas instaladas.


Pregunta 4:

¿Qué sucede si haces esto?

python

engine.say("Hola")

engine.say("¿Cómo estás?")

engine.runAndWait()

  • A) Solo dice "Hola"

  • B) Solo dice "¿Cómo estás?"

  • C) Dice ambas frases, una después de la otra

  • D) No dice nada

Respuesta correcta: C
Explicación: say() añade texto a una cola, y runAndWait() procesa toda la cola en orden.


Pregunta 5:

¿Por qué es útil añadir time.sleep(0.5) entre frases?

  • A) Para hacer el programa más lento

  • B) Para dar pausas naturales en el habla

  • C) Para ahorrar batería

  • D) Para evitar errores

Respuesta correcta: B
Explicación: Pequeñas pausas entre frases hacen que el habla suene más natural, como cuando una persona habla.


Pregunta 6 (Bonus):

¿Qué ventaja tiene pyttsx3 sobre servicios de texto a voz en la nube (como Google TTS)?

  • A) Es más rápido

  • B) Funciona sin conexión a internet

  • C) Tiene voces más realistas

  • D) Es completamente gratuito sin límites

Respuesta correcta: B
Explicación: pyttsx3 usa los motores locales de tu computadora, por lo que no necesita internet. Los servicios en la nube requieren conexión.


✅ ¡Lo Lograste!

Tu asistente ahora puede:

  1. ✅ Hablar cualquier texto que le indiques

  2. ✅ Mantener conversaciones básicas

  3. ✅ Responder a entradas del usuario

  4. ✅ Ser personalizado con diferentes nombres

Problema conocido: La voz puede sonar robótica o en otro idioma. ¡No te preocupes! En la siguiente lección (11. Ajustes de Voz) aprenderemos a:

  • Cambiar entre voces disponibles

  • Ajustar velocidad y volumen

  • Configurar el idioma correcto

  • Hacer que suene más natural

📌 Tarea práctica: Crea un asistente que:

  1. Te salude por la mañana/tarde/noche según la hora

  2. Pregunte por tu estado de ánimo

  3. Recomiende una actividad basada en tu respuesta

  4. Se despida amablemente

🎉 ¡Tu asistente ya tiene voz propia!


https://www.youtube.com/watch?v=Pj9KbAKpQyk

https://www.youtube.com/watch?v=-0tIy8wWtzE

https://www.youtube.com/watch?v=YqSSId7xfwU

https://www.youtube.com/watch?v=MjK-j7YJ5YI


https://www.youtube.com/watch?v=l2G8-iQYfoA



https://www.youtube.com/watch?v=t-YO0XeHczU


Comentarios

Entradas más populares de este blog

1-7. Transforma tu audio a texto

8. NUEVO - Solución si tu micrófono no está captando tu audio