Una voz sintetica en español que lee los encabezados de google noticias Mexico.
Google noticias es un excelente lugar para obtener información de noticias relevantes y recientes, debido a que dichas noticias son de diversas fuentes como: Diario noticias, Excelsior, El universal, entre otras. Este programa obtiene los encabezados de las noticias de google por medio de web scarping y hace el fraseo (parsing) del archivo xml. Cuando obtiene los encabezados, los pone en una lista y los manda al sintetizador de voz de Google para obtener los archivos de sonido de la conversión de texto a voz. En seguida pregunta al usuario si quiere escuchar los audios.
Cuando se realiza web scarping se debe evitar saturar el servidor al que se esté accsesando (enviando a cada instante la requisición de información de este) de lo contrario podrían bloquearnos. Este programa esta diseñado para correrse una sola vez, el programa intentará obtener la información del servidor (Google noticias de México), pero si está saturado o caído, esperará 10 minutos antes de volver a intentarlo. Si falla, esta vez esperara el doble (20 minutos), si falla de nuevo, espera el doble (40 minutos), de esta forma no se satura el servidor y se elimina la posibilidad de que nos bloqueen.
Una vez teniendo los titulares. estos se dividen en grupos de 4 para mandar menos texto al sintetizador de Google, debido a que solo permite como máximo 100 caracteres por sintetización.
Este programa fue probado en python 3.8. Para correr este programa necesitas las librerías: bs4, lxml ,gtts , pyautogui y playsound. Se instala fácilmente con pip.
SUGERENCIA: Puedes poner este programa en el folder "startup" (en windows). En la PC de mi trabajo hise esto para enterarme de las noticias más relevantes al prender la computadora.
En el programa están comentadas casi todas las lineas de código para que se entienda lo que sucede.
Recientemente gtts fallo debido a una actualizacion. se arregla corriendo en una terminal/Linea de comandos los siguiente:
python -m pip install --upgrade gtts
python -m pip install --upgrade gtts-token
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
#------------------------------------------------------
# Desarrollado por Carlos Alberto rodriguez Martinez
# http://mecatroncharly.blogspot.com/p/blog-page.html
#
# Este es un programa que obtiene las noticias
# desde google noticias Mexico y sintetiza el texto
# a voz.
#------------------------------------------------------
import gtts
from os import getcwd, listdir, path, remove
from pyautogui import alert, confirm
from playsound import playsound
from time import sleep
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.error import URLError
#-------------------------------------------------
# Variables
#-------------------------------------------------
news_url="https://news.google.com.mx/news/rss" #pagina de noticias
T_waitWeb = 600 # 10 minutos (600) segundos para pedir acceso al servidor
T_waitTTS = 15 # 15 segundos en requerir siguiente TTS de google
Intentos = 0 # variable para registro de intentos de acceso al servidor
WorkinDir = getcwd()
#-------------------------------------------------
# Funciones
#-------------------------------------------------
def deleteFiles(Dir, extension): #borrar los que hayan quedado
files = listdir(Dir)
for file in files:
if file.endswith(extension):
remove(path.join(Dir,file))
def getFiles(Dir, extension):# obtener lista de archivos de audio para reproducir
arr = []
files = listdir(Dir)
for file in files:
if file.endswith(extension):
arr.append(path.join(Dir,file))
return arr
def playFiles():
NombreArch = getFiles(WorkinDir,".mp3")
for x in NombreArch:
playsound(x)
#-------------------------------------------------
# PROGRAMA PRINCIPAL
#-------------------------------------------------
deleteFiles(WorkinDir, ".mp3") # Borrar archivos mp3 si hay.
while True: # ciclo "infinito" (se rompe cuanto termina satisfactoriamente)
try:
Client = urlopen(news_url) #intentar abrir url
except HTTPError as e: # si ocurre un error por alguna causa desconocida
Intentos += 1 # registro de intentos incrementa
alert(text = e, # Mostrar mensaje
title = 'Error',
button = 'OK')
T_waitWeb = T_waitWeb * 2 #tiepo de espera es el doble
sleep(T_waitWeb) #Esperar
except URLError: # si ocurre un error por direccion invalida o servidor caido
Intentos += 1 # registro de intentos incrementa
# Mostrar mensaje
alert(text = "Servidor caido o dominio incorrecto. Intentos = "+str(Intentos),
title = "Error",
button = 'OK')
T_waitWeb = T_waitWeb * 2 #tiepo de espera es el doble
sleep(T_waitWeb) #Esperar
else: # Si pudo acceder al servidor
xml_page = Client.read() # Leer y guardar informacion en una variable
Client.close() # cerrar cliente (no hace falta que siga aierto)
soup_page = soup(xml_page,"xml") # Frasear archivo xml
news_list = soup_page.findAll("item") # poner titulares en una lista
#-----------------------------------------------------------
# Dividir titulares de Noticias en grupos de 4 para mandar a Google TTS.
#-----------------------------------------------------------
N_Noticias = 4 # 4 encabezados de noticias
inicio = 0 # inicio de cada grupo de 4 (inicia en 0 e incrementa de 4 en 4)
Acumulador = N_Noticias # fin de cada grupo de 4 (inicia en 4 e incrementa de 4 en 4)
NumArch = 1 # Variable para nombrae archivos con cuenta numerica Ej: 1.mp3, 2.mp3, etc
print(len(news_list))
while Acumulador < len(news_list):
Texto = ''
for x in range(inicio,Acumulador):
Texto = Texto + 'Noticia número ' + str(x+1)+'. '+news_list[x].title.text+". "
#--------------------------------------------------------------------
# Obtener otros datos de cada item si se quiere
#--------------------------------------------------------------------
#print(news_list[x].link.text) # obtener link de la noticia
#print(news_list[x].pubDate.text) # obtener la fecha de la noticia
#print(Texto) #Debug
#print(inicio) #Debug
#print(Acumulador) #Debug
inicio += N_Noticias # incrementar para el inicio del siguiente grupo
Acumulador += N_Noticias # incrementar para el fin del siguiente grupo
#----------------------------------------------------
# Mandar texto a GTTS y guardar archivo de sonido
#----------------------------------------------------
tts = gtts.tts.gTTS(Texto, lang='es-us')
try:
NombreArch = str(NumArch)+".mp3"
with open(NombreArch, "wb") as archivo:
tts.write_to_fp(archivo)
NumArch += 1
sleep(T_waitTTS)
except:
pass
#----------------------------------------------------
# Preguntar al usuario si quiere escuchar los audios
#----------------------------------------------------
respuesta = confirm(text='Se generaron audios de noticias. Quieres escucharlas',
title='Escuchar?',
buttons=['Si', 'No'])
if respuesta == 'Si':
playFiles()
break # romper ciclo while principal
No hay comentarios.:
Publicar un comentario