o e5@sddlmZmZmZmZddlmZddlmZddl m Z ddl Z ddl mZddlZddlmZejr9dnd Zed d ed Zed d ed Z     d'ddZd(ddZddZeZejdedddde ddZejdedd efd!d"Zed#d$efd%d&Z dS)))FastAPI WebSocketRequestWebSocketDisconnect) StaticFiles) HTMLResponse)Jinja2TemplatesN)pipeline)ffmpeg_microphone_livezcuda:0Zcpuzaudio-classificationz$MIT/ast-finetuned-speech-commands-v2)modeldevicezanton-l/xtreme_s_xlsr_minds14marvin?@?Fcs|tjjjvrtd|dtjjjdtjj}t|||d}t dt|D]}|d}|r9t ||d|krH|d|krHd Sq-dS) Nz Wake word z? not in set of valid class labels, pick a wake word in the set . sampling_ratechunk_length_sstream_chunk_sListening for wake word...rlabelscoreT) classifierr configZlabel2idkeys ValueErrorfeature_extractorrr print)Z wake_wordZprob_thresholdrrdebugrmic predictionr"TD:\Code\ProjectsPython\_HuggingFace\ASR-w-ZeroShotClassification-Assistant\server.py launch_fns*   r$c stjj}t|||d}g}tdtdD]=}t|}||dt|d}t||d|ddd|d d IdHt |dd d IdHrStd nqt |} t| }|dd} d dd| D} |d| IdHdS)NrZ Listeningrawzchunk: rrz | z / 4gffffff?) thresholdz#Silence detected, processing audio. cSs*g|]}|dd|ddddqS)rz: rdz.2f%r").0Zpredr"r"r# Ms*zlisten..z classes: ) intent_class_piperrr rrangenextappend send_text is_silencenpZ concatenatejoin) websocketrrrr Z audio_bufferi audio_chunkr!Zcombined_audioZtop_3_predictionsZformatted_predictionsr"r"r#listen3s2  *  r:cs2t|}|dddkr|dd|krdSdS)NrrsilencerTF)r/)r9r(r;r"r"r#r4Rs  r4z/staticZstatic) directory)name templates/)Zresponse_classrequestcstdd|iS)Nz index.htmlr@)r>ZTemplateResponse)r@r"r"r#get_homedsrAz/wsr7cs|IdHzJd} |IdH}|dkr?|s?d}|dIdHtddIdH}|r>|dIdHt|IdHd}n|dkrR|rRd}|dIdHWdSq ty`td YdSw) NFTstartr)rz/Wake word detected. Listening for your query...stopz"Process stopped. Ready to restart.zClient disconnected.)acceptZ receive_textr3r$r:rr)r7Zprocess_activemessageZwake_word_detectedr"r"r#websocket_endpointis0  rF)r rrrF)rr)!ZfastapirrrrZfastapi.staticfilesrZfastapi.responsesrZfastapi.templatingrZnumpyr5Z transformersr ZtorchZ"transformers.pipelines.audio_utilsr ZcudaZ is_availabler rr/r$r:r4appZmountr>getrAr7rFr"r"r"r#s<