71 lines
No EOL
3 KiB
Python
71 lines
No EOL
3 KiB
Python
import os
|
|
import asyncio
|
|
import re
|
|
from database.connection import get_connection
|
|
from core.asset_generator import AssetGenerator
|
|
|
|
class PhraseManager:
|
|
def __init__(self):
|
|
self.asset_gen = AssetGenerator()
|
|
|
|
def _clean_filename(self, text: str) -> str:
|
|
"""Filters forbidden system characters but preserves Spanish diacritics."""
|
|
safe_text = re.sub(r'[/\\?%*:|"<>]', '', text)
|
|
return safe_text.strip().replace(" ", "_")
|
|
|
|
async def add_translation_pair(self, spanish_text: str, english_text: str,
|
|
textbook: str = None, unit: int = None,
|
|
context: str = None, voice_gender: str = "male"):
|
|
"""
|
|
Takes a multi-lingual pair, automates audio generation,
|
|
and securely links them together in the SQLite database.
|
|
"""
|
|
conn = get_connection()
|
|
cursor = conn.cursor()
|
|
|
|
try:
|
|
# 1. Insert Spanish Phrase Row
|
|
cursor.execute("""
|
|
INSERT INTO phrases (text, language, textbook, unit, source_context)
|
|
VALUES (?, 'es', ?, ?, ?)
|
|
""", (spanish_text, textbook, unit, context))
|
|
es_id = cursor.lastrowid
|
|
|
|
# 2. Insert English Phrase Row
|
|
cursor.execute("""
|
|
INSERT INTO phrases (text, language, textbook, unit, source_context)
|
|
VALUES (?, 'en', ?, ?, ?)
|
|
""", (english_text, textbook, unit, context))
|
|
en_id = cursor.lastrowid
|
|
|
|
# 3. Create Bidirectional Translation Bridges
|
|
cursor.execute("INSERT INTO translations (source_phrase_id, target_phrase_id) VALUES (?, ?)", (es_id, en_id))
|
|
cursor.execute("INSERT INTO translations (source_phrase_id, target_phrase_id) VALUES (?, ?)", (en_id, es_id))
|
|
|
|
# 4. Automate Castilian Audio Generation
|
|
safe_filename = self._clean_filename(spanish_text)
|
|
audio_filename = f"{safe_filename}_{voice_gender}.mp3"
|
|
output_path = os.path.join("media", audio_filename)
|
|
|
|
# Fire our cloud TTS utility
|
|
await self.asset_gen.generate_speech(spanish_text, output_path, gender=voice_gender)
|
|
selected_voice_name = self.asset_gen.voices.get(voice_gender.lower(), "es-ES-AlvaroNeural")
|
|
|
|
# 5. Log Audio Track to Database
|
|
cursor.execute("""
|
|
INSERT INTO audio_tracks (phrase_id, voice_gender, voice_name, file_path, is_reference)
|
|
VALUES (?, ?, ?, ?, 1)
|
|
""", (es_id, voice_gender.lower(), selected_voice_name, output_path))
|
|
|
|
# Commit everything at once securely
|
|
conn.commit()
|
|
print(f"✨ Successfully integrated: '{spanish_text}' ⇄ '{english_text}'")
|
|
print(f" Audio generated safely at: {output_path}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
conn.rollback()
|
|
print(f"❌ Error during phrase ingestion transaction: {e}")
|
|
return False
|
|
finally:
|
|
conn.close() |