voice-bridge / backend /text_extraction.py
scaffece's picture
Upload 14 files
66915f1 verified
Raw
History Blame Contribute Delete
1.58 kB
"""
Text extraction for documents (PDF, EPUB, TXT) and sentence chunking,
so long-form content can be translated and spoken sentence by sentence.
"""
import pdfplumber
import ebooklib
from ebooklib import epub
from bs4 import BeautifulSoup
import nltk
# Download tokenizer data once; safe to call repeatedly (no-op if already present)
for resource in ("punkt", "punkt_tab"):
try:
nltk.data.find(f"tokenizers/{resource}")
except LookupError:
nltk.download(resource, quiet=True)
from nltk.tokenize import sent_tokenize # noqa: E402
def extract_text_from_file(file_path: str) -> str:
lower = file_path.lower()
if lower.endswith(".pdf"):
text = ""
with pdfplumber.open(file_path) as pdf:
for page in pdf.pages:
text += (page.extract_text() or "") + " "
return text
if lower.endswith(".epub"):
book = epub.read_epub(file_path)
text = ""
for item in book.get_items():
if item.get_type() == ebooklib.ITEM_DOCUMENT:
soup = BeautifulSoup(item.get_content(), "html.parser")
text += soup.get_text() + " "
return text
if lower.endswith(".txt"):
with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
return f.read()
raise ValueError(f"Unsupported document type for: {file_path}")
def split_into_sentences(text: str) -> list[str]:
normalized = " ".join(text.split()) # collapse whitespace/newlines
if not normalized:
return []
return sent_tokenize(normalized)