
    0$j                        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  ed      Zedz  dz  Z	e	j                  dd       dZej                  j                  d	d
      Zdedeeef   fdZd ZdededefdZd Zedk(  r e        yy)    N)Pathz/opt/ai-avatar-demoworkgate602_m4a_artifactsT)parentsexist_okz+http://192.168.0.2:4000/v1/chat/completionsM4A_LLM_MODELgpt-4o-minitextreturnc           
         t         ddg}t               }g }|D ]A  }||v r	|j                  |       |dddd| dgddd	}t        j                  j                  t        t        j                  |      j                  d
      ddid      }	 t        j                  j                  |d      5 }t        j                  |j                         j                  d
            }d d d        j                  di g      d   j                  di       j                  dd      }	|	r$|	j                         r||	j                         fc S |j!                  |d|d       D t/        d"t        j                  |d#$      d d% z         # 1 sw Y   xY w# t"        $ r}
d}t%        |
d      r7	 |
j                         j                  d
d      d d }n# t"        $ r d}Y nw xY w|j!                  |t'        |
      j(                  t+        |
      |d       t-        d| dt'        |
      j(                   d|
 d !       Y d }
~
&d }
~
ww xY w)&Nzgemma-4-hereticr	   systemz[Reply with exactly one short Traditional Chinese sentence. Do not return an empty response.)rolecontentuseri   g?)modelmessages
max_tokenstemperatureutf-8zContent-Typezapplication/jsonPOST)dataheadersmethod<   )timeoutchoicesr   messager    empty_content)r   errorpayloadreadreplace)errorsi  )r   r    detailbodyzM4A_LLM_MODEL_FAILED= z: Tflushz%LiteLLM failed for all tried models: F)ensure_asciii  )	LLM_MODELsetaddurllibrequestRequestLLM_URLjsondumpsencodeurlopenloadsr"   decodegetstripappend	Exceptionhasattrtype__name__strprintRuntimeError)r
   modelsseenr$   r   r!   reqrespr   r   excr&   s               6/opt/ai-avatar-demo/work/gate602_m4a_minimal_runner.pycall_litellmrH      s?   *M:F5DF "[D=!  /L  MD1 
 nn$$G$++G4#%78	 % 
	[''R'8 ?Dzz$))+"4"4W"=>?hhy2$/266y"EII)UWXG7==?gmmo--MMEOPTUV3"[F >FafAghmimAnn
oo? ?  	[DsF#88:,,WY,GND  DMMEDI4F4FRUVYRZdhij)%$s)2D2D1ERuMUYZZ	[s\   !F.3F!A!FFF	F	IH>'$GH>GH>GAH>>Ic                      g } t         dz  t         dz  t         dz  dz  g}g d}|D ]A  }|j                         s|D ])  }| j                  d |j                  |      D               + C t	        t        |             S )Nr   servicesr   tts_outputs)z*tts*.pyz*qwen*tts*.pyz*gate7m*.pyz*synthesize*.pyz*.wavc              3   P   K   | ]  }d |j                   vst        |         yw)z.envN)partsr?   ).0paths     rG   	<genexpr>z&find_tts_candidates.<locals>.<genexpr>B   s"     dD6Y]YcYcKcc$ids   &&)BASEexistsextendrglobsortedr,   )
candidatesrootspatternsrootpatterns        rG   find_tts_candidatesr[   :   s    JF]D:-tf}}/LMEWH e{{} 	eGdDJJw4Gdd	ee
 #j/""    tsllm_textc                 F    t         d|  dz  }|j                  |d       |S )Nm4a_tts_input_z.txtr   encoding)ART
write_text)r]   r^   placeholders      rG   write_tts_placeholderrf   F   s.    .D11K8g6r\   c                  <   t        t        j                               } t        j                  j	                  dd      }t        d| d       t        dt         d       t        |      \  }}t        d| d       t        d| d       t               }t        | |      }t        d	| d       | |t        |||d d
 dd ddd
}t        d|  dz  }|j                  t        j                  |dd      d       t        d| d       t        dd       y )NM4A_TEST_STT_TEXTu3   Mars 測試 M4A：請用一句自然中文回覆。zM4A_STT_TEXT=Tr(   zM4A_LLM_MODEL_REQUESTED=zM4A_LLM_MODEL_USED=zM4A_LLM_TEXT=zM4A_TTS_INPUT_TEXT=P   z@/opt/ai-avatar-demo/work/gate7m_a_qwen3_tts_customvoice_smoke.py?TTS_CALLABLE_IDENTIFIED_BUT_NOT_INVOKED_IN_M4A_MINIMAL_SKELETONzELIVEKIT_BINDING_PENDING; no active LiveKit server port found in recon)
	timestampstt_textllm_model_requestedllm_model_usedr^   tts_candidates&recommended_tts_callable_if_identifiedtts_audio_path
tts_statuslivekit_statusm4a_minimal_result_z.jsonF   )r*   indentr   ra   zM4A_RESULT_JSON=M4A_MINIMAL_RUNNER_DONE)inttimeosenvironr8   r@   r+   rH   r[   rf   rc   rd   r2   r3   )r]   rl   actual_modelr^   ro   tts_input_pathresultout_jsons           rG   mainr   M   s&   	TYY[	Bzz~~13hiH	M(
$D1	$YK
0=)(3L(	~
.d;	M(
$D1(*N*2x8N	/
0= (&("-2tWaF *2$e44H

6aHSZ[	XJ
't4	
#40r\   __main__)r2   rz   
subprocessry   urllib.requestr.   pathlibr   rQ   rc   mkdirr1   r{   r8   r+   r?   tuplerH   r[   rx   rf   r   r>    r\   rG   <module>r      s     	    !"
Vm-- 		$	 &
7JJNN?M:	'ps 'puS#X 'pT	#c S T 1@ zF r\   