
    rHJj                     ~    d Z ddlZddlmZ ddlmZmZmZmZm	Z	 ddl
Z
ddlmZ ddlmZ ddlmZmZ  G d d	e      Zy)
z#Segments backend for the phonemizer    N)Logger)OptionalDictListUnionPattern)BaseBackend)	Separator)get_package_resourceversion_as_tuplec                       e Zd ZdZ	 	 	 ddedeeeef      dedee	   f fdZ
d Zed        Zed	        Zed
        Zed        Zededefd       Zededej(                  fd       Zdee   dedededee   f
dZ xZS )SegmentsBackendzSegments backends for the phonemizer

    The phonemize method will raise a ValueError when parsing an
    unknown morpheme.

    languagepunctuation_markspreserve_punctuationloggerc                 :    d | _         t        | 	  ||||       y )N)r   r   r   )
_tokenizersuper__init__)selfr   r   r   r   	__class__s        e/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/phonemizer/backend/segments.pyr   zSegmentsBackend.__init__$   s*    
 9=/!5	 	 	    c                     | j                  |      }t        j                  |      | _        t	        j
                  |      j                  S )N)profile)_load_g2p_profilesegments	Tokenizerr   pathlibPathstem)r   r   r   s      r   _init_languagezSegmentsBackend._init_language0   s;    ((2",,W= ||H%***r   c                       y)Nr    r%   r   r   namezSegmentsBackend.name8   s    r   c                 4    t        t        j                        S )N)r   r   __version__clss    r   versionzSegmentsBackend.version<   s     4 455r   c                      y)NTr%   r)   s    r   is_availablezSegmentsBackend.is_available@   s    r   c                      t        d      } | j                         D ci c]  }|j                  dk(  r|j                  |  c}S c c}w )a  Returns a dict of language: file supported by the segments backend

        The supported languages have a grapheme to phoneme conversion file
        bundled with phonemizer. Users can also use their own file as
        parameter of the phonemize() function.

        r   z.g2p)r   iterdirsuffixr"   )	directoryg2ps     r   supported_languagesz#SegmentsBackend.supported_languagesD   sU     )4	 %,,.H.C#**2F #.H 	H Hs   #Areturnc                     t        j                  |      j                         r	 | j                  |       y|| j                         v S # t        $ r Y yw xY w)NTF)r    r!   is_filer   RuntimeErrorr3   )r*   r   s     r   is_supported_languagez%SegmentsBackend.is_supported_languageT   sW    <<!))+%%h/ 322444   s   A	 		AAc           
      P   t        j                  |      j                         s	 | j                         |   }i }t        |dd      5 }t        |      D ]d  \  }}|j                         j                         }t        |      dk(  s(t        dj                  |dz   t        |      |            |d   ||d	   <   f 	 ddd       t        j                  |j                         D cg c]
  \  }}||d
 c}} S # t        $ r t        d|       dw xY w# 1 sw Y   [xY wc c}}w )z,Returns a segments profile from a `language`z$grapheme to phoneme file not found: Nrutf8)encoding   zBgrapheme to phoneme file, line {} must have 2 rows but have {}: {}   r   )Graphememapping)r    r!   r6   r3   KeyErrorr7   open	enumeratestripsplitlenformatr   Profileitems)	r*   r   r2   flangnumlineeltskvs	            r   r   z!SegmentsBackend._load_g2p_profile^   s.    ||H%--/-224X> !(C&1U&u-	Tzz|))+4yA~&**0&q#d)X*NP P  $AwDG . 2 8;		D11+DF 	F%  -":j"#(,-- 21 Es   C: A3D&D"
:DDtextoffset	separatorrD   c                       fd|D        }|sd |D        }d |D        }d |D        }fd|D        }fd|D        }t        |      S )Nc              3   F   K   | ]  }j                  |d d        yw)r@   strict)columnerrorsN)r   ).0rL   r   s     r   	<genexpr>z1SegmentsBackend._phonemize_aux.<locals>.<genexpr>}   s(       OOD8ODs   !c              3   &   K   | ]	  }|d z     yw) # Nr%   rX   ps     r   rY   z1SegmentsBackend._phonemize_aux.<locals>.<genexpr>   s     8Z!e)Zs   c              3   @   K   | ]  }|j                  d d        yw)r[   z  # Nreplacer\   s     r   rY   z1SegmentsBackend._phonemize_aux.<locals>.<genexpr>   s     GJq!))E62J   c              3   @   K   | ]  }|j                  d d        yw)r[   #Nr_   r\   s     r   rY   z1SegmentsBackend._phonemize_aux.<locals>.<genexpr>   s     @Zaiis+Zra   c              3   V   K   | ]   }|j                  d j                         " yw) N)r`   phonerX   r]   rR   s     r   rY   z1SegmentsBackend._phonemize_aux.<locals>.<genexpr>   s!     Jz!aiiY__5z   &)c              3   V   K   | ]   }|j                  d j                         " yw)rc   N)r`   wordrg   s     r   rY   z1SegmentsBackend._phonemize_aux.<locals>.<genexpr>   s!     IjaiiY^^4jrh   )list)r   rP   rQ   rR   rD   
phonemizeds   `  `  r   _phonemize_auxzSegmentsBackend._phonemize_aux{   sY    
 8Z8JGJGJ AZ@
JzJ
IjI
 Jr   )NFN)__name__
__module____qualname____doc__strr   r   r   boolr   r   r#   staticmethodr&   classmethodr+   r-   r3   r8   r   rH   r   r   intr
   rm   __classcell__)r   s   @r   r   r      s'    EI.3,0
 
$,U3<-@$A
'+
 "&)
+   6 6   H H 5S 5T 5 5 F F1A1A F F8 49  c  i  X\  aefiaj  r   r   )rq   r    loggingr   typingr   r   r   r   r   r   phonemizer.backend.baser	   phonemizer.separatorr
   phonemizer.utilsr   r   r   r%   r   r   <module>r}      s0    *   7 7  / * Cs k s r   