1. Lunnaris13,
¡Hola a todos!
Espero que estén bien. Quiero compartir con ustedes un proyecto en el que estoy trabajando. Se trata de la creación de audiolibros donde cada personaje tiene su propia voz, utilizando voces neuronales de Azure TTS de Microsoft y las voces de Amazon Polly. Estas herramientas me permiten darle vida a cada personaje de una manera única.
Actualmente, para dividir los libros en formato EPUB en capítulos, utilizo un complemento para Calibre llamado EpubSplit. Este complemento es accesible, pero solo a través del navegador de objetos de NVDA. El proceso para dividir los libros con EpubSplit es un poco tedioso y requiere navegar por varias opciones y menús.
Aquí es donde entra mi solicitud. Me gustaría tener un programa que haga este proceso mucho más sencillo y accesible, automatizando la división de los capítulos y permitiendo guardarlos como archivos de Word (DOCX). El programa sería de gran ayuda no solo para mí, sino también para otros que estén en una situación similar y busquen una manera más eficiente de preparar libros para la creación de audiolibros.
Descripción de la interfaz gráfica y funcionalidad del programa:
1.
Lista de libros: En el centro de la ventana del programa, me imagino una lista donde se pueda ver el libro que hemos añadido para procesar.
2.
Botones:
• A la derecha de la lista, un botón para añadir el libro desde el explorador de archivos de Windows.
• Una vez que se haya cargado el libro, que aparezcan dos botones más:
• Buscar carpeta: Un botón para elegir la carpeta donde se guardarán los capítulos divididos.
• Dividir en capítulos: Un botón que, al hacer clic, comienza el proceso de división del libro en capítulos.
3.
Indicador de progreso: Mientras se divide el libro en capítulos, me gustaría que la interfaz mostrara el progreso en tiempo real, indicando cuántos capítulos se han dividido con éxito y si hay algún error en la conversión.
4.
Diálogo final: Al finalizar, que aparezca un diálogo preguntando si queremos abrir la carpeta resultante donde se guardaron los capítulos en Word. Además, que se muestre un mensaje indicando cuántos capítulos se convirtieron con éxito.
5.
Un botón o atajo para eliminar el libro que hemos añadido si ya no lo necesitamos.
• Un botón para crear una nueva carpeta automáticamente donde se guardarán los capítulos divididos, en caso de que no queramos seleccionar una carpeta manualmente.
Descripción del código de referencia:
El código que tengo realiza las siguientes tareas:
• Descomprime el archivo EPUB.
• Encuentra los capítulos basándose en los encabezados (por ejemplo, <h1>
y <h2>
).
• Guarda cada capítulo en un archivo DOCX independiente.
Aquí les dejo el código como referencia para que vean cómo funciona:
python
import zipfile
import os
from lxml import etree, html
from docx import Document
def extract_chapters(epub_file, output_folder):
# Crear el directorio de salida si no existe
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# Descomprimir el archivo EPUB
try:
with zipfile.ZipFile(epub_file, 'r') as zip_ref:
zip_ref.extractall(output_folder)
except zipfile.BadZipFile:
print("Error: El archivo EPUB está corrupto o no es un archivo zip válido.")
return
# Localizar el archivo OPF
opf_file = None
for root, _, files in os.walk(output_folder):
for file in files:
if file.endswith('.opf'):
opf_file = os.path.join(root, file)
break
if opf_file:
break
if not opf_file:
print("Error: No se encontró el archivo OPF en el EPUB.")
return
# Parsear el archivo OPF para encontrar los capítulos
try:
tree = etree.parse(opf_file)
namespaces = {'opf': 'http://www.idpf.org/2007/opf', '': 'http://www.idpf.org/2007/opf'}
items = tree.xpath('//opf:item[@media-type="application/xhtml+xml"]', namespaces=namespaces)
except etree.XMLSyntaxError:
print("Error: El archivo OPF no se pudo analizar. Asegúrate de que esté bien formado.")
return
# Obtener la ruta completa de cada archivo HTML
html_files = [os.path.join(os.path.dirname(opf_file), item.get('href')) for item in items]
# Procesar cada archivo HTML para encontrar y dividir capítulos
chapter_counter = 1
for html_file in html_files:
try:
with open(html_file, 'r', encoding='utf-8') as file:
content = file.read()
tree = html.fromstring(content)
# Encontrar encabezados que indican capítulos
chapters = tree.xpath('//h1 | //h2') # Ajustar si se usan otros niveles de encabezado
# Si no hay encabezados, continuar con el siguiente archivo
if not chapters:
continue
# Dividir el contenido en capítulos
for i, chapter in enumerate(chapters):
chapter_title = chapter.text_content().strip() or f"Capítulo {chapter_counter}"
start = tree.index(chapter)
end = tree.index(chapters[i + 1]) if i + 1 < len(chapters) else len(tree)
chapter_content = tree[start:end]
chapter_html = html.tostring(chapter_content, encoding='unicode', method='html')
# Crear y guardar cada capítulo en un archivo DOCX separado
doc = Document()
doc.add_heading(chapter_title, level=1)
doc.add_paragraph(html.fromstring(chapter_html).text_content())
output_docx_path = os.path.join(output_folder, f'chapter_{chapter_counter}.docx')
doc.save(output_docx_path)
print(f"Capítulo guardado: {output_docx_path}")
chapter_counter += 1
except Exception as e:
print(f"Error procesando el archivo {html_file}: {e}")
print(f"Capítulos extraídos a la carpeta: {output_folder}")
Uso del programa
epub_file = 'ruta/al/archivo.epub'
output_folder = 'ruta/al/directorio/de/salida'
extract_chapters(epub_file, output_folder)
Lo que necesito es que alguien se encargue de desarrollar este programa completo, incluyendo la interfaz gráfica y todas las funcionalidades adicionales que mencioné arriba. Aprecio mucho si alguien puede ayudarme con esto, ya que no tengo conocimientos de programación y prefiero dejarlo en manos de alguien que sepa. Estoy segura de que sería una herramienta muy útil no solo para mí, sino también para otros miembros de la comunidad.
Si alguien está interesado en crear este pequeño programa, me puede contactar a mi correo:
[email protected]
¡Gracias por adelantado!
Resultado: +0