fix the translator api

This commit is contained in:
2025-03-11 13:32:52 +01:00
parent 9ad0e27a6e
commit 3f0f62032f

View File

@@ -74,6 +74,7 @@ active_group_id = None
last_completed_group_id = None
announcement_task = None
caster = None
reset_task = None
# Initialization flag
initialized = False
@@ -103,7 +104,7 @@ async def process_announcement(text: str, group: EndpointGroup):
Process an announcement using the multilang_translator.
This is based on the announcement_from_german_text function in main_local.py.
"""
global active_group_id, last_completed_group_id, caster
global active_group_id, last_completed_group_id, caster, reset_task
# Make sure the caster is initialized
if not initialized:
@@ -117,7 +118,7 @@ async def process_announcement(text: str, group: EndpointGroup):
active_group_id = group.id
# Update status to translating
group.progress.current_state = AnnouncementStates.TRANSLATING
group.progress.current_state = AnnouncementStates.TRANSLATING.value
group.progress.progress = 0.2
# Translate the text for each language
@@ -135,7 +136,7 @@ async def process_announcement(text: str, group: EndpointGroup):
if big.language == base_lang:
translated_text = text
else:
group.progress.current_state = AnnouncementStates.TRANSLATING
group.progress.current_state = AnnouncementStates.TRANSLATING.value
translated_text = llm_translator.translate_de_to_x(
text,
big.language,
@@ -148,7 +149,7 @@ async def process_announcement(text: str, group: EndpointGroup):
log.info(f'Translated text ({big.language}): {translated_text}')
# Update status to generating voice
group.progress.current_state = AnnouncementStates.GENERATING_VOICE
group.progress.current_state = AnnouncementStates.GENERATING_VOICE.value
group.progress.progress = 0.4
# This will use the voice_provider's text_to_speech.synthesize function
@@ -165,23 +166,20 @@ async def process_announcement(text: str, group: EndpointGroup):
caster.big_conf[i].audio_source = lc3_audio
# Update status to routing
group.progress.current_state = AnnouncementStates.ROUTING
group.progress.current_state = AnnouncementStates.ROUTING.value
group.progress.progress = 0.6
await asyncio.sleep(0.5) # Small delay for routing
await asyncio.sleep(0.5) # Small delay for routing # TODO: actually needs to be implemented
# Update status to active and start streaming
group.progress.current_state = AnnouncementStates.ACTIVE
group.progress.current_state = AnnouncementStates.ACTIVE.value
group.progress.progress = 0.8
caster.start_streaming()
# Wait for streaming to complete
if hasattr(caster, 'streamer') and hasattr(caster.streamer, 'task'):
await caster.streamer.task
else:
await asyncio.sleep(3) # Fallback wait if no task available
await caster.streamer.task
# Update status to complete
group.progress.current_state = AnnouncementStates.COMPLETE
group.progress.current_state = AnnouncementStates.COMPLETE.value
group.progress.progress = 1.0
last_completed_group_id = group.id
@@ -191,16 +189,21 @@ async def process_announcement(text: str, group: EndpointGroup):
# After a while, reset to idle state (in a separate task)
async def reset_to_idle():
log.info(f"Waiting 10 seconds before resetting group {group.id} to IDLE state")
await asyncio.sleep(10) # Keep completed state visible for 10 seconds
if group.progress.current_state == AnnouncementStates.COMPLETE:
group.progress.current_state = AnnouncementStates.IDLE
log.info(f"Resetting group {group.id} to IDLE state")
# Use direct value lookup for the state comparison
if group.progress.current_state == AnnouncementStates.COMPLETE.value:
group.progress.current_state = AnnouncementStates.IDLE.value
group.progress.progress = 0.0
log.info(f"Group {group.id} state reset to IDLE")
asyncio.create_task(reset_to_idle())
# Create and save the task so it won't be garbage collected
reset_task = asyncio.create_task(reset_to_idle())
except Exception as e:
log.error(f"Error in processing announcement: {e}")
group.progress.current_state = AnnouncementStates.ERROR
group.progress.current_state = AnnouncementStates.ERROR.value
group.progress.error = str(e)
if active_group_id == group.id:
active_group_id = None
@@ -261,6 +264,8 @@ async def start_announcement(text: str, group_id: int):
"""Start a new announcement to the specified endpoint group."""
global announcement_task, active_group_id
log.info(f"Received announcement request - text: '{text}', group_id: {group_id}")
# Find the group
group = None
for g in endpoint_groups:
@@ -292,6 +297,9 @@ async def start_announcement(text: str, group_id: int):
@app.get("/announcements/status")
async def get_announcement_status():
"""Get the status of the current announcement."""
global active_group_id, last_completed_group_id
log.debug(f"Status request - active_group_id: {active_group_id}, last_completed_group_id: {last_completed_group_id}")
# If an announcement is active, return its status
if active_group_id is not None:
group = None
@@ -301,6 +309,7 @@ async def get_announcement_status():
break
if group:
log.debug(f"Returning active status for group {group.id}: {group.progress.current_state}")
return {
"state": group.progress.current_state,
"progress": group.progress.progress,
@@ -325,7 +334,8 @@ async def get_announcement_status():
group = g
break
if group and group.progress.current_state == AnnouncementStates.COMPLETE:
if group and group.progress.current_state == AnnouncementStates.COMPLETE.value:
log.debug(f"Returning completed status for group {group.id}")
return {
"state": group.progress.current_state,
"progress": group.progress.progress,
@@ -343,8 +353,9 @@ async def get_announcement_status():
}
# Default: no active announcement
log.debug("Returning idle status (no active or completed announcements)")
return {
"state": AnnouncementStates.IDLE,
"state": AnnouncementStates.IDLE.value,
"progress": 0.0,
"error": None,
"details": {