a 8a- @s4ddlmZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ej dddZddlZddlZddlZeZededZdZdZdd lTdd lmZed kr,dd lmZdd lmZedddddddddd Z dddddZ!eddZ"edZ#e#$e%e!&Z'd Z(d!Z)d"Z*d#Z+ej,Z-d$Z.da/e0d%Z1e0d&Z2ej0d'd(d)d*Z3e4de5e6e5e6e5Z7d+d,Z8e7e8Z9ed-d.Z:d/d0Z;d1d2Zd7d8Z?d9d:Z@d;d<ZAd=d>ZBd?d@ZCdAdBZDdCdDZEdEdFZFeGdGkr0d)ZHdHaIdZJdZKed kr&e?eHr0q&dS)I) byteorder)arrayN)wavmakerZAKIAWFFYOXCZ6ZXEPSUSz(/N+r5Q/+Y3J8GdTKkAB+v6wDb5ljTy/V+YqgCKMW)Zaws_access_key_idZaws_secret_access_keyz platform: )*)contextmanagerDarwin)LED)APA102)rr)rr r)r r)r 3)r rr )r rr)r r r )r r r )rrr) bluegreenorangeZpinkpurpleredwhiteyellowoffrrrr) picovoice porcupine blueberry terminator )Znum_ledZ ISXIO344FFZ ZWIGXTFIAUiii>pollyz lexv2-runtime translatez us-east-1T)Z service_nameZ region_nameZuse_sslcCsdSN)filenamelinefunctionerrfmtrrL/home/pi/TSA/TSA-demo/TSA_voice_assistant/raspberry_voice_assistant_local.pypy_error_handlerWsr&ccsHtdkr6td}|tdV|dtdndVtddS)Nrz libasound.soznoalsoerr activatedzno alsa err mode deactivated) platform_sysZcdllZ LoadLibraryZsnd_lib_error_set_handlerc_error_handlerprint)Zasoundrrr% noalsaerr\s    r*cCs t|tkSr)max THRESHOLD)datarrr% is_silenthsr.cCsBt$d}d}t}tdkr8|jtdtdtd}n|jtjdtdtd}| t d}t d| t}t dkr~| ||t|}|r|r|d7}|d7}n|s|sd}d}d}|r|d7}|r|d krq|r^|d kr^qq^|||tdkrtd td |WdS1s40YdS) NrFrT)formatchannelsrateinputframes_per_bufferhbigPrz-turning off leds and returning recorded voice)r*pyaudioPyAudior'openFORMATRATE CHUNK_SIZEpaInt16Z start_streamrreadrbyteswapextendr. stop_streamclose terminate set_colorr))Z num_silentstartpstream recordingr-ZsilentZ sessionlengthrrr% record_phraseksD       rKcCs>t}|jtdtddd}||||dS)Nr/T)r0r1r2outputZinput_device_index) r9r:r;r<r=writer@rCrD)audiorHrIrrr% play_audios rPcCs>t|}tdD] }t||d|d|dqtdS)Nrrr/rL) COLORS_RGBrangedriver set_pixelshow)Zcoloricolorirrr%rFs rFc Csd}gd|}d}|dkrtdD]@}t||d|d|d|d|d|dtq$td |d d|dd }|d7}qtd dS) Nr)rrrrrrrrr/rLg?r)rRrSrTrUtimesleeprF)Z pixels_numberZpixelsZccrWrrr% color_starts  4   r_cCsPtj|d|d}td|dtd|dtd|d|dS) NZen)TextSourceLanguageCodeTargetLanguageCodezTranslatedText: ZTranslatedTextzSourceLanguageCode: razTargetLanguageCode: rb)rZtranslate_textr)get)textZlangresultrrr% translatelangsrfc Cszzttjddgd}t}|j|jdtjd|jd}t d| |j}t d|j|}| |}|d krJt d t|td krtttt|WdWW|dur||dur|t d |dur|t d dSqJWdn1s0YWn0tyN}zt d|WYd}~n d}~00W|durd||dur~|t d |dur|t d nH|dur||dur|t d |dur|t d 0dS)Nrr)keywordsr/T)r2r1r0r3r4z[Listening...]r5rzHotword '%s' Detectedrzaudio stream closedz pa terminatedZhotwordzword exception: )r*Z pvporcupineZcreater9r:r;Z sample_rater?Z frame_lengthr)r@struct unpack_fromprocessrgr'rFrQKEYWORDS_COLORdeleterDrE Exception)rpa audio_streampcmZ keyword_indexerrr%words\  *2      rrcCs6tdurtatjdd|t|d}|d}t|dS)NZstandardrp)ZEngineZ OutputFormatr`ZVoiceIdZTextTypeZ AudioStream)VOICE_ID get_voiceidrsynthesize_speechrP)messageZ text_typeresponserOrrr%rusruc Csrz2td|tjtt||dd|d}td||WStyl}z"td|tddWYd}~d Sd}~00dS) Nz locale_Id: z!audio/l16; rate=16000; channels=1z audio/pcm)botId botAliasIdlocaleIdZ sessionIdZrequestContentTypeZresponseContentTypeZ inputStreamz Lex response zthere is an error: zI could not understandrdnone)r)lexv2Zrecognize_utterancebot_id bot_alias_idrmru) session_idrJZ locale_Idrwrqrrr% call_lexv2s"    rcCs&t|}t|dtj}t|S)N)base64 b64decodezlib decompress MAX_WBITSjsonloads)r-Z decoded_dataZdecompressed_datarrr%decodes rcCs8td}|jttd}|jt|ddd}|ddS)Nz lexv2-models)ryrx botVersionen_US)rxrrzZ voiceSettingsZvoiceId)sessionclientZdescribe_bot_aliasr~r}Zdescribe_bot_locale)Z lexv2_modelZ bot_aliasZ bot_localerrr%rt s rtc Cstdtdtt}tjrztdkrr?r<r=rsrrr|rZ CFUNCTYPEZc_char_pZc_intZERROR_HANDLER_FUNCr&r(r*r.rKrPrFr_rfrrrurrrtr__name__ZbotZ launchlexintrorDrrrr%s              ;  ,