Stack Overflow en español Asked by victor salazar on December 25, 2020
estoy trabajando en un programa que traduce palabras y genera un archivo .mp3 con la pronunciación de la palabra en el idioma de origen y en el idioma al cual se tradujo, el problema es que al momento de reproducirlo, idiomas como polaco o portugues, arroja error, pero con español no tengo ningún problema por el momento, me imagino que es por los caracteres especiales, pero es raro por que el archivo de audio ya está creado, el error se genera al reproducir el archivo. He intentado con playsoun y pygame
Este es el código
from googletrans import Translator
from gtts import gTTS
from playsound import playsound
from os import remove
from unidecode import unidecode
def tts(text_file, lang, name_file):
with open(text_file, "r") as file:
text = file.read()
file = gTTS(text=text,lang=lang)
filename = name_file
file.save(filename)
accion = 1
print('Elija el idioma inicial')
idioma_inicial = input()
print ('Elija el idioma al cual desea traducir')
idioma_final = input()
######################Traduccion#########################
translator = Translator()
#translations = translator.translate(['pera','manzana','durazno','uva','mango','sandía','papaya','melón','plátano','damasco','frutilla','cereza','ciruela','tuna','mora','naranja','piña','coco'], src=idioma_inicial,dest=idioma_final)
translations = translator.translate(['manzana'], src=idioma_inicial,dest=idioma_final)
Cantidad_audios = len(translations)*2
#########################################################
######################Creación de Archivos###############
identificador =1
Nombres_Archivos = []
for translation in translations:
texto_inicial=translation.origin
audio_inicial = gTTS(text = texto_inicial, lang = idioma_inicial, slow = False)
audio_inicial.save(unidecode(str(identificador)+'i-'+translation.origin +'.mp3'))
texto_traducido=translation.text
audio_traducido = gTTS(text = texto_traducido, lang = idioma_final, slow = False)
audio_traducido.save(unidecode(str(identificador)+'i-'+translation.text +'.mp3'))
Nombres_Archivos.append(unidecode(str(identificador)+'i-'+translation.origin +'.mp3'))
Nombres_Archivos.append(unidecode(str(identificador)+'t-'+translation.text+".mp3"))
identificador= identificiador=identificador+1
print(Nombres_Archivos)
##########################################################
i=0
"""while i<Cantidad_audios:
pygame.mixer.init()
pygame.mixer.music.load(Nombres_Archivos)
pygame.mixer.music.play()
i=i+1;
"""
"""
while i<Cantidad_audios:
playsound(Nombres_Archivos[1])
i=i+1;
"""
este es el error que genera con playsound
Traceback (most recent call last): File "C:UsersviansOneDriveEscritorioidiomascodigo traductortraductor vocabulario.py", line 63, in
playsound(Nombres_Archivos[1]) File "C:UsersviansAppDataLocalProgramsPythonPython38libsite-packagesplaysound.py", line 35, in _playsoundWin winCommand('open "' + sound + '" alias', alias) File "C:UsersviansAppDataLocalProgramsPythonPython38libsite-packagesplaysound.py", line 30, in winCommand 'n ' + errorBuffer.value.decode()) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfa in position 49: invalid start byte```
Lo primero, una aclaración. Esto no es una solución (todavía), sino una petición de ampliación de información. Pero debido a su longitud y a tener que insertar en ella código, no me cabe en un comentario. Se convertirá en una respuesta en condiciones una vez el OP responda a lo que aquí se indica.
La excepción que te salta:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfa in position 49: invalid start byte
Es un problema de decodificación de caracteres. En particular en algún lugar aparece un byte de valor 0xfa
como parte de una secuencia de bytes que Python estaba intentando decodificar como texto UTF-8. La hipótesis más razonable es que ese texto no era en realidad UTF-8 sino Windows-1252. En ese encóding 0xfa
representa la letra "ú".
En un principio pensé que ese carácter pudiera formar parte del nombre del fichero, pero ahora no lo creo porque los nombres de fichero los estás codificando apropiadamente con unidecode
.
Mi hipótesis ahora es que el problema lo está causando un mensaje de error de Windows. La instrucción playsound()
por debajo hace lo siguiente:
winCommand('open "' + sound + '" alias', alias)
Y eso lanza el comando open
bajo windows, el cual, según mi hipótesis, está generando un error. Seguidamente la biblioteca playsound trata de recoger el mensaje de error para reportarlo a tu programa, y para ello intenta crear una cadena usando el siguiente código:
'n ' + errorBuffer.value.decode()
en el que intenta extraer el mensaje de error de la variable errorBuffer.value
y aplicarle decode()
para convertirlo a una cadena que Python pueda mostrar. Ese .decode()
es el que está suponiendo que el encoding es UTF-8 pero falla porque el mensaje de error generado por windows (que contendría una "ú") está codificado en realidad en Windows-1252.
Debido a este bug, no podemos ver el verdadero mensaje de error y por tanto no podemos enterarnos de cuál es la razón por la que falla la reproducción de ese archivo.
Te propongo lo siguiente. Entra en el fichero C:UsersviansAppDataLocalProgramsPythonPython38libsite-packagesplaysound.py
y localiza la línea 30, que debería contener en alguna parte:
'n ' + errorBuffer.value.decode()
y edita esa línea para que ponga:
'n ' + errorBuffer.value.decode("cp1252")
Ejecuta de nuevo tu aplicación y, si mi hipótesis era correcta, ya no obtendrás el error de encoding, sino otro. Edita entonces la pregunta para añadir cuál es el nuevo mensaje de error que recibes (que debería contener la letra "ú" según mi hipótesis). Con suerte, este nuevo mensaje permitirá diagnosticar y arreglar el verdadero problema.
Answered by abulafia on December 25, 2020
Es sólo un pequeño error tipográfico al guardar el nombre de archivo.
Cambia
Nombres_Archivos.append(unidecode(str(identificador)+'t-'+translation.text+".mp3"))
Por
Nombres_Archivos.append(unidecode(str(identificador)+'i-'+translation.text+".mp3"))
Ya que acabo de caer en que nombras los archivos con i = inicial
y t = traducido
. Y, de paso, amplio la respuesta.
Como decía, es solo un despiste al poner los nombres de archivo, y no un problema de codificación realmente.
Estás guardando los archivos como:
audio_inicial.save(unidecode(str(identificador)+'i-'+translation.origin +'.mp3'))
...
audio_traducido.save(unidecode(str(identificador)+'i-'+translation.text +'.mp3'))
De forma que, por ejemplo, si la palabra es manzana
y la traducción de hace de español a inglés, los archivos guardados son: 1i-manzana.mp3
y 1i-apple.mp3
.
Luego almacenas el nombre de archivo:
Nombres_Archivos.append(unidecode(str(identificador)+'i-'+translation.origin +'.mp3'))
Nombres_Archivos.append(unidecode(str(identificador)+'t-'+translation.text+".mp3"))
De forma que, en el ejemplo, los nombres almacenados serían: 1i-manzana.mp3
y 1j-apple.mp3
, y este último no existe. Por lo playsound
da error al intentar reproducir un archivo que no existe.
Si ejecutas playsound('archivo_inexistente')
verás que obtienes el mismo error.
Por tanto, solo hay que corregir el nombre de archivo para que coincida con el nombre almacenado en Nombres_Archivos
, cambiando:
audio_traducido.save(unidecode(str(identificador)+'i-'+translation.text +'.mp3'))
Por:
audio_traducido.save(unidecode(str(identificador)+'t-'+translation.text +'.mp3'))
(Que, realmente, es lo mismo que indicaba arriba, solo que en vez de corregir el nombre en Nombres_Archivos
, se corrige el nombre con que se guarda el propio archivo en disco)
Sería recomendable emplear una variable común, para evitar este tipo de errores y no tener que crear dos veces el nombre de archivo
Answered by Barrendeitor on December 25, 2020
Tu problema se está produciendo aquí:
while i<Cantidad_audios:
playsound(Nombres_Archivos[1])
i=i+1;
En la lista Nombres_Archivos
hay algún archivo que no tiene una extensión .mp3
o que no está bien puesta la ruta a su fichero. Cuando tratas de abrirlo tu programa se rompe con este error que es lo que yo te he indicado:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfa in position 49: invalid start byte```
Esto se produce porque estás intentado abrir un fichero que no es .mp3
Tienes que:
Revisar todos los ficheros que hay en las carpetas en las que cargas los archivos y comprobar que todos tienen el formato adecuado para ser leidos .mp3
.
Revisar que todas las rutas dentro de tu variable Nombres_Archivos
son validas y están correctas.
Answered by Rubiales Alberto on December 25, 2020
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP