o
    Si#                     @  s  U d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZmZmZ ddlZddlZddlZejejd edZdZdZd	Zd
dddddddddddddddddddddddddddddd dd!d"d#dd$d%d&dd'd(d)dd*d+d,dd-d.ddd/d0ddd1d2ddd3Zd4ed5< ee Zd6ed7< d8Z d9ed:< dQd=d>Z!dRdAdBZ"dSdHdIZ#dTdKdLZ$e fdUdOdPZ%dS )Vu  
response_iq_tts.py
──────────────────────────────────────────────────────────────────────────────
Text-to-Speech module for Response IQ powered by Microsoft Edge Neural TTS.

Architecture
────────────
  • 100% Serverless/Cloud-based CPU engine (0 VRAM used).
  • Zero local transformers models required.
  • Spawns a dedicated ThreadPoolExecutor background pipeline to prevent
    FastAPI uvloop event-loop blocking.
  • Decodes cloud-generated MP3 streams to native PCM WAV formats via
    PyTorch audio decoders seamlessly.

Supported languages (14)
  english · hinglish · hindi · marathi · punjabi · tamil · telugu · kannada
  gujarati · bengali · odia · assamese · malayalam · urdu

Version: 5.0.0 (Edge Neural Migration)
──────────────────────────────────────────────────────────────────────────────
    )annotationsN)DictListTuple)levelresponse_iq_ttsi"V  WAVzMicrosoft Edge Azure Neural TTSEnglishzen-INzen-IN-NeerjaNeural)display_namebcp47_lang_tagvoiceHinglishzhi-INzhi-IN-SwaraNeuralHindiBengalizbn-INzbn-IN-TanishaaNeuralUrduzur-INzur-IN-GulNeuralMarathizmr-INzmr-IN-AarohiNeuralGujaratizgu-INzgu-IN-DhwaniNeuralPunjabizpa-INzpa-IN-OjasNeuralTamilzta-INzta-IN-PallaviNeuralTeluguzte-INzte-IN-ShrutiNeuralKannadazkn-INzkn-IN-SapnaNeural	Malayalamzml-INzml-IN-SobhanaNeuralOdiazor-INAssamesezas-INMaithilizmai-IN)englishhinglishhindibengaliurdumarathigujaratipunjabitamiltelugukannada	malayalamodiaassamesemaithilizDict[str, Dict[str, str]]TTS_LANGUAGE_CONFIGz	List[str]TTS_SUPPORTED_LANGUAGESr   strTTS_DEFAULT_LANGUAGEtextreturnc                 C  s0   t d| } tdd| } tdd|  } | S )z>NFC normalisation and removal of invisible control characters.NFCz [\x00-\x08\x0B\x0C\x0E-\x1F\x7F] z[ \t]+ )unicodedata	normalizeresubstrip)r.    r8   @/var/www/eduai.edurigo.com/responseiq/staging/response_iq_tts.py_normalise_textO   s   r:   r   Tuple[np.ndarray, int]c           	   
     s   zddl  W n ty   tdw d fdd}z"tjjdd	}||jd
d}W d   n1 s7w   Y  W n tyP } ztd| d}~ww zt	j
t|dd\}}|   }||fW S  ty} } ztd| d}~ww )z
    Synthesises high-quality text using Microsoft Azure Neural voices via edge-tts.
    Executes entirely in a separate thread to cleanly bypass FastAPI uvloop.
    r   NzJThe 'edge-tts' package is missing. Please install it: pip install edge-ttsr/   bytesc                    s   d fdd} t |  S )Nr/   r<   c                    sN     } t }|  2 z3 d H W }|d dkr!||d  q6 t|S )Ntypeaudiodata)Communicate	bytearraystreamextendr<   )communicate
audio_datachunkedge_ttsr.   r   r8   r9   	_generateh   s   z?_synthesise_edge_tts.<locals>._run_async_tts.<locals>._generater/   r<   )asynciorun)rI   rG   r8   r9   _run_async_ttsg   s   	z,_synthesise_edge_tts.<locals>._run_async_tts   )max_workers<   )timeoutz)Edge TTS Cloud Engine generation failed: mp3)formatz(Failed to decode MP3 stream from cloud: rJ   )rH   ImportErrorRuntimeError
concurrentfuturesThreadPoolExecutorsubmitresult	Exception
torchaudioloadioBytesIOsqueezecpunumpy)	r.   r   rM   executor	mp3_bytesexcwaveformsample_rateaudio_npr8   rG   r9   _synthesise_edge_ttsZ   s2   
ri   r>   
np.ndarraysrc_rateinttarget_ratec                 C  sH   ||kr| S zdd l }|j| ||dW S  ty#   td |  Y S w )Nr   )orig_sr	target_sru5   librosa not installed — skipping fallback resample.)librosaresamplerT   loggerwarning)r>   rk   rm   rp   r8   r8   r9   _resample_if_needed   s   
rt   rg   c                 C  s:   t  }tj|| |ddd |d t| dS )Nr   PCM_16)rS   subtyper   zutf-8)	r^   r_   sfwriteseekbase64	b64encodereaddecode)r>   rg   bufr8   r8   r9   _audio_to_base64_wav   s   
r   languager   c           
      C  s*  |pt   }|tvrdd| dt iS | r|  s ddiS t| } t| }|d }td| d|d  d	| d
t|   z3t	| |\}}t
||t}t|t}tt|t d}td| dt|  ||t|t| dW S  ty }	 ztd|	  dt|	iW  Y d}	~	S d}	~	ww )u`  
    Convert text to human-like speech using Microsoft Edge Neural Cloud APIs.

    Returns (success)
    ─────────────────
    {
        "audio_tts"   : "<Base64-encoded WAV string>",
        "language"    : "hindi",
        "sample_rate" : 22050,
        "duration_sec": 4.83,
        "char_count"  : 232,
    }
    errorzUnsupported language 'z'. Valid values: z>Text payload is empty. Provide a non-empty 'predefinedAnswer'.r   zTTS Cloud Request | language=z (r
   z
) | voice=z	 | chars=   z%TTS Cloud Output complete | duration=zs | base64_len=)	audio_ttsr   rg   duration_sec
char_countzTTS Cloud Pipeline failed: N)r-   r7   lowerr*   r+   r:   rr   infolenri   rt   TARGET_SAMPLE_RATEr   roundr[   r   r,   )
r.   r   lang_cfgr   rh   raw_sample_ratefinal_audio	audio_b64r   re   r8   r8   r9   generate_tts   sP   
r   )r.   r,   r/   r,   )r.   r,   r   r,   r/   r;   )r>   rj   rk   rl   rm   rl   r/   rj   )r>   rj   rg   rl   r/   r,   )r.   r,   r   r,   r/   r   )&__doc__
__future__r   rK   rz   concurrent.futuresrV   r^   loggingr5   r3   typingr   r   r   rb   np	soundfilerw   r\   basicConfigINFO	getLoggerrr   r   OUTPUT_FORMATTTS_MODEL_IDr*   __annotations__sortedkeysr+   r-   r:   ri   rt   r   r   r8   r8   r8   r9   <module>   sR    


















*

