10. Haz que tu asistente hable
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 pyttsx3Proceso 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:
pip install pyttsx3
pip install pyttsx3Tutorial Completo: Texto a Voz con pyttsx3
Paso 1: Instalación de la biblioteca
pip install pyttsx3
pip install pyttsx3Este comando instala la biblioteca pyttsx3 en tu sistema.
Paso 2: Configuración inicial (archivo 1)
import speech_recognition as sr
import pyttsx3
listener = sr.Recognizer()
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
import pyttsx3
# Inicializar el motor de texto a voz
engine = pyttsx3.init()
# Decir "Hola"
engine.say("Hola")
engine.runAndWait()
import pyttsx3 # Inicializar el motor de texto a voz engine = pyttsx3.init() # Decir "Hola" engine.say("Hola") engine.runAndWait()
Línea por línea:
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
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)
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
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
import pyttsx3:
Importa la biblioteca
pyttsx3, que es un motor de texto a voz (text-to-speech) offlineFunciona sin conexión a internet, a diferencia de otros servicios como Google Text-to-Speech
engine = pyttsx3.init():
Inicializa el motor de síntesis de voz
Crea una instancia del objeto
engineque usaremos para controlar la vozDetecta automáticamente los controladores de voz disponibles en tu sistema (SAPI5 en Windows, nsss en Mac, espeak en Linux)
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
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).
engine.say("Hola") = Haces un pedido al camarero (lo añades a la comanda)
engine.runAndWait() = El cocinero cocina y te sirven la comida
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:
# 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()
# 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
import pyttsx3
# Inicializar el motor de texto a voz
engine = pyttsx3.init()
# Decir "Hola como estas?"
engine.say("Hola como estas?")
engine.runAndWait()
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?
import pyttsx3: Importa la biblioteca que convierte texto en voz.
engine = pyttsx3.init():
Inicializa el motor de texto a voz
Prepara el sistema para sintetizar voz
engine.say("texto"):
Añade texto a la cola de reproducción
Puedes encadenar varios mensajes
engine.runAndWait():
Ejecuta la síntesis de voz
Espera a que termine de hablar antes de continuar
import pyttsx3: Importa la biblioteca que convierte texto en voz.
engine = pyttsx3.init():
Inicializa el motor de texto a voz
Prepara el sistema para sintetizar voz
engine.say("texto"):
Añade texto a la cola de reproducción
Puedes encadenar varios mensajes
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:
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
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()
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:
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
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:
SAPI5 (Windows) - El más común
nsss (macOS)
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:
Volumen del sistema bajo:
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
engine.setProperty('volume', 1.0) # Máximo volumen
Parlantes/audífonos no conectados:
Verifica la conexión física
Prueba con otro programa (YouTube, Spotify)
runAndWait() olvidado:
python
# ❌ MAL
engine.say("Hola")
# Se necesita engine.runAndWait()
# ✅ BIEN
engine.say("Hola")
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
🎯 Buenas Prácticas
Siempre usar runAndWait() después de say()
Manejar errores con try-except
Controlar el ritmo con time.sleep() entre frases
Probar diferentes voces para encontrar la mejor
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:
✅ Hablar cualquier texto que le indiques
✅ Mantener conversaciones básicas
✅ Responder a entradas del usuario
✅ 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:
Te salude por la mañana/tarde/noche según la hora
Pregunte por tu estado de ánimo
Recomiende una actividad basada en tu respuesta
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
Publicar un comentario