Skip to content

Commit 5b3b964

Browse files
committed
fix: use pronunciation values from replacements.json for TTS
- Add get_project_pronunciation() function to fetch pronunciation values - Use tts_project_name for all TTS audio generation - Keep display_project_name for visual notifications - Now respects pronunciation field in _auto_discovered.projects - Example: agent-zero displays as 'agent-zero' but speaks as 'agent zero' - Example: rasenfunk-website displays as 'rasenfunk-website' but speaks as 'Rahfoo'
1 parent 1384585 commit 5b3b964

1 file changed

Lines changed: 29 additions & 10 deletions

File tree

‎src/ccnotify/notify.py‎

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ def load_replacements() -> Dict[str, Any]:
420420

421421

422422
def apply_project_name_replacement(project_name: str, replacements: Dict[str, Any]) -> str:
423-
"""Apply project name replacement"""
423+
"""Apply project name replacement for display"""
424424
project_replacements = replacements.get("project_names", {}).get("replacements", {})
425425

426426
# Case-insensitive matching
@@ -431,6 +431,23 @@ def apply_project_name_replacement(project_name: str, replacements: Dict[str, An
431431
return project_name
432432

433433

434+
def get_project_pronunciation(project_name: str, replacements: Dict[str, Any]) -> str:
435+
"""Get the pronunciation for a project name for TTS"""
436+
# First check auto-discovered pronunciations
437+
auto_discovered = replacements.get("_auto_discovered", {}).get("projects", {})
438+
for proj_key, proj_data in auto_discovered.items():
439+
if proj_key.lower() == project_name.lower():
440+
return proj_data.get("pronunciation", project_name)
441+
442+
# Fall back to project_names replacements
443+
project_replacements = replacements.get("project_names", {}).get("replacements", {})
444+
for original, replacement in project_replacements.items():
445+
if project_name.lower() == original.lower():
446+
return replacement
447+
448+
return project_name
449+
450+
434451
def apply_command_replacement(command: str, replacements: Dict[str, Any]) -> str:
435452
"""Apply command replacement for audio"""
436453
cmd_replacements = replacements.get("commands", {}).get("replacements", {})
@@ -545,6 +562,7 @@ def get_notification_sound(self, event_type: str, custom_text: str = "") -> Opti
545562

546563
# Determine text to speak
547564
text_to_speak = custom_text if custom_text else default_texts.get(event_type, "Claude notification")
565+
logger.debug(f"TTS text: '{text_to_speak}'")
548566

549567
# Generate cache key and file path
550568
cache_key = self.tts_provider.get_cache_key(text_to_speak)
@@ -609,8 +627,9 @@ def handle_hook(self, hook_data: Dict[str, Any]):
609627
project_name = resolve_project_name(session_id, cwd)
610628
logger.info(f"Resolved project name from session: {project_name}")
611629

612-
# Apply project name replacement
630+
# Apply project name replacement for display and TTS
613631
display_project_name = apply_project_name_replacement(project_name, replacements)
632+
tts_project_name = get_project_pronunciation(project_name, replacements)
614633

615634
cwd_name = Path(cwd).name if cwd else "unknown"
616635

@@ -705,7 +724,7 @@ def handle_hook(self, hook_data: Dict[str, Any]):
705724
message = f"[{display_project_name}] Running {cmd_summary}"
706725

707726
# Natural TTS message
708-
custom_tts = f"{display_project_name}, {audio_desc}"
727+
custom_tts = f"{tts_project_name}, {audio_desc}"
709728

710729
# Skip most file edits unless they're system files
711730
elif tool_name in ["Write", "MultiEdit", "Edit"]:
@@ -725,7 +744,7 @@ def handle_hook(self, hook_data: Dict[str, Any]):
725744
action_desc = "editing"
726745

727746
message = f"[{display_project_name}] {action_desc.capitalize()} {file_name}"
728-
custom_tts = f"{display_project_name}, {action_desc} {file_name}"
747+
custom_tts = f"{tts_project_name}, {action_desc} {file_name}"
729748

730749
elif hook_type == "PostToolUse":
731750
# Check for errors in tool response
@@ -743,17 +762,17 @@ def handle_hook(self, hook_data: Dict[str, Any]):
743762
event_type = "error"
744763
error_msg = tool_response.get("error", tool_response.get("message", "Unknown error"))
745764
message = f"[{display_project_name}] Error in {tool_name}: {str(error_msg)[:100]}"
746-
custom_tts = f"{display_project_name}, {tool_name} failed"
765+
custom_tts = f"{tts_project_name}, {tool_name} failed"
747766

748767
elif hook_type == "Stop":
749768
event_type = "execution_complete"
750769
message = f"[{display_project_name}] Task complete"
751-
custom_tts = f"{display_project_name}, task completed successfully"
770+
custom_tts = f"{tts_project_name}, task completed successfully"
752771

753772
elif hook_type == "SubagentStop":
754773
event_type = "subagent_done"
755774
message = f"[{display_project_name}] Subagent finished"
756-
custom_tts = f"{display_project_name}, sub agent finished"
775+
custom_tts = f"{tts_project_name}, sub agent finished"
757776

758777
elif hook_type == "PreCompact":
759778
event_type = "compaction"
@@ -778,13 +797,13 @@ def handle_hook(self, hook_data: Dict[str, Any]):
778797
if tool_match:
779798
tool_requested = tool_match.group(1)
780799
message = f"[{display_project_name}] Permission needed for {tool_requested}"
781-
custom_tts = f"{display_project_name}, needs permission for {tool_requested}"
800+
custom_tts = f"{tts_project_name}, needs permission for {tool_requested}"
782801
else:
783802
message = f"[{display_project_name}] {raw_message}"
784-
custom_tts = f"{display_project_name}, {raw_message}"
803+
custom_tts = f"{tts_project_name}, {raw_message}"
785804
else:
786805
message = f"[{display_project_name}] Input needed"
787-
custom_tts = f"{display_project_name}, input needed"
806+
custom_tts = f"{tts_project_name}, input needed"
788807

789808
# Send notification if we have an event
790809
if event_type and message:

0 commit comments

Comments
 (0)