@@ -420,7 +420,7 @@ def load_replacements() -> Dict[str, Any]:
420420
421421
422422def 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+
434451def 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