TransWikia.com

Como puedo reproducir un archivo mp3 en otros idiomas como portugues o polaco?

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```

3 Answers

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.

¿Qué hacer?

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"))

Edito

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:

  1. 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.

  2. 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP