From 152eb5a00e503a334b9ac8cdc063eef6a59956ae Mon Sep 17 00:00:00 2001 From: boyang Date: Wed, 23 Nov 2022 17:31:09 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E3=80=90=E5=8D=9A=E6=B3=B0=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E5=8A=A9=E7=90=86=E9=A1=B9=E7=9B=AE=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: boyang --- .gitattributes | 1 + .../VoiceAssistantApp/build-profile.json5 | 40 + .../entry/build-profile.json5 | 13 + .../VoiceAssistantApp/entry/hvigorfile.js | 2 + .../VoiceAssistantApp/entry/package-lock.json | 5 + .../VoiceAssistantApp/entry/package.json | 14 + .../entry/src/main/config.json | 90 + .../entry/src/main/ets/MainAbility/app.ets | 11 + .../MainAbility/components/speakerComp.ets | 42 + .../ets/MainAbility/components/toastComp.ets | 49 + .../main/ets/MainAbility/models/asrModel.ets | 13 + .../src/main/ets/MainAbility/pages/index.ets | 630 ++++ .../main/ets/MainAbility/utils/logUtil.ets | 6 + .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 16 + .../main/resources/base/media/btn_focus.png | Bin 0 -> 10096 bytes .../main/resources/base/media/btn_normal.png | Bin 0 -> 1579 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/base/media/icon_close.png | Bin 0 -> 1249 bytes .../main/resources/base/media/icon_temp.png | Bin 0 -> 1060 bytes .../main/resources/base/media/icon_wind.png | Bin 0 -> 1479 bytes .../src/main/resources/base/media/seat.png | Bin 0 -> 51673 bytes .../main/resources/base/media/voice_ball.png | Bin 0 -> 81499 bytes .../resources/base/media/voice_bottom.png | Bin 0 -> 11443 bytes .../src/main/resources/base/media/wind0.png | Bin 0 -> 225300 bytes .../src/main/resources/base/media/wind1.png | Bin 0 -> 224665 bytes .../src/main/resources/base/media/wind10.png | Bin 0 -> 226397 bytes .../src/main/resources/base/media/wind2.png | Bin 0 -> 225808 bytes .../src/main/resources/base/media/wind3.png | Bin 0 -> 225075 bytes .../src/main/resources/base/media/wind4.png | Bin 0 -> 225862 bytes .../src/main/resources/base/media/wind5.png | Bin 0 -> 226004 bytes .../src/main/resources/base/media/wind6.png | Bin 0 -> 226346 bytes .../src/main/resources/base/media/wind7.png | Bin 0 -> 225961 bytes .../src/main/resources/base/media/wind8.png | Bin 0 -> 225673 bytes .../src/main/resources/base/media/wind9.png | Bin 0 -> 225742 bytes .../main/resources/base/media/wind_close.png | Bin 0 -> 38429 bytes .../main/resources/base/media/wind_cold.png | Bin 0 -> 100734 bytes .../main/resources/base/media/wind_hot.png | Bin 0 -> 132167 bytes .../VoiceAssistantApp/hvigorfile.js | 2 + .../VoiceAssistantApp/local.properties | 9 + .../VoiceAssistantApp/package-lock.json | 1226 +++++++ .../VoiceAssistantApp/package.json | 18 + FA/PATEO_CarVoiceAssistant/data.zip | 3 + .../voiceassistant/etc/init/BUILD.gn | 27 + .../etc/init/voice_assistant_service.cfg | 16 + .../etc/init/voice_assistant_service.rc | 21 + .../manager/include/audio_record_manager.h | 51 + .../manager/include/i_wakeup_manager.h | 35 + .../frameworks/manager/include/tts_manager.h | 70 + .../manager/include/voice_cloud_loader.h | 15 + .../manager/include/wakeup_manager.h | 45 + .../manager/src/audio_record_manager.cpp | 201 ++ .../frameworks/manager/src/tts_manager.cpp | 249 ++ .../manager/src/voice_cloud_loader.cpp | 88 + .../frameworks/manager/src/wakeup_manager.cpp | 209 ++ .../frameworks/pocketsphinx/BUILD.gn | 119 + .../pocketsphinx/include/CMakeLists.txt | 5 + .../pocketsphinx/include/android/config.h | 108 + .../include/android/sphinx_config.h | 17 + .../pocketsphinx/include/pocketsphinx.h | 731 ++++ .../include/pocketsphinx/cmdln_macro.h | 388 +++ .../include/pocketsphinx/export.h | 15 + .../include/pocketsphinx/ps_lattice.h | 456 +++ .../include/pocketsphinx/ps_mllr.h | 86 + .../include/pocketsphinx/ps_search.h | 319 ++ .../pocketsphinx/include/sphinxbase/agc.h | 202 ++ .../pocketsphinx/include/sphinxbase/bio.h | 316 ++ .../pocketsphinx/include/sphinxbase/bitarr.h | 152 + .../pocketsphinx/include/sphinxbase/bitvec.h | 155 + .../include/sphinxbase/byteorder.h | 98 + .../pocketsphinx/include/sphinxbase/case.h | 135 + .../include/sphinxbase/ckd_alloc.h | 311 ++ .../include/sphinxbase/clapack_lite.h | 36 + .../pocketsphinx/include/sphinxbase/cmd_ln.h | 447 +++ .../pocketsphinx/include/sphinxbase/cmn.h | 185 + .../pocketsphinx/include/sphinxbase/err.h | 221 ++ .../pocketsphinx/include/sphinxbase/f2c.h | 218 ++ .../pocketsphinx/include/sphinxbase/fe.h | 561 ++++ .../pocketsphinx/include/sphinxbase/feat.h | 469 +++ .../include/sphinxbase/filename.h | 112 + .../include/sphinxbase/fixpoint.h | 145 + .../include/sphinxbase/fsg_model.h | 376 +++ .../pocketsphinx/include/sphinxbase/genrand.h | 177 + .../pocketsphinx/include/sphinxbase/glist.h | 242 ++ .../include/sphinxbase/hash_table.h | 443 +++ .../pocketsphinx/include/sphinxbase/heap.h | 153 + .../pocketsphinx/include/sphinxbase/jsgf.h | 209 ++ .../include/sphinxbase/listelem_alloc.h | 125 + .../pocketsphinx/include/sphinxbase/logmath.h | 249 ++ .../pocketsphinx/include/sphinxbase/matrix.h | 214 ++ .../pocketsphinx/include/sphinxbase/mmio.h | 85 + .../include/sphinxbase/ngram_model.h | 703 ++++ .../pocketsphinx/include/sphinxbase/pio.h | 308 ++ .../include/sphinxbase/prim_type.h | 195 ++ .../include/sphinxbase/priority_queue.h | 45 + .../pocketsphinx/include/sphinxbase/profile.h | 231 ++ .../include/sphinxbase/sbthread.h | 220 ++ .../include/sphinxbase/sphinx_config.h | 17 + .../include/sphinxbase/sphinxbase_export.h | 15 + .../include/sphinxbase/strfuncs.h | 158 + .../pocketsphinx/include/sphinxbase/yin.h | 116 + .../pocketsphinx/include/win32/config.h | 31 + .../include/win32/sphinx_config.h | 13 + .../pocketsphinx/include/wince/assert.h | 6 + .../pocketsphinx/include/wince/config.h | 3 + .../pocketsphinx/include/wince/errno.h | 94 + .../include/wince/sphinx_config.h | 16 + .../pocketsphinx/src/CMakeLists.txt | 109 + .../frameworks/pocketsphinx/src/acmod.c | 1331 ++++++++ .../frameworks/pocketsphinx/src/acmod.h | 500 +++ .../pocketsphinx/src/allphone_search.c | 915 +++++ .../pocketsphinx/src/allphone_search.h | 190 ++ .../frameworks/pocketsphinx/src/bin_mdef.c | 891 +++++ .../frameworks/pocketsphinx/src/bin_mdef.h | 247 ++ .../pocketsphinx/src/blkarray_list.c | 172 + .../pocketsphinx/src/blkarray_list.h | 149 + .../frameworks/pocketsphinx/src/dict.c | 506 +++ .../frameworks/pocketsphinx/src/dict.h | 222 ++ .../frameworks/pocketsphinx/src/dict2pid.c | 572 ++++ .../frameworks/pocketsphinx/src/dict2pid.h | 187 ++ .../frameworks/pocketsphinx/src/fast_ptm.txt | 23 + .../pocketsphinx/src/fe/fe_interface.c | 692 ++++ .../pocketsphinx/src/fe/fe_internal.h | 181 + .../frameworks/pocketsphinx/src/fe/fe_noise.c | 364 ++ .../frameworks/pocketsphinx/src/fe/fe_noise.h | 60 + .../pocketsphinx/src/fe/fe_sigproc.c | 1388 ++++++++ .../frameworks/pocketsphinx/src/fe/fe_type.h | 65 + .../frameworks/pocketsphinx/src/fe/fe_warp.c | 252 ++ .../frameworks/pocketsphinx/src/fe/fe_warp.h | 90 + .../pocketsphinx/src/fe/fe_warp_affine.c | 181 + .../pocketsphinx/src/fe/fe_warp_affine.h | 76 + .../src/fe/fe_warp_inverse_linear.c | 178 + .../src/fe/fe_warp_inverse_linear.h | 77 + .../src/fe/fe_warp_piecewise_linear.c | 223 ++ .../src/fe/fe_warp_piecewise_linear.h | 77 + .../frameworks/pocketsphinx/src/fe/fixlog.c | 229 ++ .../pocketsphinx/src/fe/make_log_sub_table.py | 35 + .../pocketsphinx/src/fe/make_log_table.py | 24 + .../frameworks/pocketsphinx/src/fe/yin.c | 322 ++ .../frameworks/pocketsphinx/src/feat/agc.c | 227 ++ .../frameworks/pocketsphinx/src/feat/cmn.c | 188 ++ .../pocketsphinx/src/feat/cmn_live.c | 163 + .../frameworks/pocketsphinx/src/feat/feat.c | 1497 +++++++++ .../frameworks/pocketsphinx/src/feat/lda.c | 158 + .../frameworks/pocketsphinx/src/fsg_history.c | 315 ++ .../frameworks/pocketsphinx/src/fsg_history.h | 226 ++ .../frameworks/pocketsphinx/src/fsg_lextree.c | 835 +++++ .../frameworks/pocketsphinx/src/fsg_lextree.h | 266 ++ .../frameworks/pocketsphinx/src/fsg_search.c | 1574 +++++++++ .../pocketsphinx/src/fsg_search_internal.h | 164 + .../frameworks/pocketsphinx/src/hmm.c | 826 +++++ .../frameworks/pocketsphinx/src/hmm.h | 309 ++ .../pocketsphinx/src/kws_detections.c | 120 + .../pocketsphinx/src/kws_detections.h | 87 + .../frameworks/pocketsphinx/src/kws_search.c | 705 ++++ .../frameworks/pocketsphinx/src/kws_search.h | 153 + .../pocketsphinx/src/lm/_jsgf_scanner.l | 87 + .../pocketsphinx/src/lm/fsg_model.c | 940 ++++++ .../frameworks/pocketsphinx/src/lm/jsgf.c | 966 ++++++ .../pocketsphinx/src/lm/jsgf_internal.h | 140 + .../pocketsphinx/src/lm/jsgf_parser.c | 1800 ++++++++++ .../pocketsphinx/src/lm/jsgf_parser.h | 90 + .../pocketsphinx/src/lm/jsgf_parser.y | 156 + .../pocketsphinx/src/lm/jsgf_scanner.c | 2221 ++++++++++++ .../pocketsphinx/src/lm/jsgf_scanner.h | 342 ++ .../frameworks/pocketsphinx/src/lm/lm_trie.c | 914 +++++ .../frameworks/pocketsphinx/src/lm/lm_trie.h | 114 + .../pocketsphinx/src/lm/lm_trie_quant.c | 353 ++ .../pocketsphinx/src/lm/lm_trie_quant.h | 134 + .../pocketsphinx/src/lm/ngram_model.c | 1063 ++++++ .../src/lm/ngram_model_internal.h | 197 ++ .../pocketsphinx/src/lm/ngram_model_set.c | 868 +++++ .../pocketsphinx/src/lm/ngram_model_set.h | 70 + .../pocketsphinx/src/lm/ngram_model_trie.c | 711 ++++ .../pocketsphinx/src/lm/ngram_model_trie.h | 82 + .../pocketsphinx/src/lm/ngrams_raw.c | 387 +++ .../pocketsphinx/src/lm/ngrams_raw.h | 94 + .../frameworks/pocketsphinx/src/mdef.c | 766 +++++ .../frameworks/pocketsphinx/src/mdef.h | 274 ++ .../frameworks/pocketsphinx/src/ms_gauden.c | 571 ++++ .../frameworks/pocketsphinx/src/ms_gauden.h | 153 + .../frameworks/pocketsphinx/src/ms_mgau.c | 283 ++ .../frameworks/pocketsphinx/src/ms_mgau.h | 153 + .../frameworks/pocketsphinx/src/ms_senone.c | 404 +++ .../frameworks/pocketsphinx/src/ms_senone.h | 134 + .../pocketsphinx/src/ngram_search.c | 1408 ++++++++ .../pocketsphinx/src/ngram_search.h | 449 +++ .../pocketsphinx/src/ngram_search_fwdflat.c | 965 ++++++ .../pocketsphinx/src/ngram_search_fwdflat.h | 91 + .../pocketsphinx/src/ngram_search_fwdtree.c | 1570 +++++++++ .../pocketsphinx/src/ngram_search_fwdtree.h | 97 + .../pocketsphinx/src/phone_loop_search.c | 373 ++ .../pocketsphinx/src/phone_loop_search.h | 113 + .../pocketsphinx/src/pocketsphinx.c | 1528 +++++++++ .../pocketsphinx/src/pocketsphinx_internal.h | 245 ++ .../pocketsphinx/src/ps_alignment.c | 508 +++ .../pocketsphinx/src/ps_alignment.h | 240 ++ .../frameworks/pocketsphinx/src/ps_lattice.c | 1937 +++++++++++ .../pocketsphinx/src/ps_lattice_internal.h | 298 ++ .../frameworks/pocketsphinx/src/ps_mllr.c | 169 + .../frameworks/pocketsphinx/src/ptm_mgau.c | 916 +++++ .../frameworks/pocketsphinx/src/ptm_mgau.h | 113 + .../pocketsphinx/src/s2_semi_mgau.c | 1359 ++++++++ .../pocketsphinx/src/s2_semi_mgau.h | 108 + .../frameworks/pocketsphinx/src/s3types.h | 102 + .../pocketsphinx/src/state_align_search.c | 433 +++ .../pocketsphinx/src/state_align_search.h | 99 + .../pocketsphinx/src/tied_mgau_common.h | 132 + .../frameworks/pocketsphinx/src/tmat.c | 284 ++ .../frameworks/pocketsphinx/src/tmat.h | 101 + .../pocketsphinx/src/util/README.python | 41 + .../frameworks/pocketsphinx/src/util/bio.c | 645 ++++ .../frameworks/pocketsphinx/src/util/bitarr.c | 108 + .../frameworks/pocketsphinx/src/util/bitvec.c | 101 + .../pocketsphinx/src/util/blas_lite.c | 2147 ++++++++++++ .../frameworks/pocketsphinx/src/util/case.c | 141 + .../pocketsphinx/src/util/ckd_alloc.c | 427 +++ .../pocketsphinx/src/util/clapack_scrub.py | 276 ++ .../frameworks/pocketsphinx/src/util/cmd_ln.c | 999 ++++++ .../frameworks/pocketsphinx/src/util/dtoa.c | 2985 +++++++++++++++++ .../frameworks/pocketsphinx/src/util/err.c | 305 ++ .../frameworks/pocketsphinx/src/util/errno.c | 51 + .../pocketsphinx/src/util/f2c_lite.c | 551 +++ .../pocketsphinx/src/util/filename.c | 120 + .../pocketsphinx/src/util/fortran.py | 114 + .../pocketsphinx/src/util/genrand.c | 198 ++ .../frameworks/pocketsphinx/src/util/glist.c | 271 ++ .../pocketsphinx/src/util/hash_table.c | 706 ++++ .../frameworks/pocketsphinx/src/util/heap.c | 292 ++ .../pocketsphinx/src/util/listelem_alloc.c | 295 ++ .../pocketsphinx/src/util/logmath.c | 503 +++ .../pocketsphinx/src/util/make_lite.py | 265 ++ .../frameworks/pocketsphinx/src/util/matrix.c | 279 ++ .../frameworks/pocketsphinx/src/util/mmio.c | 257 ++ .../frameworks/pocketsphinx/src/util/pio.c | 657 ++++ .../pocketsphinx/src/util/priority_queue.c | 144 + .../pocketsphinx/src/util/profile.c | 345 ++ .../pocketsphinx/src/util/sbthread.c | 739 ++++ .../frameworks/pocketsphinx/src/util/slamch.c | 1029 ++++++ .../pocketsphinx/src/util/slapack_lite.c | 1463 ++++++++ .../pocketsphinx/src/util/strfuncs.c | 194 ++ .../pocketsphinx/src/util/wrapped_routines | 4 + .../frameworks/pocketsphinx/src/vector.c | 150 + .../frameworks/pocketsphinx/src/vector.h | 100 + .../frameworks/utils/include/common_utils.h | 23 + .../utils/include/voice_assistant_log.h | 26 + .../voiceassistant/frameworks/vad/BUILD.gn | 41 + .../vad/include/signal_processing_library.h | 290 ++ .../frameworks/vad/include/spl_inl.h | 79 + .../frameworks/vad/include/spl_inl_armv7.h | 136 + .../frameworks/vad/include/spl_inl_mips.h | 204 ++ .../frameworks/vad/include/vad.h | 50 + .../frameworks/vad/include/vad_core.h | 125 + .../frameworks/vad/include/vad_filterbank.h | 45 + .../frameworks/vad/include/vad_gmm.h | 39 + .../frameworks/vad/include/vad_sp.h | 54 + .../frameworks/vad/include/webrtc_vad.h | 87 + .../vad/src/signal_processing_library.c | 668 ++++ .../voiceassistant/frameworks/vad/src/vad.cc | 55 + .../frameworks/vad/src/vad_core.c | 680 ++++ .../frameworks/vad/src/vad_filterbank.c | 326 ++ .../frameworks/vad/src/vad_gmm.c | 82 + .../frameworks/vad/src/vad_sp.c | 172 + .../frameworks/vad/src/webrtc_vad.c | 112 + .../frameworks/voiceclouddll/BUILD.gn | 20 + .../voiceclouddll/i_voice_cloud_manager.h | 50 + .../declaration/@ohos.carvoiceassistant.d.ts | 119 + .../interfaces/kits/js/declaration/BUILD.gn | 27 + .../include/voice_assistant_event_target.h | 87 + .../napi/include/voice_assistant_napi_tools.h | 33 + .../napi/src/voice_assistant_event_target.cpp | 223 ++ .../kits/js/napi/src/voice_assistant_napi.cpp | 380 +++ .../napi/src/voice_assistant_napi_tools.cpp | 90 + .../voiceassistant/ohos.build | 56 + .../voiceassistant/prebuild.sh | 14 + .../voiceassistant/profile/5102.xml | 24 + .../voiceassistant/profile/BUILD.gn | 19 + .../voiceassistant/resources/BUILD.gn | 117 + .../voiceassistant/services/BUILD.gn | 140 + .../client/voice_assistant_ability_agent.h | 48 + .../client/voice_assistant_ability_proxy.h | 35 + ...ce_assistant_agent_proxy_death_recipient.h | 37 + .../client/voice_assistant_client_callback.h | 28 + .../voice_assistant_client_callback_stub.h | 22 + .../client/voice_assistant_client_manager.h | 53 + .../server/voice_assistant_ability_stub.h | 85 + .../server/voice_assistant_agent_service.h | 36 + .../voice_assistant_callback_event_target.h | 35 + ...assistant_callback_proxy_death_recipient.h | 37 + .../voice_assistant_client_callback_proxy.h | 27 + .../client/voice_assistant_ability_proxy.cpp | 253 ++ .../voice_assistant_client_callback_stub.cpp | 77 + .../client/voice_assistant_client_manager.cpp | 173 + .../server/voice_assistant_ability_stub.cpp | 497 +++ .../server/voice_assistant_agent_service.cpp | 64 + .../voice_assistant_callback_event_target.cpp | 79 + .../voice_assistant_client_callback_proxy.cpp | 109 + .../services/src/voice_cloud_doc.txt | 77 + .../voiceassistant/test/client_test/BUILD.gn | 68 + .../test/client_test/client_test.cpp | 71 + docs/PATEO_CarVoiceAssistant/README_zh.md | 78 + docs/PATEO_CarVoiceAssistant/media/AppUI.jpg | Bin 0 -> 426105 bytes .../\345\212\237\350\203\275\345\233\276.png" | Bin 0 -> 102650 bytes ...2\346\265\201\347\250\213\345\233\276.jpg" | Bin 0 -> 95122 bytes .../\346\236\266\346\236\204\345\233\276.jpg" | Bin 0 -> 197288 bytes .../\346\265\201\347\250\213\345\233\276.jpg" | Bin 0 -> 147681 bytes ...00\345\217\221\346\226\207\346\241\243.md" | 121 + ...06\346\210\220\346\226\207\346\241\243.md" | 44 + ...00\345\217\221\346\226\207\346\241\243.md" | 74 + 309 files changed, 83945 insertions(+) create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/hvigorfile.js create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package-lock.json create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package.json create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/config.json create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/speakerComp.ets create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/toastComp.ets create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/color.json create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/string.json create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/btn_focus.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/btn_normal.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_close.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_temp.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_wind.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/seat.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_ball.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_bottom.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind0.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind1.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind10.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind2.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind3.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind4.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind5.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind6.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind7.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind8.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind9.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_close.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_cold.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_hot.png create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/hvigorfile.js create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package-lock.json create mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json create mode 100644 FA/PATEO_CarVoiceAssistant/data.zip create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fsg_model.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/yin.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/blas_lite.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/ohos.build create mode 100755 FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn create mode 100644 FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp create mode 100644 docs/PATEO_CarVoiceAssistant/README_zh.md create mode 100644 docs/PATEO_CarVoiceAssistant/media/AppUI.jpg create mode 100644 "docs/PATEO_CarVoiceAssistant/media/\345\212\237\350\203\275\345\233\276.png" create mode 100644 "docs/PATEO_CarVoiceAssistant/media/\345\255\220\347\263\273\347\273\237\345\224\244\351\206\222\346\265\201\347\250\213\345\233\276.jpg" create mode 100644 "docs/PATEO_CarVoiceAssistant/media/\346\236\266\346\236\204\345\233\276.jpg" create mode 100644 "docs/PATEO_CarVoiceAssistant/media/\346\265\201\347\250\213\345\233\276.jpg" create mode 100644 "docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" create mode 100644 "docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\351\233\206\346\210\220\346\226\207\346\241\243.md" create mode 100644 "docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" diff --git a/.gitattributes b/.gitattributes index 4542312..52654a0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ FA/GreyWolf_NetConfig/gradle/wrapper/gradle-wrapper.jar filter=lfs diff=lfs merge=lfs -text +FA/PATEO_CarVoiceAssistant/data.zip filter=lfs diff=lfs merge=lfs -text diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 new file mode 100644 index 0000000..da3c134 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 @@ -0,0 +1,40 @@ +{ + "app": { + "signingConfigs": [ + { + "name": "default", + "material": { + "certpath": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_com.pateo.voiceassistant.cer", + "storePassword": "0000001AD71F1522D391A581FD55351890116B3FEF1EF70DCA414A32BEF5A47A765DBC85405ECD31F888", + "keyAlias": "debugKey", + "keyPassword": "0000001A16B4CDD9E39FEFE8D9FC01091B4C6CFF802F472F1CDCC40F3FAC55AF8D210246515E29B98B09", + "profile": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_com.pateo.voiceassistant.p7b", + "signAlg": "SHA256withECDSA", + "storeFile": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_com.pateo.voiceassistant.p12" + } + } + ], + "compileSdkVersion": 8, + "compatibleSdkVersion": 8, + "products": [ + { + "name": "default", + "signingConfig": "default", + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 new file mode 100644 index 0000000..bc9939e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 @@ -0,0 +1,13 @@ +{ + "apiType": 'faMode', + "buildOption": { + }, + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/hvigorfile.js b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/hvigorfile.js new file mode 100644 index 0000000..79ea2ec --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').legacyHapTasks diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package-lock.json b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package-lock.json new file mode 100644 index 0000000..15bc714 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "entry", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package.json b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package.json new file mode 100644 index 0000000..c7685ac --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "devDependencies": {}, + "name": "entry", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "description": "example description", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/config.json b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/config.json new file mode 100644 index 0000000..95b4e92 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/config.json @@ -0,0 +1,90 @@ +{ + "app": { + "bundleName": "com.pateo.voiceassistant", + "vendor": "example", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.pateo.entry", + "name": ".entry", + "mainAbility": ".MainAbility", + "deviceType": [ + "default", + "tablet" + ], + "reqPermissions": [ + { + "name": "ohos.permission.INTERNET" + }, + { + "name": "ohos.permission.OPERATE_DIRECTORY" + }, + { + "name": "ohos.permission.MICROPHONE" + }, + { + "name": "ohos.permission.USE_BLUETOOTH" + }, + { + "name": "ohos.permission.MODIFY_AUDIO_SETTINGS" + }, + { + "name": "ohos.permission.ACCESS_NOTIFICATION_POLICY" + }, + { + "name": "ohos.permission.LOCATION" + } + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry", + "installationFree": false + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "formsEnabled": false, + "name": ".MainAbility", + "srcLanguage": "ets", + "srcPath": "MainAbility", + "icon": "$media:icon", + "description": "$string:MainAbility_desc", + "label": "$string:MainAbility_label", + "type": "page", + "visible": true, + "launchType": "standard" + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": ".MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 0000000..b705469 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,11 @@ + + +export default { + onCreate() { + console.info('Application onCreate') + + }, + onDestroy() { + console.info('Application onDestroy') + }, +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/speakerComp.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/speakerComp.ets new file mode 100644 index 0000000..35cbf32 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/speakerComp.ets @@ -0,0 +1,42 @@ +@Component +export default struct SpeakerDialog { + action: (speaker: string) => void + @Link visible: boolean + speakers = ['common', 'zhilingfa', 'qianranfa', 'tzruim', 'gqlanf', + 'jlshim', 'madoufp_wenrou', 'gdfanf_boy', 'gdfanfp', 'mandarin', + 'hchunf_ctn', 'wqingf_csn', 'aningf', 'yukaim_all'] + + tapAction(speaker: string) { + return () => { + this.action(speaker) + this.visible = false + } + } + + build() { + Stack() { + Scroll() { + Grid() { + ForEach(this.speakers, item => { + GridItem() { + Button(item) + .fontSize(40) + .height(70) + .fontColor(Color.White) + }.onClick(this.tapAction(item)) + }) + } + .columnsGap(15) + .rowsGap(15) + .padding({ top: 39, bottom: 39 }) + .columnsTemplate('1fr 1fr 1fr') + } + .backgroundColor('#FF0D0F10') + .borderRadius(18) + .width(950).height(500) + } + .width('100%') + .height('100%') + .visibility(this.visible ? Visibility.Visible : Visibility.Hidden) + } +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/toastComp.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/toastComp.ets new file mode 100644 index 0000000..1f202b1 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/toastComp.ets @@ -0,0 +1,49 @@ +class ToastCompCallBack { + //通知组件显示toast + public tellShowToastCallback: (message: string, duration?: number) => void; +} + +export class ToastCompController extends ToastCompCallBack { + constructor() { + super(); + console.log("tttttt"); + } + + // 显示toast + public showToast(message: string, duration?: number) { + this.tellShowToastCallback(message, duration); + } +} + +@Component +export struct ToastComp { + @State show: boolean = false; + @State message: string = ''; + public controller: ToastCompController; + + aboutToAppear() { + this.controller.tellShowToastCallback = (message, duration) => { + this.show = true; + this.message = message; + setTimeout(() => { + this.show = false; + }, duration == null ? 2000 : duration); + } + } + + build() { + Stack() { + Text(this.message) + .fontColor('#FFFFFF') + .fontSize(30) + .textAlign(TextAlign.Center) + .backgroundColor('#BF0D0F10') + .width(720) + .borderRadius(18) + .padding({ top: 39, bottom: 39 }) + } + .width(1280) + .height(720) + .visibility(this.show ? Visibility.Visible : Visibility.None) + } +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets new file mode 100644 index 0000000..52c9101 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets @@ -0,0 +1,13 @@ +export default class AsrModel { + op: 'realTimeASRResult' | 'nluResult' + isFinish: boolean + text: string + needDeclare: boolean + tts: string + intentName: string + control: string + modeType: string + action:string + value: string + positions: string +} diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 0000000..029111a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,630 @@ +import LogUtil from '../utils/logUtil' +import carvoiceassistant from '@ohos.carvoiceassistant' +import { ToastCompController, ToastComp } from '../components/toastComp' +import SpeakerDialog from '../components/speakerComp' +import AsrModel from '../models/asrModel'; +import window from '@ohos.window'; +import app from '@system.app'; +import geolocation from '@ohos.geolocation'; + +let voiceManager = carvoiceassistant.getManager(); + +let screenWidth = 720 +let screenHeight = 1280 //1160 +let cardSpace = 20 //卡片间隔 + +let tag = 'VoiceAppIndex' + +let hotwords = [ + { title: '打开空调', url: 'OpenAir' }, + { title: '关闭空调', url: 'CloseAir' }, + { title: '空调温度调高', url: 'AirTempSetUp' }, + { title: '空调温度调低', url: 'AirTempSetDown' }, + { title: '打开天窗', url: 'OpenWindow' }, + { title: '关闭天窗', url: 'CloseWindow' }, +] + +let windowImages = [ + $r('app.media.wind0'), + $r('app.media.wind1'), + $r('app.media.wind2'), + $r('app.media.wind3'), + $r('app.media.wind4'), + $r('app.media.wind5'), + $r('app.media.wind6'), + $r('app.media.wind7'), + $r('app.media.wind8'), + $r('app.media.wind9'), + $r('app.media.wind10')] + +@Entry +@Component +struct Index { + @State speakerDialogVisible: boolean = false + @State isRecognizing: boolean = false + @State isEnableWakeUp: boolean = false + @State voiceText: string = '' + @State isAirOpen: boolean = false + @State airTemp: number = 24 + @State airWind: number = 3 + @State airMode: string = '制冷' + @State isWindowOpen: boolean = false + @State tempColor: string = '#FFFFFF' + @State airWindColor: string = '#FFFFFF' + @State airModeColor: string = '#FFFFFF' + @State windowImage:Resource = $r('app.media.wind0') + private toastController = new ToastCompController() + private isUserStopRecognizing = false + private needDeclare = false + + async fullWindow() { + try { + const win = await window.getTopWindow(); + await win.setFullScreen(true); + } catch (err) { + LogUtil.info(tag, 'fullscreen error:' + err); + } + } + + requestLocation() { + var requestInfo = {'scenario': geolocation.LocationRequestScenario.NAVIGATION, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0}; + geolocation.on('locationChange', requestInfo, (location) => { + console.log('locationChanger: data: ' + JSON.stringify(location)); + }); + } + + aboutToAppear() { + this.fullWindow() +// this.requestLocation() + + this.isEnableWakeUp = voiceManager.isEnableWakeUp() + this.isRecognizing = voiceManager.isRecognizing() + + // 开启免唤醒 + voiceManager.enableWakeUp() + voiceManager.registerHotwords(JSON.stringify(hotwords)) + voiceManager.setCoord(23.025978, 113.754969) + + voiceManager.off(carvoiceassistant.EventType.VoiceAssistantEventTypeRecognizeStateChanged) + voiceManager.off(carvoiceassistant.EventType.VoiceAssistantEventTypeOnWakeUp) + voiceManager.off(carvoiceassistant.EventType.VoiceAssistantEventTypeAsrResult) + voiceManager.off(carvoiceassistant.EventType.VoiceAssistantEventTypeTTSPlayStateChanged) + + voiceManager.on(carvoiceassistant.EventType.VoiceAssistantEventTypeOnWakeUp, () => { + LogUtil.info(tag, '语音服务被唤醒') + }) + voiceManager.on(carvoiceassistant.EventType.VoiceAssistantEventTypeRecognizeStateChanged, (err, data) => { + this.isRecognizing = data['isRecognizing'] + if (this.isRecognizing) { + this.voiceText = "我正在听..." + } else if (this.voiceText == "我正在听...") { + this.voiceText = '' + } + }) + voiceManager.on(carvoiceassistant.EventType.VoiceAssistantEventTypeAsrResult, (err, data) => { + let json: AsrModel = JSON.parse(data['result']) + if (json.op == 'realTimeASRResult') { + if (json.text.length > 0) { + let last = json.text.substr(json.text.length - 1, 1) + if (last === '.' || last === '。' || last === ',' || last === ',') { + json.text = json.text.substr(0, json.text.length - 1) + } + } + this.voiceText = json.text + } else if (json.op == 'nluResult') { + if (this.isUserStopRecognizing) { + this.isUserStopRecognizing = false + return + } + + LogUtil.info(tag, JSON.stringify(data)); + + if (json.intentName == 'UIControl') { + this.handleHotwords(json.control); + } else { + let needSpeakTTS = json.tts && json.tts.length > 0 + if (needSpeakTTS) { + if (json.tts.length > 0) { + let last = json.tts.substr(json.tts.length - 1, 1) + if (last === '.' || last === '。' || last === ',' || last === ',') { + json.tts = json.tts.substr(0, json.tts.length - 1) + } + } + this.voiceText = json.tts; + this.speakTTS(json.tts); + } + this.needDeclare = json.needDeclare; + this.handleOtherControl(json,!needSpeakTTS); + } + } + }) + voiceManager.on(carvoiceassistant.EventType.VoiceAssistantEventTypeTTSPlayStateChanged, (err, data) => { + let isPlaying = data["isPlaying"] + if (isPlaying == false) { + if (this.needDeclare) { + this.isUserStopRecognizing = false; + this.needDeclare = false; + voiceManager.startRecognize(); + } + this.voiceText = ''; + } + }) + } + + aboutToDisappear() { + + } + + handleHotwords(url: string) { + if (url == 'OpenAir') { + this.openAir() + } else if (url == 'CloseAir') { + this.closeAir() + } else if (url == 'AirTempSetUp') { + this.changeTemp(this.airTemp + 1) + } else if (url == 'AirTempSetDown') { + this.changeTemp(this.airTemp - 1) + } else if (url == 'OpenWindow') { + this.openWindow() + } else if (url == 'CloseWindow') { + this.closeWindow() + } + } + + handleOtherControl(model: AsrModel, needSpeakTTS: boolean) { + if (model.intentName == 'CAR_AIR_CONDITION_CTRL') { + if (model.modeType == 'TEMPERATURE_ADJUST') { + if (model.action == 'INCREASE') { + this.changeTemp(this.airTemp + 1) + } else if (model.action == 'DECREASE') { + this.changeTemp(this.airTemp - 1) + } else { + if (needSpeakTTS) { + this.speakTTS('暂不支持此功能') + } + } + } else if (model.modeType == 'TEMPERATURE_SET') { + this.changeTemp(parseInt(model.value)) + } else if (model.modeType == 'OUT_LOOP') { + if (model.action == 'OPEN') { + this.openAirOutLoop() + } else { + this.closeAirOutLoop() + } + } else if (model.modeType == 'IN_LOOP') { + if (model.action == 'OPEN') { + this.openAirInLoop() + } else { + this.closeAirInLoop() + } + } else if (model.modeType == 'AIRVOLUME_SET') { + this.changeAirWind(parseInt(model.value)) + } else if (model.modeType == 'AIRVOLUME_ADJUST') { + if (model.action == 'INCREASE') { + this.changeAirWind(this.airWind + 1) + } else if (model.action == 'DECREASE') { + this.changeAirWind(this.airWind - 1) + } else { + if (needSpeakTTS) { + this.speakTTS('暂不支持此功能') + } + } + } else if (model.modeType == 'HOT') { + this.changeMode('制热', model.action == 'OPEN') + } else if (model.modeType == 'COLD') { + this.changeMode('制冷', model.action == 'OPEN') + } else if (model.modeType == 'VENTILATION') { + this.changeMode('通风', model.action == 'OPEN') + } else if (model.modeType == 'AREF') { + this.changeMode('除湿', model.action == 'OPEN') + } else if (model.modeType == 'DEFROST') { + if (model.positions == 'FRONT') { + this.changeMode('前除霜', model.action == 'OPEN') + } else if (model.positions == 'BACK') { + this.changeMode('后除霜', model.action == 'OPEN') + } else { + this.changeMode('除霜', model.action == 'OPEN') + } + } else if (model.modeType == 'DEMIST') { + if (model.positions == 'FRONT') { + this.changeMode('前除雾', model.action == 'OPEN') + } else if (model.positions == 'BACK') { + this.changeMode('后除雾', model.action == 'OPEN') + } else { + this.changeMode('除雾', model.action == 'OPEN') + } + } else if (model.modeType == 'AUTO') { + this.changeMode('自动', model.action == 'OPEN') + } else if (model.modeType == 'DOACTION') { + if (model.action == 'OPEN') { + this.openAir() + } else { + this.closeAir() + } + } + } else if (model.intentName == 'CAR_SKYLIGHT_CTRL') { + if (model.modeType == 'DOACTION') { + if (model.action == 'OPEN') { + this.openWindow() + } else { + this.closeWindow() + } + } else if(model.modeType == 'SKYLIGHT_SET') { + this.openWindowHalf() + } + } else if (model.intentName == 'CAR_SUNSHADE_CTRL') { + if (model.modeType == 'DOACTION') { + if (model.action == 'OPEN') { + this.openSunshade() + } else { + this.closeSunshade() + } + } + } else if (needSpeakTTS) { + this.speakTTS('暂不支持此功能') + } + } + + openAir() { + this.isAirOpen = true; + this.speakTTS('空调已打开') + } + + closeAir() { + this.isAirOpen = false; + this.speakTTS('空调已关闭') + } + + changeAirWind(wind: number) { + if (wind > 11) { + this.speakTTS('风量最高10级') + return + } + if (wind <= 0) { + this.speakTTS('风量最低1级') + return + } + + this.airWind = wind + + this.animationRepeat(4, async () => { + await this.animationStep({ duration: 200 }, () => { + this.airWindColor = '#FF0000' + }) + await this.animationStep({ duration: 200 }, () => { + this.airWindColor = '#FFFFFF' + }) + }) + + this.speakTTS('风量已设置到' + wind + '级') + } + + changeTemp(temp: number) { + if (temp > 34) { + this.speakTTS('空调温度最高34摄氏度') + return + } + if (temp < 16) { + this.speakTTS('空调温度最低16摄氏度') + return + } + + this.airTemp = temp + + this.animationRepeat(4, async () => { + await this.animationStep({ duration: 200 }, () => { + this.tempColor = '#FF0000' + }) + await this.animationStep({ duration: 200 }, () => { + this.tempColor = '#FFFFFF' + }) + }) + + this.speakTTS('空调温度已设置到' + temp + '摄氏度') + } + + async animationRepeat(repeatCount: number, animation: () => {}) { + for (var i = 0; i < repeatCount; i++) { + await animation() + } + } + + animationStep(value: AnimateParam, event: () => void) { + return new Promise(resolve => { + let onFinish = value.onFinish + value.onFinish = () => { + if (onFinish) onFinish() + resolve(true) + } + animateTo(value, event) + }) + } + + changeMode(mode: string, isOpen: boolean) { + if (isOpen) { + this.airMode = mode + } else { + this.airMode = '制冷' + } + + this.animationRepeat(4, async () => { + await this.animationStep({ duration: 200 }, () => { + this.airModeColor = '#FF0000' + }) + await this.animationStep({ duration: 200 }, () => { + this.airModeColor = '#FFFFFF' + }) + }) + + this.speakTTS('空调' + mode + '已' + (isOpen ? '打开' : '关闭')) + } + + openAirOutLoop() { + this.speakTTS('空调外循环已打开') + } + + openAirInLoop() { + this.speakTTS('空调内循环已打开') + } + + closeAirOutLoop() { + this.speakTTS('空调外循环已关闭') + } + + closeAirInLoop() { + this.speakTTS('空调内循环已关闭') + } + + async openWindow() { + this.isWindowOpen = true + this.speakTTS('天窗已打开') + + for (var i = 0; i < windowImages.length; i++) { + await this.windowAnimation(windowImages[i]) + } + + } + + async openWindowHalf() { + this.isWindowOpen = true + this.speakTTS('天窗已打开一半') + + for (var i = 0; i < windowImages.length/2; i++) { + await this.windowAnimation(windowImages[i]) + } + + } + + async closeWindow() { + this.isWindowOpen = false + this.speakTTS('天窗已关闭') + let images = [...windowImages].reverse() + for (var i = 0; i < images.length; i++) { + await this.windowAnimation(images[i]) + } + } + + async windowAnimation(resource) { + return new Promise(resolve => { + this.windowImage =resource + setTimeout(() => { + resolve(true) + },200) + }) + } + + openSunshade() { + this.speakTTS('遮阳帘已打开') + } + + closeSunshade() { + this.speakTTS('遮阳帘已关闭') + } + + selectSpeaker(speaker: string) { + this.changeSpeaker(speaker); + this.showToast("设置成功", true); + } + + showToast(text: string, needSpeak: boolean) { + this.toastController.showToast(text) + if (needSpeak) { + this.speakTTS(text); + } + } + + speakTTS(tts: string) { + if (tts.length == 0) { + return + } + + if (tts.length > 80) { + tts = tts.substr(0,80) + } + + voiceManager.playTTS(tts); + } + + changeSpeaker(speaker: string) { + voiceManager.changeSpeakerType(speaker); + } + + onRecognizingClick() { + if (this.isRecognizing) { + this.isUserStopRecognizing = true; + voiceManager.stopRecognize(); + } else { + this.isUserStopRecognizing = false; + this.needDeclare = false; + voiceManager.startRecognize(); + } + } + + onQuitApp() { + app.terminate() + } + + @Styles + cardStyle() { + .height(screenWidth - cardSpace * 2) + .width((screenHeight - cardSpace * 4) / 3) + .borderRadius(40) + .clip(true) + .linearGradient({ + colors: [[0x2F4668, 1.0], [0x5C7CA1, 0.0]], + angle: 0 + }) + } + + build() { + Stack({ alignContent: Alignment.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) { + Stack({ alignContent: Alignment.Bottom }) { + Image($r('app.media.voice_bottom')) + .width('100%') + .height(148) + Flex({ direction: FlexDirection.Column }) { + Stack({ alignContent: Alignment.TopStart }) { + Image($r('app.media.icon_close')) + .objectFit(ImageFit.Contain) + .padding({ left: 15, top: 15 }) + .width(84) + .height(84) + .onClick(this.onQuitApp) + } + .width('100%') + .height(84) + + Image($r('app.media.voice_ball')) + .margin({ top: 0 }) + .width(255) + .height(255) + .objectFit(ImageFit.Contain) + .onClick(this.onRecognizingClick.bind(this)) + + Text(this.isRecognizing ? "" : "试试说:你好博泰") + .padding({ left: 30, right: 30, top: 10 }) + .fontColor("#CCFFFFFF") + .fontSize(40) + .textAlign(TextAlign.Center) + Text(this.voiceText) + .height(300) + .width('100%') + .padding(30) + .fontColor(Color.White) + .maxLines(100) + .fontSize(40) + .textAlign(TextAlign.Center) + .align(Alignment.Center) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + } + .width('100%') + .height('100%') + } + .cardStyle() + + Column() { + Stack() { + Image(this.isAirOpen ? (this.airMode == '制热' ? $r('app.media.wind_hot') : $r('app.media.wind_cold')) : $r('app.media.wind_close')) + .width('100%') + .height(141) + Image($r('app.media.seat')) + .width('100%') + .height(305) + .objectFit(ImageFit.Contain) + } + .margin({ top: 30 }) + .width('100%') + .height(320) + + Flex({ alignItems: ItemAlign.Center }) { + Row() { + Image($r('app.media.icon_temp')) + .width(46) + .height(46) + Text('' + this.airTemp) + .fontColor(this.tempColor) + .fontSize(45) + } + .padding(10) + + Row() { + Image($r('app.media.icon_wind')) + .width(46) + .height(46) + Text('' + this.airWind) + .fontColor(this.airWindColor) + .fontSize(45) + } + .padding(10) + + Text(this.airMode) + .fontColor(this.airModeColor) + .fontSize(45) + .padding(10) + } + .width('90%') + + Button({ type: ButtonType.Normal }) { + Stack() { + Image(this.isAirOpen ? $r('app.media.btn_focus') : $r('app.media.btn_normal')) + .width('100%') + .height('100%') + Image($r('app.media.icon_close')) + .width(54) + .height(54) + .margin({ top: -5 }) + } + .width('100%') + .height('100%') + } + .margin({ top: 60 }) + .backgroundColor('#00000000') + .width(190) + .height(88) + } + .cardStyle() + + Column() { + Image(this.windowImage) + .width('100%') + .height(314) + .margin({ top: 80 }) + Button({ type: ButtonType.Normal }) { + Stack() { + Image(this.isWindowOpen ? $r('app.media.btn_focus') : $r('app.media.btn_normal')) + .width('100%') + .height('100%') + Text(this.isWindowOpen ? '已打开' : '已关闭') + .fontColor(Color.White) + .fontSize(26) + .margin({ top: -5 }) + } + .width('100%') + .height('100%') + } + .margin({ top: 80 }) + .backgroundColor('#00000000') + .width(190) + .height(88) + } + .cardStyle() + } + .padding(cardSpace) + .width('100%') + .height('100%') + + ToastComp({ controller: this.toastController }) + SpeakerDialog({ action: this.selectSpeaker.bind(this), visible: $speakerDialogVisible }) + } + .backgroundColor("FF17212E") + .width(screenHeight + 'px') + .height(screenWidth + 'px') + .translate({ + x: -(screenHeight - screenWidth) / 2 + 'px', + y: (screenHeight - screenWidth) / 2 + 'px' + }) + .rotate({ z: 1, angle: 90, centerX: '50%', centerY: '50%' }) + + } +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets new file mode 100644 index 0000000..b84ded7 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets @@ -0,0 +1,6 @@ + +export default class LogUtil { + static info(tag:String, str:string):void { + console.info('[VA][' + tag + ']' + str) + } +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/color.json b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..1bbc9aa --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "white", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/string.json b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..0732e50 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "entry_desc", + "value": "description" + }, + { + "name": "MainAbility_desc", + "value": "description" + }, + { + "name": "MainAbility_label", + "value": "语音助理" + } + ] +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/btn_focus.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/btn_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a37f4194ca5f009501f2ed7c470c1051e59d05 GIT binary patch literal 10096 zcmV-$Cy&^PP)PyA07*naRCr$PeF=;t*LmLmj;ijS?zwk%XJ&8iMb4~N6e;SK2p*w)M2V1qi4w_* zlOO`(SdnGGjsi#~X$gp81F}Up4jjXAB3X$-A%PI&l440AEt2B3)E+b1i`?03j-C7L z?y7eL|9e%{$8=3q&(2U>vKw4>PaW^Q`s@3@_x=BSRgb`%=%ckJX`A!J6HlZ*Hf@=$ zq9~lk0oBrkx{0Llr0ZPSyR3agIjL@J2YowgJB$ z?2UjPfjj_s1>6?YG<1}xxTsa*5m;L*SdtaC(8 z5jaGno}%6nw#x~&6!^`8y&C8S&$m{$H*TGhZu$Kaoab#XwJdHyz6ZKH=ZOXOE*QUgJv%w|+9AKJ4r&EmN~rw!iAKn0ue zH-7N%aQjC40Voa5p?HS*pE)-y325+};1-I11|Ms}@O%=LQ*~~%-xKRw_B zcE1<(c{iyCdv|9(0{Y1_&mQ*HiXV|u-LFC2O9mKe{|*chbgn_+x*6Z%w__?ZamN)7woG!#ugAYso^of?&|YwQT6p#t}$v` zb$e_hf_6uRM&;DEIcjy-zMxLDROQ+$?WnronrpALv+7#0%+RE0U(+-yfx(SE!GKWm8U^^a(Dd7-n-gQ%wl%%5)S*!tp%b*vE(g7Ul|uD0sM-N;RsJ*u z{5Y1c)$o0!2Jk(TWO)t&pC?wvG_v_{Gji7zsb4t;T^jMVduaeQfTk27%>ib z^=7U=E)JN@0=8AZwRDnWH)VeclrhaH$Dzs}69QkGU7G)4r*c%TP&9HV-?^$WCYYS7 z!~*C5BSX^-V}Q-dpVYwL5cH9bzaPd2E|7|(X(zMe9u3*OT*#6OFFpH+S1$j{TwCGZ zJqHf!-ktq~&<&cAmT}WwNm6Uw0ywwc^IXuiyZ_5*7=))BEx5hpszmn+^=a3 zU);0*VB5gn13(C^jsa_W)Wik_W=-1zhj$@5KKM};gSP5#f`8W8Gse+lm1T_m9XAJV zwrvdvd}U$o`X84ySJ(q|@8oKJ5o3TQy$VBWBld4b_H2l=5cJh)%4*P$j}H(`O@@JM zC~Fp}qV2`qR6xUn1 zenJ_v6*@Iz{Cl#z{AWJziW}{?Glp_wU_%@JN(0+iF0x%6n^B08^{kTmiCeg=?Ny`g==@lV{sC zS15l6+ItH8>8h5ZN#1Jq^r!Q=g&U>L9e*>tvimr zqob#9S5QY>l(<>Z66U>w1XrOQC{z&%C4+wtNjD%6AXUU>;5F!vkv%)ps&;O2>M0ZLs82+MADNlp8N&j zd;k9M&^xmoojp~iXb#}9T~QrgE2TDT__(~N-QKD{LA(d%-cI{-Hv=7AJ4yuPKU$c% z{C|AS6l(uYHK%I8A7p)+0e{W?Z3gtS;{zs5Spj{4o<8~iK3FQ2zjN&PJ=uJrBM2I; zX~Ge|q>fn!X`Z;_!~J17;izNCIQ8cxmA76?Z`|Hi{j~(M-S+2>3thdtN(#J3m!=n< z_4P^weyjT@RCUms7W@r?9|p6PK(>!R*iw!3kzz_69Y52zpgsV5>}01pU<1Snu`Amw$Nh*zw)ny?ufB ztwU0MS|+XXNgEn8HG;T_5y_~FsY~<3ZI6?<&4w1O>o*q8wiR^Gj$JpFmS!JZom-ei z@aH8{G}9&5gWm?c!=sfa!$Qp;fX}rWefTr=EZIn>+jWJhFTL zp?GopMkUhY#Cfa!T94hXfsAdme`og&D0Fmxe`4bGPeDn^3iH=#{xI7!GNi*nu7<#` zXZsNJIB$LgrYYv>F=bf~ddO0C>L-8oPhBVb_>tkeNvQW4iH)QfKdsVeww!uGuFuWH z38Oe-Zq;9Fv80ZBEA5Z*+s?s#n!C>9lM`eAwh{QlROc}CDKo_(2K=NE=I#A%Tq&!wJqZ5t@r=UxJ#oQqL*Um+oK=b=ve`jFp~#s- z3RL?mOi;mJeeQ+-xO4a3M|KVFOCg$5`Nbv8qrRDxqM&0lrlsw%% zJHLPZ>Y0DQ6&J)QNX+&?PRPY|c8u9AK*z*R4K!YmI4y5#Z4A2$zAuFvAE zQWrcrxwgPEq$|?(lKA}MD?fce`2M$!48JS7p3Me>N!mPZ2imH?vEaB>ZT@DpKVH|q zLw5ls@X2da7k|XGBPx1-LG`zFNe|*BPX+h^+mFE0w12k8WO1OJVbu~xP?t+0`03}K z`7eX}4!ystXGg`Zl}Q^-Id|-=%Vx`K_V}Qct@^DY))7#%_H6d}EwF!kSFi5hz5n^k zmq-3C(_C=niE7CMnXvQ_t1^fmzAy{FlqfHrgeGbn2FkPZnVJzendi7DX;+}+QLd6Wr-v1G$VP##1%5T#_w|L*;|y?e(WPFz3t z2cGstwd8?iAu-TBaJ(!h=W1D>Jo@NUtUi5-Y##=+Ip%T9;t1k$CfA%7pZW2R4jvso zkZsE+NSe)Nh{Hax&J)%#QIh&>)!+CAr5wpf>Y)?Umv4;ybGZT>JbHZW+U1iENY>_a z?Fr2C6s0S|K(`U=SAah-5DZrJQz%cfknM3wLMG7mH(tMdc;@ER4-OCA9Xo9|PBSNM z4{uW1U^mIENmFIQ`clFm!cc5Xkf2#x*S~RxbSwA&=<$1@xVH4r?98=GsP)Ur6I?n1 z2ey#)A=4-O#bhw3HKB1dmpuB^Q>^)-oJIC7T$lf;qfOWNF#t@>l~Hk&hN z(`RkJ{kwPUg5CS?_+M8qp8DsCf{(zLEbn7_)9uI#Z+cOM86G>8VFL5`KjPJ+w4@8! zeu55r7OS%8CVuRY&=>4m@g%L7O5+UvUM=H)bPqt*#63v9vy_!5J=-g)1(%OfWr zCa&Wl>t{IlHp4R~aqhle5VCqSmwe_kf8vBP2ZLHw&M=+l%qLlnnH(m;LAEch6!T|J zzkKrO(A})j+~cjDvC?dL%^sg*-)75e_V`x)8(W|mdtzGi#Ctv>uf0BUkMc{a$oi5Y z^E<-PB|%n&q?xj;4ss3fGZ{Mr69=qJP@7{+toWQua99Q$UlQl~cRk>Tw5R165n^J1J0$>BOmpZ`ugC$n83E#>|)yE)23b0 zmKT@KsmDv&IS|d3*X;4F>#w~tG0b-8&J*Cena_=1AN`*4!Pk!CH4bv|8C^i&KjmUJ zXCs*dM7X1;&;D&f*q7}THi9vdr5MK{NiVy%oNPiRXb>j6*-R7V(#9^91V`|5C?>C&yAe^l;dQ- zuw&Qm8mNVDHK>34z&bo`Q*hs^-y-7eZvTCUjzL#X-&e;jocs&m+;e>GOA^SPAg7;| zIZ=``YDI8GKKt1xGn2fZLgzHY2TcU^d6r~MHis#2fch@@%pE!N@@F#H{IB=+4K!5Q zNsgU1n5!I@q%~@5Y}KD+;dH^|?P~u$2advy{{BC@a_-E(14nwG98Xg4ZFZ+DI8I&8 z2?>jKFpGTl$tN@AxeTk-_jY=M@8%rveV1#UIeY5lKXG$y|IEDQxQ_E{`_#HAJkfh{ z(%qO!$Iz@+Y22k$-mBB9KaB-$SNr2@Dtr3}{>}CCr~gzCQU=HI9Ixn`X$;D%8O+M` zlqLDq$NxNw^X|nOXC+$ZKEaXNj7ejHCtT{dj?!M{XQxj8ea771>fISKe%fd-$=uB` zdwgkW9VKnMn=P-|C-ue|o^f1<=KE8p|M<(^GzmW89a z$f}Is!6>c)ei+z#TyVj1W^RrrwL_?IQQre$?uDP7{WvK2or=bfOE)CVN=bWzl4jeq z>Tjm!UB3`Pk~qA*?2q%u3LTxld-c+p?}C;d>U^!Z=Q85kxjRMS3NFHYK6&)>U&}QN zY%}0!kGVjl3xv8Ce>VD1sZ{#CodZEur|C?7ecB+&ut_~dvm*(u`ZtoK=~w7zHvLn7 zAJYa5xbIMHi-PM&+lpJ=b!%>MU$-~m`$ zTm01Q#Eo;*Xnf@fUmg+O2uS$4Dg@IVJg#K@OX~3nQ6!v z*!r3{)X6wXsSL^;rgi3(=bwLS*WkWETyu8ag#4rt#-tuDF4jt`h+6eGmi%cI-fe9E zTw4L|`_Mz<7tTKScO-&dF^^JOR({!ch&J@?*y;dHqIQ0AEYu- z-vgxv_@`ce_IC^IJrCk5z>~VlE%D?Ag`^FQTlH^`1>TJI-?e)m9KP$s4`2V;tG{D` zuRNpkqm*U^_{#NU#y=>?$3F8XZKP{~Re+BfO=AM^N{QuqAGslO$B|2MmL z^hZ`rG{h!HY!k~3T99~LtA1;#xY>I#{*h?cHthkhBBW+#4Ses=nDYT!2`b+p!*SAX)%H+uR8cROw-31hAOEemYB1=>4%;NA~D zaO1+67e7r1DW{e?%>=h7dqz+F^jATXU+L)TO-u6Ie(|je-o6$%`i^^a->!jgUb%GY zKcKv6BDhVL&Lo7oRO`&_^z^>53+MlQ=iq))yEJ){@td938du(C%h~LC_3hYfIh#GN zRezi~qm;mh9{HPkX6nj6Twa*Ist74-t-O@!%ya`-K%}cdXOQ(zzwrF;x3zb@Bb&>& zSU<_%Tl=@o0t0&v>O0?g&zXy(FZ~v>Jpl}AnFW5D0jxAr77*|_kOhRe*DhUn@9fO< zmwR^Zt|SW*);Wz|eQ=X=ZsJ}6xGvvhH?-=vc3waDc>CJ_{SW>Uc;4EVZjO(=09pr3 zAEYvqrYxkLq!#A#(E*V8Uw!epKPa?!AIW6fLSzMyOB$()=_GEo?}+YStA2YU(vJKE zx9v8w|IUFu@Q!!C|Ki27FMi%KeW>pd_$el-rJa^+2C^h|HM4T(+Qm!npPioiV$Y5N zVwSg##apnW*_V;V9Ut{9!JVp4IIp|kt@^DWq(pYwca(;X^>eU4r4&B!@W-@QTK>x9 z`^sbj)JNL?04CsRaE6m}e#!vMiO4>&c!|BOkfD549#ku+2 zub=|$D?f_9n_n$fW(iaG2_qOFbo8;Bj;VlcKx4@kz?uET~9C_unb0@zF;2Xdr_z8hB zL8eD1;L=O=dXcm*l)^VHgmTBSJ+eM=K@xXuZKdb@nODD>ZR_lH-E0!+q`%VEku3`Z z78uxjP`~SaADX>#>C_iWYo$40$oBZpN}cejE0j5@UMQ9J6@vKwOq0i_(#26+o8_^R zhfr{)C#Mcwef`px^7*bjcicDZhK0)!>9k7&ZE?$5^;@3XPW$iJH30X0_~F&*iLoy) z%ul|i75E0|%z_?AYt0;dLdy6esZ_5JO#9MUf$!KM(&&65?6(0wD3@sFU=J{H6BLejk9dGgZ=SUHurt_A#Ztp`j4h3$6hu}AF@2L ztgm$ddWU)32S4>|!kbwbf^rLdk5U((T)Bj!i2Bj_{A@e~6;^-@65s)s2Se?yiR+%6OWLb{YWj+Q8SluHv`?uxW@u3o3D72rxarNAvmCMCN3g8=-2Wr7Dg<*cen5U%g183&V z$UI_uF7Q#qaFz4;#owA-?h_Y@K;Rq37t|#j93iDkC~+{oiJ&*Y*V3Vca&(5*&!2l_ zes<>Lj+=FzOs>HU!S!$Zt#^R<*_HJgre0ZXd_yZ|*Sc1#{$}min9`H)8vqjGp<~D4 z=<&O~;@Z-8C$3)jK7w3nB`9GA_@TtnO8cBKPb1TF70DZu$!TV}&t?~R_GQW8gmaWT z2zsd;lkJHBPc85*`0-mhnoz#Hw9q$p>9tSz<VFg1 zzkknuxa*zo)|qVf^vu-Qw^x@IrioTU6XqL+5B^bA`Hk5dMt$Fa-(jB6LO3kzH?_dC z0shDkX|%}mBJH8L>?g@lvk;sp3NER`9V$68zDaQ!$zy>ond1G-ke^<{A*mK~p9z1Xm7$p~17G}RUJ2NrD2uMk^1Pv0|9_39Wb1*ND+oWZDqvuU# z2bo?9hh>6*mJ56xIB}#Ts~ysll_fqWd*}2p+^@Efo`zCL_%ZGmM- z7sZuQaNS#63DG4EmqcjNRUav~$3 z>Egn2-^}EV_pUB4zeg$EM=9>6NDC$wNFtK7vm(Pds7TAF}@Vzy*>yYgaT^kOJr##jWi>y_9;$pt5ylbxsPB>a5%3}K5%ef~Kof@SFEwF=07VB- zKd~_2@6$^60N{Rnt{wkxzawxq`Wt;g!YMA6xly0FS0KHWehlXfIAN0YiICHdxiE61q9}l@UNCjYZum57A~w7SEeW^ zg@D%@6bo1$h?XdCtkemB4@6kjx1gt53Pl|sM`lseE1LDG_65^ilyS8aM@y7AJ+6|z zno}jolv&}>Ea-exSF`aJ4i(m6nZwpn z)gF99f&G|@?X^cm*lpnzN7K#2>#{p__;@3NRVi5}1WHoKqA!Zm#p3F;7QU}3QwC&8 zYt1a+5&S@?1Z9~Xs5We`fC_X13}h9fg80&~e=X>lpjwD(T@Pg?t0hiJa8wi1iytp4oAaW(NhuHL@I1pxR$y_;Oir3rvE~9Z&LV@H3)}?7?sB0g&|# z`%A?U>{@CL6qsRttr%gHDy8vO81~nc5{;&z=$O_KsK(#Q+%5b&xNCsh!{5=Jt88ff z+ENRss5C`Lq(Twc)?cZ{?FQ(0w-nKYf+h;_PLu{vloF+70DNS81(Gl#&8LjZiKI0emtafVJ{0NGVe)Bpen9!W$&RIiZn zm1TYeKTxUy*@I@Igc1dsqA4}{1Oq@zQf)!6DYm;d7}l!V3AXf(w+b_zUIpydAPR`G z+wd+SQ-MSWP#W(P1%$jZPJqCt8k7#%9+_TI2^1uIabPYp%r63&W8@7)4uF6+z$XUX6u};{K9RymA3)zgQ=;V?u)gWAgY7MZ zZm$Ip(A726u)P5}?w3ZzYsOW`_UHr}q(aeyGRHbV0C?jBR_;(v4by}4B>u)M4oD@b zX2N%ws0Y2Tmz8omOzJWO{bX;y9)>;z@HA8hv=Q55uM}QH9Qen_2gv+jH$lC>y4XSD zzz;5EvgC8(P{y$rkc26sID%gL)&cNu)b|>{4eLurIHRB?i$E_?8Y7<@J%dVyXsQUs zJ`^34StqdV#!e&rZT>W$%Kq&I!P}*D3uZt(SELTId$7Umml9(Lt?-U1ynROh7=3RP zK0|G9!4H_xMslajvONNwYDojY6UTzz{LQo!nhWhK$+9SKlnj}^9`yOnCA|tm8%vx( zqQwFquh3?BMoBgJG1%?u$PrauV5^w%iI~60Kv0Gb01joUEV;`GQwH>eS@uV;R{@`5 zO4Ec%=G(A6VV3cgK|VD?ky`Z_YI`GnOwd+wfEM7l-wh)N2mr6NbqJI;p>8%}6nULe zL_Yp$^}Ut>@KGOuM5nO9Z3XxswPAVl?NEV|?0%70{hi{IA;2}|CaVJoa)%2124|To4RbM>#GCu>I)6!4sNT?@>B=A^AlF~Snw~AFyIZd zJtdN(#0}UV<8{YlA@C9Kt`y9}bf$3t4BEMoHn{e%Y0`?E&j=e7X%9GY-vlbAQ69bu3t?`k~Z7^$PkHR#ZQikm@kz;kfl{gC1cBt>E zmbgbD@DcPvOP3-=RvZ9o8y62=umRs>(#w zo1_`=S8IOE_Bce+BFR&vcno?$lo)HvP>^M&B@T1ARCCV)Ukbzg6d?_q3iEBU_(t+j zW%giOjoiTjVyz^>?bVE5ujkE(KLpJs z^H<595d5V=8*yhl=_>P$1BBA242m+6rN#+}^=*_vA<#qc3j}-M1d2&Qg{GMF)eM;) zr*K$Dz&7FE))6X!t;PgF_~9+4-%{j@3iA`fD*1a1aD~7-Y&E`NdjvbvL@JGgGl~;M zCDS3;xjo7-f9MD(XHW}B?HRC3UBVRyRYlq`m6wk4dKXo8WldxDrZ$j`mpAoHAKE3B z9qY3^cmmGiw6doX@P?_*(rTXI2yc5KOP1@{pA$(@`+LR-@Sk-63wA{*I8^v$^NsLE z;45j8msBxIxTHiO*c}JVw;8&%P7wZGxzY9^cg?CCVM|f)_9~3X5a@o*h0_4+$lZpF z@NeHY--0PkrODtcYJM~G8wX^$lQG}u7U%>a;H9R@1*%ZX3(ZtD%eQN;mRCv|M`W}4 zRgF^-FlAXC$X3f6Y)^eKTYuL!lm*Rzf4R4v;0UkP{ff31cav2%ZL&Vd{w1Pl*5yQt z67z5Xz&L=Sepyq_ap=xE0cJQ+@+gjgmu5SFg8@B3Coo`_l7Q;~?hh}>IzZK%9co|l z@b*IMR$grl-Yu}h;ss+GJRj%kSnx}Q{H6hC4Fjexm^Ndv7}zqYL$C`WwUZ$V!EOOx zQiNw^$rC!OsR{$wyzEoUxf{AuQDybKtJ-Im^{s+FR_avSZDY-E2f1*BHw=1F`gC{Z z$^1=0%Y`gK?eCXe63QRpIs|(FBY}#FN}SvrIDr%#$7?Ch$-|Lo&M84hP*PyJKLR~E zMWkvB_$w&K-eN27d#fyK0c7opEqpMb4?YO)5c~oq4&xeuE^xcxn7A>ZXIx+!$AF#r zLdzUAk_H)`d%m`SXUfTV8nt|8rKG!eay7rWs_XT<8Jrp#YM8x=lQ-4(^8W)OyKY1p S;*F{R0000NhTbfYGs^6UdoD)Tg2BT#76SfCM!wGrEOAjTwmBT#6lc`nsH#khN1{)v~iXf5Z9Vc|Nb_^Lk#d=lS7z-WlFrF6yYwC;$M| z-CUhOxi-rqP*qu;JxHDkazVs_E{A}MUd%iIApdrAa`3xISjt-$ZRD)o))!OWb~hk~ zRNJO^A|>^WEKc>4kFzlC04RJ~fb$gYQrW)#5c$G|DAA;J4vjYG6m>U6U6ze7MlNmA ze#obxhG_=`kywCkp?b~F9@Y$ccP<#tq?_ohmpJM+vUMdV!d#JH>U)tMB1D0|7;dKt zV*rBhD1NJh%ytP_Qx+esZ&o_HDW9b;^U?ug+r#I^AEte_G;f`$i<>i1+F zyzSpw0ylm&04fwOmI`M}e=X>C)P`B%di?j$%1>K6Hd+QDlM{Go*bpe2&}sLlouRux zD`vr|-r|XG@xXgE$=efN`9@S=45~AVB&kXY)u|f+)BQy#5Pq)kZqxf;4lg4bt`Nze zZva*JN@Jv#FKua!m^ic++LEwpgLqMyvq*|8ml^re3}M`!q<#+uMZS+Z@GMEc;(WR{ z+|0m>rbv47X#u3Z)v6#;P9ZQR)eLSN$0R$vX}EryFfZPFm4}s(Csq4%P*yQ3R*Jmy zCv6kC#>hl0|21cu;p8?r*Ff9`3f`?T9|=Y+|dX2h+}@MHaZR7t&^J zArcC>?lY2!y9JgC77yX~3)xH#LTGC=MvqGGY@GloO@NOwci{hVM2%&07*b$Y*YI*KH zUA^G_#GS1eaedY7sM*Kmo7!)=d?TpN|JE`_%o8@-SZgg#0!WSScVo=t628TLb_(GZ zU35pm0hLUwi8zjvoKch*cW#I@MUu58J>6^UFZMVIJFDG|gaVCO3gh<{ru?|%7FpHl zRU7M+iS5V-+QZg0#K%y;x&ypHGL>Dtu+Z#^B-|TmD%KxNl_3F&Vv#ZO3AXAC^v2V= zL^t_zbxI6*y5T5FX{R`sF_Fh4;v~dH?`y^V3(aB3@$O~@^D#fa-rj6Om5MS>J7x26 zJ`Zg_mKNoF0^K(3k)3Is&?tzvp7OUe zTNvlO8fiknD-hYdG9cjl{Zk?xeZ?L%bGkHEIofX@2=H?l_*2DBabhG@FzpkJzfZKw zkx|>GMdX$1V}sjB&5-(59eDoLqq;NSNJT# zU3LUpr4rVdfHN9wr`}l>^(!A`!HOr+!J^~mN$*EM9WUyxC0@A2| zuxR`1LcjBE)_`spA?I5PbJ##iP3>l~4gCnjEg5~$8ibsFSHKxto(y7*#lAY}Ss9=` e?DD_VVvBp}v{MIzy|d-?2i%;!oGK25rTz<0q5=~D literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/seat.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/seat.png new file mode 100644 index 0000000000000000000000000000000000000000..e5851247e2c30cfc34d220a102ecfbfd4d51618d GIT binary patch literal 51673 zcmeFYWmj8W)HMtgcZcEx3lOxpOM+8^ySr1|-J!S^4HPZKrATq76ev=pSaB=v_T;)B z`3LW}_d~`RIcJPypS{;!Ypyxxj)T6J$HAn)L_k2mQB(kHARr(n!aqFdsPH?k&Y7F= z3!;aHybMC^PpSh11Udvou(X!1$#DT%zOi-gYe>ba0RKBh=5#qEm>>!W2xJ>-ED7H? zsIN(Q(bu(p?hNrF5j^SulH!A~q{|d}t^f+I^o&xNtm(XCD&_0B0efrhCs!A*VyEps zg!rCFio0vMdw+#;b3LZ~)=vX=pLYFSlNv+gyu zwf=aECCF2`Oy3)>F6ubMV2#8tYj*If>|(F`Z0BfsuenGqqV*2~WHoeW`OFAU8b7u@ zC%Qq0E34MX`xyt%=B-TKKmhPtRujZv#3Y3spF z%n&{L#P`e?FBreqo9f}rd1X?++;4KB```L=QF6#PkC3E~Q_l|=^=4hc-cRr0fo2lX z`-~^y^^>)t>nQ1*RvFQ1DdwczjhZa!D2g^IA8*$I#4&JxfYDtk-~S z+_upvMRz~7+F-xanH{vl{!@aQuISi{$gIzIb^q=oe1W?t!Xzcmq_$uuG1rq$1@pjQ zPQ@Hi_Aosy0@E}*XbQ1DMUs5~W?v&UJq3!fJZHrKP(OtjImGXdYvjq|piLyl(+eIi zl}TP3>hLL(HQW2ClK#e(FZ8oQGZTv0`4cm^8Om+KO0hj#PlZ=*U8=>KI!VTp#f2H; z>+QLXRV2Pwb5wzyPf>)9CHIkw4zCD9ixQC#d)BA1n>KbY0i-PCsm{)Ky%R1ic^TMC zwAsQ){vJpk1(1_#0+Qe?)?SvX1?|rzd~r^i^%8?ek=Ksjnu?hufnM-$B3A?V{WP!4 zS$Tex7*HXOwsxeX>|Ni)ipEv$(_0yCC$w^NhCFsNp>&8l@MD3o@rtha#h)=e@vFxl z!4#ZD-dyPQX2&QXi3|+xupTwDd*kHbgW{o>rz9FqM)dQX=m^pu(Iw;k%lIYqG1by< z*Te7@3(@kB2bzbxwRj7p)u!l7mg^DQjcy(VUv5~kGt_Qx(R$^N1(87Hk2oAfIT$Kx zNXd12As@taZU@GXx8i`y%QonJQ0up8poB%%b45K0L?afJ?RVH%?J|n!!%5WQi{I>t zoPN{1rGD#w8q{Xg!L@;@m!dHZrcCTfR!gIz;ITT82h@i_IKko=%VB32P%gr=%X_d3E61p>C)hZvXAR@g@ ziMp1yKm?{y*@QmQU{A<3=z#^&A!@E%jZ5nEKsJ5mPluFD&lh=F&sT<;_{OR#aVVwC zS#fA%$PN*`^SbNVLi_dY6AT91vY7;$ILl7mj3vcSy)k>KYWxQ>*xuNE54C3dJayxvP+~xI#Wx zb(bA*HRwH^WQKi{4%M>3&axl47Tc_&b7VL}qNm#)EY_fx&~Egi+K*1ss0!6$Lz!xW ztYZ@1fWTH`pELjNfzo z9&!_TGtsySy{p+uD?^xKIX?quXls!btsm2z|aa(t{2 zFE9~PBk$-k9eYF#)t8l_BA+=*)IAD%NOScLc_oM`_mYiRiQ#PF;a ziTrYrO|~*0*{YMZBTT~VHz2j%%dIjIZW$9UofXOT^p@D=D52h9xuj%DM#~ASqjn&M zOa~c8Ls7{7erX!Y(%Nb?wW_6Lv;N`qd&q`PE!sY+RiBVl@jb7KnF#*3y-gC2qpj;B zCdFLsTrPgd;Q=in0Ke7d*|Cp~Hu}u|8z%;$Q^G?a<&GU&wJ$psJwZEFV`BMR93YA6 zV)^~^N^Q@@2yvz;_1*g$Dt&I|0F=82cz6@|`VK9(H`Y0&Shu(Eew_(K{QfLk?_{V) zZe^VE3TWn*sc1VhO(~;C9v~Pw=%5E-kIzqQsdlYWRhMF(M7rYg)E%v*JA+ zM4xD)Th70aLMe5~jz$|sc1RAzPn22$D!VINUsW}T`9GjVp=;%@%5aY-{iCC!g)H@- zDX1uL+bNGr;roVS4+01lcTPZTItqT2s*^a}o(ZkhFLU2NOl0fU1#_DQ3_3Utg2-E1 zOvDVBq4UW90-ScbB6Zr-({|owhT&QdPp?QKjNrDF493u6%IU4;13n|AxTOqjwkIv7 zu^pCOWNC%!fiOot^lwWRc^6e0#YTexxC70Jy;v_hyN_%>-hgh5`& zI!4*ft|rD>#0pkJ`}SDmc1Ci2Mw=0Dq%P8yHHUDefn~A}@&-AXl z|AWmJb&>zI+iDxGChj}v>)@4mXy|^g4TEw6HSpDPhl%U!~V}0bIlb#_yf6?gny$uR6xM>LDCzF^mg#(n0&Tx3u4U*f~ z%{$Fo66{3i~!6awfRVhv_vAuN-I5o z8X@&9pDM{nEa*e>Av7wS$E6B7p=%m^q4wM4r7%d~t;CEe9O`Z4{hxnX?)>NA;+XU5 zCPovYY{#QOu29A!Bm~O;lco}`PKtSW{*_Gz8&Dk`TaBqKg9_zUT5R^i>gec*k~J#j z42s7d@!ou>UHr6s3CZ0^`Ml@)IKZ{uI>kHyPi7kd@a`wNyo`D`+D=M&4{fHR>bLl9oBzIc_N$r-AZzofzCFU_Irl_ zPH*qqRM|HM;3z=rXRFlj)CogSvSa`$7glshtiOgeEluz->*jHJRxKlU#+-br zhE`xoch8~}>)7V+uV*men6J@iVPbb-;tv>2IY!2Yzq*{rY2}63*NEt&Y zo5eZ#A)z`WArE7TI(Xl<5&L(GIxvHqJ7ZA%RuV8CIh`Q#FHWF#PICaJa=sdj{m{+` z+qyZ@aAZq(#q>>mCvB2LegAcQ$=OZZ-ExDrN@w z-=6=COo`Z?_k~oc=p+C~N#fmtXlL}08!DrH`NH)W*#apDR0#~#EetWz&eStJ-yFsTM9zK4~%$LqWblx@XNj99~rVS5w2VO2_I zs~!JrglQ&y3%LrpKCumWa-<$m$H{@gT6`rKMJQ1dY1Zlugq5DLCmkitej;$JbBbSR z{ET#^p%}Tbz+_RP;t#7V)%vyhX#SyJ%1F_FGwG-{@JMUN0O!)8uQFPDg9i@j!DjQ- zKjm89Qzk*Sc+SbQD|gfJxX_E$)m&7G03}t`qsSGgik|pUV;v@R4<^J3BEOb+uo*QM zTZ35AWEDR+X{k@&VL(@Dj0SvB_3ch{DHIfr71#^uXeJ!1V2)Zf zD&SU33kso+G*17S3w;2qWJu6XCc^aC;@tPmmpu0xL~CCs4_Z{~I^?Iq)mM)ON-dFE z6r`4y3%bQhAUy=Qg-YRfv0z|RUj9n_or|8V(lIb9(~g>~!qbSr(c|^#~fn~WwrPRSm!G0izQF<`e|ssNzQq$owr%*Atlk=^M9cF+zu{dzP&2N4;VE@?Yt7M=O6qy z2(?)+;u_mpV(~J&3H|94biNP^Td#0pPmrdnGe!9O8Jed`3xcfw#k=noDr{VWS>hPdpfNKKA#9aosv}-y+27xK`HhAoh1JgxjG9W6J2;aHoZ{qo7;Jn zxu7_0@P^bZ`0k6FMnJ!TNi6_RQ!9kae6FoXD(DL41c#Y}>ToC6-@e}SZF1)t4d+eD|wkjd1WV8Jc zu~3c&q0V|2=aDKkpIGU0bC4Ah#fRhJnIH(Yz7a;Jn00x#tz?x9wx*2&h+NZ#)eit)40NZ10Pxpn$`T`DhI%2>_-=&l8?JjF)(%HM2sc-KHten>$mH5J7r`~kYb`?Z zmAL1(6CICn&e`t5CymhFYb{V@560T`pANV z#(GYZepHK4v`EsCCN7)G79tW=Iv}mC2EDqzJo&x8QK&vbBUd8fNuvmZVED)YM;nX9 zu+eJmF=n7vBn@_8J)(EEt!C1XDtBRtfn#9KBKcrYOjw^ZW0cwUK|lw)yhOk~Ue5b}xl_^X3u)J?Hsl(HyE zH#A>eR0C6rO1?V_EZa;Ww45#A7&=L+o1pHPUEN-r19QQg*|N2Ix0w+ur!cWmmc*@* z&*))e?M?M1zE$N`q3tk_{ew+NrtVk`9qjE5T}-2x*h%?mgZ3CRySL`IYW>9lSy2@? z9o`>ie?*&vBWEeskPFG(Dd$IXe5nSb;-&!fh%sqm4@l~rDrppHTuCiw5>o;hAXTB* zP6(K(1i;Q-?)deAI9yq0XnHyYKT$;>;m6|Q&)T)Hmbb6-3j(JT zLmKL(1{#bA85x3gL8JzsD2ok4cZBL$@dms$(aedphdPSuoF@oZpx?#C70NWosi~vt zfXT1hf9o{uFWnUfSTR4ORlwW+F|6KfTcp{r-m@IPv+3T^Ym-o)oDTZgh$5;#bL$o_ ze{>j2cvUE;ClOl7vd~~`%_S-d`h2lOaoGCg2c8t-;+-iJiu9T9W#hrFJy&R^lCC24 z`9Fjk%~Y6!x&?@GP?43&iobse*_WPePJV|YOZe4*fuMP^Fbd`5G4HeKatA? z!dMD@0i=$0AyAEGpCcyYY9}rZBW|*U-O13Bt|tQUJt;0m^cy`Fy0m+-Mj<3MbTkZf z3{;51$#RRbRbaZ==h*==&Yts-x=+h|EFs?TAMQaFLt^H(#t^&t@lYfvz-OujBqd&H z1=}5$pm;P`sT;P7A5B!yFkeLJMDL{d-nof2@*?@xqK$Y#e<|;u9?9G8d1GVa(l1OO zKUUwoD0g2&-Y>6A`4D0a2c!O|fKPO0ujUtl!lhqgM^j4;Jlek#EE4Qzq%Ym(V3%N` zvfuvN|FKMw1N6!fpIB30!wtUej!d^(vb1`776;p~0~*R}Ht%eMAC+nSKXf!oKri8# z3Hte7M8%AP;O?Ifm;Ljgtwbkv+8-GLRjqN$mo9HApKWPi+to`RANZ1Sx$uHb;-eHg zF4IZbFV-64CR8N=sxaZmqTYu+GiG>(xm(a}ea|qM&Z|wDsMzQv;z;VsEH6ZR0?dyrQ4;bMMOsM4vhT*k}AUsNK~2$m=)bD%gO4O zC0EVrx5NCr;A_qI%X!?ZzkTSihL5&}Pc4vCHu%v!z3~bb))sE`*uG4RZJMhyo{69O zV;STT1x(feC>W`j1_sU)FtfC!T8k~UxcYdhu<^=iI}WN%U$-8v)sjxGQSNX8AfYIh zb#CW%;3oL&k3=Rz3?x<-L7f%eR(+Fo(BJq(`+C`4@qz2~ zx2o@7SF64pA$Ezh|7cL@4Ie>H(~G{_??-F7P0LACDw$_bms}f>Teu_i2`i?8f|y^Z z6?W++y3q%iMtr*U`k^8*`PRLBRM!yy{?~Yz~v6k`rs-nSu7BxTMCIHqA5Oysg9vfSg%#Q#BK&=$#GD-%&H^^W_RDt4? za7Mfv&hJ}JyFCveYHC+qfq#xzdc)5jmd-_U5r}|9cSBrR)ZTq4MIC~vm6Bqa9_LrH zQyX7dXg)%)Y)(lS+}&p;yyzwF{*woMjTi4!;mdWbXl8r6;Y0ey;D9oT-x~d*AkVSoX4~=+E94=1W3rW^UTBcqsqQT;4~#%06UL9 zJI{j;{M*I2#UAPV^H_*u z(YwdJXr{3$6-0Jji3GKfC(!7{7fBNnR^rUMXM}yV-ITGU5@+wG{d3g?l+OrO7RcRr z6YkvHV(~LFh^>3{!ucJSNsj*>ex$3J*uJ+P)#eo@O=QzYr$HsEgdk-bT^uchJTH@( zYP8&Sb^Y5a%N8hcwxLdv+@01f_~{sj5+teHTyJeiwmazx0ngJVgliH;+GGTn=ahe3 z>m%kZ1N@ZIw5z zYV@rOQKk}mK}HKt2&=~MpGW62jmA)shU1gb{rHFIw=A|;Np^O8S&CZ`w)s!GnnC;% z;oU53v#3%qD~rp80zK{!QUHOr9@$?>jf4x$c;r$j2v*@r?za+s^tkxVWw!HmPxLiL z)&XyNawz;msMMu(POlb&+lujRq2E7wiKl6|=zc?Lu{H<(HUIuiA>Wy<{~3N%rP9%x zl}^-+M^c+fz&eUB2tSxvGTK)Ot;XLvFG5S2 z=wSSohK#7v0!cZWGqdMmzHT+6()DG;sycQ?1=Uzo^n517m#c(e$C{x|k1QaV`Ac|f z$-c)}eZ%)AtP>C0Sc!G(DHKL}Qfu}%=D%p>(+?>rqNNLNsp{(N5~;4|)dEZOhAPYF zrs42?&i%qFr#Fn=ZQyGg&Ha*Epu2}@Bi-BbkCS<#^>*fz?}h%=>yluZGaNUdFb&Gw zafZTD`LIhvvldX%i%{;lpbgypU#sBKU&I(6s%Gi5G1-Bq&CmmjK>mkSFJ)nw!(LE; zwa*!X@kg!!c#?o?8()0(ZQmK#1Ut&#rkwHAnD)@vhHMz;Ed9C?{E9`0!G#{F7rVAv zn_T|=R3c`@<+2=k zjv@!yket6>K@7|cRYi8`KJCt>^;^#^SPd$jTrxt;bwb4q?0OAik@bVDR>o^fZ{0pi zIZ3O_GIA9ct|DGUA-P+Y+S%I^-;*+8Z;?i;7;3=qWWfq=Nkx3F84Q8F7(Fkib-{(6sN5mSNxSkgZyAhF7QmCi~ z_g>Cr6$UNq+NpQa%~Gs4(cFR>IRo{WGw&5jtmO)TuLKL!pWj6%xr`I*T0zjG_u9!P zNT+Aou^?P{y<0U_ni}#q6;Z$ zpDCm7-V9pW5C1*b zpdmT0Rh*3Ho5dt1-Y%c3tNv!AMC)MzY-iJ;Uyari`35!yj+VB4l`SM&=e%KxfO_YZ zpPIWrokR9FD@;`qZAJzoOt?tS=DC72?kGmZD#f7vdm;O6XW|#q$Zld6#?Ux-xEu-) z7m1I4h!lEHWg6TRo02B`igK@@pn}~L`Lh=B3I|)Z%?TTi@wDqn{?(i2{uc|zNOKnm zYq;6SyO57)F#w6HtNtHsH}}L=;$cq7UAUK5g{sj`Lc({L)#6KB{A@IB=Q9Cdy&ulr z!Zm>#aNLE80Gfh?7So^Ml3zQ`x8N1%XDUWgHi+UFrr5e{ZOTB_$#;OQ>~Ck{M$2rI zm(qmprrV|spDqG;`EZS->B+`WAwrrGZ`&Q+TK7DDmn?Z{;n?Qp{pS7;`OnvF`RQd5 z*=?;9==7zDx*dC54f4!2dg0yxL8`jBpZjcM3dJOV6sM_!eLNWe)-{W9{%5%wnP8% zsh3ldJuXZ9zdgSiG+Ez7Pp(AH_BN_e1q{*)oy@f{6wD5_umlP`8Op%sXF(`Qc%G#vN6KHrD@ z*rOqTbc$mMgm?QGrGMY#_Fgeg&(3-TAN^>R{Bys@qUG*A>zx71K8s84rk&*A0A|$G zFQ>anK0=B4|6~#B$n0aVRJ0u}a;spCY3VrWf9%;$p+o10zj)NrkE#KlRqa7wq1SmL zGb<}G77ej7=1xPC6T!iUS4JPl3iz>xw=ed-ybG&lnOVgku$$##VA9g1{JXcTc*0W<&rH0AGNvy| z`#tyzia_!)PYTE1K4x}q=&jbUlqqAMm22I=hQmJ9K16t%)d$&OzTe@eCKGf(isp{2Ul2dC9NdhOP**kzPqoN^V0``Pfspxi0^quWj9f}fhW={8V63e zS@!XVP5mL#7Sih4)>yKcB$d@jaUg8%Xy^9DrPYtw0#0%+e5%=)f9URhs_Gg)%m(qx zOH2*^2S4*kXvdJtsl%LCM7VNiC2l)II`-7n2jU7B%WJp(G)+kv%f5?zlVA9^Thb&t ze^C04VSGqp-?34ma{1Vf8Eu5&6{0tsKOUS?nqNbBVP6S+l;qPE>P;9TTyXvqUa->E z*T(T9PjdZFYs=+x+v?qyit<$pt-eTo?rJjvUv!mX0}O0jT$}XLq1}o?L#*FEQB1|G zgxyz5$(BH41Yu4E?tKUzk@~y%8XR}s^px0=2#LVt2iK#~k0b+I?1t()pVY5{32_>^ zM}1(G@%ycULVS^Azq^o`&d#!klH`Ldw-$e~hlsgO2Hi##dIwWO;oBIESkN>PV-7cL z{)=wN@mJTNqk^{eTSotww6o1PtM7ueK|=4v&Q(WAJryz|JKe|mThvKTw1zlIFd*MZ zAVY87Eg@mv0|w!oBS!cF?u)sw0T>D#L@XFaFeJ^lIbA=)uiAtF07!6?-B!v!W7Ki65(x6_aL;Wg;H+_0+|l4en_vCry!;KM;hvePNW zbYXC?xY2I{yp!Q*WQh+qXyAV+I|{MxH2ocPedq!8X?7`QLbX^^=Yx9|>hdB5Q4AXW z5X^6GzU*mi$ntTK?_J_+FO2a%0WAL=>)3r_d!l6|Eq6wvUTF<^Ey0rT8k;i>JItrY zlJly?N{+`+VGF~d6bQLov`l^&I=PjM>xR*vPYd9@aTVRvqxvvt4m|MoBVzM(NmodL z5j=p9zQMcm%MB4urxk*hQeb{o4c_?gQe8bOD1o6?e0d_)dkcVtUKxLwD+70tQkcSwPo_te)Sh!u$ zKC)B{eR^#n9)h(@@X-Od9ba-*Y}r{qro@_w%Jp3L8hkmPiI;pfu8Iqv`?1ZRy4FbA z${R_d|Ag-HJ$@b-wSDM(x;ktraVtI&%9&k`e7E+ZW%mH8>G7x=lLbD_}F_G}I;BG_$qnXk*@6vf7&fEA( z>YaPs-APB;l^W6?4$jf`%K)tW!AKKEZn%djyN0MIr1-TzJ!n4LW_TkMS0F#s>CnERjWMzW9I`E+X{wwRaZ&k{8R@MnLL)+f$GRt}I zWn;ak(VzBxwpvRz9A@4SlGDQ3Ew-?!z}k(e56q-q_oTA+!TXq4;`kfkx*q7tBWzbV6MNH|YiI9*p9(E^k=ACMVKBOy z!+*O)oOP5T{9>@G z>LY=)%DsuUEm?oot`dIcbb1Ie4Z*}Ep~^t|kuUt_ zE61b^DDvHkH>`?R3qsINX0BmM&d(J5{srr|^j^}xiJtRJwVetV7r>dBoRB#_d@4zMtS@@uqX0;#%p@jsrn*o-GvkZ zuJg#yr|edS-0|L9;~xdH@x#OZe1Z!D)6VLgku{jh(Ix)^O1j!X34z$jHCW@D_R?;7K4pJbBGGsAx z=@couYJh}ynFB2FiIMS0>C?wTE7u1O)7J+U4Q)h63cT?Dn^?5a#UA!ci-dPF zG+$EK_frFC4Z^}<2{9ek8E5xu1@F44nI3dg_(ruBWW%aY?(6Z`f2KuAEv-5(IQQ)@ zk{=!(atG{UH)w0~f*R~0IN76(bg=1BAL;NW`3aqs5C3W2Z&6n7R#~Qkr?T6bj<(n9 z{vX|WfGi>^n$4l#xE;Rt+qLiVNEF;p%{0d$TuIH6f5yCDPHjM{m1Kljnmg#7RxSl| z-!7?$s`TdccdIjLL#dicJkxESa)FFtzv~|Jr<06PD*F+omtqIp^v(eD5*m=fP5~;* zE3H9Cd#|UuJ#GV^W&a{3x(f4R!o~J-*0822iO$V`ou~i!IXdsBlEq`fHVGVxSz1da z9$sdP!CNqGIz{tGEp6$@)-=9G?0#Io_%k0g^0$+JbLY8WpDBgx`iy>j;(ya_gi(Hy zbUQ-F9yJK~la>~BH|+-*{+7%w+jV@*d0+z*oNqZ>@4g#qu}*kKKMP0lY(tdu=j&ihDhI`m#7gH7pv2xnlud@jrV8iF z5zI0`aKY(MxKx_klX?uSn={O_6@9`xQY~UI6dcwZhAczUFFm6^$Hxj%g3M@V9=kO1 zy0<@_wmBQ!@02ME=il_MzYPh3!084(6q+|gIbbAXW8(=@E|b8%rYYCKha~EftC&+! zq1{+nw=05}zIrNi$n=0XpcSSCZl2cXP!1cN4)(tmIo|&#>)}E4UgSmrhPf1|7>nZU z8ut~bgvKSPS~6K7-u4+R%T(=obpQ7uW3}Mz#8x-jspL_)b+)8fobTPQ0Jx`XV+GD> zSt9Kf_?T=bhjiH^r_Fi(exqh-AkNllm~SwVUL{ z6&5)a%`luA|L{jWCZ4UOJ)AR;G(%Q83Vpypb0_0tZwx@a#AN@BG*xHk*S^;KNVo|D z*7L23q5WZV1vltojAekg?dg*z98;xtBa0z0bNe9&KOdQfZ1-bvbuko-vEE8_5k_0a zIsNOXjP`ih^xUjrJ_1zR_c!93*JDD26%}l;eD~wD6|8xEXB%QRW0?}b2PraRp%A7q zXHn0>bXl;IU=##HkxFI;<16WA51o%73FVa$Hj}2Wy)sK<`_nue&K6(^i#S~TOV%~X zMJe@P2$%0i#uWl%ng`zBzs7?oDZc+U>K^CUvnjm zFVpXzpPz^Mj0>yt1+e6_IkE8KG2r~Cumj+@GV){d&_9?c%UHTtB8bW$b@Ct(2x};>{K$tPh4QW&1hqA(d2i%=f=ba6` z+o>JNv)J?Z0GnKYl9ZB@{x-1anA!P8TKMpMaW>g#UsHR%tyq8g`BKrVyGRM2lK|O- zWVj*`+j}_A6?pp9Rs29+G$7{e2NosROaDSO|DkoO!FSULx}ib7gly#j5qmf`xVpyM z$YH=8?tCvnP<|5kgn1Y*pSx68&)HA2#wZb0!ueo0ogh#EY)?*m>bLvCz3Fg?;V z<6xc(U3b%-=dK9q7M)x18vpv+q_6D9m*Zf|zRE_F%}wsGH`4z(^$$_VjLt@GZrY0i zcZVkTRdEM=#QB*13O&!Irzi|Y>ZKTAV<-PTxBcDQ3d#@s)ga_KBeO{SqU5YMfr4Z| z5eJTNXQ>=_=G2X}SNB>uqmlsu57clARz3gO>Wam16s*u!RRaYSM&{=Q&4v@Rk|wfD zJe?Nvl1=Bqp(v%FbRtIJ;ffztSXlV>a&L;(U0m{EG~R2PL-wjjD3NWJ#-p+xebls} z)D=OC^D`&S2&=0w=_C%$U)J}jTHfsph1O9r(pf0_B)JV#pb1j@m5f2%22P+@wmVmR z6rj-muRdc;3~b>`3KL4wW`BC%5Bogj@$(kb*X@-aaVg*(Z-6vhf8jDahpCuV<9~a) zn2_|Jfsn023{|JP7YSOmqmt9t1Cf^vY-63v3xZfZkN1av?E2@sU75#1w9HYUAEcG) zJpyT&cT{td>X{oYQ9d_W!kH>3t0+JJlFzYsDNJz5ee0k?M~3SVeGcLLEyf}WR@fWl z_()+7GU7*n??T_-I6X@e+InhbesDZdHox7@9fm=;zrTMslPXVh|Glt}xYY}{9}8*F zf^E(H4;buk5p^Bj%ngV*`pQ>pT7+d&hzFoyw zuZBBtJ&9Vh-g{Dnyc|PYhkl3-dEiHm47Y_B#*duUn^6*FE`Lc^c~v)hyfbrndq^&1 znuMVufOugVcx1S4kfp%b{msu-@>i7@6>ZL{L5wWfehLJpkg`u}y;=N}kZrOY`_-_m_k+_YlurG|m&iI* zxgM*wlAb@{edmd^#A~&3Pg7vy+w*JF0t777^|vZ!p9tX2j)IlBxn|a^%Djf)06eOR zuo_mO%I_rSc1B<@|L>6*sHt~g0xwi+nc)e4A&RWnDra$lKUBqAg_s??^WWHxOgPLe zh5!8N(s6oy1#6@{DM)MC=na7I@Drt3CiXX-yS1egk4IC3^KFbNu}eBZrRrY+X(**i zWYIBj@`o%ehBo-_^ShryTPTM!t4r@9AM}u0PtDK&EY+)^o%@0#zo*g4W?U7&-rTAD zbYla3vzF(&xDUrCP&z9G0u?a~Tha`ynk@C2ys3XxHKW%tu>)$fzVs)f+PQo}^!O2O ze_-eIiJ-FjV%4$sZnNysaV>C7@O>!C*2j0-@3_N00o+EYeFASSX&)DvO8uxItAu~0 z@a}h`bI|=rti{A6kJZ#~Ok%PidU$NYBGJyG0WdOU85QswCJ0FhecTB<#`Cl6{$dBo zkPJcZ9>o=Q!BWWr0hGsWi&t|}GM_|+z3(4Jr>h>l!Tt;<=b@hS zrLtCR)EX|I!FvGM!JnCrYu&*ODB7cYW|YiyDCVcGxgAGUv6D%CAcXf-2#^F=gWvFJ zUHkFhI_TiPD-+mZp*Xx(uER@C!Z?11B#l3pyq!>#Fg`xi2%4fNC=MneMkGn7E@^a< z%7O?}Wr4!Sy)(>L7H7mm!(asJhi|rIO#QPm#94p>{Op2(z&U%$Ma#f6< z*x}H^JPruuBWYm9v7s5Ymgliu3vcLB_uX^WeJ!ypQq59pHvR9=2U$&^1~b$cSuTD^ zxH01NF6?$Gw!CGuk#Q-BOU8t?C%hz^&3e>S_#(|bfuqvOfjG-thHwGtx(QvmFg+7a zIMzEGX75|l1B#5${8{mSV|wsvIhUyJQ>nLM36)Oyhd{cBzM zHf`p$DiFd?0awvX>1b$(d`pqzrMW9ISf7+q%bK*c5pr_WOXrtV4yWxpp-T*usoF)%zK+jW78L7TGBj=ittI zBI__6HI7Tn99}MoMX-`aAqv8N7w9J z2DQon(Jzq8Zm@E@`|Xz}wI`51?H?+KoW1#1txI`JiY4bLp)0K2h9=A&ZlprsoQ-a#MY52w8JBU&1f?S@Vl z@`AJNyIw^m_<6{xyL)(-yH1E6PM7tT{Y8?j?-ofiHgaAV2txvl0MOx@{qVOk^>z{Q zv#LKM)1yFd&s#V)Hbk_Le#p+irVb#3=i3I@$_7P%`s z3MfiJDAPbldAX?A7IV!s3MtzrRmeL{vYh;UXCFA~rU42P1BnscI*K)zV- zYkd;+>-vkJrG(*N}PcOGI|sAb(x>kG9^|s=2r!U!n^zE^|Da1({8~y_-bHL zb>1}vwkR!skjn9wNR64KbQN4T{j1ILGyMr*TqB@SWz3HP;7;rgmTr#A-^4^R?9=m) z#UvJK+WYbPM_clB?W;CM2HN$f|J1x)GbDZ$so&RrklFV656?coP-hE!rkioJf8ivO zc$s5Bec2%#tUEL$R{B>gn&e95#YY|Z3Ec4AC+9b<%=Dklr(i6hDC!Zq^Gbx1+E1Z% zRT2wqpeB)Gyc%jIXB?leoQ*8o6y>Fw?YFBYbN1MEUFxuTjGGc4iSuvqK7zaWmgCQT zbER@aYtgVq;+F!t5L}lnV-%nGs;hvRDppub3h~I9<4NgeP&*LQzk8S-{HmQ+R``cl zgk9wDz7|Nn`27o-<$ao6aI@%c>v1QYydVk3=ab6b80US9$M_OhvjQ?j)XXpw;~|lo z3LYk()i2gYgC}8+mDk7WBGax6vc?;DuAW=_bRL_FfSKjxNnf#k@bF^JMTDhDxU_OF zL(txZsQ@j_G;ky`EuUz_%P>?zjHJJ~tk?poJ~ z!;@7@n~m6C`}f6Wa-A`5HW0(n`vFAG-{~oKb|4o@cmY?_UkRmNQjh#6 zH=ks01=31uWSv%`N81~aD_TQ=S^X9fCDMd(QFs%))ARFDuuWp8 zFUJ!=K~+K%toXzYJ5os#GKS7qp4y>4q}dSd1Nq6s}SLVP+Ef)?Y?I zX=T1JiY1C$WwM|?*_?Yz3x?OnkK9)iSD>7#2{ z{Puw;ZLE2}k?hVSCj!wlR&i0D^*Dn}ic~eN-(Lf^^Vg75Y)pQlODC1ej+h$gP8?qo zH(H~h)dw}j)8YuXGu{d@fqQaaVnp3T5RU$@7vOOIMtmY%edTDRw5T6BoDS-9eG|f; z(lYV1v9q+ocM|POT-uIw!Q|jT{J=JBN*KwM%1&&q-&wHIi~?a2QyJ)0rW7a+p=0g0 zfxMu^Mehw{i_O?`WiZA^mmIs1XyGf}agBD+VGVh3Te`4kC?MO&$%8*i&j3OJ7+3?h zMpws+(U2ILLe(Vf0`HO2+6`Vh{@|X*|7{qqU`A{N`9Gwao--X_PGNy_7sW&Li5k%3 zJHp^cF<<^xWaDGUT>$z!-ZOniUMWe@Zv@JOpxmPe2*i(!`%j_(l`;-_9llyzYJx=B+OO z*RM+pHwF;vfeZWR=<$)IJ?$8S;_L%ncYTBJZ<`v0iHpm4;4EKgm&#3t_8~__HqVTYy_tPBC6`O~QFrfO$A=Tq@v+gcnIanpAye zc_CCb*(h;Ow>ILC3IF48WRqcn+;9-pHt=+{ok*2~BX;PBtLH-g-W5@KV46L6o)6Ab ze=?DvdC~&Fhh;@4?EmrLTalM|GG>bI3k%zLYYU$RW4ioIeU-pH4HN3XhAtZ}xtvrc z2c|iH#1XHHBN~fARj95M)vJ<)GksTg7mhsUc=!2L&mQx{y?@*` zmDXuG&xHkJI)P505Ws|&N+=LWtfUHhv`{_h3i zoBWy*1XwVp#4_?EYMnr8G<$KbWL<1KZkT6L?q@;I@%luB0+^7=m&T_lN;{Q*dqanI z_(AocDg~fOGE&3CxbMFEQ7D?Cqh1&~8~QB5W_sa!!f@KqaZX;72szTF7=rpDPJ7QO z80;It;I>S7epN*z5kVpm7YTXPvs)4(qarsphU8EmjyU>F_KvOF-+AjFe)?jquMLlX zHvtw5z8jdpBolBP=luhz?DCRsH3+Q`zm?&yrYr?$s81j{nt$0A)Sg2g|MR^p8YCF> z_|Imuxcja<_4b8jYeZnm{6+fD+Z9X<8VWWqauF-Gw=G+aRgYhkt(Y*FM13#U$Tc`}p!K82cC~ zpN;Ir$=+8MU}YO$}c5Z11(K;7)Te!Pg&_dvF9~j?R(Tt_3nG_!N|y{ zh=%gKa(FHE+8*DwDvO2h3y}~zN>n0BQjlnsaq6ijqhn(?(!)iOhe0_SR2wQ9iz88& zKqM9w+fgJIv?WF5%d?pbmK=4I-QUyu(Len1KOfv17JO{=6JWup{x#wePEi6B5tS8$?c(z{Lpp5(lXDR%F&U`(+E<>}N80oQfU?-?5XL&-2H zje55xNC9TgXhb?&M6RfZ6Dm6_UY^W79(6lDX(|Tzz@HyLPfsr>g@Xh^f(zGiLHU2- z_7e$4=(C`Ile0R2k64q8cfRv2$dBoGY26k?2i9h-fi! z9$E3w*ViK~li73U>B-^IPhIoVZ{J%xE5Re3C;=9XiIU>un7}?H5Cp-@k#u%NGE+Fb za@vX*G}Xt&Hcwx2boW-&D-YVOA)#GT{!M=N*_BxP;)|ddC*cIA+EL}GsL;n9eor{L zB@a}6Dv(snnp=-|y!}Kx_3ZN~jya+qH)Uz7kw_>O3Wd=|5Kkn8V36NJR_PiLtyy<< zb>Yy%k3cS8eEOI7-*`IKta0`sE7#mmz9!i_BY-_XDy?*H@sFil&O@SuJdl)oWbua>QfN9f{6(<&ig7{)=Px#DB#vC<*09MY_o1|&x^$XB+a z_HbV8t`QQ}juNkN4|#w;-~VUy_4Oi<6a-Yp+zUYNkMV6N5)Kj&k!b<=numA2>ut!S z(%9D73j{H-IYnj36*YoLtWH#=)f5%+x`YU$jYgt~#vzWHT6R2;Eb46#TIswhM#!w+O^+^_}*A964X z1#eU@6+gP{7vEX&_vX((uU!Hx7`3~0Jn|YOKy6kt`Qp?4L!+lqZ;Cyu&{A&;%QP`K zlHF}UyzDnL{9=zZjq&%deD+y%bZiwCh1iA?z6wgnqa-~KfhXD^L882l84;ZJu6N+c zXI7$+bD%&i*MXvHvno_o6``|X{|gm$$J)6!JTVI)XF?&WmcJ?Hpo7NuI!|r-gmHnre2?iul>f=wh z-U7>V;P@!lk|M#NcB{LyzXQd=(Z?*p-1c^?cy>MXV(9Cj=qAdeP*e(`RiJ56sL_bX zz0lMM8XD_SUss1%EDBADAdoybj)V1U*W&QQk3?pyP&A7AyO;g)du#Xgy~5|KE&?nV z)wLc|YBbb`nv#|K`}?(gK0oi^gAaaNBoaBsFpT+*>$WMXHbX)XFK@2cuIpqpP3w!t zV%xTE-Fj~%64|k2$r4+lKZ~cxD_1l=J1{bOgKk)RJohEhI(0!?3pQ-+78b(pU(9li zkUcDmJv(F2wp4$AKOTALFMyR%BS4OEmcYdcc5F38bM33?Mb+Q%+<@Im%n zOp)94HK)OXG1XW20M3uBhOdA9>xUe7+;Jz?*ViAbo90omSnP0BmgfUV1Q5Q~@bxz( zKvZJ&{lFjbT93jYPwi}IlQKCHmOocS$y^RY+a$)}$eR)s`8w`D-4 zmaZfkvLY-CRgDPiLW@O()j^JK+KOtZuR|;n8E?<3TSaW%*nvd{FTvPYsnpZiam?Mf zUbSn#LE{rw4FML6s#%KK8OUQRSI#?h{-R?RENDNxWEhKm*E=qjh##uT@@z?xB9$lM z%QWGy1md+7BP`s#TUV&yw&QsNzVH2R^Tv(KPCDtNq1vJK@{#r>)9K-Ku9ck8mFGV_ z{9Bsqkj>`NKR8nErM-t!dpv3HWp>B7u-tw3UC0%zFnrc^g>#!K*E))ecbg>iEE*R*xV5Mz@+~MbsxA>jREvx!`)%F66-_gm zkgEkNIPY$z*@bx4#c=wFb)Le8ob7;Rjb+-FJ5wTLsR_%$MI&`mi^}X z`uMRCO`9c264i=Oq_8*W_&xOMnlQ2F$i$8kep^#F^rs!qyY8j6{rA7;Jx3R71@Gp~ z-E-=i>$Z<%a-zuKo<51$Ee+VRy&I-wzshuWXLRqjEW)iS!!U6B?RP*T-+~)9OY$WL z9!$LdjQ3#6)~)E-nS$qOVk@a)S&&sh&TEA}t1=>#cM*vrBBG#FMB_0uHr0!*s8}>A zj-x8&Bk44f!$U~ax4?6yT*t=sM?Q4tvYHj}TDfoiS!dT-u58OL^X^`EaP%C(tXQS`eAB_n+BA2fF+R=v0p4u!u~ zepb}hjtA1XwU8hx-A!>ef`MVRkHbP)vz67frpvvCLx=b&0c7O`ESsQX~kZ21r38 zbvQr}P~7FX2+)mD*%}gml~NH25{t56gqg>$Ar9q`PTF>H+%QpWccHxUW3uAQB_S&R zu}%G>>68^Q`g@Q>PYAIAgOY7qn~S=B`K*?f2PH|OTHsap+OlKdYd-ud3MHeW6XRCK zoYp41xV|HFc<-5DF)kjj_*E@`xp~t@Z0_g`Gqj^V-gLr|NaqUZ?AQf3fEQ3Lsj@hg zMW0%(Qg3cb&XXvNmJ;(439%g|DKg@Ts1S@s5gC<$ERnu>*s-%4P^hDx1=mL=-QWMF zTd%#W>~yI*+&rNDK!62fKR`W@r=+<4k&)8uNTU)n3dRB-{s$7V*s&2!t(RoE5k3x* zBs5cdW;&L}R_U=r|EN6jD-Cq$i7o2VmG2CCc!#~6CDGei{B>HkH1?b)#pT;u^Sxd?T`nz_D7f8~&!GWQ>>*CQH zT3T8LB}v--C;Ne1m{+;hmd^ff+Me?Z!=}IX%S|iFRbZRzqFBGFQ*0?!UV941tBD95 z_rmk5(cL$My7~x~9C8r4yZeyI zP%xs2O0>;Q^{9{6iO48gqc4 zNJ1hYilm^;l4&xwVry}1DGDiDs#MCZBvrPRlq0KBsZTFT!#NTHN9+J1TmRG+pY%3)3?1tDrU zC>GhPCGa2VJI2kY!+U1NSR3%;l2f=JM)>obJ5$bPfAsLfkG=ofzx@p#6GDXErqAUS zczXN#`ZrGBQ|bC{PCG$h$DQsFff4mvDSh>8$2l5nF8hIE|MNfn(@)W;p3&<1Dn0SY zlfF%=zqH;z3VY;!7o1o0K&&9nlMEPXmU9%rU{T~;M%(YSxH(d%Xz?Tg0RFXyA7KIC z=EfHGu{{}Ve($?}>0dnj^v=NH*4O(PI0TIA^a`Fld2)4m?S?-{l=v%g5Q$?w4?6t+ z1}Jbe5eDQ46d}}@_kRvKp2$^z(^etEz(4~Zi`bQIQdU&ghIB}wWLZLaihOtyM}Oa; z%_pRSMMXHKFstT4EJiZHakV)hF22Viz?fGS#Z=bSubqX=cYgo(fB!dr?8koW z+>2Gw^Y9a=|7Bh2pYe7bUSNkPOY54tMMhtK;1Q42^ORJRvj{le_}-B6)McUKd1n;4V^VE+m~kbCzb+jHcs~ z%Bpm;>ExGx<=_15PhI`gA8zq-I|GM+aUEV!=bRc$$`9me@!;M~zMx)<6e*E}*KJbAL z{K*TgD1YR{nSW!g`Cr&(JP7OnxVow-5tbhK`ZppC9?&6zL=!|9Quqa&gO7ap6I2^i zR_(b0;dO5j!X8rL+6peERg`94$qkVnQczi*Qm@+!L^rCXvN@O^KXH;lf3UelB2lMj zdhl2O{mbr@`M;5eM@g`^@zgngxHtA$&t>r>Znny5^jGo~4u_H-A9xYVVCM-0tqqV?u~u z|Imj%_Pam%lmE?QFT`bh^og^-sHFHAW1Zk@0%2XP*;#hu{6#u*c4KiE%>6WKmYY#W z_%gU2AO7%1IJLBY@zra7g21rNm2Ieu0^yx-p9_@Ig1bo5j5^&GE%kfUDL{VboU+38 zee@fTlSoq9+1i2_&~9yR{%`O8cR&9xUx@Q{_!%#~GjIqPFTHDW)gu~AX8$Tv>YvTK zrUihAdFy!;VI7%}!)7D8W^`cf#&6N1U=^4aSWAzd!jDE4BA5^XP3cf#7Hnkr==N_8(bJXx<$sd0IyZ@g>XQ!*)t%n=DoX)@@ zU|eTc^T7un%wBcdYu>M<_@S5!$6)OrFCq)1pM3fzxR%E5Ya!y`R7I$InpZPPL8dlr zVi$W%ciK5E^*Re~qEX!wv*VF#VBCo3vw;R|1=YyC&udCUNHLE-!ZtC|SX7rTZqqqA z&!2+~dz^{;Xba#mo=mAWmI?PFOF8n0T+HPzx3gAnZEc;LmgO)0#rwmFGv)2I>m?sF1q+Asf+)9zM@qH0| zzQ39KN2fImKwgaJM|sr$qaQQ|F{K1`+bvpI>ddR08aOc*>v8IcPwSk- zjU}`(-Qq_=A5p|Xv5|&ZWMQDT@OxZTb1hP8z@wN-^RsUphbNTFs^cohaqLU= z?7RNXIctpB{K6N%_`9nsEC1;|?|IJy_uhN&bE50GxV8IFq*Cv!t>qCO=X`T(hi*Q4 zgnsvfALB|he?}ImC@w9YM^}w#LlEum?$YPK_+?Ht&6kFjChm(@v4%!cnkEbu8COPS z)NU1Q|FOE%=O}}@3nDsm?i}ymSVbEf8zj@@Lnj}2?Cl@?;JXg(%dfLB$7$5;67>MQoVf?@uTXZhK0-i#Sbfvku4hCZ6toywd zEp?&pg_T6eZN!SJriPbBK&5SW$X|-BEci(;YeeUgV zfBV+6xy0k~^dDLw-&I?K#&#SHZCu!-n~tv0`~LGsISqKp50byUU+a6hhG#<1?(PoV z|D^}G^!30c(nXA+(7yzO!7Qg%x69|E*Xz->sFw|0N23L zg^SzNZ)fzM|L{|MtpX&5VgiqpC{p0`TLTzy{5#v*^wqCDatVhKQ&Mxh;Cz&1+m9qk zS#y!YP%z7AslP-^OI_+C?WhtiY}gzO=-dU+6pl8|Ux23O!)K3w;YaVg@4kbKuCB9R z(Ba`en=^0-7|-VHy$J99;sf9K;ctHR&40kW1qMm3c=D;IIAH4d*o5@}6ioC(j|9wQ z@%~mT=lprM)AD7h^OD@gOujLz-wz;7z9P>48+AR45>Y1BgBUQ{Q*cF=pEAd4EKH#n zWUqhBgI*)Th${7YxiA+4`6$bu14A`8vc`GmdnUsY>Bpa zcL(Fq`2Dsvzxt&weeMfyfBW07c@Qm2{r9wUzv%>=IRvZXp~_B`pbviJQ*++PYbQc* z#?@eGgk-()JzOK4lb!7ydgS;M+!gPj1>c)>Gc2a`rL++0;V;T)(ROutWr>!1U23tx zprp;s9Xfw;8!0F{dEx}M+Z}uU{HeFT_t)O>>1#Pphugfo&%hyITxZw!sSCURq*o-r zgh6%z7z?lfXy6~x9RLPY4PpH8e1k8~^eD{de#Dg2nrv+k2)!^q^wB@#bfS-dJjmfMqClAb0SJ8`sqmU38Vmk1I z_-KBO<^Ug6_r9DKrLzDEl+&WKUaOT+x8J3er5<%#Z7Pb4X48@*i^;5}$#_hoogLf; zzx~Vqy8H>Emv0xut6jIl*B58t+J7mBXYD0%29BTG{y+Me`sWbMd8M!i2oR=tjDeD) zjsP4n`oQ43wA7}Reuq+}xc4(O7<>cli7Y%f;A4zM*;CYe#8vZ>+5j&87FH%cy+i18 zjmSd^>J~YdlmbMa4tTJ+qH%6A)8lV^9y$e(P&Ku}?)ezi*~>{WqMU4;x1r z3JcKeXm@8ox+>|TfAV>%t!6l%yzw#o|>p zOdUlJFeNw*g&r44R`{-YiK3$2qNU|7EqB}0Z+Ez7#)*@ss4V@ted_TO)ax&s#~yq1 z^&k4}U;g?_;^sd*h!_0~90JCRehHr50et<`#s9sR$^Q${K?DmQN%(Y(Hn5sN$2Chx zP32j_l`tT(F^GWpMQUXs3Ik|35-_WcT8jB!4;p?pF9>q8IleTN+KuV0ms2bpXgyaE zDzacr5fsN!Jw68#k2ibLPyx=o!ARrtFf(tK*ZN2ztP4U$pLO#Q2A>-kBU(e6+n4%u z74`uz(Ivi{p(K~o?RIDdUP^f=#l4ho?!`(?9*w zr<)r)=iWFi>(6LQEf_E&3PeAP;m&|Q{^|S4pa*x<%5Y?8$<~^tlL=LIHCOHX?{7H@ z00&ZZdZcR|iVQpf?n!QVd7)Q#MtRX@qd`O|0F7?9OZ}x5t@cn#o72O`pQP>GA$2+( zI)CmgB`R~X$@t&C>m5J)(@*aXJ>2@`d!Etlk=7&W{eMs)m=7)>KDdCx8h#Qp|UxTm-P(g9%^0C@;Rk{le)g&nFpY z&H3G(-OoPp#K~X%?(e?qV|d9qw>F-ZCybRnl}f%&Raw%;g^Tp5&whoh(cX}dfeytB z9xz7Z5tRUpd5X;w;j_tvHg|TZX!jQ`w{x>dklczv05)$444c%BdU5HOzS6Z~B7{v)5h z|E^naz2)=k{f?ZcqeA)#5e6!rkei1YAOK`mA?iT-B@Wi!f!6o6Sa>xB!oo)ojq0cf z2)tFxu&pg-n@8SNg?=x@+7}weL`^ZR9MUyiUkr0Ym_!Eb#m%=a<(2pYG+>I zb@ltmY;SLWyxZ;lwV81RTAp$WQP*_xt{?ox89> zC(m4V5F?_-* z+%_1sxg2+4Q_j^<^R!psGv=N8_V&~8DXc{|zGiw0(FJDAiXqgZCY7grj?%O zJ7Dd8t%NyvrV4-rUZt*SdwYvM`I)a!Syfb_%_^cG^cg8D1}^}{Y&M}9Q3iB306qgU ze98ul-IW`Cic$GgA4+095BYgM1BZa|JfGm_WB2d=z2CdxNB`Cjo|IB%6-d!(87ibg z#T3#jA!Wl|^1vAcr&9dIEZ?Vye6$hCX0OkV%RUYxuD*oqZbSle5#HXed6D$?vwN>A zfT>}eLGyF%-EcXQ2)o1}h7<}MXdyDoi=6U23qZH9NRMFQtx6W9r%Y}K$JTk-ZQyYh z{EuNPb^tEFvnhaNwWAl>16fnuenZt@PUT*yAVZ&%W>gm9`>_J|nY=YA#}^shrMeJRMVAmZ7l014>;^nd?|y zeSvdg^|M>%7 z`O<&=>5u&0+2`ZlJ>2K@eFhEznTRIl>5l=HKIOR{%P3z(t8G266BQOtc$8HL9!(;txg3{T8h*ci60P zx!jr z-Z2Px;PS^Ah;(#P4Lk_SRuKXDIx5WY0T?K!wam?z^^E&Z)Y?&AcraV*x9I3vpUGt$ zW9-x6ON61}Aexk#Hg|VvG#=BfH>`3b@QFXYpEVJzsWIsJQPFHxQmsoe_{Wn0;&c|S z`Ra|gaa4hmktQkIfPh~Ci0ZmxU;&V@y1SLpXgK1CVr^}e27?_sbLKRS1_ONFZ#?#; zum99nzxvVf)43*x+y3P_1BZZd9bfAwPoH~dyVd?FV{M2sLf$>vng@G~dDYXrIg%&8 zqqvK20z8kD#+9@O98E0JP@a6oK&xqEbDPeb-{60dw13`ymvXk~Qd$SSQZEzu3DeNG2usdvp~9Y$Hx)?iG#qX|c0uROX&YfC-)+?O7p zzxe9IR3Z&!z2!V240P9H9v}P%fX-T4z42B;t5pHMDnS*OWQ%evDBDGH5s@VT10?%! zFrcO76|$zLQ%@eJ?TrgGo0R9qXcESl?Fy|7|kZ{xcWw;E8DOg$JRU z<_H2narXQMH!;E>_DmM`J!$}v|I}u`K3^$yC1Sbx8g_-MFdu#NX=P=}8|)?M_26|H z+>s6ki@`sptAe19%ZT~>8SW8+K|8ip1*mxYc;ETYC;kLgw)SPksB)^k?uEaBlGMu4 zbE2RlD=TzlxzE-tzS0WEV`+1HL}#~#bn)Uvdi5FD|j-S>fy(o?6-aTEcL2PL>j zNg2bPpZqnomX>aK73Br|z$8gF81!jJQ)?=xQ=S;G-;{I&b$GYeWjEgoXU@{uQzvM+ zy9J))pa08D1S?i`Im zWfQj%$5v6v?@qj`5eDbuSF+Y z|JnXPF(U_0z%IC~5ckKXEvRqL69F_B-lBROZ_sn(vb2vQw=lKjA z0><-vf}ii*f9T^Mf7Q3X?%O`u%JWw(DuF_j5z28wK;Xr82U&W=nSIlmBV?X@LngN_|-<2C~p}f^)D-aYna0FGO*Z^WbA045$1q=o|-3|?h zV>);G6rDf)6itWQuC8Z4_eURi-_JEdy65}0J>36wdIk;w<2t=?exPP4G=1{3U-}?@cEKJ1cKL?%Q(sfMec$FP3G+**`W4_96T+p)@Oi90tlo^bz(p z-)V?GxMFvqM#syXw#svEQHt3&S6eX#Ma%SHGs1*8bP&E|89I$n!0VsGUxZU!Uf1De z9Xufh&dq+#3wyY%0o%g!=t9B~DUR!kJccfA6xKQKb=CU_VHkStiA!$)LAh z5!7EhMp>)P`Vbs?UBhxjGe~eHm97~`P!KR4O=)xE0-b#71dVqtlCEYaPF{TKuCIRj z(>pJPpTZRfByZPyxV(sG;1DpL^~qh8Yx-rvZ7i>$YI24pa>uhyC}|wPo@=DH(j{6N#`zJ|h87r3nIw0%OEpU!74dwWvDU;7$MH9pYsm()9!$zIU ztis7i!8LSX0fML_=STsV9Q#w)FvE}Av+q-=vJ#;g6{n>_1Qa<2xINArJE4D-CzU+7 z2KhWHuas<2k|wP6VBSQRR2yh51eelc0WTs1q8rNsOaRl;kylcyT@V`@T2xgTnvQ0C z?NE}7uefq#g~pSTb~ZNX{Ml2qvweZ8$=FOLB7Y=+8z25Snf{8e27oCV0Mg~ z1tKg4H>4L&*IzwIX~sKz_((=suDO%5x7Kp_5(^ z9CC#h-hholhtg){*WB(YD9T9E<8N>=$XFB2B5)YkNHdgnJ>y6#c32 zb-WWU>%iwNZTWnKCRJR3Fc%c^0eip#5V0GruXN&b6;gwIt+=O$7h+<2RAEIB1bH1P z8=T+e^_wU!GPbM-IX)d%+@HOiq5Za`BkLHfbrtb-uK_pJjg!>1N`&xOS$>?e($C?-2QF%-FRg6 zdr(RmiP3qq5fr~WgE4LH?9j&6F6|74oaTtLXn$OO8jglTn8_kyfQXET=y@(HkiStN z2n`4ia9(W2vtbRMV_`dvR0`}WF!N7UMv2V0nrHEeQC)6{WXS(RrS3vmEOQJ|2_6XW zxq+hBWz5r7A)4`naNKqgmG};WzEO4rk|;X#kx8&XahA;ni#(?+hyyvj#QiFwORkTk za31k(@SSBqJ7^_fZrOlG@aHonarpvr<_{5;n*roMireubC$L?FVJi}V8AG6^=vws{+%~}=(j%peB6sK z+kL)N!RG~vf}Ur6VnOE+9<9`jA-)ZA*QcDMlF39Dq0X zN9#p$Y{(adCXMwTBz$#Ps5qWy*?e>q%8WTeajcfdF|mgh(n|pxy*k`;JOBrz;}{5| z7A6S%B7kwk!Zsv68e2ptUS;mVVgVd6BjO!~{V^vhWx(jJ-N?W)8dcnE3BFS}u9ekg zj$%M?Z*Of-T^X89M^ugn=&tv^5C6p9{)v0u_A-wyUWz}|7YTH(9O>}y<*Je9H3G)v z2mUxad?ByPUxtDI*__XBdjI=ZUU%#5|9I`jqyK0yDsQ}SVM}ap4;eV7Rpr~EhS_+W z5rY?CzbUTS4^>LsozC~qz~C4MU{)FnpNr>Cf9wMVa@Df3cvhB7nAd16YBiU30!RQX z{1@N>FbP0{bW7wqkc)`}s2A{gZ2^3eGW4P@+SF=wC@%mae!Y(>{H!|y5bvX5TN3Tn zBO1id;EE-D-{AJzgqfyJC8o(d%Mw)U!F?C7$0e@;0y!NQqBH)S;Fjz67yYh05$<0O z@Q1(ivSMF65Q`9!#J6bEn$Bi4gXdI*W=jC?nhgre*_8J+ zoy<78(AD(J?r8W!Z~5SRABgwaJw$|m&F6R=*X@7(+1#Ip?|p`6;3WVwh|BkY##JHa z8GhHxz3p)De~wRR*xi|Ty-WSmzxl&=EibQq|8RHk*0R>$HXKgZwsv;q)?h&6*)+JG zS{`&E_CmQSX7D@+hv_j)?V?_TXZDfE4qi*%mk9u1XjYX}m)M{0q{bL}Q z3j@RB*kinrz6u}7CBLlUV5_Xa*MwdZJiK$1gky~w3>W%j_@5JVF7eU^5g>yT&S8ko zqQA<#^fm%UNM|8i7rYWf39V&7$7TR`>@Ue$q%u@Lc{kg-!g==R7^ToSzxWQYHs9IV zq1k9?%IWl7xBvJL{C~{T;V+IfNJgi5A zfs~IQ451@X-T;pUYL?w+*`6EG#ms|6$>|Z84C3+Bmx)$2mwO@-fpQtC6WDHWDJsB& zTc}2fUhK6I33l&Z3*RItmvMY~o>QycVNC;O+ng|q8jdgkdyPc|4DcWz-UI*4AmSs8 zXmS`BkNG+rMO4PeE94`XFyy0pN^2jf@Cov{sD(Lu=ylFJ_E7^OI_`29E#<@hJRti- z8aNrmc-$BZ*C2i#rx3je)3}64wYfzrtV7ts1d&`-bCnl1f@$MyGU85px- z7WWuEMr*Hnm7@ne&>Xw%Hg`V}-839J4>73u_K388#~pM0ybl0#FVQ`BhX@8U=g154 zEZPIiVN~7xp#C6ppas!r&KxaaJqH*!lbbd|8bTPKo{3 z1$Wv51Ro4%obC%B1?sUx&onlaVf}Wt>@Tem?PUmjC(XDLX z7C_^Edi3_&{o_x5au1kb)qM{|UL_()7|G^m0O;bU&RCkMwCneWd3_u?1IA%QaD7~? z=i(^u2{SnC>#aocSN`Eoy=iB2^M@*J-{PFO>*Cf<_u|DZxwAW<;c&<^YXC*3-=n4F zJ}ocx*qaG$KGW0>V%#~-_?$UR@}`rDrsxJYnX-j8zym=5CQaw!Kg`e-526s-A?iSy3QdEuJf~i_Per@U>sd?}%n`W~EQsrP&<>SJ zfu4@VRP%v41}O2o?^vvuiqYwU2pZMJ5I-`d*h9c9>Us( zXyw>3e*Mw20ZceD*|;Q2e&0h6IUkbj2NJwHt`A`H60K-_E`G}|#y-S7&eNHP%ggHw zcwoS?Ki+TrpdNg?cB0If%gqZBkn(q-qh3S#Dm5RrJqnDd-9uS z#X*k%eFma~zy@&MhUfhA5?TMvqKFRzV~YL{++7YWNfXM8Hg!84YPDJ+Rpgy$xr-h+ zgy0F~%VR@()?g&aoI*HzvE0}v$2>rKvN|ZFVzdI_(W@yV>RvxrCO3c`U>KhM# zjRspA!&ayNk6!nt@BBImY0azzYJn87LP#6IgKBA$By~EOBJX95PF<2(ml)%8nzo6edI&MkCF`T?N5yfDF%ID(Ksig20E-9*(V5 zw0NNQy+eFumv{B`D)QL!H9qFzUT*E`tCd*6&gHHshxJum9@G}I{|I7SwZ(%yD!def zK_Weu5TI{S3C5Q5u}aGm;@&gZb4u*G8#)i-qmXV(QbooJs!dAmZj16(M(ER2*N(;$ zZ-0)Znrgam`YAen;t{73@k_VA;d_2RO_i>-u&FRsx)kLG{J0j71>X(6)Och|3??et^K10EzgH+m9U+e|GjPKY!)sCjXrd*96^4 zw7%OHH};eCmRGKK-}stWzd6ZTKVEBl*Kjnx`Qqlb+T7ft-JNZY9-`d^QYJ+U_8L8E zx4|pG?gHKL1V~M;@Uh80EKl zL1~s#!tF}&Jg07_OZ}xju?ilBim2`imK`2MyjBE6F;ZkvoHsWj42o+Y1p^Ku6)56E zkieom=Bhm;1Qvu-XUtC+^v6Kz$Z|mejsu5{b)0naJU4%TtOF<^a>7596T^iz%>aUE z43*GSD{6NN>UE(_@lnTkRH4giQ!iGz2$N>V4Jv{Wgpjd3P1t~QxVG@=mW zT2k3MGp-(JM?zUd9BHjxl@)GQ)NVK+>I@P)Eh3c6Y_>_>!PwXQ-U^8AO(P zU2%iR@^AajH!dH!vH#u6{iXkIIG)@&98PZ7+}chrUfiJ3Xv73J`Y=QVGxG~P=%w5u zG%Io*sJYaZtEzn2tqrLuc65!Vt|2$WQAgw)7&xL&)S?cFXSjZv%h3kXGpY6FjEsHIX{gDh* z=vD4@B>;|)o5ot=)Ikib`pAd?#aD`-rTTGcWsF}OaK5N z07*naRF)=nO&2asiPMLp5e;^?Xt2FG6xRLDD{g)Dr&X5D1UujxBUu~hxTCL>WE|FO zV^yAjjN&dIMkPiFVO?#k$OMB2qKyIphyjiic9Kk8UI9#6mVrbYXF#T>nbX=hC#2;l zB-O4OWX{pdrWqoS++|tqW)=PwF3T%7ElWqVOXF$bvdPrtt+pGsyRH~b9DoB2#*1B~ ztv*Ygr6nHp&u^~s-|pJh90UL$9ysvIr4?G&4jzXb$U)=FAz)m~DE(q@gA&Ae414oW ziz9p6gM#R7^tJKptiSf;xTq(;|WQ(-s-_(yenoaV_v^J?TguL z0)q*nb)sH(B9a{;tEwfaO~sqv{GGQbCEsxD*o{9{Y4h!a-Okx9BFua598_(AOr(O zg0pNeO+-6ajv_p7;mdTDZ=0(mWl2g2jyJ<&a4`T9A6+o1FOY7_DajH_6e5e1x_L%L znsK^pT$XfZb42IQp*QyhnhbZXuIdZzZvVG$SX)0X(iCjCMsP${Xn+R(DIvAtI$x`` zu~sEQ158l&CL@Tb#MG&=(mHJ6luC`XGpB57W`G@0TVoQJ!^=fT?8s43TUWO2jJBzu zwykS`NQg3O97fmD_yP^uJ=@0nkgm!KH_bO3?Gj~q>BbWP$5aR}6cO=sfMT z#;)k}ebli%a8KMy)B6LB$(a_?*i*bvDxU``*1*pnuOj_gtdbfAB#72+_u!cM6ED=Ax@$)rY78 zuTR&u1X544@j#UQj;Ok0(Vw(LJ#C4)JrTNvdB|0BP&gsh=fK`SBbE* zaq?Za-+uFJUUk!(ma_Z@jW*x6voq)p2E$}$XIl)0Lz+&;Omwr_TO-dNomzvEJmzqM zUfR>n+{we+W`wGwxiY$$_ld@Tfgp|=34jOeQHla(!Qe0?rHFR&jMD&VK$gE{eQ+D? zd`@6TCtqJo71C6Jb2wvbAW+kEz2|!8l)LQF|P)J*q zmbBp16;fDE3#$~FN(*b0McT;{71o%kt8Hd-G_6IX(GnKX2CC&ONt+-&#s6woIAP1Q zc4<{PWBV3hF)a#5JG&^DU_w0~Pu;L+yP`dEt${D=-R|rL(D2bluea&Wt*yDJJzQBi z<14Oiy2%aC9231q&(1+%eSM(`i9f9S?hL7_x%gu*QI72n$#SAYz&L0izs3RoN|wx* zjNk`+&Q+4BbFaCm2&Q|ms&Q}+-XY%hHgFQ_g5KgkVEAZH%+5Y8=nkS+cDrKQYKirY z4MB7Z&03qH+|EQ*WTMUoqCY$;R#%C}=clsH#$u)`X=bTtrAnA&CX!(;i)1D=EYm9~ zvYryAQbLpyWfCQnHPWhD=$VyPOOYxmiqy&@cDDXquf6?E%SrlIGbz4zGMcRK><-oT z&aMFGF&YmTK%n$y`}ELTA_~oX@sLl^%;nyp_XB^)P@&`%;f-q8Kq>Pk;Xka_RsanM z645gPgt+&Ef&RK%o^pW!7J%-B?Oi%? za)ZvCe2NCUyUu8RcJ0QapX@BHofT3-h=Ddv23acnJT&yA(`Va6KV6#)D{4is&Z*oxU?!9_^#Rso95?SHYwb&HFfz2 z;L&k2bB4+G&h`Q{j?-&7MYVEf0T^+@gl*R!d~p7=yYqm^;+}i%Y1~n9(?~FpxaV3# zA1~u7td}=nT*JVBEk68L8~hI%_^&|WM^tRXE{!Mo+747ezPA9kT4hM33dzXg85l!H4HJMN~neZTp)K5&? z%$;t7MY=yT3rE`EmLBvJdqR$ejg(J&fp`WP4sjo5?%)ZKqC(0C>UQ+|?zUUJF4}MS zYv`i`?A=#Q`IMROh2eP*<|+_ogn5g0 z4(=kMOo71n>%e=UKmdA{vzt3~;tBNRJ_QF_ofndvi>j+3C*5KW&TQKIz%K;XRp zTc_uR**YpfBP?%U6goK~Xl;vHBPnT_NDsXp8hM5GXeg-PCo>)iBZV+i|5}S}TF1oC zJ49wCL@}EQqBfawDy*7`OqD{95(Ww@Jy2wIC1^$jAOKM0R8Xoa0RX9I6X~QBvNZgj zL{5ZdkWf;VCFotLD<_j&h>RTaAkvgox<=(KcYVt@f5%Fv^=7Nhw+=_+Vl*6c<d2wgdt+ko=9-R@AUjXoEid`6W~ zUZ9ey&23v*Q=&p&4pcbtZlm3~?{^o=aJ?$qTbr}CgSi*ab$Ffwg1pf8o0ZoIr^Wza zh%T}@U*Y)+fCKmoR7SDC7pvN#Z?WtbwKE*knT;KK^2AfLaqbl2fitT&9Q%BKX?2^t z48}S^MhE}_#%+P28&^g<;S9!dEdd@r`oMGn1UN?`D$zn4L>yM)bxHg_gQ&vyRczBBYgxb5=^L zEkHwC#d)xftupImYF(xhOH(4PYFldSl+K-2m93J>s-oqJEVrn{8lfVqTf4#8zDs+x z%Vw3!S1NaLy5{or($Nz{8y)y&K`Zzmt-obGfQRSEAr#yr47}&=fCuv^LW^v@YI%2HTF6$Rn{WUD4%`0W4~+Jp#0*22tugn>+n z)mkL75VD#{iJyN}N+qQb017 z4^&)sn*xUgciw}o3Pg|_JG*r9^aVP3@=27;jym0?udE(fe=1>88#8|k{4#<#dH^Hs zfdBx)DJS#=bQr`vk3mv9lB)J{6ywzA+VoVFZkNRF#S3ZPLy6qGP<8cHXK zI*d(RVk+yLN>f|GDkM)ZhXMb=k%Wd_S&K}fb30Ye0VH%{om9?gn>c9`rxVO7teZ*? zCUug!L>ep8)R|7t5=}{(+(82(Gbq%pD>LiTG_$2?Ii-gV;E`vA9gc`p%eo@3?O1~_ z-=WqmT}zup)9DgxKUAe%r?+bJV^FLU0Zdv`?f&qF*H}a%bo(cqw_605e1hl>Z@PHT z+ZMi({941{?^*%lTDQB>7}b33g#wr77ci~>22Up%Xr7p>o#?Bb;AZ%EAQ*(m;1V#n zi)i)`i90S65daLz4H9&esM;h^102?f00wmc09ql^yCie~f(Q)pnDvM_T@;s{b8(J5 z1g*#apAY=wk?1y_$Mt67LBmWZqTAVfHq6BU92{j#MLPmWo5++iVau7wDk-e2Jc!gn z6bLcU3~8(-A`EaAML|?gG^eF(U8BZESW^q-tVHzDMyjhGt3+v`WFbstW#*jJrdFbM zn6t}73MJ}Vn#4(|UD8RjZcn;bzv{*t?ovX%L6Nv^G?^x&(O8VfBerITfnfv>uBwX4 z@EBu+u6mKY<}v<~o5x2boRUgGCU>dbX>*#2g?~s5<`?90G8VN@#Ezh!!wR3y|W1fdE9hC48R4Sx+sesX|$*aU%do8|;mB6Vu}Y9>0SeK&5wA13W%KwEk9dgu<(RpmO)Vxa7GU z$F4T!T{Ey;L&Wmz0OKVN2n_xQbjU-5&;$g&VUQ}?mnNDfB+9cS=oLf<0s;~B)dCPA z0Ce_63YP-}Gj5D$2Mqo+B>bP$+$lQ%N7$hm4;f(gzcof2L?i#=kRMTtBakkc>4uFi9Eziesk&`%pANDdK;s8>=p^trcs=1d@pAxx|E%Wro~!Wt!29`mNH;A&#e*5h^I2Kb z?r=mGHUJc-=;7m!=<#rLs@GqBwAb(NNRe-HTu#ef z!8uI@>f1uC#~>leX(N;`xdlLwC%`%CU}G~ z5n+&@z92P~_+~9KFC0x;q;lsbZKy>GM>HWs8p^i!&!*T{PtK(DuHi$#q{t?2UB^pj-h= znh{DIE1nIYTnndiIgq(xq;mJws-&I=KzKe*$Tdd_L}E{rfO`*|K_g{!wJ6~dP(W1R zvqik;C>LMH`>d27FI_EVO3<^pL z4;qVXt%r^ik@>!h5gQ#SN=#H!pYEukRJb zchq(Lit%LH8jr?uG9C-odT?J2REmcFP2VU+A$hzX^F{_YnYigWUJlKqV3y zG$FcxTkmqeNBw?>T6xaoG=m1Bg<$J}=)*@4Faq>o!k`eGbh#=kf&~j1@tW^J!dyo1 zqQcQ&(hRWJ-W}43r%uwBzWRteee(2sLi$=?0El33 z6~G7c8J@!c07TG0lp!=p$Ehe#3|uj#rLUM`E<_ti((@Y-bTeRhurMgcMT*KfPDv5w z_lPVwJq6GxEuxLOKy?IGOIwn*I#HaSLRe{YIZrzg`gXKh)`+&1DemJLrR|Q55kzHj zC$r3{EO%3&1=6}B>liE`+*>JJSvW`IHmO!DY(`3|?J!ZoJr1z&kFbnLbv$rj84ii| zgGc<`#BEfU+!Az3Ve*#X?>14oL~dZnr42C2@!A=pi$`BxV1jeuBaF)c!!u1AH3zn5 zij)VTvw0{GiVYRfC;t0egwE#)3$w>f6+c~Zn zl_d!8M5;8AsjL-yTI50@@=&!!7CQlGz}e4{OB9TXYJ!)Da-F|VAC$KBCrqRQD+uwonnJGK`IUGZ?Bi!o##Wy~)h_wV)*0c_HJD_9WD z-c|(Vx2>XJKdRN$C0got8Ax&{*J1Y#-2{V!2LO&10w~021pD$41zz*pa-;zuVZSK$ zw)Gxe;~715>KuLfYY)4J9zH&uOlMDZSC&rZX;HE32(necb3z)*ft&_`&FeUl5D-XM zgm;=O2xo1CC$MXN9RMJ#F-~bNookd7^8B z)E6QQVPz_{)7q9&IiHdemQ-SFh7Ynxn7PWP25G2?Nu0_hliEokZ4KAl)Vd+kQ4sy% zch>20Dhh-*@Bw^9-Cy$L^q4q$nC9@9Le6zeW9m>J97Y6-E&#v-0>GfTs7}{$MBcmf zwY^*Vje3pnJ!#B6`1c%tp!zKt*a64$im zTB8zi&pl2)7r^jbAMBN?jyRo!o1sVE-l72x(^Da0NJtz(rO{1+WZonJwep-~UL~q` zNL&saXbBZa;r#a-kHhKb8)o0g-+X!y0N|~-$L0VqAJ`YyR3QXzE(nWp<29B|Jl-PO z+T0?!?ClX2%f&0+Aj>-*Shm7eZn!H}`0)za1mrqVr<_VN@ll7JO@&RAXwQ_e$xO78 zL}-)BLMf3eDKe1Y<3!4Gst_@N;jY1QQ>wbcLDQ|MtP@ix2|csJJkutLl2rni46Ex@ z38kD6iPSbB;Sg!0BrN;&Ib-lx2`y3rI$4o8XA-Ca$k@C^cD=3jtL1F=N>k2mD5sOm zJKq}NK_gZyElx`$zxi(6jt(Gw@eqv`Z~yT5WaDGJ=O z&@DK@-cFd|acQgX70b~Em(Ze1ItF{@Fobi=S+K&}f&@qFJya=Jjv@dOWNl5P;3-ub zAb~}S%4(a48c;!wY6cCm8o(hFiES8kN{GY}Sui4ipBBucR5-RIF=Z|Asg6`?Y+eJ6 ztb(y&C2idSnJsOtQwKk>WKG#hXRhw{Y+mgMX);&p+@-ygt<}?H)nWpJXkqC{%S{Zx zAmmvwSR>8UBT`*2>f>dXNQUT|pCdfL$r|~*q%>YF-h9o!PNE+&293l)tU2M$=i>sZ z11|$2DJFTC;9;8(m86y&es{?M5lLalokGf2lS66?p98K0e;=QcW3D7vH84+tPKTG& zYq3}FC1d|{2_jFcfztkw=$RbIfsw-%N>U>@pjhGd`$;f3AgIhpTooL)NPuI&_D$ls zySr~)xS^UiLj11R0s`Uwyetsx0Rgl%!%edv1i}ce_O0h_kNDi_h5Z)*H-4iN=y`ZX z^MVIQiPq0L+6WQF)}~m$VSUdY-1e5BBWnZ@vB|CgXmqAyS(j6ZlvHObF>9BteorK$ zT7l8jsgh};B!+y@mf$4XN=X5V(itTxt3;wyqFo}8RMIY?1Q~IQwtXrgJeJCdG698Q z%PN&pOIKR1u0$@3Or>Jf0gEEiP>kR&_Mw%jO@ikAX50}v4q#})2GMa0DJ26dHU)DUw0=?pWR7{;#AS?Z^M#-;10k*%{EogM{sp2q6|bF&N#^th(_cQaK~{BaWsFPO%GOd@l@$))Aa(9kZrrpmPU@CZMcWOKGCB${*d^Jy z+0pJU;eR~v-+T)X%(CajdwZ4@+|h*0k>A#?IE&xDpCR#r$b5MomLo)8yw)8YFkuhC zgRM-QQ2HSKlBF4i>;Vu=3X#qVk;oiG4v0ifog~VS?FEsQDRF1R2qF#V0jqC(X~l*Z_gJUL7Sza9}%Nk;lkckn>?VgKjmv z@i9V##g8|R`PYwah$CC;VtHpv*mWWL10m|^NOBFN>WfTIRh~?xu9QqNrA%GQG-*p| zDrJ;Jb(7?5w$e(OT!Ow-IkMYY>PeYMDW$1Pm5Wpe$5T*+x|a;Ol35LufzPS1qL!ip zpMgSsPk{lrgEbS_$J)L@|V6 zOV@2VncOU9(^pVc9!aF=3MLu2K-QPZMs+wp=AVSOqe5iC;9?m#dMdofZo-Q1a%sh?+Bi(m(j>Qt2!^$G%_u?EnrG-(kcJg2 zs}7SM{JrF7vA#~2Wcg(S(-c8;gfKod7v$RZts))D+?&8+!X)#mfD(6pz}T|1yGS!9 zAp*hX^9baCR2E*(G`T#avYG%A3HFsxvGr((LgoPCTdrTVVk;iNn&eA zqMeeoOC-#MWKojL6v?`ts#FP?g6#xANFkG&B+6T)sTD>ti*-nv2jH+~DjlVMl#7aQ zTS}sY6m%I-f!R_zLpbC6;2?#DZyi>H40GS|ABfX00~DWh)9$% zfMtS!Sz;a|d&2dc9Oi(>V(rBe^U1^(B z&rG#-5Z-~im?gQDZR5sy%K{isrL?(8B>Kp6RIGyE%-ZVSEw2bB*mQXjq&%H*2T>}1&iViVAOJ~3K~xe~ zWQFl1Mj!Z#^DrmX0Uqm~RG)Jp(2v|gE~c>N5y;S|r(&sZ{3cf``NejZ8}|7@Zj_l0>+Kw9bUpDLG1=wW)A$ zq5%KFH9jc{I)x)R_DOCifjK8YrmEU%HoZY;vm~8qNupf%jz+#P$cN)mnmAi zafMAao_OR5&KUPrm$*?ATzFZ6Vrm*}?$F@kfL#o^Qb{D!q}3W1tLqo@{>o5Fg@zZ# z8;^Lq4UQwE=O-}GBM|Y?1FE4|c*iBPLPCHiA)nK%xj@9As3xH}^~C%ItU3V2wl@4uE8LQQr85`@;+}NSE4s}_w zwr;03P8G|Re?x255kTQ&_@Us>`Yn!fSm%V_9wKZ!hUGGN%;s{7pLFe?R3QL2!BGL5 z15EHA{w+0@gTQ3DQ2-M+WiV-^yRd$LWD+x82aQj0Y`PqHfJ9FNXOdwY3Z=b!zysy; zDDMsY$I}ImgGzkyJ>m)30~pT+DE8Fv1_21$W5neu=_YK364&)$jj_LyDH7HQA0r>Z zsV6KEDDb$EgT&J-Mhr2zc>t#X5V*LHKRzg8I1n86feHh|eo$Z}Ahs$vXu*BI=cbJ* zrvMmMk%%|;k%WW}Lcw}KvOgeURy{aC6H=q3rbi;5lGKVA000=SMIx>IbBn2JMZ)1n zh_c116c{Z$SU|`J(>wIA$nakhHgj1Xj}Uz=fDGtqkP+1*kyY4P#(?LL{g>FN+%W^h;d43nCq^g{#Qdv6;Q;9G( zBXWr(gZXmebe#x96~-o*&m!_*;@#9dp9WAMU4^WM0v@2?2+1bA#~S#BXRa=L(O zY?qvEldw7ViR2Q#4Z<*$2r9=j7IsSz+(l-EvznBsNU4gfnpUM7syrX2ogQj?j7qZ_ zHDBycg_2hs9iAmfA0e#p<+7l5fHb~@)^ijv0aQ|G6ek-tivlnRZAdZ)fm9I*QKO8B z4FeHDNKs>3N?i?*fTjW)&5dm^b9fNI+`5LN0U59 z+Uou&G;EURA#H_^oJSs^YWARFCgjk0&4SZ|DvsiI`$^|(Nhw8ez&>L1un^VxJp&y0L1Qw+&qL+Io;&Q;u&RT9d#XNjj~hLyC&4s@Q%JV?L+}1(<}7t6&cmICyZK7wBbA zj-y)<1k^SmUA3*&xvk5#vnCCRE3MMJOtQ2}+U-)xv@(K9q-$iNFn~Mg7Qr*1xi`<; z1*d=Dcy6FcfcpoOY?$dg0d`0QgFmwPX8yei_JxvJ&3*o);$9ZkSzSvYZc-s7B&5>T zD$PKWYF)#%MUqZbqM?t3@Bx+3t}P7&76XXavYx?2;Qw#$%97+ZlB@&BwW>%_Tv{Wu znQ2-ZyFc`+3-rxIoo6mF7tpVMM3bp)+SDeIQj4r&W#xt#dmipcM`U2j%o16pfR;i6 zfz2brU--VsN08NAHd?v$WK65k#9?tTnXD)qkKKy1H zZ7dV#*5ij|c0&%y#Jm;e#%0&e<Rzk+Z2}Pm5ZuE`B9Q7s0D1b9 zh>x2srqa^W3L+tZFlb;i>MGEOk6Crq6LJ~@0(BKm!+kdd4n(N4(Y#G%6@*$Sct9fV z#EVk_1tO_opNOiSOr9ltsH&c{6X5;|b)uCjjDS#MZnYl`QbbIG;KA9TUcx!8(Zk*+_Gs-SDmpP)l3YQo8+ne!roEM`Re!~<$9f3cNH>(jM#72~l zO5~=4&(;QU;Uyc-aWA)A=iaEEWp1}o7Dfus>Y&)J{ZI=6X z;GnEFMg39?#1>hf;u*(eTRl;qK_nvydz%%i81+ZWMAvfAmc?~HI@AZz{ zXig;-VPgRe9EWVApn*A9tjXnIh*r}0foKGYUAEfv!o-q=SoMAeKv_iXYi1nJvCMcAWw-NHGv225vZ~(9c!nApIwSKWo0mrsHz}s;64l*;61N)uDX@P zA)tYFQCmj<9G!sC2^OLHNlL!8c{}0dIKmn)Iid{eC+1Po5izj9`8IT}4b*|ErVuCw zNfLOl0Sde7VKKP_B=o)QqKLm$=)=+lw*T_d1+?;31*OL9b7=TsuK++Syz~Hx!ktq# z%f0jfz+kE3W+zzyG%W3W<|w~mqBBweBn)6IFu5JMYblI}U@8UNZVjo4@DM9NThAo3*1de@o?dN}Hmjau<4;|M5+%Zj>wv<{$@JqexR(T z0uI5$h#@t}Lu?>}fP;vJN*=YBj_|ft&=AKN8z{)#y&|XHRYRnWR>1f@zyf06&A%w? z4Ho#?7BsG$t|NAd-yl6$yF_1uwP6%Z5(Ter0!8W%3Knf6_d7ovcCY)I-%QImY#NZ`` z%<=+eoLe!c?F1m;%V}`c*wK_W*k7+$H-N0_Tj;4^wE)vyjj7D8$*q>i?L_4@qAy?z zSW$@td{+Q-&5(iqK_v4vaYR2K=a_q0L;&CcYv(Fq5GSnUMF)=GPzI3aPn+}qGrIs$ z;9&4GV+s2J42&a|EO7pcTrr~(5(Z-O02&GyIlN*Y?W7E-rW7z3EHLk$BT;)D&|k^i zs^%4bn>n_dZA8xnwC%AysiOfnx+IR6x{8jFIAT1mFKDQwf$uy7GzJ02USg^q_KHdk z^$*I>Syr;Bz(TXUYRYdT&S@len*pin|<{?1Uos{WWcl@5CiutGqf*i)|wYQWA03d1vNjMl700vucjt3ZU8&s`j>Ba*@ ziF=@w)Otj02gt`%0syiFxfT8sV93{Aidb9|Ar>BV&)#~Fc(45-eSkllDMO;ns;n0Z z8V`sZz(e|g`wC+S^YV;{r3}#Gj39Edbiq;v4-#(+17I{t7$Q|DVDPxQB8PX5N*KR- zU>ILeiLo|)K_$l78>pnj3kZO*XUq65qVeUL-_3yWBCs3kI8{l%8n*%(w_)R`@i;uN zX<^(VWvESKBA%LT(+G{>9qOqtjsw@TL7d|wT5K4hgmH)`)G>g;1Qb8$PQVBZ8lh1e z2wZb|I-$KHCS3q9KX+Ym|iAsuIs^b+n-WR_552(!E`;|FB9E@~(gaA)`{)PRYGADZ zfpZEHB3*#~tSmE91;F79-*xV#3ea{IsG=As0;H(EMOADH7?3Qm0NH&m}w@L6ZQ8TeNN~AY_QP?RI%wXh(4V4qq!GHvRJHAtl-jFU7ByP6;JE4jKU|el{%p(AC z^eMU7r&J=|z=8$OIkVv6xfaZ&THn|oGPiiHH33G8A^a2)#t=8$+IRGkFl3X5RjZ=UI9ud0EYG<~A z21fGUsz(RA1rF?E`v+w;L%0lZwrvP-AS7coq09ouBV^(g;9$_WCgg}^;F#V>90r2> za?ePiQYhz~HO|LlfT=?A6b^vZx_C}9cmPB^M`bmP=dI!iv-GQV_Q0vY1gqd{v3(ec zgaHJeRl*4QPO8olhR2yku`d}%S%o5if?cSvs)-Z<7UrE6T;LT3IzZY&D2eFenKl5D zj52tU;@ef7hkKL)C{4`AGDpxSACm*)XT$DVG05}lLw;cJ{j5&Y<6)qoArjg#;f^q-`zyp6d z>Kmy*U=I*x0h@tG1pyN5uPMu<_zc|g+4UCN%CD%Q%g5@O8HV`a^DWq$RHT#uRM>zH zHIS&it|6VM%vepN-b+x~DKn3N080s?K7w?B1p!_G{S0Xf3jyZ! zsx|`vWavI~U*CqqFIf7L6#`35KKfVUD|Ua2iIE$g*m8v;5;Pvx%Q0pmCTWFk@r0{Z|Qt9M*Ml%v1_AR`n+%Mn`ORX?v>17hqERR#hB891QRSN*=Rt8hGsFfV?F zQIGL&xRRT zp*vOC498XVBddR`{8b&qfB{KR;%Th?28e*1|W z)J+J=3jqReQpHt-M(h|s-~!QLDCv6v1RD2LJ;kI6Tt3uR(FGEgpMjTEw(mYM7+4fY z0jH+A8)33Sd_!ZtsUYgRN)6H(y=Nvs6gYxVLE}BR$x3F z7cF)GFhTgOiodGQJB45}(fNor2W7@&*col#GY%zuG zBYs}NK_!Rck{r}c0EdOxBP=+~7GBL%*&>#{Z&ZTV8~1JCfD5fHLWygTV$YD>6C4-_ zj5N?&-4uzlI4DJkO$~yV36c`pyi!^=)&fN|EqajE7Psw6Oc>^t+Dkq-1UO^>R&yYh zbPy-4sw%8+5sUtQCUFPWAimN9NU;>=c!)_nxId%)kq}5?smXcp1~n=ABpk$bP+9d! zILI#(M1{9`T5)?blZL9Zs(I94M8|m;(nDJaB$5X?W!FDbv3=x&w-AKJHj#76@|BlH zHU>ZdEUemsyXrl9jm8CHU=&A8p z&MOcpFzp$q4Up(F<Bj-~k9Y8Wz5lT>%*~%N*0So{MH==E}^oipEz~d2ZRbm(eEVfj_ z=731;<(A3`0O8-{7Ai5Ah-^p%TsXZ|Q{*pWx7mVhvjC=kr}x^MlAhV}U zfk$WUmf$xT2|872lG_*39D!trVgCGdR%B#7orFj2ScI>C*DqDif`5+!aA zU}=mc1Ze1L5BF0$Nw@+8z?jao_7hEGf_M=$QP*E~`zEmFDz>b%Oi0aTgDGCNA zPe)8b*h^C`V8CN7NLL;M1gN+-Z}z1_q}hSG+a{syQ~v_b1vYdoP6LdfSUPj9gMqg1 zBBfjh*TIm7#wzi}Qki%0`QCsLer(r`!}ifMBRxyAUVcN_Uydxzs_wbmxk2T#XF{;&>GCAmW6KaHkb%74Ei`-C;_E*bV+3F*59Z+lnYhtct{}sM|4) z!QiXzwG0w|#m~pV)L~pldsBK3Uc-L27v}3z~QH&qTYMA4lqFbLjVESb(L&I8_~lEN$MT+c4U+Ku zArJ3mJU5`i63E|)03csRBoMq4Co?ofmtgy_5{Rm=EP!yn9JASTwPL*{TsB(kyCmi&G*1YZyo`iTJputOmHnD?uGe= zZ-1^~hH2Qeq&nO7OEUlUD&)Z`2hK_$KK7v#8(H@5#3 zgS8MalpsR&5}KWYM`tgc%ORS?wqt?hkQc;zSPs`%y-)2RLI;2dY#@I@c~_&x!hm1? zld`8h)L04>=P2%O222$^cxC+M8)hW0D0F-0mT#_w zj~gTy9=K1*?P?zHzazi~TMTe;yaqZr&`{i3r3C;02}?;tK~!&C@7xAL{5~c%bpvUu z!wf{76?1~SST8g^bqt7gy=3fsn3C9k$FOPgypf0RJ#lX(AGBy>?zUYAqeoN30O=)v zde%Ug2BxpASskRCDT@jaXo|lI-RZ;PY1?;{)xu)r2c&@TEt&Tl0N6y@RM%V*jV??= zN#mN0AVh6f0|%>Kk}|8XKQzTiG=f7!a@g}^I%I4He7ETq9x$4=1|UK6L&0R&?5Mw3 z4M-w@sWuUnL~u2L%R7U%_Vxsh0->vV?W?Ne2HP$_7<^Kdeb8;L&s`eH`IHNZqg>E=dZnkW%4)? zFnVpfbiEt{hQNF2P+l4{5A-1g+Oz{k*IiBwD2EaNuc<_6bnO*@dEFwB#PVE) zL4?qsb0H^DV^vZK(rv_m1TR;m1tr=d!nb8BY$S3Q{joCd0W|hDR=Npo{WS>(7d3#7 z-fs_taH1i)z9s?L7m5H=b^jKCijjt;rr6d1Vm-)PHQ56^In&5=``)}^Mc&1%W4EuZ z(rp97$iwTRY8*6bs!iSYT@fa)&4)1ikm=+1P{!Xj&-Uh+WCw^z4K+}}c>I;fmPoY; z{@!fKO(jsbDp>S_-1o|!Oo>#@2-{_hJ_S$gI~37wFZGkX_^V?9qw7st00oy0ky4H! zoB~Q~oQT#O|GWRFCKVSvwcrKx)Ji6ZK#!D>tyEe0PBgBmx0HTufYNX-3M`ryBj}gD zAT$(w!tSrY2q)h1zm3}-IBClckm?$8Q4s68=p#J8r*0Ygj?qHVM7mlJZ^sNhNNW;P z-Sl~lha!FVW%7;8-Hd&Gu5DWz*TL9tI;WrjsQ}|s?G0KxyD~sWJd}Qf?*l-ghon&1 z7#bu6RU@5(ul4DZPB37G+o^{E=v4jmS9hYFBdf8?_Y}g0+DFB!aGad@KlbGXE1w0k=6$ z?l)i@Lb)Cw!+rbJz8d9}gRV(}(N7AE_c(4{ibJ6JPpO>_ubbsh9&Db8!4+VG>#Gzi zNO_J3dEFFrJ|SY4W4j#yI=H+7o)&b8p6bKR4(a#1c1?shjifOrdP#JbbyZ`?>|?8a zB_DeX3Dehj17`YK0ZwxtN!d_!E5-G5DMEJ9;6W6|9yA4~opK(A!=e}Czaz~5kRhJ{ z;}EKKUDFeE^fmyWu0f8reOEbcQcVRo5(J6gsy6!)PEIC{h1)_95w*dhE3vUpOhAH#WQQUOI&Ul-P!Y%}PHHiMD#Yt1ry?E|5C4WE5rK zLz#E*eS7)KA|5`RsUYw;h~+BMTdSeBTHXIbG<{rW@`x;-BC=ceM6-4T* z$C|dWuA}z4%JHDZ?erwWL)0rx_o`fuWoP`jPJ4FUG@BY}?J+IGiDR1D8vE+riG5wU zW1njxcz)i_)N#HgSZt5E2V+^-PJsj%X++d1a0ECFA!Q?j z_==q6j!}jbc~I?sEes^A3OVGRPtvv}rF34gFYBiq@hxlX|SHkJI@?fkc73PJvrs{)dpHD+<5IJ?{p{=!Ya}rbm~i zCW!)x0=GkfkA(4uAJ+;5d@^Hs;RJwj3|*VS=3|j&!mmrx%`yF*u1yrU!xS*Vpr=&x zoRT7q4BasOW1jbc0pplg*K6+{=-97L0Cb8mknWKv5TU>wVDR>>Z=2blVvO7az&HgN zf_u1l^4O16>S?3EUbfC;^SOlqlWsYf0zvAQk9Eb~_Fc^k-m7o!s~cZ zfN`(7Gkr{=K%zjR!0k~W0mkjoHr+W literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_ball.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_ball.png new file mode 100644 index 0000000000000000000000000000000000000000..73c9ac08aa2a077b0daac29ce592310fce36c772 GIT binary patch literal 81499 zcmXt9WmFW-*WQJtySt>jL%KmgO1e|JL^^h95D=6UC8fJTasdfZLO?o}`q8lTQoAqz z5AUa$bDlFZ&zyVbo;x>^^mR1|aA|P?006-&O;y9^5d{DMnXoaRXCGyVAD;)HzoCXQ zpnj76003YHyi!#%3br}!^+>Tc4`gh=+3q>}?oDwt%<QA1^cP`mhTA$_ZhiL_=YF3SoU%|G^3i(J$rTDW_2{ z5ru!z6;Ml;|HB{YbI+n&-V^;9K&3Du?xqUPp7FiC=Y3?qhuIM#U9O;0;G6JgTtNZr zzc3ih8oEDR;X76&vSsgo_}xpP4fLsf#@rYbjU4>4P;TQHpPKp~E%n=HDpUJWg{b4Z zXB-?!_~#ZX+VxBYwZ(wolrK+|TEk0`JO8gG48EV*7yNLIcbhCf{|PyGk}5bt6uRXo zjfJAxhAJF11aFb;zEZI3Lz10Eg?;?RCsc^Ym;X*D8*TmP%a9&CcVYlVwz`ydXYkDJ zzmIthH|ICcXEXVrQIPQBAbGS*S5{%>-y}n+sMI{CQm*9%2@M$VCWgGd!eD}@ESMri! zd)pCzUm_INkzxDu{&28}OdugLt%FIS6(#Sc2kxf=KV2^v z-*99fnV&Bh0zf^jhmVNbcD;8C#m|wHJbAjQvm}zM-nmRpReONu@vFS$rw(7?Gx4bL|-H`Ghk&8Uy2Z-ReXgjjKO-1WP5gb=V&&-Qm~kqf?G(|Al8?b$ z#lrFo6AC`uu9nH?h8i~{xCc;dMt*NR=ribxgzVA9z^UV5-=U~Rm2>6^n43!UvnIn( zT=CaQVUGz>sF{Vn{~(9GyK%d_tg!X7wg2&EO8X%zWw#{{x#V-Ksi`>)B1kws<$8;5 zL?23YSA}&Nl9An+?t<-0)%dR&Dw!dHc1-WpiEd}%*n=JI0XlWbt9@%@l+QfpZXCwD}@n&G)D)^kuK3vMFu?K(a#%r=9@j6rva=utE zDkTM*ICD`u-^_HP*V7C9)@z%c=;m%aYe?&v!2%FcyB%XbK8Bp*E2WJFZ)KU*DnZ^< z_+E}vEJ{g1J025==-$Hr`#L*xzO3>giV+j3!Jr|6ulE~mKf)#Vf6oS8$hP!#A@(D| zBGZ?c{?NpTsm|_nyC*Q;dG*`cy3Ui!J za};|O?fadGL!gN@n*b`G%csJJ+kGkk@YHlGT2P@*JC_E0E7#wg#1Z^ZIciU@q$t99Hi>04aejRT95x{~nt3q%TH9G*6%CY(^DZoZ~)#La0_z9wGY9HnY_vIPWHIe!{$pbMV)GeG~S zwX+-T3cK#n{6oCY*1IMnQIG`T#%< z^bo|vFLlb0rMi(ZqHs)d#quVD|l9Rs7g@Qht{7yM&a>l{swxXUF&g*PXDH3P=Iy9sra*$uN?0q%Z6{^*{{%P)0NgnSn6J#wrMyLj8&c zV)K^)Rmam4d0Q`v_ER7dxkuoJKF{&(WsDO*AY;_$kS6cX0KPO+rbtgA#h(Fi|H}vX zwhP6h9_SvcZA^E#7b`f_(o>sTrlcuH;M_yBh^Y0y#x7j)-)9?r6EEd#%m7CREh#NB zWcJ&)eE#d!UDO4`O>fRdGlfL2mxHk4!AT$sd!`x?pq57{_kuv^5aj)P9Yx}fF= zR1|V>Bdt2e$~I(A1K_t$6b|v7!cG^9=6Z)8g%5QF4Rxu%Sy(*0=0kh}DL0Vq3yH0$ zMg0yrZH?M>jy+nalh999cQpr;5xio)`V#%{1<-pVBmr-nE)vFMQo%zEI-@^7c~^8C zA`nV$rI#>ALO>Yre&Y4be4XX-W5W}z)x&p%EteH9b*-n5SiOtu|FP}x*Vip|u7`$R zTs+AqG&}LVep$*bMEAQwvBX;b3p{ovIADTr|5r_N9!ceQshffVu^)@0_h|?NB}g{+ zDp9xyE;%kD4!}f)P(gho!m2fy76MLA#5QBS4pv+Vl@KavRK!-AvPAu#@X}OI*Hc7l#1#Q{AY8U=J#2Cm}iO>Q8>O0=86j{?C4j-;Ct;y zNb%oQ=<)r3969-fEm!id7T3B8X2LFR)`XnMr_#JPD6_Y6*uR2+teYPl!bq>)Io5V? zLOEx0jzcB%0PVG~zQ(?nSc&%-vwlu4O1R;W7qY7q<^R9BNkb^6#@Ce$*}sbDQg?&Cbn4mfV2e-{&P!-SQbM_yx519^L|fSrjcK^&Ivtw1_Q(dVE0vS42>Sbts}MeZ-`XWy4x zV8iF47J?!>N6Z>pEr(DED8Bj7efQs2i2%;q+b`EQoVxnO1RZKGJAC{#&e1VL(}?JV z1+f>Mgka_!9=)9`84Z4dA|C`d zaajqbIuJ4LZRPG z49P~$%IGyky!molR4rSTIq{E)%enVaxuAu`Ao$`&2|7Z)GHXk0);JYi2+^BbGRp&4 z8S~*(wayQSH-K2D|9X&xPNJ{%hVL}hk#K9jbwhxPDy3L6^s&)SKfO#+Nu{R2n>na2 z!jDl4yX4=`=M=U4TY=seftSZu2@8hDzqoS#8gZ%7G!uo;!-kBmo z``U%-qLX}qtXw&6o|um>*bZn{`YB`>EDI#&*eN3n5$5^=g)B^O8Cy5ajNTc5V5g&O z7{P6j7vQtT82TX-h&qj@Mixhzt-l-o@a1iUI1g2UNahz}`YMty^MXay#>QgAsp^#zlx2R@?{DDUjH zaSpcq7QGLf7D}~t36_OR4z7>HzqxRM5S>VLBW3zo->UU;Po%xT%xqDRf(;2dt>T69 zy8`(%IZs2HKCaJ)_yuWm%O5EOjhd)_|7=|i?Wj`d?i{5Sv=>%4pi<8)A4+%-PxJgy zZ)rB+HQA3yM}yg<9o(tYyGnFvU`vHIHV}+EId$>7b-gO)?kH5kBr`W08N9*OM=8?s zZzQvbFH zi4A`;$kSu3qIGiBri`*VeoAS~WY?Be;`Gc3@ZX)F<}nt&zuf0U`JBZ!-#wD1^fO^3 zI=_bU1Fm&60WU#(LIWjpy}OEzBGA9CAg>j(%q0}Z!^4eeIf3fV^)~g_g4lSH#SJN1 zb9F^^==$edy*EY%PPCYIEkJGU%9`uM@A#}p1Xjf;L`Jx3OQv`v z&qp6T6AGCUMbC}d*jki2PTo#6j%K9ymuCBt6BL zP?1F~o#)MV@#&SmbJIu@k;?wSx;;rXgZ>lgt zd)8td@j01z3*(fU4{goF8r2R_6PuF5Xdoo98!yjP+4X+F3@BB#24lL~UUA{7ys;R7 zPavR(uVw>D;av;)$je|7A6a3!Um)r+A>Rb8*m#*I9t8M_&9}yhsrUr60kOe?hNl0B zK*)}cg7bOMFX=aW0||8hB7~;^`%nIYq|4j4^Oo?LKiJKqB%s1U?C?__K)-9jv(}^f zk~%ZTTa3UGV4nncwiHgRz+81(kG`GmvoSzQ9t-V>#QSA0Ut+990o?fyj=a7B-;4nt z{IMwa3G^`m`DBe@yp%kqB_b4p>@K@SPI&o@*#QG%#M8^>yv{qxqsII*!?C+eT%Stk z@)v<4ye1xKKWd07nPVHPi-0%|SC~`&o&AaX2(n44~k-F~D$jN+}n=q-EX|xrVMR#BnYD^P=Pe>%3 z>{x06G0AgC7?1AV+oJ zkz7BXIe_|#*w515eF<=t!eqh=+#XeV$td(nkYC^%RQX-DGH%vO7?(;?7yFRa*bEmp z&j`VSvY(xfXnCuHA)8tB*5`F4g92-ZGHqZRC?p!XQ)^NLv+Md zgit(DNZ1g~gaQ&)AIq$E+%CefkM_G6z!o$8L1+$hO&UWdk!7El443u-?XXs2)a0}D zsqw6O!5=-G=5Xi~uB$Tr3YB7f>RZh8y$VmIexht(t3_vbOU#c3-0&qAw7Glf0{IBq zhKS3r-ah?^lHMkBU<3Lze+cS<1|YZ52uZ5}hBG>%M$vvd(tg&9Xsf_PMW9QT`(ITG z6qaw2uAwe+mTvyld|URpt9p|{z#4c=4F#r7zi=)LJ?-|Untt7}(l+;n@`L?BQ}0vS%mXN02Bmkz{2 zu!v0nWY(6fMeoNttIUZ(P^p#?rDRB)MN_lMD%XTLwU7ugsXOeI=R5r??@AznsQRUT zUI`-&H*u<>j6_y9nzKtL46IpuS6`{{;k_^FkUCd&IWbsl5ujyS*pu#h!)G!a`gTd}E{ zLHaEQ^(ptU1cGYXN5;s?4+omoTiH{=(5w(6y)VO$&Mo=d#cBO65P{w{^rGr5mme8o z22NI1Cns1>>K0;D3?DhkB*y*c-5r96Lc=cPZ|N`oCN5=!*aJCaUT#EsNODn0*YdC6 zV=2)GrC~XPsWraks@ee=)D7KCXeV$*X;00!1XPBL-G`bwhsC(+d53ZKwS-2*g}RtP z-22jdd8fYtiNxe1G(>gQ6-=TjG)7j+fV^4%Bynu6cRvkZkg3ly7dV0mZomc*zek4H+R#7L_gDWyJ)AC{SwQn4WQ;9EUA@$b& zF~6980`~77e#fHlsR0pxTr9AH%Lg_RrRk8>l5f($Z4(kgr#HkRIHPXkI0#1U~U-=5s20FpB&jcS%;LQC-CxG5+C1nW}8BtcApI<3-&!*DAsV)9>ZfHWVB*A-v=1LdCN^f{12HI=b1-mTpinF8PntLm)ZRf540-7KUrajmyHmSMqj# zR)g4L%I1X{zSS!2Y6!AOKrg2}vR=KVw#{4upNgcBz*QN*2yn1N2Y(b-G4UJWNDQ|X zS)m|NqE7kSm|RW#Q~;KH{V1lUu)y0lD#V5 z>(y*&V*amPtmpc;UX2V6yhn#Zi^3Q>nW;zIE$MrFmgas1@1$bevM5CNZ=;r@em%^F zIeB=zEnXRZ>Xn<;+H`10=nguCni$&$JV^^&hiY=zEztqS|Ex{{X!*pJAjO4@S1zA$ zol+*`P^>9aqY(#H14L9n0c*dUt}ghIw+YhHbcOGrcMsGzZ@M(UFC&q4%M52yC$Y4$ z0_Bxv~#OqW#v)z~8132BM7Z=h6QpJ4eMZ+c-lY9gS zRPBDh9NKg8z$#qf-NPsvShT1mq(a;FvZ$l&etmnTrG^Ay;c1$RIH0n&$G^S2;9d{n zoNtb(>5c)m*yN`Gp7{A-)+iP$Y<0#DT=ECNryx_2)w6)3P*Nj(r7RPSEhVLDDK@;K z6qp$=$vf@~r3p3O&2lGM(v*MBENaAlb7h?($Ea0%xx2WTIaIuGa2`^rKa(WpJbSTtESA;NK6MNXsP&!K! zrAY~4#!r`ksK23P$!rq9ySSnl;aB#JdyfP7g`2@KNS=oYN=?-&ty0|Ie{a>$5JUm& z-#F7#>gsBCz=j8Eaz$X(ol6VX1g?yrs_UB~4l@m$u)R0hk5((Qk8eV3HZR_}sX&%Q zEB^xW_6jnAvagV+mI7cfhbu}BR(Ov1y}sSiJ6b{Ju)T`Wi9Gpj^|o7w4d?rXC76M} zlj-pcAJY>DP)SCRoo$!2gX$(kCKxu?op=%6MeB6fTKz~5!bBgRM&a!5 zH2wM-`Xwo2FDSX&89E)czFx=}@@<(gbevgw+m7VfjEn-%KxQ$}xbA5TVH`WPv7LT1 ztrpaocK$zw&&6CiQRRfG)#JDsCfa`S@vgWYuLy>4qci_|G6fjp{KSr4wWFQSV^<;& zR5gBGC2RXQn;3QE;UV$9D9-!W(QKi6N7I`3SN1aB(U^Xl`{t)4<1#;wqjDEO#ray0 zHIMHORzkrghSF_Jzc4Nl8DI}qC|*`L`80ZgXgNg6RrlQ@Byxxv1}slH%q|#l!udH? za8_#6dw!T;KFOZ?BWgT6ZWd1OmjfQ`oH0CI^0DNcfr(ogN@M-~b4fSBdMZDMD0f)> zf~?v_vyCxU&UpWxzO|yBEVJ+7OCbktQ;$UNKdm)y^fh-}{*I|e7=J(ajB$&@Bxm25 z4hckK!@{z|3c~ybI9}~6e5HFkCMAYB@D-p(UCY8eB-BPp&QZipF!pqLCA}s&>5DzW z(#Vc8Px^O{AmV2D zNK9X)DAdZxIy5Wf=72%Z7KfR_@qxAXtujl0M9m0{im{k+JIL!8z-c~C3Y5g^v+%>gQaMrrM>;_066%m%NcM* z{}&ZENn>@)udAK@`otZ-9-Ii&$AzzPqZeh{bs^kliQo4F5Pr$v=OFIR(g5oKSj_kG z`has*ju-xy{>jPFmlP!QF`= z6Bg##u;HRD*q;*i@NjG=WLJt{3LOS(4!vwQE%ANdWBN}zv5PN3qR{9&5u#H+8YGu) zp`{Z7&?0vf&?&{>VezIIY706&MPaE~qb!Y-v;l8ui{Fliy}!6P-CMML4dG-a;{(Q$ zMMew!e=PtOzZ~xmJkT~hGB`#LD%gb-4dz7ICz8kUBMk1A| z4}_)S>FUf?xJfV2?sX=?jq|6-GdkWHFkgt13IMaL0RIOr4(iL_7xNrAqIGe?SQ+#g zW`}C)F2eN6hW?aoD&OW*S~yk3CDhB_M?l1ew~vngOCRJFK@&sM;kMGpn+Hq>dEFDY zKZnycqInt`TVKH3K%ElKfbS$YQKm4vwmA#RO%T zdT|s~8BGAG)4vXOJ5dx{m$Id1+7(*N$gXFR50&NauPNO}bYbMzL zh(in$MudckSX#?PeJA;cyNVa-fTlMN_@6qwxCDMR^Ek%N4 z>uWOqD2~mn28hQULtW>vhk7WhS%Z6X&V@*#uZhsdpOT6u*adea8+@Ktf;4u)_}Fr2 z0k78?Q!&a%h0N+0{>J2!2cOD{)CH06t^|K`cvAnpml9L@y0_V9z()nW;mR^c?+d_% zZ%k9lji~O^bbJ)am4Sec;)vWB!#EwK;t|>JMoehQN9Ax!W!DX{qI4*3g4i!@WJ^w3 z9V%^fC4Z&5zBPrF!dN{9_8cGFpp?d}Yr{^dZZlB+%9cHzOENNCV71A7a1Xk3if$yP zQkdz|oh4sL!k}lI$zCjZ!Cd%`g|e}?&8vUjRHDzJ-P?PhqX%1aiUbc)eujf6v$bf7 zQzdxnSGe)f{rNBi;rt;FbK$>1S%o6gF#B0s=C}L3u_XTlKeED57fUTSxse`M{B#rv zI|n|%5K`^Sq*F44TN5S}FLLN;;pAQfn-4y_i6^&4^xaOl?&=U}mRiPqZL^1NFlX^r zWH)MtG%MTDYv;dp*f7&cDyl`Rs*pvnzO}CI@*P9gseH>Wf)fGj+@_2XNTK?rgeCP~{ z0}mj%xi=3c$wCXKMn|+g#K%Nt-lMptHmE;7*P0YC=n(w-1iOMsb_bJ~p@(;Z@Us~V z*WJ;z*H@f2Po`~1f)=8YY~M=Vx*IXRE=b%N_Qmc^k?rHaH*O1mVAgm5d@QrT7#HEL zf*BFF%oJ92O36E9&3B_V9gOfxnc-AgT}swNNL*6f#(TiAKgi?Y$2H7M5<#Eo)KOvfi0< zQj8=$LWqlpI4R0~7hkPDi5T4yMh3ClkhpqB~6 z4+}a2h05X<^A%AlMJ!s650&Y^;Yr^DivX?|#<2MW1h#_uT2dP^rx^wF_&aepbqh*) zX_meKYVL4)FwZ`d13Ww`;D2cHuy^KACnsLv*Z)kJmY;583;JK$pH;~PhiZoR@GIyQ zpjZcd4v=(!hW_)epojM~uCRvQLkM^;t=>E{yo#UZn>@ivx25NqT|(VMkBx8R@56Nw z#vs$N8<=g(({yT?MHEG+1aU2&Mh|+D87+e)7an7#y*0heFMn$z5vR7fPsG*K$y#5b ziZ2Y`?%W1)3Wnc~oYGkgnPOjM){Dlf5&5El$^6OGy)Fv~{!WmuUL^u_Anh2E-(oW9 zV`1~ND;4)@ow!#DzaCJy5i~r#%$u%JID@Um&ly{nu?7A04KmI&9}x zhWe43k<%v=ptq+Ni>J?!9_mVOd*Z8PF`xDyy>HO`I(~I^s2jj2=?Uv5Fc3RYjx#Xm zNlyJH}AiFh=$s11aWA%nxg^dlH&zF z`YuC_NUo}%Gf}w7T)Ucf8nG50hqnn98Hxwo@-$d3ZG5an)asT@$F0CnyOefrO$WX! zIdqmj)c64z_#xQG@9RP1=MqCLn$%szfB#gm+-fst)Uh3xN4L7x2wQ1V_2ZH`@Y|9! zBDjNmIN!6gQC1kYg*rTbU+d=hP0q7h4NL>?mL9nAJT5iEtSu}CpY=S@N2Gt@^z;lmr&-9<@HJ~KALB^v8) z0w@_gTZCl1Qf<-^qTv*FsO6Pf_cwX_5?2Wj4b8l!2`|hxkIkSo zt4U$C`bw)>7bP-=w7gB3Wpe>kt~=2=)U?wMF9I&Q!J&H!3_6EkjdxBU#tTF$LY-=* zd3|YgS3+{?TeDAAs2%hEp>;G=moeYyJFr$Ws*p&?DkL=3a| zP3@3hjAo5*5HOHZ1@iCh#R_f?LnBMH3z4b}_EaiMr8`#Sxc+n<0adHzC>T#@{^8+F zEkL2v+I5+V4SV^;F7mw15xmD+p&MC)S+87IgLEn_7PwNTt>Q~P`am=BWA0m8D{0Ll71I|1h1Bdo2zTX3Y>h*Eo&d(+b4NS^whKTU)RB|-pR8B%uW87bJK70{0 zRkV$KS^S`q3tJh|aL1wO4IGHiz|D;|HoQEaOe*a2qzEJp4cxNk!hVBV4MwH`6vEKg zb7!7@Qwd(y9C^*J=q{R4skFBVE_rJ-+djsTHMVqkfiKqw1T6jUd$Z1Q9+OYhN-y$} zaE1=s>>PV3E0^SOWBr6v;5y}0>b#6ajcfGwhoqS1-u6G2@3_$CUZjM5mWFZea`n8a z%#xJ!d0MmBG#&G>^x4lB4e_$5)zBc4jVZuLZ`KoA2Yy4ULhFFcd3vpD*{kxeskSG@i>b4^RNbQB}sllcV$qHLSuAM9X;Fp<`MFh*$(FZVN`t2%L;BZ z%t{G}e9Hy2Arn~F%CGgpL=na1)VNhBPTksPjLQ{(Rrv~!`K7@kT5%lTlZHaS-%Up+ zw#UbEfzvU{AWN9>%du}5s)kxsGHpuR? zjq%xSn)YR{SoE%sRfD=Nz@vf@Ep96dn~@XC4!bIg;dj=XIJQ!A)KTbp7_Kw`YmVcK zOrX_|cNkS>$M#n!gG+SB7Zuz;CP}6+KnIUczP1H3@WFlBmI@UL8dFmVI%WGN zzoWZd-rB#5{`9dwtZ`_a=2X~y%G^_M$qb(F;nR{cMT#&j2A_D5;uO2*!>(mM7a|X4 znVk!bB{>*u40P=bO)rY@GZb4bxS1+txy*UGUu@O#44$1{+1}6Io;}Kmd9HEHjj25Z zuO#^yF`dcQzaCl<%fB4lS>m5&PtZ5iIfH68WK^`#e$6g&&->x%@2-)V7tYUVpS~FL z9Zq<*UL#p0k4v&2_GcauM!J)jc!te3w3Dg`7|gz0KJEqQr)cnt%~>h2xL3N>CW`3a z2`T==bua4$Xbv*baNpAHcbILfIxr7o{7l4;1HSiy!f(NwE>lnW`kT4ujd_(?8W?5Q zvA8Uz>^%QY-Weh$iq^$>PmEvNN6lk?=aLv$w?_6<&2;hXx{B5N^f$`${hras*6*MQ zq@?tn%5fZ>qth4MKD-Mkt%9mAF<)A zJ?EII>yZpL8-SbZjj-g~kDSM=Bbc%LcHIiATcF3y2cWH`m&N-)J8jO?IISFk%)!4)0#XK&xMj2{}41XJx`x%A;1~M^Aab_;F}ipo)WYZBoGab zydLR~^m4fhqH(057)Vds2GJ0yepup0wm0>OV}Asi(M}y$Fbzg;goZa<(G5fD;i=-6 zC113M3}j!Qi{=P8Yit!KFRgtgedDSsi^hYKGPxi8ub-O(z8OVvR8hiIMx0-*xAIrH zpOcv>mGlJ%%Lw2Fwx_IJau^NNEK_I;V@KZ-W~%k3jbVmc$1??Un4ziWbz<|T}3Xte{-8f^PL zTL2Zh#<$cE$&FIH_^APum||p}mpll`+Hh8RTBZ&4a;fKE!3f;LS_r-n{oEUPFXnlI zwh|5=RX$TaTwPH*o(t1Pxy`=~Bk8}o5J4iDJezZ-1U8x0`G@cx@ zBZOY7-i`}b%89Jfh=82XjIyY$0@)`${gz^knA&dcqvsHSs!wykyZ7DA-G*#m&$}Tz zV?5_Md+W+LsameiO82_7D1ANyi`3R%W<}lk7DV@$+-HRxn3gdw{v5`n>>#`I-^BE0 z)zg`HV(~I4u9Y7#qeV#ad8E47oPIIx{V3_<4U7ZctsF9qH2y}|WIDUsc9@eWgj294R`nHu% z+`pwO=h()Y%|JRJog?^HpI#KNBoRmdD;h~WwO?K~t0BSO6nAbUgdyyqA4L<{fQ2f| z80i4bqJ=CFZI{R8wnT3QqzSi^IW*j8@aX<{?amP|WM6bY0%!l~?(-lXE|71uVztY9 zVIEHmt?*>tzaonLp}lAtCpr~)X*`ha?7Ax(Y|YE`!C-kN0!xIDTYY*MWWf>mFR8RR zQTVu#WT!m3*|6PZAedE=8;EO#{iuqgPa^6YqrrzG91Pz&nC%a____5@iv~k^);Zy@ zOG5f{wT;)Xc!OnE^+=vOFqP3UP^Y@9oJEQDyX$ab%aIC<)!Ys(Ryd zw;;IKyr$g^?GL3htA(67t$0>eLMiN=Luh`&1!PjBEV&5QgtuI+@Z z>`entb3pRBzpf^ zeLyzrrwGVx+w(Ar6OPkREd!f*#gC!Lho1PN@F$O}d{iCp zbp6cVNm9F*mI^)Oh<}C2#;3Nb>MkSfGA%W;e>@9Go8pd!cx41M0PZUD#D#!;e1Ns? zahA|dUH;l+q~BP_O7heB{Vx%ZHUl>_6j1zTvA=DbbHd-nW`3ok-9AYf;(>cfhO4nr z1^@Hqn>64rDJuC2+~qE{`y^-}y-1sIU|jg|zL+s|61+UP;j(^7hHx2{3-bmJ4oeD% zpdtS|6$yK81A)zah4y!8GJ=!e46jE5!@-@uqe&c_UmftH9iN@4a9S!>qfUE$|Ih*~ zBE=F1hlW;U@kc%D+6WE4UFLofsi@)4QQC*fmD*FKW3HnsP9}0lOEj;Zmc>LE=l_K^S z2bo=3qLVKeAwKRUO-*rnbP`$7?X3$dShoK(Mxs(aT|aBu>}lVBM!w6CGK56gXl2xN zsLP=s+qUCuYP>_LrE4+Y*8|=Pt_a#t5mR-k&jor5vzrDMmTdIYcyboYXfW`6zwp8RrW|jEX zDFdxq{huLx=x`WR&lGQ^Ct*-w@?Ye$k0nL*?BkllCEuewY`dMdA9wwK*Y+Z5Wj4@n z>U_L#q(ab|9YNuCcljRSemHhgo3;4@Fd=CtG1XhdyV2u;g4F9IipLtC2x1Br7iX!r zO1~D*bCzqV+JZwkZSBTlu0n)2afJ9hz6hvBSH1Yao`E`J+CbnbtV%yNp#O?H`cly& z8xmG>y*~61Pg6a}TFrzB@Y8%PNw26@bh+rjXio4V4?s0Xyj^{7Mbn_y`yktm@iHXn z!;)9Q`kHj;SxVG!yX};4q~z*QGls3DotlzI(c4gPU5COU?)$7zki&w4qFp&;Nr;eQ z_%KkKcmnA{Osks%Y%InVj_To&qw@^~Mc9n~Y_tkse$!NkSlLQw#7NM8;}f$$F$P@P^{wG<>l_J`OPEIqxa+y`by`!Boern#o31J)TyVqXuRn)6Vb+9wV|(Y zEk3DxLo~>sMU6#m&VB2S77cofSD9-O>gX5cu?sW+WlS3Su7Efhqr1Jugf;KHWffk; z(%=hJ-=t?q!QuL#JI+L=&rvQvnJYCQfLUZE&Wu=8G4?Y)z*#sQ-TG%TJ}?fHQ35es zNF`|5@Gz)ow7F8`0g~0i@>Zj|-^!kFHj3kcB5es=2_R+EH{B<_h&L6;k@G!DpS;yM z*IdHo_0wmj$`7IX8t z`ORS0dux@LtDH81_FnAV)-a9+F@c=t{uhpT9>8-kVy@&X#0vXn!;ix=lBdGwwlmhp zFo|FQB4PufW|uSY@0bZE+%mipo$=#KZAuI#UBVNXj>XtY$1Ec${OC_vRQxtmlY1*U zfj(SXM;M!i4tliU;CKInhQ8jR|Q+c%M|LG;HWpb_37u zO=SB@8svmFVvJdzUA76(<)n`BXPt9Es2Qx=S}FpId>Li&?Of1$XJ+nJ(mo^vy)YIDUT#AcvQC{n48O9u zqlM%36V{R-oah#9+9ncKKA-)kqLiD1;exj|Tl8k(ZM_yW!hK~KeP6a8Vmivhi0?m& zF9Pu%&NX*G7pqe>YB7K~8&ekhs_b>E>BsII0Tco(LaX=LrOi)lcr7z0 zXe-mFstl8!XU<+?gs2lh-vP`5?cl0Pqj9+JmC0%H%iUHH0P#CS-y;CC3oZ`q)5*;%@}vZW zV?&62Lv|lc`!DGHaLG)*cJXMjvzjFNS;o0n#_5Y&b0r!Zx>QLFtuJfgI-@YF|{+D&wG`<%L&FNWmQ&%AB%*PbYg3WX}g(FLVrxPg&5 z)T#1=KBhS{86~m-b%ll64X#DX4zH_r)S0%O_uNkR-KUa2YGPw^r@FkDR_S_+3DLwQ z=C&?e2NorrtmX1o{E=xmO$N)RC&`InNVmW4I9TdPm79zf>v*kJII%s24Y`sXz7j}* zJN3Jr2YiB9*K+Oe)*Qgo%1xn!5AfZe>)7cP92|-^{q3pR0J4j`QW6AmL&qOGeMtmn zV6JFGQGfW?RJtIS4;re=`iJ0Ae>M7cDXIa>H%`aML$L&%0%s{nRZAsrWJ4C^uW-4M z5TEtWwUWHq!bm--$>ja@oK(3RSec*AaG^V@%ENJHyO!L+_DzRr-rLT1M{DiWjID&s zbp0*OfAvITI+Enxs-k3at0Gc#1OKcA-N1exV5s2Rg;;N%IysCz%>FEtOhP@ZqW&v? zt@!+5^tDpB$a+{zoMM^f@BwrO--%SH_pYTbATBuIE&2TIRp|8^QD(2GV;B|t6m}x^ zm+{_`BDmK%NfNTHzkp<%iDQ+b-+vf~m{C3X8)H@$Dxu9JT)0_#c4{Lh~E z?EvapF!Ir~BX9(qujONHu}1NqSy5=H-fNy6H`W1WLMg?+XmVOnc(Fy|07_H&fcf|H z_w{}1oNza(-)x?4bw|to_ev_)*3AX;eoftitA6vFuJ0PsTCRXLNk)B?aG(7YXk&&Mx_j1la;x;VqmFzta= zSC4)$t|bg`{T&q}Wa`HrFkG6=Bes1mKksbt+zA|xrk}a235gmp6w7T9P9CF zZn7xkMQa8X8t@&3UYs1uZv;CY^c8OINdunn6;NMv$$YcIyv-7@`hAw&EZ%>m-car* zxwlH$oSabK|N7r;8h(@`uwHm{3E+c)Am{x5S^(^D@Adh^rJnw?yNXXvbB9L*dZCKm z`&%0yS=h$i&~|pQ?m$|`4>!($uKy6fzl-l1;T#WQ{~rKvK#;$_9bC69&{p}ks=qG> zrs-d9K0tlqx#R!&nHNrcFHx*M*dyhK)y(Kxmy`j3s?$#Nurk`@h#^%2=n1CB(~>#^ z0fwLlkvQ9bm*%s;{^>8@y(3rjmcL#giGRn|+IB`@SsN6i%E+W=!d7YNf3(s!+p~o~ zmoC92k9Lax-+04$Ex*`3`2Zs@2mcZAw7Y0(KiwX4r|8$e{+2lTgY*1LOTgp?uxq=! zLfse&%H=O~7hqH@u;#+JG}VQ`PaD3oKjixbOXw=JL`iAsbQy~lO3o54ma>Gg$*7ab zI8ItgEjvnTqr-(B53lcxPW;Zd-v1vEphK~^q-wlId8fzJedoP0345UsU=Df!bpRqN zA?)>Cy*;JHn(cf=oon3$KNg~ z|M!6Z0>1GEg#dH#Pr>|%J2PH?2K>H^m(KqS8^G^ax)1EyU{?eQW4rlC9E*BPL=9O5 zXvH1W31Fu>z#Ef3d#`Gx{W@cHFh)Xu&@C7u=iN2Nd)-u|q7K+T>k6TGcTH**g(2rA z3KA3lZ~ye_f0tMINIv41Gzio3Cd> zgyv!!Hf`s??*zRD_(wxNT*HqO|L8MZF5e4tR>gO(&r*K}BA*4A#`s6uO?3eKrcIzf z#ht^Sf7*@fa)jS@L<0JKeI1uP52? zgS8jw%g~?_tQB2Y#Gr_jkx9oC^&OO>+=_oczcMj-zJbH@fVS%I@|$pF+4cONJ2waa z! z)>%9p3#ojZ->(bSSz)XjF&=hOF8EL`@i3K2rWn_lbpxJeJmMVV-~Qtpf92MG{#Whz zEJ-PT-(zn9=e#RX{V-s*<<;yhT17wVOd#lv+;EPjxyOonPUI5g>3tQR4Fj6@^PqJF zJU#?yruj4;zM0GCDgIHxkN5NxQuuJ7xt(_NHC=tP!1p=>t!urxXDJV20507}Gx>Z? zzMb&n$M*PET`~wZMdu54C}1FpPddPaih!s-K)YKi?nyL1rYX2Y3Ovb|MT3rFa5)?HWg(6bfs%#VTG#HQNOOk zmex@v^|+oGz)T0@9HW(%(u-LEqakz!XD9YH7srL>?>_&Py&z1@tr0++w6IqF83Rz8 zo3}K=L2gckOXkae?X*4*;M0C@!j&rpLmwMnUL>Ip z_^-SK?EJq5{CCS88K#^iTJT(RzEmu*Q3PyK45#34#fW|A!_7$`wu>kU0zd+PEpt}a z2dvdvWQ#p6;)sb>pu$#}v}!(z<$_S1Fbu<##aFKHy!`v$-~DfyV3L4JrMNDo=kx1+ zR$eF=gq%aYyGWJ45cS3oE{v?O)lAoFN^NZ_P#9km(4+`mU4X3>u=L-1e&5pTYV}>Z z&#L;iDaaWf`{##)*yf>`*?rAWj)nzfI>ya{fO2HiHpLR`tOFa7m~ zfatxO@8|w(hQN>YB7hPbu+2Q+KwqG-41k0|3J1slP#a`IRf5{UC?7e4LQPJnVI^Tv@Sl;-97dM%h7u$4{>P=9$wczb|rDRjN|5WR<8&r4*|J&^ok} z2~*9;bWC!Lqn0*7pz7{^9WST2_~X5(o$q&a5*9y9P7O!Y)2`$ln@_2HS}DKJis1J^@LSx^ zc>T>Qz|+4B{9nGmD~~6P#Ymo?a}jkJDf^>h$cEPQ_tEM#9f0rlMJosvkiefqPPO$c z#~q$!>ui0EiC(G#n8=KyNm?z5(Lx}Sq>O9D)8G2Ncm7^k;|sPl*Lr?8Qp?5YezX>) z^f(7iz^_Ay7snR-O#_a_t2v7GN$7J_-@Omj0yNZr7SygAkivocfNo2Bn>Jyeb)f7+ z)3{?_KZ^B_(tgcQk0$<~1^bcc*VyEHyuR1@n<>4no}aw`3=8mi|H{@Xy9vGyn63ec z?%SFGt)VamN>cni1F%IxBz|gylx7zg1EXRxy#Og0g5!Ay&W)af0p@U7ZbFW=eP2Tn zyDtTn+K~3LefH12@*j1B&OoB6*`TZ?3#)QW7xOL6QWVz-FAQB!d`zjos%;L7Lx7M~ z;zd!z2;kgkw;L3IH*e&1ch+!c->0(Npef>MX6N|{x_0=6V3z7b5ka(&L$W-yLX_*8W5B2}#d>lQ=IG>fnSw_3 zC!;d0?DGo!5x5W~AQF*RQJs!;rXxeox6Yw2;3NusG*&u|Mv^$&iyYDU9YEK zs}N-=m9FwZX;K+hH2pWEfe0XVjF~n%$GSA8JgE!Wi%oPe3|<-cJ4#0C%GwKknKPym z#DhMf2r@(7zjI9M4|WXlSR2uP&&b1Nv;Xby;H$4L8!P?ob7tT@P4*;{Cepfu%9vmH|kT7+NjH(v*obtz{VMFe;NQOLQn(01K@|ved-aZtb1=y+7Ic z`+~EW^7kaVbNQ%h&r*F??@x4}UblIEZve=fyBYp|yf*<=*-9M?b}Irlw^R>cFGyo-L{(tt~G{(~OIuASV_AU3jw{BH+RnK(K-W(389+I&%S|BBX#*Q2y zafAp4TK*G6c96&d_0N$LAc!+FNT9$DVkovn8-nd9u^q;oBr+gbiUK-m+7f6jBQC>f za`v^SXS%w()_d=_yi4$$_kC~Os_7wz;OW@{>le?_l0|YZgXqvIep{?=|o=%(Yr%8__npiNG|{F;Qd&QEOr2} zy>Tc@ukYV!Y245Uu3l|)KdaxGp5Nc!ymP=>urAJexTm52KU`R^$~CW!oZqQm^Y=md z_w<)T`6Flj#v_k-%=>WN2j%~tfdBRdz}M{cFJC4(d5FZ*=U-9hj}BC`eO^{!OWtS? z6bL@mlbDPrIIlp5M`Jp>7Ca#M2lKVbBJ4|12XAf30U(4t5Bh)gx-gb>Yf- zqNy^@$VOH+`1+rH_SOILXl8#}Y$Niaj$9?=Or5Q`msfidz@wIbrPojDzpUNI_XtF1ZXlNY*|;Nv z9pBIKN$&{$RBf#`fl1S!rGByJkCg!T{A|JjH{!Seg#JB>d}0*f~y7mdvF8#$k91E+fV6P`6hi?T#f6$*|FGq zDuW}f)C(W^*vEcOk!|g4a3j$ybRqiT#*s6m+|iM9gZ(ImYuZ4bN7&h;v zZs?V~aPa!3U6l6Acbq+#&4|j%2fH7Fzx%A)xwRKI%ZcBcJ1_U0R}a4A51#D;HD~>g zZeQo@|4#7d?*FlTUpZY(UjE>}rStwj>Yo3$Wk2FX+}u0P`giZIsW-Xz&%j)Q>hkbk;+cng`y-C^xn%uib63^Dek}Ldb z9p>;562%~ZwO1vv&lfX(CgXB%AFtSCVlR#UmaoU`zWmsn;a7-2F8g!Ukk@>d*LqF| zfa5jcI224T(K~!8s>t}~Y9^`rRv+=v@t6ld9|HiSz1aIl#*f+BGppaD_h0e)$FdGe zdSvavJ8l7ZIVc4K5P!-EDjmMIquFB4|NZFmUGM1oj~<}Pmh`XX^K>0YJd=Yl-fujz zzoY4N`il=-c;MId;D*52-}K_h4gIWz+ou&m`H{62vfrse`R_xERgXK$#q3V&J~+G4 z=>5KaeQo{l>Tu_9W-ElFw~uIHMt)`*FBabK&AdNbIN#mfxsA@EA_yO?-*7vRJ{q3< z$yoM(YFYNb6a1%g;&%o3-!iT`^uFWmE2qcSe zDCa$ip5}6lCt(r7(IL@zGN#||{Z!dDbX0n$7hybJ4`t}&B6M?2u{>h=T#V1c<7KL7;}b2oxmaNT?R2Ok5qzBS8T^ug9D@O} zJ|5B2!+!^IUHJC7$PvKm8w6k~|M}6v=g;%!8b?%mLA~$Ec0Fqb-~(uSNk1^Vz|(+# zDZauYAbfwQC=j4(cp?z(efZ+{{N;+u1Lympbku7a^~24XQ|-bAubh^Zr7(AOWxSae z0X*?Y7{B+Boi$-k-F0Jc!xy9eneqdNO~c$nsOk{xeiPm@!8cpZ>8l(5>|Nw;oFRYs zBpfd9>G!xe)~cJ^a$SZ2k^1o z2T->R{&?*N7G7uzpw~zBfcK+C0PrylK*fMRs0?aY3n7RM$sh!uKUmsq8@kxuMK{9{ z{cCz5S)1qGe~-{lqtWPBK63G)e?VUJ_MjW2syjODT$mlX!ZZVQ7(Y1ItdA_=_^0#1 zr}DqNcii1^{l!UjXp86Wd|*Gw(#7&W1Ox$9IPX>Cyjgc#O|j_7Uy44AEi=Wou5-{ zBT^-i?8YRgJqcxwBJhW!aCA7P!&0bcl%6F#OxMaDxS&6EuRMQBf=f2Uk zP~#0!O8au$$Po!K`rkkE{4ZEXcjyA;IwZU>){Nk1F%PoyP>{VfrLwU!K6khz%~0A0 znL#7At)2+S84;*UX}*uLeIP*{vUXbZ zL2EE~IOq{GKFC3M`Jq(ji$C7e94^1965umnNjX@?S=+ zSLvm2Jz9Sy4xkJc+(G})#Rq?8JQ`n9Uibd6w?Y(yy>&QLQrgftHy^xTuPQ4C?<=F- zk?jOgMZ-g8e#Y;sJ8tYvcAHW6dUYQwjL=GAVQkuaKR3=h)wnm`z8SuM+Sun8F1-BK z)BYpnS^vpvzZSNi!H)l>@YrL20{)cXPX@T#jrV@(&8JjXPUW4tl2c`*Ywl2!ic}X! z*8LG5pHW7Lx@ZExk4rl*IJX9cI4t0l1%cCrt|Tg{mm3>vLa9NIW#6c}G-WAdGZlq2 zvL2PD{{3g)__NQxaqyQR-Nl6*F7*|3`Y{8eTu1h|JL{a$*X}+b1?e@E)@sjxJl0FS zeIf=U=8pqF?(W~=k;w1JIY0mPc=0C1@Rzty0UV=B@CAzTjlzh5Bqqd4tj?bTywj$NEqzXEe zu(upHM2r3y{7>!emj|P@(HtyO*AbP4@2I1)Gkq>9`czv~P5civmywN}qsr^>O_R@ue=jZie}&bT6A9a-95nETay;^t;u z9Mnf=?w-9>t_|~@xGFBS_rrb&BeL$$Sl`RBTbEnz+KpE{HFJM1ulqjw=rQ5YeUK4KcGfeq9`i4(G0pC`H_%?R;7^Zl`G7ssLRsVpL^l0Kl7D0_kR{;J~FN` zD6=Eba8QHGeP_t+u2ES#8lOLkXSOncQ0{Xj0?Td~_ovUnxvR9o8x1s*ktTqT-X5R7 z93>u0c)7($3q8y`FyNDM2+MqSoN3L{S>ZN1wJdgJ^A-=qApu* z^~H{Kc@r?Z`z&t;MlkcXUpnOt@Z%B>Dgm7FLR?-rqArN^7&!p$@d19`_>0FqP!Z(5 z9|9lj{e#RacoWdk05cHQ1$Y{|fgbA5(WaZwGxR#W<#(g{4@*BGP(_|bRr#AA{@{oH zPT$&&W?~purtiJ9{r;}2WNDSPRu0M+UOPVzVbO%(4+a@F8#j4qn4i0~Hx28P;id7N z^SyQc~3c&>-s_2D3XhY)KKB~c%+pf0pKqN z67a*R*D35AN&Sknlf%BpGt2iO__Bh$ca4-KQP)RmZA}(5_m!FmS&oI-(6X#YvQed| z|JiT9_}};5-;en>m;H(1XW+ALUy$9Mk_w8}&d*381p({;Uo_h#rNQpU#hoIR`|#qA zTX=bGH-eo#`FM7p&Teyck$Qb@Gt!|>2K*}M)7OGmUmh2(vRwuU zErY=6+`m$lW#TUffz{WO#5Y#_=_qH?@B^^m0(b`>a(ZhSkQn)8@MFgxA|I6b2m;9P zApDpwaIpe74gk^TA3tmS_#GU7`;IjSwjap%MBg_&z+=PT3C~66V6+}WP=(!pANmU) z{J?)^^yF=QFdr(T2Vq8opLMqHTUXiA7DhXHuJ+O#`q{$yhI&^|FW8q}xfV9>Ip@l=V-hkcP4~-pz!5|UfU}N zebfc-To=i{u0yFH>YBv%cBM+`>Z7ApPd1I*m=xvM_(~SCx$^eS?|b^C8~+v0@Kd?X znV$*1Xt6E(ifBHf(MCt3brgiL1P1XSQP!iBSB{-)QSuufM|zz1mrlBAj*qOL$A;V{ zq?OzRevIwnSTRl?FFkS~$)i400LxweR0*ttJ{fi7l0Q27Bu;sy4aiVGp73Yl zIr{XkzT`dr{4>a)kCOhB{aNr6HT~?#&so@#@Qx3Rq5^0g+;8K_`1kb?I;o_kg?AxX9Q$#VmAC@zr)Dy^MHde7{BcF-)m%+BNAAqD8zyE^y;|S7 z*qcsU}?m!4>O`-8r(JZgifS`~A6H3ZLG1@&xP8zkyR}_f!S& zEn)q?6`B9t%l-VH$mR1B;?kvy;^BucLEM8epX`rFO&d~s2XE*toMr8$k_GNr2r*CK zAA*oySolr8eK8LK;CG`k6r7nmq1H=L%Y&+vRUu0wwklzYQD2#ftjp5Wzy3Qf{M@|t zKY(5wy*0D@CIXOO7n1zm8n*+;`g{iuZaV1oG0z83jg5VN?)5#^e6v4YK97~0bh+nG z^ZQh?Goc6p5F3M}Q{1bd2Pw$aL9+2m<$fF&9&7sJNw7T9%Vr)c3q6T$O;iPc?DA#x znGk(PR$k&8a^H`4Fu}Ld1}wM!SmvAV@8w{S=K352aMUAZbQWH_=<)-WAE4(-Al>z2 z!4K;IVhg~n12_bf|Bx5knEmm6@KMm#(f7IscntYF?m2RB0OGd9QvYI|Juu&hu($3*^RM-C%(=r1$ZUH~rlID9Zmo z9^j8NQ1J{sBR>B4r^MnWsdY`Vo077NT_uj@x~`{6Z3xlNgp`H^AAd0+yy4vVtxi^> zn%rU$0-g(V)rFBRLs5_%Zwl$V!&<3AH|s`h7QWPDQJS$F9ULsq{fjTW_P3-En$>v7 zx*PzG?Y2c*^Gtud)loUY@G9xyT@>$VK8fuKC#+e$$3Y;HY5cL=pGUPHs{~WYo-;nT z8L7hH0I-tn@r8H-kdAC-K~SCuWZ=JJw3jk|e)|&atAyWbAb9txe`(~I3xHe+oFxBJ z+0Ry9F);A)&1EGJ*LHcc56)T6@_ZlLd|Uy*P0>cFFMz**`tMW_KpVj0Km-OCExaT; zilIwKJ}h;;r!&Kt?sHr8vb#=i`0L36+~ZOL_x|H%`iuA9ci*qNUJTl~!Fy@TBWVSR z!OlBxlyv@}3$oB&s}Q<=Lbe{T&+RU3?NC)$;t!^0W<^Ikk2KV{ zjcx0w+;%i2x4WQl?bj{`IDCKn<2xap^!{!E|4BW=Nir!u>j3=6>2bP5m&C)DKBew! zNN(Lva$|l&1v%GtFsd$rzb0 zxe3OXAsD&2Ce66=1>j^e5&!@o07*naR4D(d5%p)De)%ul*qvX>ckb9?JN4LX+JRKN zkE}0gimacHXrNNDxlO>eTx5F1?z9l|z{HbZvSA08_i4_bd;Ub=!O}Z|ACGAofIxu? zApt+n|5*@}+5W^6;9tV`AB{YZ9e%TCAAcvS1|IJq_)ca2Ja=9GqSDB3rPt3T|1tn9 zNxv8bGWc^Fz!Ko(;DfTCJiu?655N=vS^%*BApQ^paMqh;!Fc3$AOW8PLTnva#_O=} z@5!~u{*fpgdPg61_woY5AJ`XYVE@0U`kM#`)74imKJ>AVOVWLRFt?Sed+(hMGw)32 z-BIgYiLdT`IJ3U)x~`{|2B}Bmur=Ou&7awRM;`MgW<6`w%q3hP%1&fmL*L}yrCC+djuQY@x#U-uIs|&4;OV}r4U*F zd>bGy2^~N3v>*k6EbrwokijlOL5_;x>5i@QfA#F0=f5cWZcu~neJAZO>l}K1 zHMiENiZ}j>0u#$3SSLg=CYqMsPqsRGlgfUlnAoDIf-Rx;n}=#`(>066h1tFf(z$(< z{8HZ^^M~Q$cMMppmw#BbGc!2wR4s730823R`S>?+KRht_IpeR)`}yyw706#BI|VQI^^=H) zzfJ~!dgRwL(U;nh6Q-Rj5Wg+81@I9L zOCA?~vD%BfyPg>QT>kT{KZ2iwLD~VpY4E%cfc*eeTSIS&_~<8w3Z6o5>7u`vTG!Ll z_T^|Q!sM){5jiT$>Nh@o|406(7CnBeIw=e5Te$sr-vlw(-g`M{mL;L|pF50;3&N%J za}Vyg12?rd&w}}_5Wm8qn+IVkUx~_@Ft$#S+t}T4Z_u{8`(bjQ{;j9N`D=&Ez8{$% z-_MCVek&@=<6p@#H~*m!fPa{o|Gk6%i6_J}k6#oUk6e;J@gpQ%M`~mJhH6Gy?HwxZ zN~wxQNFAa&eQ&rWcCA!1v$g@X=e$914{ovO1zh*x(q2_0)+(Xkz#GWQwawCOu9>o` zWu>*K|KHC)_tS@q?%#!|2gfZ@?sKo73Aa#?STr;m57bPD=y09=_=4gR+h~|a0Qfja z5i@?0&oiJo12a3%LZi6dhaNvDDx{7c0oWD5=AVgKpY;W-132E~<1<{#_28B5y|nOy z@!@L5&+Pv3nD3OJ=e8u%iG{x9^Y2vkpE!V20VKkY<3bYq#EhTx0Ib?OZUa#MXW#;) z?DIFovb-CjyAOyz1OoK^ob9pg$80}j!KoF%L;#CHiTUSM;br#6ziH{*utA%COwZca zY2VNJRsvduCScjhAARTp-}4_SQZskU*{Z2}f5eT5FLW`O!`8J2UC?zCylTTiujHsU zp|WGKwtZcQ4b#89aSt1OE*21w@6velob}2(w-~$OkldQQ;a-=6yYEKlKil7Q41Tuv zdXo42anSQS82s;2?ytnKC!Tmhz}Fmq0DgM-lKS~SL*k|KZ9VOb8Z}B?v#lw{V>vO6 zIP4dS2xeSFJHn6VPB(`x_WMImexX7bo5Ig^FY0Pg+asxk5K0t<8jVD;j^Wcz8u7no*?&^%8;gM?`&};lB$uBo_F?d^WPZ-zfrcS&^Eqr^0oXj^L)jl<|Idtn z1bdso&xBumJ$`QF0x6+5qdw43Zx7=jf(8q?d*_<3^$jR7g)HIog_@`T29( z_x^u=?yRw9Sj;=8OXbKkgWWsw<vD?8e}!?^wwQ+@qD$-;J0NN z+C@vnsBli!u0{aR6K7w&G8+tnM)*gc1S$BL-MD7faEKq9X*+7wI{W%hlz5lHOnKvJksRH-=8l^a!bjUQ`Bi`eOmgqPK4!sB3IdtsU)}wW4nN28-lcY*%l^~`d;={1 z>8Iav+@DNy;`_1Px8m>5J2ffur(Pc>8<_wE=#lYb1pwg2?LL6tvYZzl{$Tsj2E?8p zK#!$=WcgYB$7(=)P9y~3-ix2TU376A3F)u1bf3F}N>|X+!%M6X#E1|r*;IMb%KXa@ ze&A#OU1$eq7Buu-XSFY#6T*V^Uo)lchk>-yVeYKZYoj2Q5F2_{6nBXEoAsof`7(J! zR#Y~XYloSiciz`!H8cm#UBgYWUF$c$^m$iyXZ^;HJ;MFRHvsykofvrB+egwaYW-oZDfsJ~0O0G$>K7>UUF!8$`}$Pw zCmS!W7h3H!`{)jT)m@kfxa~${i9FlUGpMTrm$Zvhg_9xh90&oTVKpu;F*hxFf zeB-rUF8`Nhe+&Y=%!B0|2zijXvDh;pvquhqXZ|i4eQ>bgj|2GeIgW)u2m;9Hh;zOl z2-G{a3lU7FuA#GjgI*tS0{n1!_G^N5YvJb~yzk+^Pzf_P1HdnByXd_v3agJ=XPk0g z=}`3S=?QOk8aD-%+G{atU4L%v==v~)Mv;uEg7qOB3GYOAM_a$IJM({gg8y{Si2n-C`1}&x_~F>|>6b`;3TQf|tSdvw?;pc%=$aDHAGLDlxucDqU(-8r_t> zoRl6?ztN|^_}t%iJMmmMz^|zYnzaN%1q#?U);1(+?omd83)*#0H4 zmx2Jlo`8QE{9kvDIR1ns(U;HnWc$2q@wJ-yv(`Tmf5+wi3iw&L15gi~nUUq&l>Os| zANT+p$9~D?n@K-R12}NR3IJ^vf`{)gm5Hi9X^Ae-dD4sZ=$xa=2@>f5UItSY|Fr z=yfmqxj&TNSpfgYy3mj8`RS&;_S7q$==c1^i|O)#;_?noL`UFjANTc_n{vseH-a{1aYLF)VK`Wzw+|@w zVN}n;qQvf}kzQ2$Wx&Vv-Q}MD(%ds$>d6Z}$*7YF#?$5gD%1Zy{I+ikekS}@djDkL z$;4l(0GQz8QD5x!t&PSXyw{&HJ1^`2=mX0Az~ow~|b1_@KIfo6yv$}PzIillAZ z5NZYR&js}b=`9^JNja%(rS7h7y;^VfL*MdGb)-t)4e_ENz(3HglRJe~_c!*<|NA9x z?Vdk#rgk9xva9cRDEM!qyp0rL3LrGRei^X+B+aU z3v+E2t+aJ5H*oEhTKYm)-f`ruP-SqPLckBsElfb>H#A69389o#MbVn+XsQBr<#-~C zs*>e1ue|x^-rhg>X=yzC09ZrMsy^P`hc;i68b)l^QIBEDk>s%~*@X}XYO&ZRfZ>PF zoIt;yrU4k$#XdaBg(2WUpI?&U%{%}<6pq<_l=3_USSjhVa}NiO^fgv10S5TW*{6ZEOSL_Fh!{ z0kjAPtlLlJKOTDo0KVZDTY%0YAVflt7kyIMk9~e@|1odCw%s86EYJVF8<=ZY3k_}9 z30<|HAz;+k^R8%t*)df$ z+@D>oHp9WoXEx^;_rWg);6L(+}{3SMa7;Ton6Ozj-JgITGK)*T?=7^ zxZZa9RX5t24-0Cvwm9TSMqB)T9Q>h*g6cIArL;<^wjd+T*hn*)n9?X;efGH*ey$zt zkC3*c4dOT)dUNKNSmq$*OKR47G9UyK_(ABg5)YX_NGiba<882*!ibN3`0_oy#N6X( zC!yRoR0zWaAAk=>Q3M`l?h~t@6@dJhU3;>T$Z57eW&AAWS@q|SYQC=m{`?gBD*OCg zW3DdrtbEQY_?I7-Jp3cD;^$_WFB5)A;fF^i{FvyAS9~(@w*-H0Bf+;M{6PF!CIZp( zGx#|WWb!X7{v7)%psdH7pEvqKAmt_96}D;D9?`XaC!Y8YIM-^a5`i8#bKg%*>$9)f zMeiCb?4eh#_s#`hxq8tDkG9f<(25pcMP*4H! zvYUf+=sLT7e`9w(^P1nhIdx^X@2{Q5y#My#=Tqs&uBoS3|3CiVU(WV#*Xtkm`|0u? zMtqk@Jp3>T`sK^|+(#$!;qQ4wH6v1o-H~ynP&Dtf5kd+rL~lr3?fmF%SFc$REu`#` zq~K-moExF2Bv+G|lq8I?QmL*mrZ8hIO|xDXM1B34r@#CUf)wilQyryA@{K)329E%q zt*DTOnrWN-^wM=4^!L1xhYPc@v!zbf@W*|9Oc9Xvi%{?g(Q8Mcgw0S` zdiCX=K9BYCIxoLHuliNe9{CrO%l@oDT=nmIFBL!@1?I({ z<>SecpTW=e{Bg@KXMSX2J0!6Wm;VX;u619C`o-;@*8&r zQ2GmU6uP)RjQ!tWiNTMO|E2b798FRn?Hx^Ip!Lzl-@JEv{-3)+52HixkIDi&e=aEH z%HI2d2I>iizO1OL5VR_JLt)#{JMlte zajNv(xts19i+xtXpMUUA(BqFk9!><^6MBqg&-T7m0PjN=xcaR5>KXrb;0M#su078k zs;$XHZv0!1DBNDa?mit!?Tk?Vs8dx{QEyuDd~eog!PmV+L?$;F_F#3m1urWKtsg{H zk{B7Mg>j}f($vxyO;Z)S-QnF|clhJ%R89me)!o`lZ`($fjZQ|5E8#H24?rU*H3r;;;QcPOn>Rtb6VL4 z@^BUWS=yVJ|Gdk8TGP+JomF4{tliIQzpugI0J!;U@Z&1$4}hnN6!v}jT5rz$tKfGw zS$8M!BM5N0&prPN_|eA?X~v({dKX;wTPFWd>Sw<{c=&mOq<4r4LiqjTEhzg3JR@S@ zIpe2zGY|X^N;JJZ3VufD{^8{}wxLDuP8cssFGs-? zGty=v3kpS;wDRqHr*9J*M-WwN&Aa(-==#7DgZ-IvR^or15Wz< z5YEo+LR+oD=Oplh^(Uc}3C_(q>(^^i3oA|2;3#unZfw-%*=w)=>1(%k|4P){Bl`mU z3HU7T(WLr{>e_S9AA9zw<42H?!l83#0#Ca*+eh~0As~Yg3psH*z^#NxSsy(?;mN~= z0)ieU7t{DI9pGH{^-1-YgF@s4@=d->^c^4LIPUpZy!jIGcS6*&lC`-i;M?1&8d!N> zT3d|Iw4~ZQAqS31SuXGMnlFPa1%gQYrQTmAjsHs7&l>++_9x);244a-9#PiwLQk6M zw@d;iXP;E=$KD^-U-(?h+k(vSqpZij2i6} zKfHC}FNrW7%)FsP0 zIu*PqjoqJlSLlAIc6)cDKC)xC=IGVA|53W`pLqN;w0$WWdwwT?e_8G?lf%0dCr>=F z(#kvzcf(}fv2#(r{{5uRsa@UH8W~%Oxzwd?)y(yLo69t1_+met?>(rU!7m2#s?^T6 z^Du)@Mj^+7m$6dUU4b>;vNXD+p`2_~=JPK<|DPNjwLgKm5JWY+RFik;vC#)c-WODj z9F?_aU^D3kMxTR203ApMsU&ir|sZ<+azZ}1&Y9F9kiDKRI+;#qwBbUU%n|88YJ0L03f^Z^1`)6Kb!Z&vYN;Jtl@{P`LV?p6Ma12kAxp<_EE~Gp1$v*pocg6QtuD&qwEJ@BNq^7 z{*e0u{IKzg9D*eQArD4m(^5F7$v)Q5K2aokE?{JWp89H_0mNIlP@59_#yLiumJeugr@J|y$}Nt z0@69LO-FV{Z+EviAYjZ`i$IO?bf(z)t9RD-{;nB%@2#-C4?&ElgFozpG{M^zh7WbH z%8F13S=L@l?e&duad@;*EZFIHv+%Qd8&Ef(=NGQ9ApI&`4X@EPSHAJyz|U?Gr`(fP zbXu$8-*3A2|CWLOw6F)yHGu!}<;!ws`>Z6oi14gNVc#@&NY(Yqlt!q+3S|Y!!FJ-P zQq>y+Z4F+z&fB15a0`veY;Y}F*3T*&NNd~T>iq-zbr)9z=76m z&5g{u)b#rT)dST{ANc?PmDhC99$>bQ0HLEnC(3>xFcC-$K)$#W0|crFp6x450YqQr zPOj?a#T{gQHuOk0__B?6<_^-SRw)bM2uvjI4@B{dvsD%O(ib1{(%#{eyS-C-j9q4Me!v{d{ zc`*3cRE}yr{>2YAA9!+@ErMt!gBWIhkYl%)dp{-(dq4vC(fi9Yg(x+oe{(Z0n%UmE zo`LXd#zmMfy3k@Hu$WpqzwQQA4Aj+@nm6s6y9@tg8;@8x`+V|~PlS(eUko_lnGbm3 zr}y~d$>8ra`oG;X|Lwqk@tG&Z_Rb}-^C(Grh7>)#qeg9E*4BU+sl!}o?>glwz^bCX zV8=JCT0gRZZ@Ad7@C&2k8AxYB=Laz|h1B(&nns#1NL`F-UDCW9j9vf23org-DT9E* zE@u2>)dizY0ML~z@vTNS5^{V=2hKc-3S@1RccjUn4FLEvCcySD!5_TCc+}IPN=k^Ic{BxdO<}zh4FX1l3^zK9~M1KRyZK(|-NSK#;P2 z?CCSZmx9M?=Fgk}i+K|Gv$4l2+s_wz0(q47c+CBJKHkCCdXjrjk2!w=IcEM4^P~wt z$97)v{Z_=XABR6s9WeNNQ~;K=jCNn_vcdlmfi^X4p(MT5z7?ksd|x2YS*SHt`RjL; zANU{3V6Bl8{#Q}@53Y2`{<<;&Gya7VqO6QS)|ZvnM?~H3*4hD;9W`bx%zPV=^_?gj zPJ)%f4Ch2O%$vdP?7rqVyQzbt?I2Uw0&TlD>gd>F79&W^4EZ9-XC zp(j$S!D(I9dTf00*5cZ~@#fpNex8lrk)1R6q0~!%$9%smB-?XGz@?=h%=D4@(JBPZ zTYLaN6lLitpRBeJ1frowDGDm#H>N2PeFdbv=>Q0q@+&=lUffxdf5-ZM4g_f(I0l65 z0DRo*=h0sVGiweQj41%5Ql7ETYi|kWxlKS+fcIFQ@2~dw@yje*hIcObtc>{}>`9>a z-0Me$A0WtVKl*a?`e66*h<+W9VC(_tRO%yx^GJ_LK3vm^q#o3Me8>ZjGVc5X+-&R3 zLBq04*vQEIg9pgrYfX))@P^*%cDQN8`%x8~)u;mXmoJPS`dJ*_GzHFj_FkCM4^BFN z7(zL!y;X$(^RJDNAp1lq)uJkf#U0fi@BNS0!fX*jr&=$(v1T!Ii@n~ST{FXByRZv; z;FEL{So}Po9(|_xsQ*3@|h>a?#3l~Pf7Bby)Wu>>mzkv z^PrLynGoih+D^}$RJ!VH=6et)GmDQwX-^S=qg)jg0LiIX(8|t)kJ9L zgsP1()!3V>*WdVeZtU;>l>jgA1b&q5=)Ix0FB!BI{2FnKjn{Q~bcY^aVHpQ!wn6eq zGEVb$A9_kIo#Ee|8F^j;(o{(-@fcR}xg!3X4B|}cr8$1A1R~fua4e58XqCfj zn|o~7u~hc0==jrhpnR2w+kvbHNNT{7=AB7;yh8Yiykx{z!6Jf127g8^vivFun3KtA z3Mps&{FpZQVug@uo^+xw-tS9Ve%vcfy*{t_CMO@Pm}=f+~C8z(d%Qo>Cyn5 zKw`hAE)gH&>|aqg+<`*ozn~w~^Ll24XmzPaYOm|Hre1Z4jmlIE}OjeXpG_ zhTyz%Uc!Nm1X{hdk(I^Bs1SrU!W%gnikDx1^=De!{y8s)<%()W=kgUw zJBV=7RvvnOOalOZfEw$&4(1)lj5%IAeH{hbiO+OUn&1j5YU|I zWAce|-dJ2C(`T@=m3JQXVYG)Jz$JUS73!yo<1}EOzx%3&;33s01F)- zU-?Dv&zV0h1)=PRT^GbYkOcFd1-3G!qDdIh!7!skHv?frL3o-%;if za$F<)_*you9lZB#;LMMnzg1Q^S%_lXsFHd;l#T1|D{n#j@AM?N#eS$K6EG023#DD` zAKJBQu={VdcHGTfS&l3+|F6FJTj9sgKNK#mEcu}K|2i}OyM^rh_OJQ)&6fS|Gx+aT z7xd-{@V8wL;XZ@^%c8gox|+GP!3FEB4IX8`^x7?`mELO+wD#k&Rk|`#xZae?=wjrH zue|#Fe{JpXLxbuVT=47T%%9F-VN0)4hBV*yi<KX&cO;9vT7MR_k* z6ui5ysS<{tZ~>+RI)Xpja`UP$9|Mi^{kSF^kAbcdeUSjnJ%2jZaZ2gO96)vuLe|Fx zA&mdxJ<#}qK!yLMk{urtOM;a@r=KdTbNrPVKL>#{0pP!Kun7E5aOsa=fc_pCnO(Z0 zoEKorE4_S`H?QZS4M_bx#(ym4$&7zy_W5#e>iMzp=PfzR@&S7MJA4@^9`3Lf;79fk zGz0hpOju%NHl>DUc0v09KVKF0G?t#mD$rD{|L2=>;}47&54{^gEeq#@@?uad@pV5{+#)* zJb6Xk*NkM${2xRXl2KMEBGQ#0zXuKB&gJe3~ap&xB!rSDC^<3 z2Wc-1JkakW0BBz0Jy!UD$xkXg==r5)vJaWx7clJbyhFfXPT-AKcw>f-E4*oo4{u8! zlP$ZJ89(y@O9C(gpH+qs0wK%y0C_6+Q@PG#KVC^*LHNq}ZW$!fyvHF9SXhQYFB@yx@~60MK(x@PUlOh%Xs+=9OLq1OPZ|`;qapg*OB|DEAQ@Q2z6H z5LutQv*-sHm3{+>U~!z29f9y~L`{UGHBnP*d)l{06hbrs8L2>P%2OjJPn<38zC04u z(04;9bz}Q(7UuJTs zlP?0g5U3&wt}t*|&ZA{0lAJfO{L2HJtMmR89AZF7%D!|*AQOV@<)5$gB;dz!J=}xi zJpoSWNy3}d$Fcv%C?5FLa&XoK??We?)XD?=(2rH+S^%%q z4^kGTQ~?SxZOGm`-fatvb8t7XZ~|<mw!gS*`2Vh|xsTLTGI4qwJTi6fZW#U9NX(;X_b@+}zvX zi_#6&`W~0Dv8D^2*LO;lPQkqkYI{=)_52%G{udHq%jrIr*C_z7fd_!ih8~(!5gB*R z{L3?17zbh#4EjIx`-*$(D4?jvy$bPqrCj=%b?E$AJ6^c zaYEjUK>$b!zRU&0UO#Q~B`rTI{F0kbw(icWym7TR*>k1UUS#uls3Z0LJpcF1@-ygJ z^N(GB&jA&Ezk_r-34VsICtk(zjtboUONT=8iZhn15PGw@${;wbWAp4N<@p9$LWkJuJl_>kS zZkAH5&2+n7o3*LY0wh0f-#U@NPvZG{a<}U{ErA>bRY#sa@bEz}o1cX}90b4(r1Jg5FFi+r(@&w5z4B#knUsB5^~V7KWj+Hi z5q_EIL-t1-kX(Jh@UxQ-XZCF5c?^C&&XF|zy^A(o419=xl8TRK{ah(nRt(zMd$CS{ zoqQ1>`kui2!m0~~AOkxu#*u7=eLNRvuRCI8BGy6`1v(=gRigf%&s7)x(I^Pp4c_Zc zIHwghMuQ)R;JQK#7}vrmrXIOCF9tbyt9ozu=hv;c z^@hKX?zauy?>|A8{i7hha{x#|0Ab+tvd?=c|G#~~f9}nRz&Y---Gl0Sc?*`CT1=(Z zLx&wIy>OkJ%KpswudM7c`G;>1 z0Rm5zg#O$T+^$pPjJ_)FNz(yd@m)IjqTo*aA4+U?@`o-LN~-&zPMnu3ko z0DgN%eKSmq>u@8|x1myz?H9(`#o+8(KiK_wYjo-kvK!siwzJYH^0H8FhN~)i@UExe zgwV4Nl0Ia1D~vI+Mg?GM)oG_+yME>WaAfPC`UpN=?1AB5I>ile;|ap89I`!Lk3B!Y zpKteJ)(>4jEW4R#1L?%=Zp(56z_%RcIx%W?s zKkol|&Yz4$P&I(r&sT!D0*FK($DlOc^DM8O)kF2FydYW|HNf+?x6_& zv)wgyb=|0LXw7(gUFl95(L&qbD_vC*dYNa3aDMJwHFz6jL9Vr>cNL#_!R%Kp24xG0 z7Ql+K6w35Y$-*eBgnr}ZGyf+EoMFcarhGjomfZ0qcLZd?WM35j#C2b^2bc`N@h94J zqwfd!pkKup3E<~zULf63=|c~Y%6|0wocYtqZH-Mr1e_(&ml*$*mEI-G&m+Lp|EE9@ z=hn&P2jm{wfF$EZ?~e+ApVuohf5?iLZ9v}kc`fG!1s zJl=~Zx&gLG@MT#qYx!AAfAUyIG~Ps3PcwRc|M7V)?)~wzRWN3E)U^ZIc8Cf=iiBU# zL?C~l^}@X!Ebh1tOuysf8~{H%^?NK;NgBaJaj>-4cFYwp_=BfSi5q_9llPPl{$0-e z)cY{&gAK}?qH#{*o_Ed4D1g61=GQ`EkkH*Tz2Q8rx*R0%dncW-2lJULCmX~1;Or~y zU`J3NT|4Jj!H*y9vh;uQNjCKU2Fm_FV({Ol>o~EuzclHNlHO&{pTJ-AXVg|v%KdVt z*PCr6h0Hz<11)%PYO%oBUwdC#Aw;h$ zKv)V@)JDC$^Z8FX@5WxYkx6IWek$o948+_WtGGJ;;W1$12Kay{f&=WjdDb6;K+N~) z4qV#u;fuXe@u&~~j>jYb7TxUL6AyB7wULcN5}O~zKF4Gr%G9OOFOBvxC%}w9a}N>d zY$A%v0KW&UKqA|t8sOhctQffD=h;-!{c(v9$vZCpleT{~Q)I&q9uy>kFF(_=sE2!g ze0dOiAm9)LFw;-7{+#(U;fK;4AH(H86Me~>FCXN@?=t!I4=RBla9qG#ABR00SrCBe zCE%+8Qk8xB@n>L-zYYVH!qWk(43oe?N~#e!t)*S;|1$%M@vWmxXgEUkPwuTB`UfMh z{aX5YHv|);N7+x-kSj@eN#O7$P1Y#XLPFtpa94SYc?Xz%E-1LdyUsd0z{#gE!+KlW zSIW2S$gVlM*7=Jx_n-dNML7TChy2@F1wUTD9r5?rV<+}8`B$_gY-11i4fXx+Pv(CQ z;OBCmUoP?g@N#9D`KQu#jk>;W)P<2&i%uIUr0$P8GZ_hqtv+EZ@mlcPH?5zNB0orM zh$cyK+f6@g%4RR3y$j35M000YLK*F1t zeq?26_!CKo`9G6@03=`Ni5h=ib?4p~9PqJeCNh5sS0KLJ;mIrX{Ap2$#YM@FA3-R| zcbApGin?#90pLIYkx$YRfZ$74ftlq`8+^Rm?_y;@!;1JPi-6MaDNP2K%|E|>Jh_a$ zZSMEeRUXdt>3PP1AZ_%;jGw>{g&(popUgTw(8(*k==~&l4knP~M6v4lbU>8duCS%bG$YG$H2qO6X zNu2tE#Me_P>tDXhT=++$L0G4~ADnO{eECRuxcCgZCN-vDJEy2NBpV}KQQG-=EcQh3 zS1|J^3+EPd*9?VS7;8ma+uaQQqVpG<`~B{xp9(PYJPCfh7McImO+UQ;#}fP});(8J zMqK7eCY|Z+OYkSAe-->)Ih7BbY1H+31V32*uJ26SNXYD;A)6`#T!gwj(jU%USK|J9M(j%@#v$v5D3NfAnyOu9{*ASm|P+9Esw7?#Un`38Zg)?ZsPG)A2L1f^~dcyX8U2ugl`K$&9%Yy9H|pN-2s)>0K<%N=MBEl|3wjP__mmZYF@;6fDXMFd4T-L3dVj}sza$j>2Vexy zG5A^Vt{9s^?pixIYyyq!x*goLqVt=FHk4nAF1{zg&)B~`_%ZT3A^3>}U9159Xfpq@ zBYa2E@m|2sW4_Bo==r*)^Z zbyyS>WN$+YlXikjvetGOKnw?}EHAee(ktzRq^6W_?tbp?Iq&at$o$Enhuw4_$K{n? zNxCqs11}T##u8s0m4C<_4B8NvfY`!|3AUJ7R{ipLD!`t9T%U6Qi08W^;m2h^+jFHY zzD)KdzrN+@530daM?99Szo&RNFp+*J>Eql#OM7DwI6e1g;OBZTJO13J{^Mt667DSh zJXQ~L0Dx%)m^J*|8bsZGJk1@i;_{g;&iH_SprKD^w-5x0uBhveg1(O&~X%KALU^H-x5cp@al*D?&iQAzZ}_2uryIb zV?FtW^YXr5Q$y%g5yIiZdwB6%8c4}HkkRDJl=;^T$-;=f3~hIA{Rm_qn11RDUyloW zIG?#j4|aaDw^LQvz8|{>%$EK2FJ2CBPZr@Py0hFXK6L&teC9;yAG81I%>UKF&mrJj zUG~4f;J3dD@R7L^v#4_@g;%d2}&|Bc|>M|&|#7jvVeHum+{?9*gW&IM0Jn)62x#v6Vp z;qh@$@5TFk5c;H2pJ(FPZY5sxf&Djc{Nscy%FTRl4^;<~i~xTc`Q`q8x$l20`&};i zBtJo}6d1rUdzT}=6cG4XwR(vcJw8in zR~C7an1?9`?8#%K$0nXpe~+30L>+!LF~hIecmebo{4O5o;MZaPX@~}l@=(&xI^NhD zaD)@z5>Bhb5t+?3;pB=Lf1C(R#lYY`w37LNJRV)gaBe{6SIirrQY*+)BZ$_``hRJ1ii6yc_y{^vLmn(=rJDQAF|92Wb|II~iM-aR#p5rc__>?>PHjEq1KeMwZ-e)$(?R+W z7BxuKD$odR0|`2_Mk+XYSdS0Xy6T-SqHAy8dX)Z0vzZgRuwv(y-Is-}+X?26{^rfk zyBCP)bmosf{+ALJ_9T;j_|A_lzP?)7|HnA<-wym-@)OaI(xdd;n@@@E_3Lu-L*FCL zAJq!rU+ZV8^M#SJ*I}(uldhJIIyoaDU(?0CofoEamZa~(0-jt@+7H4ULF6MqM|F_i z3+c6RLP+U*b*q2jXRK@gLnqoelFKu624y81w); zGCMLp@9RScfl44g0`%yfo4`v%d+NVnkpsTAzC{0L^pcD(3{R=M;{lq=F?0+PDhAz|P%b%g`?Z-k)i{FXhzj(~{XYfPdLr)QPKXP48&P4F< zbVjxFx!%0TXf^M(5MyZbVTdJR<@Ks7?mP^B(t)oXQ1+`ZcnY=Gu;8<;g{~`jfZy6q z3Wo(-CwJY8f4;ScKkY&n9eQ}KA4NR8D<1^a(-DK726*_zS$|&pWsm=5R*yYD{QMdG ztd&p8J*Ws!@M9AY;6gS3dMk{t*xi84l-8AE8fuCHl>jLQ0O+Fs=anGNE zKw8`71)jvxv+rKo=3~N-7kqGYFWPyrnh)wdgUpYz-BUm7X;^f;vyXBfBp>Gc;6tJ< zc%1K}EikU9N_jd&i@_t$csdQO+_r4#)*xti;0+}Hy^LYAE`0cqdGN=jRSOx6bxL|I zrSnAy!B;#@LeGziaK3O-ZPlTZI?$HcbxjfGzGSAK-~(0_PFipGkM}B(vM8#nKN2!KQq_WM2V`c z^~QaLUI?vKD|J~&WvG^x4&+YNtX*rvSv(EE-~9jVy?LzWXO; zh(acrQ4*9v>48j--92u1x9zH~D%WziZ}~0n7Cq;@zwh3%tG5{#=%uXky>;(*zxyq} z=RM~<=Q+>uI%ltJuA{Pp$ze==97mrm_9ymAS4P3l%bvz}e%m&l{QC(%ltBny4A*dN zPl}rTIZJYtA4T(TVB86S$(XCnf+QlZ+*G zpR$U{jkjbTlRGaTJd>~AG}SlF`cEGv&yazh0)GBC81AC==g2?(SCoE2_+OMNyHVfE zl#w(II1^y9uk`Z83{$cJh7O`U8*&yQPZ9Y{tvycnOT?Egy_tt}WQ12*eQ@MuSuYL; zDxc%ND@C!^V$!i5XxI*1KCwHQE%s>^J$_^nfkFrKP9gi85>k&JXmM1Y8=@l`=)FW@jAJZj32i?hdrv3cvG2HT%zYD`y}RdiL} z;>AF^s8Wi#ij|5UlfAe5`yro?>4^s}n0S=VPu|K8mtFq&$A2KvX9WGzAZETM`tTNEcWa(FFj%O#xmod_q4Hnqx;Ru4Et?$t5+WmHqx*ONbk89 ztFm)w(I(}&^2daqM&h8NjxkxE?|<|>-u(+`fM>R1ED@Add;lzhI-_n*ol8G zt?g#x5Z3k!_>rM7v4=y5Be@WO-1EPb_D_bMtVy_J^EG+#@7j91Z9GN7JGu3glzvM4 zcgr|;E4d5Ui!C<~0D|ZPK#RN=MBCKoXNMkS3IIK_0OkmyOzO=HC8x*_fyUK99;!S} z`Gx3{dcO#KyeHqI@r!z2c!6W69|7>-NeBCPj`IprT|E3vS z>>%8$u#-c||4W-_f7ob(Y@!_lL_0#ukI(th$c{DfAJayHOa#nT5p3X+=)J*5iXn4R!o99Oz z4N|?1%{)y~+PUn9+^2Euap0pB$nzXZg-z#-3H3ey`TveoGD(eP%~mnj0PC+5)$@i- zQxkPP_xoAWJI&UY$v-&z0C>#$bKNg52a{-p^ase088F)q@N=(O+UwZmH2`EG& zr~ORmO@lr%w?EAvh}ut-dtCcZEk4G9cnVHp9|6Dods6iAtbdv5-%a;Tt-c*qRQUh^ zAOJ~3K~&PeXI;?^;lE8=O_3?EExzzeQ!VmuW#mNUCX9Es4^ehn` z=|6jZ%b_7HzJxrS@(jfqkw>k+0@FXT?I6FNBDdr=DoO_I>O+rT=g8p4DDOFXkLC3S z;df1q)GAMJb%xuILdRq}u#udq{+Ex^vwt=ZE_$aU)^%AokEvox7f(%@TDCz!;4^xq zx7X-AR|npvoQEbS<#QT_EoQd^$iDh4#tA~xT zS86-=)+lZ4sq%K&wmSAo+eYax4DniL%u*+lhapmc+&8HTLv)?$22A-O^2a!6kbd0j zw^836Kl>9o#~YD)X_qlUhu*ui->Rk}JD-yp2eRl7m#sdm2SBD!Sb3KDGH3<-GCC_S z3$KO7XfOYj!kM#Aw%bDLX!xc)hC4a=;1FR~-(urc`u>v)cxU2y$>xhkd6AU_`N;iz zp52$Z1@RS~X7?W*{3${`Ijd0)Tqs5^bo{$5JjJAA=g@m$)XAVP*#M$9$hnF5<3pgZ z|J=G`w;h;nV#97ZB-njd27PcF*7oDoY827jiTZEdli!TIii<~tfqA6+*oVNQylC-x zNvq%x(AN! ziih7$8p4N!Y~Hz0^p#rwvceBHDT+NN{-!~mN!O2bpT#_)@MF6!d_?~r>nsYp&l`Do zg?5%99n1pY`_Kd6skD|dn0|vv@A=qPL)2+VCT@}qSJU-flr|t`h$RDy+42{07k73;SXDVv71GSpptD$6y^vlLqu`_ zNVG2rL1FD>yjbCPOxeKH|1WMmyu5QF057xsla1HJ0bFwSnZ!N(SjsE_|K8I6vbcI=N)-y`thK^@>e2#<^zU@g90=CIR<*ddg@c6(*TPOaa6{8wQnNb zusz)xHQgK7>X_e;nM$x^Pp>r}{XII)&okD(dlmHHv1~I!*kka(TSunOxgUaZdwUeF zwCe%XU#hZFIVn}8zD+4^H&Kl?_z+^{ebi@F=-XwSukYk#q^Ozg$`M;E8kd)G#wDRA#W1z1A3$Ds9Gow6kTa`pwAZ9$%>I z>q*aMNrgN_?Ce!WXJwN00|tJ^6qNT-wN+3mM4hnx$KHGGbh!PWioXjsd`Ml5|5%P| z6xGWGxw@geSxYoUt&bUhzK}$+%l&@t5QrlXJ}O+y#Vd;~K2UR`TmX<5X(b)!mYZC_ zd|dF7jbh?i%s{w>2-`2T7K^*^l&S0-ewoOYOaX@m6PQJ|%wWIVtKtQ#*BeyB=HCIIjwb!T%Akb4a4vUd+{ z(b{lb&Ca|?`O)GVycl=j`vo_kdZb_O zEUlR9l_$DX5em<@zkmMPk6=Nk)+Vn`$5`u}V>4&jxXN|%dpPWZLJQa(9j5M}I&IpN zhM@+bo0Nu|TopH)O$@8^xYah$I;5jqg<~})y8WeeHt+KD;n#8G$M5F4|EVs&bO({2 z2>t%YP53dc_|ZN-@=x8Hg2P{%n*Ub|ekS`qK?Lx>O0Ut~hZo?lhnZO#tDo^#%x1r{ zLpRzc8slcI?lIp#to5CGIX_PIHSKcld{l_;F)Ev!_oFgCjY0WtP_7Cp=fu%JQ?BoH zfB&zOg0tSZv%|vJCy&^I^jplRS}Z7U*Q5hvxzluCvDn4|fb_pO=y2*@(r*mew#n6Xf>j*MVDT4Z zA7=Vd0n|^-#;$f75PeYg0sJxcSs53Mb>aN(DthnZ89huN-+t8JT;IzSzLaj?A^P}p zuW-S&OZ}hfGWz{Y`eD#zO8qbS`h9DI|5A&OPdsM(3)4S=|Ml1C?z&RP*Q}bO-REk( zgh8UKEw$DR+Sq-}V7ZwY$NLtW+H~AgU)1e~qlpHjPq3D}S9MCkQ#Fn~WT)N0S++LG zV5tW(gZsm0|8%18YEqztO1)j!bJqA*6*WhPM1COMiOu)K2?*#!3OoUxQ-2%mu#MZ{AwgluH2qsHzk;CpktJ)qF4LK8DTRv(&qL@$m4K@XkBGltWnatNQW! z8w7tD?R`}2^Q{>9zX|Zui$wKsW`b?C4UIXRS7zNDnEkG|U8T(-5BUrlcIcS&`SLis zGFrRuJ!Ctm0d=Evh=Wet>K}%UuB~M$X4a!gA)4dy?cY1*)eo~m2yF1AoGa`(qVVjA zCpc=vv-8q=LohM!?KqVdD#^Wy{Va0up7Q z@DT#$Ns7$vz491@K$JOuk^f$D_?cXLC&wRoP@EC$d^sl{e>@(c?PUSSG^tk(1zEja z=Jk1QA3a50kt~s&>wGjD3h24zCuu&X_Dt;I`$7OB)yE-#x}P(MvTYYTv-Gl}lN@{)qQDeZ)Th`}X6NhYWu0a~fSRmCTD^rdUBP=x{9s<=Q5VH{6-ARqkTW%2!FL zF7-o7)h5Q^s@Ul_!M>JGm5vw zlU4vf+ioCNj!|nJ&3U;0(s{V`=TMBJ^)p#wNgXbv9vJ^>)>1k>V`i9Lev9v)m~XO` zhmdeQv{%SL)&L-wORJ9sE=d??2z)QR^d=TwKs$jSk6H8pl40zAM^PY7JOT3!#RiNs zfik!v%SGj|*r^JOofii~95C!VAfb^(Fr_oVpf3)*y8{4UD-OM~+D;-h{+qV&vVR_@ z{e}F4I}clUOI^XABh^OFzknaYCus{#v-yhh+>)MS#!k_=?P)ySQ0U>>kDryz#IW?@ zB7rTx(cVLPm*`33`TpJ;Q0wDxl1WYD482ybX_h_x-F3q)Mg{Q4L^H<*A76Miee@5R z=wenb=Gf)zbR^sG{s$KMv~nZ@{N_sAha=ko{9d~hx0Kb`r461)ze#Go3^k~}2R^DC zk~;E~hr(5j3u~ zoli#F)Q#};&q3kz*64ZBpmXphYisU~pZ#xg4hNVI1DGdWK3i>r{A+4zuN*w&w z(yc^evEdS;kJsO@te({czv4p**Xwqn)j{!+A&jc?XhBz>c>? zgc;)6!~TDs7j(81n9V=&L@S&HJVYgG%(hbWPgQ4he^B&`Ta53>7%#YiT1A@a*?;?r zdFC(2pi@ds2%#s}n1pSc%GSL66+=Ga+e-pMl}W{*aFz-pEtrfBp5>>F`S@8Q@2|4}b2nopXuia96hqa0i=6e00GwNEcpPyefs^LO3mG&xjw|Gv43}j*vF;;dcPQy?m-B#MID%fq;pW_?)bSM^>OSHkc<)`_cPHl#Yn$#mSe4dL%VRl+E0C$8d^7P3h;$ z_XL#eJ1vJm0XDY{@gTw_Qjj$PQvZuU=#uuIBiz*Am*E}h3`n;CI|8MnQ7i{a86pv1 za6id>q*UR!&$T_z@lUI_cY{4r=U+&Bg|g$#ICwh9c0l|wnJ1Y7w*zrs1-ux!W~z@3 zIu)sTP1IIQ)Zwrl&o(q{v3IQa17f14cnF{jz|1~+{IKi3YDXq5?(|6fKcvH*)gNrPy!MGdI2qe)_7B z|6!$$SGUyOrdF|;>vXo#xo-3mH?EnzV9kjc>@$@$>z-XPO}+32elT?UxPJOfnQ&`|*73{o?N;+$0&c@r{cQ)Snk6;iciDX%_St2*Uf_^_(fB*1= zR1BQ@1IUw=7DjfF{_`TpX}p%NPykh!dntDX{5)e^cHGHS9kaUr~unkLJUqTzW6|3GEfFxSliEkE=!UxMtCLU7eJQ`fS&`v z$)mea$jK|m7T!ErCm_f7@g00%;N!Lh^cPcqQu`+eby`bm)=)wL4w>$1L*u#=3vS%M z=&*!mU;+_!KI(m#a75a(fu+1>e)3Hah9C9*Z<(F(@Bi7;hNC_|<09-aq`&fg?aP0V zl8R<%W6Wb3wav<4P<&9es&k&}Xeyh1N7NtH8&$_(ZO)^br|4XC+n$NOSfRz|;?c=j zeAo4{uAhwg;d`mugq-{`J>72-eHZ-nHNn4J-BKr;TFnnDbs84tz&ag|tZp`=ZSd~IW(KtQRjq?Vqf3UUclCAG1_tZrCB^dp?D0M$s>X`KpYFQ~Y#L?>P%)8w${MSVB zFvIzRfil(WWixN>Xm?T+s{DzEjxA{V~A#%9Vff zQ3H^J0OU@94CipVk4%B1bRqk=+MLvUWg%xd2)Nr&HUo3HQPSew)}LY+y4xW**>{!9 zfbV&#My8KbHn3~?NgMAn2Qazx!l4&NCX>i#QvOLRO-Mf;w*|3RG6R+XmsT75=GRd2 zRYZ;DLu6cU$*;DQ;I51Nz~d0Xfb9u6TKbk142UPbyI zcTR6^Exp-e)sd7PShWsiUz4l9_S)eqe@XR_^E%$hJ0_n^Rp$Y=`_?3Q`6X?09!xxc zLT`-8yp;!$A5q^qN%>P+#c*ClwZ5G;i-Q2O@pjwBZha@OXGi(zLiio-4|#Pd?Z@ki z0iQ|b_Z^Y;zlk~iGSDM6|EqNO;alo5_?h%Gl}5jRG_}2|v^ILQ+hEL|n(1*|+1PlE z)F1cpuCAUu>+>ALKootIt?H7>5eGpx4$9h^95R3~8mg`S%Jy@Az~}7`qVC59#dS6Y zZCJR23(3&p$tTG+4fS{Kvcu1AuAWD7k@g$Xm;wZmR90gn>PRnL4g&^%MD(A+t*nhk z6vrqqN(UL7Ddhl<2baTOQVC-1M4VFpa>z`JJ<6QE2!)D1po|I&nJM$^yON_=fbsgS zasW)yy`GK`{FOJv?>i6lq}s9ebj6SysXw4>n9O^c!X?I;4^Q&PhXC z&Yc9lk(xS2U`Aoc-~Z1r}%U;7FCsQJ~9 z)7h|1F1R?Kxe!B$TXidq_pe0wO1D)TyD#6#>*gr`#wRxE77<;5|Hb?U%X}`T`{3vI zZ3uqJHm5&V-yn5)nh#_j;LqT{a!Z}OUaK27h~60X%`?4G%d1Y`)1%!xab|vG4Fzim zB>obSU+bhsT~SS2GWMOZ`Ve;ZrL0?P@)%4Wz27LJ8cSS2@GDZCuCy}e>A|!2hqwQ8 z6y~@vg-Mr)ENMAxz2?+jdxHGgio)snPTGq@0zQ4b)T6e1TR4jBWVEH#2AZ0KD$9Sx zSx-u8biqq&4?g5kN(adl%0STMzlW2E4+JUNc}>`)5G+0X$(uk{ikIOa)V@gdr&c3- zB40}L%aq`b5S-p6?vqIr6?^W&R}`mS7Wqt_fuit3M4gs(NR%(qo!!vSG(szVejqVA zOBq8lcuV2ByV~*r5XMo;1U&6>zsQ$3<%ifO1kx1gP=U+Ibl;2A7wNnVM;SVBiGFKy zMqe2X{Xc8ab#mC^5UH?NQJK$vKYiqnwzUmwr0rQJ5X5+E=6m~Dg`7ejCF<)G<6gaq zCTDAMR*g;Lhe*gsD<4ujBVBKAhlDx(@}=D`|2 zdh1%PQ{y%K{WQ|RWO-?p#d8-O%=AE-&`col| zAImZXFLK@@;t{WRL(6AA#O!f*>$c3zPkQ^(PQv^@M}LT0qy;X79+P@fd$WZ%fFEU| z4*=qeb=PK-+w<3_9azXgIQ^Es0C(l4(gcG#NH1N3Li~Xjz&QvBFCxCt z4C=V;DXcrG<>9bXEE1+{fjbFo1_Cu-q(hAr+<_iIaa)+nog&g2`c3VMp3npR%vnRH zQO2rq?1JReDbayi{+So@^`EI*7kkx4?B*L&m%XcWTi2lDs>R8Q^)T7{%eeNua4TCUo-g`LnfqG#h#xHGtn56^zH3CzhmVe z{t=*Tw|OUvn1{jOO{_2&a%nyb&I zZ~(X)X2eQOEdxNz0r2T?v2BM70(`HKfD^gMUuO;f#hm|+6f6TR{2YoJkOLo=0L9LW zpQ8jBuKoE2)9#KEd^p>fYJS%J74JUz93-EdN@X>70l9Pwq}HDf2$lf@_|8zOtb9Zp z5YfKtD1hC^eNGHN??5bTzj+&v>;|v0r@2nlMWR!v`3kVv2HhIEQbqdh?J2$6Yx=)e z&F=enEH!SM)yenPFaQ1~xFIWzjk-LG4_aXG$v6{3)wnPYHdk#7+q&uOtjZ&;$;LK{ zoHxTUI?iS`4Ba}NhcQ+UZEUX8QJs$IG!99{Wtx8g{7>c8!;p{fioTy-6Ma8E6^;L+ z(|wOdeu?fMnCqWRqvf4^U-SKP&i%p9{~<^IUp@Fw&h99pXXy5WWBvTns&#Kvl{#~j z8l#?cMg?nB>gp(wWj@NKP=Jz=2!S)7jjLOc(4!$u0Lh52i8ULEPu(T zrR9eg9^nk*q>=?F?t_ECDsKT>)ClO&B9v*GNq;}_0MmXzd8G1_!Uar+0n!O+i%*>i za22Hm$l{^G0hG^08CZz_A^_rhD^YzqG|HC*&|D4(IN1^BlI&NmzC!F3;Sclwc<3l$ z8cgh=6Ot*9BYCL!!1A-F9+ZJ)>E~2F1fI=itpFzLF}wqE4>I0~5{>$sO{_E)}t_R3#DU0-1@pD_uxZ+Yo-z!yXBU0bI#bLDRB|`zYBhz=EI9}=P{B0GWZw0 zRomf2&9pZ+t~{x?PgdrMtiDpny9PZKl`gM-}-1@_RW!4@G zJQz?I|Fnkp)D^0`75}EeHnC>uA!U2G`UU50**@2?@M^7IFA8LKJ=(6It3lmNj z2Z1ZW@J`u*c-?vWsMaPyR`qik$)omtOEFN&@=STgJY)0H@#I2-8Oqqyrj*nH|@q~zZdK*SYwt) z%Ac<+Ry?={6Z%2-qt=bB)NQl45koZ()(={HpSnSXx@HH~Vd!)Uqp6M3UJdiNyU+i4 z&S{S?b3T?XCgoULZ#C^b_bi#ZqVAoWunXYZv5%iD=@XOBy5YJ!`^d6i>5`R{9-l^V z002Ma!AOZ^stx`Dd_dqYl7XG&mSh9MB@|>%LpVhRIJNR7<{lxIGl2qV0sSN@lHCE^ zUPS%N*@;+-mE@tQ9WPQuJ`m+;$WRS8{3Y$*6#`{Ekn8(P1|NKIAmTeMZ9Q~0@SNea z+YOYlShFnZWbkv@Ao_cJ9f0S-p%7?pJP+cmqoxiTgK}u%af5fkx$*;xhcr{3{>Jf~ zd;g-VkO@AmA~kCEH(zxh`SFIZ%LQkL4OyA&oz^Ytz$S(eV2LuOu~l1DwJD`4*Hz+F z->SEfiL#nze9xMU=dAhy5pP!7&wEZslzqy)!0{`E8aICMvaAEnB zisnpj9(HDFJ3ZS!(y05-7Qyb9)E|uh5H~RL(6E8&-aPZw4{jJBVU>I`|l$i;38qrP)mKKl&C&6c`bcVzmmh<-Tj zEcvvloJ8yq(W(G%m+GUQ$L=9RYzxcP04{Q59a49*rQKwxQ3?_67L-3sCQfa^!p!fw z3|uLcZU8F{rysh=1O)h((%};M`K~4{K#BCz?_{7$Eg(K|bguvaAOJ~3K~x75UYY`Q zcEO!^fg<{0f)9rZ^!N@|jG9|^tPwzp56!+usxNk0vJ6r)6R6Qi zy!nEdaiBa9K0}n2-`B3_`|CCR!nUIScU|#g#ruei4su?lXn47K?q6BDD-TUf5w1O8 z`D0xhvY6?KU=fpvCdbNjp@IuU&K6_4l}#}YIVBs_uuXAcBUpZV7*nv&@%z;DlJXDR zm}hm!=E@R>!ei6^@3_c6T}a&OdraEDIC@LHcYG=G8;Sh0tyR&ibi7&Xe5KO!1FNep z*tA$`<&0@JqnR&S1>$c=8+a{ifM45D-Cj3OoVnRmQ^jpY{z!&~Vbo4Xg%n+*VUv^T zd^dZ$|Ll(w0DeG$zomVcd`!UR0k)}imKE(icY~_s9&K;k;noyy_2KEhBC_F$KTW2> z(77A{(-^O${^A*^5=1TdD2_9H=)lDW04wXYL@6htAtbxgx@`gfB*+!8bC;r|_p(Dk zBK6eflfywG_eAns$bd_uqYy_^1A@B(g|HJK$^A{)5y$K`I6CH)i(Jzi#hiKjF6_`-BSs0v@GQ)nMq$=NO}gNoNRtTc<(I z_nFz}ls`hp-)9$XbjGk{SM)9_HDY)qsg+MUwdwq1OwA_dtIsb|Ka2Ts;JXa)KbqYYgE)`2I-yk#*bUx($|=p z!QX9?y+eB+8my~qHEvZhs`sOEZnD`=dfbj$X=m<)U;cqjJo{JK-%TME7hNe^YZSL1 z7<}%%_z{j$t1rGo8WEevY|FSWn{y%>S)M4vRTu}7*ETV5=KUtJVVXP z6Y!iZNVP9@zv%5RJOUWTlYpqG{U%74oM4y2PwDy&{JZqwBKpfgQu^Q}!XskKAyHEM z67?_cuhjgz5&+qNEa+6w65uaLJ(NI5=h3EPhux9MJ5KO9bC9JQd;k`UZ+7*AU?{?1 zGtgYa?T6@$%OP+J_&s8S4u>Tu8h_XPn68lkGa{#eD&b*;6FbZ^3k%(*RTA*SFQQK3x3r6mm)vF|L&brHRuQC#+9qO zd$KV$ICDKL)VcPyn$7ecjoPa%Pw#6}tE9XR(W}#OwmkFA)jZeU);V?E$gV#Kz&b_c z`_33;wb#LYY4eMJHs$b4R)|289k&3Q+k0A5bLEKUA9{*~KbxC(imQ+G;AKKkYJ5{W zJ^=EFJ#r!d66H#X+Zo0ZSW6>Xe#lfQd-fIt=1}_<4c?9eV1BSfdL||d0aym(OSBgP zkAb+0))x_f%HV~?7nW}KTxCR2evaz^sqCl!NiHIU+|K5ghX`b69^W5^ovh}qy{yc` zx-RV4^PY0q&LfhFG96g53#9)d6&9mU0~Mc40bF0`esGHp<2=F zeMNugOh`WIKHxx;O-TpU^1u9ue)gwf<{pDj7~hR^>x@!S`7k=GlgdpRZR%~^$7p7` zMlE3RjzHAYCloDH)UVEcjQcLCO_R2Z)3mp01^jm(=B5hy>cKOQjr`x{;Qz6bReqY@ z-{=1oNB)IX&AUczhEo;c@M9_+4?3;uBcso)sb_=kqcK%G(~b3J*m~nAAfwmXc-2vB z*IPR9^TjfmH2QH=ko+oV6yGREmEhl`qQ2YR{PhpVdw*OwKj;S$d4AOomeTu#l z2O!@sj9NJaN;iO`ccje19Z~2(A`OBQNfm%zV!pKfiYky-uu!6wUyDSmB>VbAJXF$s zycbT>({7+2T0Epwl~3AUSsMEB}c+bXWp!&LV%AMLei z*oHiB5Ax&E{$CyVza>X{ch?$Uc;8sfPxOwNOU=KqYW=QJEx>=Z*7ac2{J`n0cLqBB zMj2hrj9w4HHg?W^f3W@#>{>*BqtvQbdz72HYi88|=U$k(XbYVdyI6zy_q{i6p3Pfl zpZm8x4Zpb%lpU21*S^2@~Fl$lQ%fOrOqbZ6(-Q}_Y# z_LHv*sLMf6MrGx|n?k$XXyOi}fyhKrB6a9<(_o$^vKlxxu_dFhm+)kz= z`C!UV=_~)i4fFIrNSe3IUL6VAPt z6n;lFTTLeva4VIl3Z-K#Mw=^DEtuTttN*I0A@mc;u(O88C4((ps$G7G6GgL ztevBjvAzP6Z5RZ)Q2Ft1nb3iZ9-j5lq?x z2I;Q7CkKGc<(Cv62MWvxaTu_}jzn;@EI`_^PzWFKz{+i=?!W}nY3dJ8vL;O2!N7xP zQ?enxUtV!8?7f(&5dF~d0X^$F`d?4y^b2g%F?AivV@a9jrvBf)r+MMe<I(GxrWqNaxSj-M^5(z_#2;dWqqu@iyg(JbCUpmNP3$Z zEPu?8i~O+dzIp2weeY{m^XlkEzWzSK@1>VMk?H5YQ_MVmh2Y=Lt;(j;^@!+yMJKrQ z2WRHdvFgvYGd+Z0oKo7>sKBFz=toDTy4=jSo_L+w#+e1|T9TIxfN0d*_VZCyR_S;8 zFaI;E@#IGYL6FvfNhqT@NZH|;M~ddxpQ8EG*J(uk|D|_D;>#ctg&()wisGh%Qw?eI zeWWxne?OUTGx?{oBNZ$DUBaUCItwWQO22xl&7~eMeY^trDV$4`l@xy>3#Z8a0nit+ zZ^|I1mfo(CxYXj~b5Kqp5kg__Als9PpaGzVY7vijG60eEd+G#$NG&EI=xh|OfwKg# z@hXzT`YlSdg`Algd-++^?jRv$k*TKNK0l$~+?>;AyNdqC@j}WC&M4%dDR0~9tIhL2 zy41_#AZHI#hwSOpu`vCGMa zI71QRT+~!2Kb+?^wO=3n@BDJQN%URtKR)sk-94%viTo$~&#CkEeRb{HHEK3mt+vN1 zoUZkDX4KiL(@!*qYPM%}+!|eJZ~eHj^W~u$Y%q=*?XdgBLc1whK(4gzy2Tz_dfBc& zj_x49>bv;+Ii-}!CGoBb}FlA_KsMIwXo%Hc+|=f>aC5F(iqc0pR{Q^+zP+nO`xtn2K@6)a1}} zxtK3HrDEw{&(MDH;QQJ_NR`W9p1Hm8x7ty|J~24T~Q`wqZQY?O`BoVeYBW`k|3sH;l1*P3yzAPCoZ%GUa^< zfW=IstlQ!mo#*E@9e(U(a*G*lZr-K-y$39}<@n3_xvce`Ch|Z6!laXjTDGASwP^n# zlB2Uwk&4*y3#|Z34y?Nhly#IgS&_aY&s)LBH&n=Sp|-UAvE(SLRSKqmGcSure`LaXb){e9Id|Cx4_O+xQ3R(i3Bt{+44 zH0CN}GRK>?9k<|X5b>Smo<3wg(IoEaH{{ZB=+OI*)xyT1tI|Bj)K*nI9nSOd!<6^t zEvNiY_7R=X+M{tX7f<3 zwnha8Ke}U;?i-`#n@*qaIlTv?H8pBoElrDoox$kFYLn_#kKG9-c(rbn0;AvO#lm-e z-5R}3dYezwaxasq0=xSn{DTniCK{#h_}ibjx4HfAKqDw+cIo>wsa95GBgL;OI(qG8 zGHpwnFW;o$-ihq#V|QN|c?cJP-9GqZYD13QYv5UjHrOQS0bp?eI5Ghl05$?Zq9TA{ z;}L*mT6Td4RkZd(^vSjgJ_{s(PYhl`_YU$?K>t81Z~BIu8xvUNb1@z&hsKoBPsV@z zSXiONynq}|ApK-*)|5pssNslQ+Nr4LyC9kXF0r_sfth=0MQWJvD59rbPd~J{$B*GB zAMVk6US3Q5{KQe<=QQbeKVE(054Wn?+MH5aHmZ-t8kGkd^ME~ks!<_XI|A%|%-I;n z1J#KBHt3ja&MDZa>X_8vQe{FMsAi%soUL{Ax-kIYgE_+#$pS8}(x zmG9gpdUZZB_+NScYI^GnV%?3~o;+3d^?mC^{)tPP*1cS$k>9X;Z>jkK{+)IA2f$z9 zEobnrHV+j@zq&PQ)1Rq$j@64qr@GS%?R2Z1)-@*nyh*Lmag26BGo5OsRqS}=m#g*) zN}JmBJ?%lxv6#ipItJCL#bQXd1&4#yFYX7uyQ-@7=T2Y$=hx%vpX0IIGWyEEF7&s- zm@bxVwly8T_6kq;oqzEr`G;p5?Wg@YJl)4jH$de1O|!Wu#RMLZw=tqWg3hOw>QOE=wD1s_TnRM{4GYBrM&4%NAZ! zEzKjkms<&Z41!^oh`%HE`0-p!{mC#8K%K}I_8wyD5gl}X=+mGRx(Dd4lun1vY{L1w zmJj#<`s)vu^pz0@Vv$BqrHXVUw$Hm8fA|W`Z}J;iRVK9!PYTeGI+J`>FmI^H!>9v* zXL8SBP9K_n^z&^}l}qE85(GV9lq!Q79|T`aXMUZxE1wqgC(^-kmd5^s9}2)fZ}#)h zMQ-yg=U4KVzHloO-Jw_KS3UrKS=aRs3;Y*U?W0BA*Z$Y;r@o0FD%Z$AM)0djpPdn1 zZHzkA7X4adqBqTKsTWSEwc6MwSmT;TueQ-R<#lC@;pmS7+}o=2Y97g_w%+!T{j5^e zhUDg|5P&)=lmaH2!G7-KjXySe|GlLNzU%kHz8j&4;|(eH`agK>Wm4AC=F7LJzkenq z6{0!z#|dL62SVu}R5O$TGSGtqAaYPBhXja5a&R8uzu*vraYuwLx_I=%r|8Rj?qw2h zYUv4Qanao80KH2Kg7tIWw7cNPBH62X^^FN&m&T1U>gj zfJ5YAZO%G|LKbRRZkMxz!7oSH^VOPu=lmf@{J(j;q+1@ZrFaAErl;gd+){Z8Qc>;fo67~H&rFz5x;1VML*rOR6lQSXKQ1f*$ z^|Lzpah>(br}|3DhOT{0@JrMk3X-E0{%ME6Rk;GqOE+4|+{$DjWb(T8V>9F7kF2zyw> zQwD8#iD%o;{>MH_##OYrb%%z#7y&NZ^SC7^^R~hP2YWf;uGNTY;yj`>Bv!@d}kijRx*>3q0w-kI_T<}D|Y z&D28R_Fq}{S4MYt%zlwaGhs)N*5YUsCLS1t2^W4p5B}`(lvM1tOMl)7Kk!PmqJO$Q zp&={!A5WJ|@-d@dNWRIG6VG>P+Mj&cz4%uxs{AUM)H>KU1a&ra*5;H|j8r+VoWVp- zHpb=@$E>JLEaa&&6MdZi2c-QWZbHs`#zaK?o+CfNpR%6$w2z;w6BB-Iv&;_iMNEuN zk$)X>x44=Q_hP1-H)-=#di>L(P8fN7^3_jfaqRzQefz(aB0oRDPksRWce&SZ)i(qF ze$*=I4lB~kmBk)3U0TJJsam5|n42*L<0`MMYP8qU)MlY-tohc_oSlu!Oxm`yFdz$v z(ZRgkjJlflL`@3GR7UApZPe*-a`p44U;K1T@e1qni=7vXc|Gz+T6TXD7G>HR5}2qiO5JqO77-X_Rk{=*hUJN3n;6+Kn4nD01q--mVV%HC^~$A zy$E(nk58iN4!9DJ<9^D;^wDa==A8f2=^mX%(K6sZFY^cZ z^^L9n)@$u6f6;myRHcocYwJk|yWMufDksybs2f6tk0Uz`am7pT?;EzE-{8 zsG$w!iTR!exv$yj$LOk==`jRDF&I~C9dmCH`D;Xfr*zy7a06aA?UYvi;K>ubfwCX; zSXFJG+}v>bpNz8EoQ`KV-a7f>AI~{2%7s*X_%OgyB);fXZOu6KvRF7 z%kIQFd;B)G4c&nm2LPVMMQe@~a%It`h=U5SIeot%?U-wrNWHRWcLF(c1FV~r&H!tD zU~pQb!D3xrNWEe`Zi)a1r$I}eKDl^EPneNzkCy(AvpMygrid}ej*x_-Ny=2~>hFF} z{jvYp!Ih_SW^~##MumK~?iIpxbY3s2pj?6wlPa6iz)B@Vd4r=qt87yZe?FxD06k{) z$t9huq?^Q1AM(J;uQQ_m2f-h+%Zo(xkk0Ne(|x)}^VOL5K5``=?p@2bZokCD32_CH49cPa8;fd8V`PxRal{O4<@Ao0cRZnTD3|Hpwp z>p{wBLRv@OEQ~OP#`?OJKYRs`ZkBPmh-B;|pr?h+5&o9k3J`AL$2LqqkG;10fV0v=O zIe5|zNsO3|$^nEj;=|R3KGB|1O_5&j8v2E8D}XQJq6_eg@rNVxOCO)T`X^1aooXwm zT8lxvP!Ho4zI+f!cOiI;>Q*J)m$V=0K4$dAp~tfLBY~AkBiYpUjs-r5_|c|3r#hYc zbzV@N0@D5uME;mp4~H~wL+;mynZZ9B^WNez_=lqIdmq#P4TApzqrB5wThyDolx|lJ ze*I7Wp%Q-I2>4}1_eI+Oe(=9YM40QJB0s=IYib?rh)tLq+E%tUiQzWgQN815g$Kgs=d=azwMIuX51p z@1D?bd@iXzSHoov;F5REP(%AI026BMRPA-n}%sFz|V@i!rHTnuaJv!r;bj$-t z^1}y(OP;>3I;Cf;EdiE4zn;@gkJ4s3P~hV~iHPK9H0ifrbuaw8d+p(wuT2$f(t4oL z4r8ZsO3JDb{g^^)QjOH!C9d_uXp(KP*F9%df&X{O!lj2~%>yDn+CF))#FT#yVUrQ{ z5%HJvI)x!~y6=aS5BFwi9FFtY?B(Gr_cOqMbM5mB&ws24d^|_~&3Rx=|6AD5d;ECt z{~TDaoo)9ABmX}s;GYf|Uh?|5KbIr_G~V}9KXozSvs>9!Og$v+m&h;Rzoq7TSjJIE zzxjQ&+E@lZ(*C>0@93&Es;Z6Z2BYGt)90H(yLwN#N-L!Ob!Rl9KNfYV5KU?t9jV8H zEp0Q}el@0T47xbFc4~9t>Xc)Ph@@3N@*Y2}jl-6otu_@o9jY`N$u==%_s;6w-*9hp z{3DR&L9{a|`2>j51Yq&X26b0AwD|B-tOc!muOw) z=r39W7p}Z~7{Ius5TBE0p3KyP6F{a?+=_84R!mG}VWexeqwlRwsa1i8bN=3DL0!o> z<2PBE(#6H=Gfqy|7IF!?DB z(PfKEVf2)B8)NLnG+o76Z|6zXN`H;I!A^YeiZO(^$?dZn)!2hUg?;~^kpDJ&R%<`~r|5pRQbX~qV*WOD> z!`Dv_9)FAcYX|=IeMQ%<(f<8YO;2rNeUmP1D@R^<9 z-^|(o78aFpU8~F&UTR+WlU23Y{InxJy09HzrPPcO-Jgqt&JMoQuSx2X3uG5_U3AJvbJ;EDrKV~6HKNS z@(yh)t$pkb#b}Jvdi0V3C~vDxj4gm)*)e3DA^O&NVE-+naTq`drqF1k6x2o$|fK<{>I+39w7A?3zjlLB7aHc3o$4>f<$!D z8%V__E5Vr@#tfbX+(8d%vE=oz!7XWfRZigedI`rNi*Q%*UggbbXx1~yhHGfa-$ zKX|qN=zr48_s7m9qsEYEweH-Q$K19Me)2NEM(2!XDG{Q3&490%(YL(N36Z`x6-WGT z+vlb#wLZDDUUzv`gX|L>{~}i@RM1@_7339Z9a&5rb#}$A0qI%i2OqK zJzDR-@YJjMGxQmL|6aOtc}*9-@>BGwPkoAGjk(AG03ZNKL_t)qlpiaRAD@3qMgDID z{21-UpXHmMQD1sr>M!6YIyrxid;N&~(}0gC{j`b8xJv z%~c;(#<*6gfSNxVN3BkX{x|?gYp*+O+|z5nv8~-h@~yWiJ6oxSyfQ;t$7Z3E>7CX_ z=|LrvVz40xyQmgur@42x=P!Km_~su;IUP;IpyJ$9hJe_0M@j(5e9Jmd9tf%qmkesZ z8OR^63BLc6Z-BHAiyENViHlDFfLIQKUFk0zfmjJh&0dUpWHq(mUp|&KTt$|*Tg%0y z-zC>!Zse8UGx_;(ozJy{Y~?(+)Qh#o$Mc5+6YZ|7A$Kiwv0Q*P`s2Agx`Q|{+Ys(s3qV)E5I zw`0y1;Gd^?lkyU&e;Mexi2QHoTQ`fW_foz8!c$!a^glSt`)vV!IQmG)e;n&SMgFe^ zej)wtsFU+a<|}poWts0Ibw62+dOxmvz22Vaz5Rtk-48pj2!JQ)Ebu`j7)6sRiC2UKAVCP+5(|e=r&@1aWcc&5#0!c0=AF`bG?EJ5N z?BKPZ9<_FnLdrwz&H1)d#-w&`1Jruhstbv39=4L|^BDrYj^TkFu}?Lr@5bzN8lj{CQHhnP#WZpn$$4(&$6#$9*3C6F6KvNy%P0_Zqwo3 zm^bHQ;BlGk`?}zNqeT8)z5QeK=}&+9u?*WkzM6k}aPNCqqVfOg;D^@lXN#!^r~hw$ zMop>z1?eYZpOgIp{-X4|N>^#jU)uHiccdS6+Ex4Nz$tbA4L{a&2s^Y?Dpt?IYy}`1co0IvEp6gbew>*dOPi5Bci;4esw( z>V`yl<(Ce*cBc_x)m@gZ%?~cy>p->QDjvA#b%E zI~6xZ1N>b$H;JsCyH;VjN7^$w^&kL+__GeuJc<533?_N4>v~^h4QI{BQ9hBa^Qf`K zS*z$1Mn$7i41S|D1O;f=!wA$wmCWal?|$;`=KNpCDvKl4!EmQkXRDCioTyBFf3ldLx+EXI~AEUZPW!gkd_r0YvUQ$|aU;O#x%o0*> zQVPPf16P()_Dj#~efYmvwpZ_CQw|ONU^d;Bl7`MU>y)#{zBS{5vvmrg!(o~fy1d-W z_Zc58=JIvU+YOMO^So(ew0%Y)kG{UD9e+KB4i#L r5JY0=inC`A37L$%7Gnla1Y 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 Jv8HXv{{efgTND5Q literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_bottom.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..767e991efed40aabf82801e98092846f3e011705 GIT binary patch literal 11443 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 literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind0.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind0.png new file mode 100644 index 0000000000000000000000000000000000000000..543892f3b9e244cd07268aa26c62fb7b2f75cb57 GIT binary patch literal 225300 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 lchR|HsNoNzh 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 rP)q00BA(1^@s7dq(xn00001b5ch_0Itp) z=>Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR92h@b-i1ONa40RR92IsgCw0MO??7ytl307*naRCodGeFwM|)xGcZvg;}P z^vdDTJBT25q9CX!D%fH{BSuY(nitc&iYcbtw5y3klb9H5Fvb=u#)@D=nlz;!IKAvT zbYxubON{>TN>K7Z=e=JHfr zb$G{IJ7vO{*TVMGke;or|}3sd=NeCQ*7@I zd<^y*`2`CWux%OT0z<1;Po6bheSO)lRYGmo^;E}kIhyMbf39~rwon7tT7q9y+%M~0JQA9_QMJ9=&%{<=~M9z@`0g(%AMV4?auy}#b z0WbT{{M_UfpLP<(l^5>5|G^2Df9pSo4?Xg9Ev0%|?(L^lthVZT0scI2kpP3|6wh}Q z;D}sZSuMw6F^PG$#POH_ASeQef(Q}<0pJ>L3p^hn!ns>06xjSPUFSGnK;W{0J`P}J z;U1@q%bLxVN&Cqi%<)9Epz3l@s#NPIV*I2H6F5d#`r8{PzuqB_PBX3H>@&~MHvjc^ znz3(->e#ks+m;3hXux;PahV46(LCmBp6{#a^nlvk-K`c3Qu}Si(tmudz;? zbAt8Yx|N7XW<=ynGvIp~lX~yROd{Z~y6fd?++5*sV#+O; z6_5Sk%7`cMI$o!OA?hOUtH1%xXH3I`FnAJXyvCTX082n4yo|vTdOOWF0ZGh@ay^CwU3ajJ(8w?>X^w8~<-RT5Y1gszyk z-Ef07clrqH@YByLM1-Kn3W8pedOUJ#V^-$ayp<6@yc4 zpVL6Bnjml*XhH|MV&EJgtV}y#B%9kW`;m4KZdS!~0L53vuS6IiE` z_0)2nc@-l+|BaMsTUEC0=)hSW(nYgfrVGr~1>e(`fAqxlFRN|eKJ&0+XPJ;QCbM0u ztE=7gJ!UmG)ft`p+O7VaVeWZ%vsF=1nLpy%U-lj`y0+(qHT$~X2Z_at7t8Oo^;Q*3 zE9IJYh3^RzoMyJvrmQC)dct&9FSBavTa8f@#{;O$q}2w& zn-G!~xS-LtdzWQovSvh+%vWDqWd=;N=G}N(wyeIod&7pEJ!Of=`yp}MaSM_KW>?sz zkz$TniPcRyj-h)_pksM-y|P8CIpM;HV-!M2gcATdL0W;$1`$yLXTl^wBRWJF(8~j- zVtQ%Ya&7dKY5wl2>E`$mL#&5?v((V`yxjq-s+l?u0TkYM9Kv=WPpW% zI1$%%bkndTW-|#(B7rqXxqX|ZjkjJc_3ha$d5lRATo63{|QW+x= z@_B>5YG#es)ilRqlTNncQegk}x(l2{_d3Wq<~G#TyI!uF8My+^To)5y5aCQzAmBNl z_4N<1SD#zX09g+*+WW&}Pk3i9ec2WQ-4+cfp6K~ z7Y>cM_wI`YXPr5jd+W9(?A>jI8M9IJoAWq$sgWwzkT-#r?jdfckb+|Mo*R%-h9o>)9?>WLhW%?gW0Om%yO&1DXWy9>=2No{$XcD0U_}7jO zIoQ=7w|zU#`A!@N8|R>r0(~SXH4s!#sXZSmjvzr#gIXQHj^Sj_4@BEEB|%mN=%->~ z-&UUM+Q>~k@5_=CZad>vm__PVueY)l$! z#++?iHrkby74{c@dWZe17kApplDKu~xEA~HQMGn|)=5AA*7kvH@4$c@kEb77d`buf znnZ|Bm2GW8yYKN1FcyprHloLaGX>1YL?LqVAKeR5Bf106fsO&FKrrJ=K>#}TKzq>s zR6XFwpWz=hafsXXP+ko9QYZ>oDcmcoiU*AWdW(!Ta-7#!y$;$afDu|YIFJo2v^Q>k z%ev~pP1dWs2CSitRrZj|61%xF>a5>0kXgQB-GCUdfrtj0N|44j-R!fp^K37kc+! zdl4^1qJnJ{0!>q4Ea<)*@GP6jy1TY-^=#9!b)7UA&tg7v9(>?F>z5l{=l?wRj#XWe zByH7hNX6^{!*Z5BvMTEuZW?+|TI3Sx5l$i+&H4Gf&qGRL?Y+PuFmN8`gb`zaP(iV1z$pP2 zfm8yx6Gu>Eo{NWaq9pn1)bsq~C$|XO?{c7OgJg)G;md7pZC*Z;_Vj3kY+=|-E+EI8 zwQFB@7ya&4XX&cFc1v@mQ(q1Ul;~DR#&rJh@Jd*8QcmN%e#;B`Mdqi=BI-bqkOxnI zjzjKr*kOn1ZGA?WYuII=uu{=yWe{2k$Kw@@g=}Y4;9!x#e#UIzz!GF$7G($y3Dc7+ zrkpHZa@{w@r+;)U4<~?tYg}%im+SBA2|W@3C&spd3oJ#YhPQJ!v}5#Tq(^7ejhNozp|yF|H&)o9w6ioP9lT^6fR~vj0gf0 z8WJq?v5-X7z!oqmqHqX$P682|yrM?1q$USC_sdc#zxDWe!mE!zAwt#UvzZ>gx3d@T zAwnV!3v&&#Kl$X7yu&_!we$10+P#X>xLaM3aEGMg4p!Rf>^GdhJoTz0K;`fqJBt?% zNPqyRiG9&hIrDK7H~5QI1jZ1|PFQP_ z;>pZ%0A*KdJmDH~$@P~A-#Pybp|`UQLx$wW2Eh*Q#;_1lux0a`?2^0Jc(HhdHCB}{ z;JsTJ*W6B^&I3=q0fK{e1|kQC%0Np<1Jnbar1cB7n_hkUr6AOg-$HbvTUuMECHjn> z63%o=T-Pq~c{vHmnt-rYKp`^hN<5nfg?#a(#K@z>|G4>Q;#ZHG$iw2oJomdr zX-wqWdVA9v?~C`W^F>AUnrbV&#)>#55Mw<#(^PcR)9nzPI?#}}%OTg(|oo{J>oK~*vmeDU73ennY{Kcv3I8&Z+<@-}n#^%vNm zA79BZNf$iU3J86CE(`j?o@HFVB)xU%#W{ZI{Kdc$-Zg?BFN6? zWKe_P`mn14E)qaQ@BzaV;1F_Mv25;D-c=W!AY43SJYI5M(*W%Qlp#nI~_#_#+AU zpfkY51CyW|nwpv{Oh%IU2y|j!@I{Fnz9il}S>&T4G>w95vv_&6c++(k2sd1N12|D2 z$ngs9@Chx#u&RkcL>9TU>jghv`mq1}4d3v7{@gl$-JSvO+2>v-F>gV58jcU~1r*{O zAr}Y%n0qq2@ve(=>uC`G!1lgLtX{p^J?6sSo2wtZPGC~NOAOW_xD%Xu5KaI9v$SMM zi86fAjZ#tB5`k7 zhHXJbf#bw8RAw7WtStX&IM3j5ebn(mCqXxprPuM6t}_vXX9W$2rwz2VDc`;28_I9) zd{*k&y+@8!RPz(2j}wm`(;QUBWxm63JP5nso`+Vr5-fapA>mW?9FQ=qE5%|$zEIP6 zsQJQ@V|(+TYotL={bHnm9&0`KXC}ZHXxE z%h^!!g5c4=ZSeB_X^0ZbC9MQ}9s*2tGOBHDyXDHin_!D$_@wU$_FF znkGJC4D|gE{*lo_@~3FL(7x#3Dqf@S&^1!ky;nEvC@a;3lM9x$cJjE9YjBMm(6klr z-+#9MoW4WXi=X{dA>iTy6bCr?oQ~-w|rCof!b!2@mTNLd53ti#Ix?UzTX{t>?C+V4h)zkK-=I+{9S>^{a^p^ z$`@Ca9z1wL=8t~y>#zUlwuh7{XI?7JYF5OtBZr9Ccm&?Dk+pK*3*ddwF=0IYd3C#Y z*w`lTr&pZuli{a+^@=OzO?9K1>`ofdycEwbY8daEOmX#!1N@{t-CrDZ@wm9>mMpnV zFopc(cR#&W9)HBK^5mwt+>s5W{9BJoW5}qXk zKBP3R8@b)wBMTRf`MV}joIp5mn!sIm-FwWJmfYGnV%F!?*t?Ib&@2>~xnT%ckyNFz zxq*oDy*M^Sq+o@>;DeQj9cF=~4tQ*#A@e>a?G;ANWyg)G@f@fsB~b<8U(UtEV3P^9 zEDEr~cmz`sdy7K+BdDq=;y|tt^j~no#MPe$5(g%L)nrGVvG}wuu_jid3#$9>i!h)# zgn#!Bo*W4nIAYjLf%+@M$EFM&Is{HMaGNj?4{tMpft=3RK-IL8a0OxIp`$~)b+;uB zaTm>-fyl6DN28h}BbE*4kPUOdYT|qCy1HuX?zLGbUYh7vCAoje=~G_+gh>$hS}5Fn z^O4f^w?1)L^|TYphgQX6)%h*j+Sgvy;9o$xkEc)=7z{&&H;OzX3{QtO_R^Co!w%W(cJjz<} z${W^etkJ0~jaX&nrB))UrmJygTcNuN8htSYIelF3N&!JmFp zMP9>uK^BC&5U++C2T{~8&j|r|hPZVYvqMG!LkL)ab0I{hFq@#hwia9om;}(kuJwQ} zu7}YArJT;59_OU5{=|up&fm4xDlaXwAKoEal|zTxElpKcDy~@(UAD>uIKS1=U>6a6A6Ew)aOlT5`-16t>a(e z$MC~SYx$#RCHRt<%q291TlY?TAg_6V+Z8DdPPyP>KM5bh`ZqTmJOq68vNk>K?X7~_ zr3AKPNu@3(r+wuY%1b}EG>lrODNnMude5` zcb@0od~tt9CykE0#JshRbTm=A8_5h-IQMx^z;k_ zvK|Yf3e0{5J{c|H$##yt@Y)v8k!yd5CMftAiKrFhzVNM7&L~tN{V0jBuMTbz#<1}P z4Z*ocraz;t_{CS?%cqq`v=kE(U77=*ZKa7^2@78`MV?s=4UOjBJ#Ch(%BC#K zmdgaQa`KV6RyottJz{q6%?l>=yl)Z|0&Z`&D)V->0?z9c^UR7d7kwv!Fq&={4kDp0 z1{vs#*;sAFszK0uUwuB(wqhA2tRRLB;mh$lP@V>lP_UrcmaU9C??yQSPFbPa-swk< zbnbleEt?;8m^E^EgVhXA_&qmVYv#LlTGM78XX>gBq0Y=gHe(I+_nC%Ku*QrWZtU2# z)5`Z{%-y?pn$f6|o^|8hJ)@gby>IX6?0VlMPCfO)lHOdV(sP|uA(u$;+Ax?Qjk!$w%wWf5@3{V{AGxg8uA+49FFnr-CXi(v;864OVYbA3oJAbzE`_Z4r< z*s;!vV1zk!@+hk&6*E`f{2$iVty_%~7oLsGA;**@T4~RSL^W%mZ@>iMoBbVoO-OC) zg%@5nzyz$ynw0tNKRnWN-!pIZ1d`g@@VUzWo&-T*=g!WGzO0i%JfzYz3KapvpiM_d z#7KurUTax&Qv?&#?1HJoYoWu3idE+beIg)U4d|mIvZBL}s)@)rAdXc#@J8gvKe$0U z?T1fV(~dgS8qt(8-}u!HW=BVtIeg+ItG>R`EI>Db%iKyN69(wYg0wav*3C>dZ@v8F zBc|mbuI)P}pln@p%iZbwU)a=}j7NGWA2Ph_hbN66C~AdVXJ@B|M_~nlHVD824J0_4 zkmyNqY^1*-e)sm$s}Zjgq{cJ9Ey05)!WDxkfQM&5od^)75P88B6vSj)L|jeYdutg# z?(7Bb*B;;Lp1E+g^X9La$Oob%KI=sc zySuXkK^eHK5Q%;Ku|Km5fA>1O`u7q^QB~EB#-g?&$N+;kJ>BwVfJIMZMUl$8te;CnUU5+DZP4qTe`z6WVStdPZ$CY(P`JNU5b}; zRAf^?ZAK);HV}jl1h^%61b497$S;GsMpg_ZQTl<)V=`PkSs7&ddxL!s{}{{9`*rib z#)b}Q5Z>AR4tLJ^Cwcc>c@Ez?c6^YCh`y>vnWpw24k0_LuG^V(+D=te+5_o+yEhN_ zppEs>t-b7s#R?T%|K&Aq;*E4OXu-aL$e%#&aL?+|dv zohBZ0Oo`iLrx3?ZA+aTel!#J{7sPB(Dx8M&0Hn&vB-nH)nou+VJ+< zmL5ymg>2dy80fRtuYJw@%3roXJb7kgWr;Pmx!TkfKL6V0&Yrio@9b4LrRSxa7W6_F z#v}J{AtXRpJhBOe0GSX0AOLqe2c-o;F>~uQ!?m~#r zwfp<~tS?@EiM6|arhWCpTkMMRs8v^9Y9kum+SNHJrx;82t}-a{S8l1B@ang z_$mYf{{Q^^Qyuq^`R=t(?6Rv;Ne4ONPIGzO$|H!oc6Sd9pbd_yiT&X0X~fd|xunzo z%92xZg9kqNn2h+KvGEAx3=F_X!8}|T?7oeG1NVXYzCh`$a1oK^f+4_o;gMcPpJL;K z($b`-PoD49mZ|&;y#t{a04fQ$Yv;QGmY$+x@bL>CAPw#mVH@9m-M#WJTiuwA{2k~t z6IzBkB@x-~N*nf{AAik(E62jS`vSYrZ*xk2QgQp9U26GN1V?>D5U0vu!XG z!}XB{;k*5a%%nwC?_c|iMd=R?`h(};B&x=bkFtKN1bIQFK-LnQu~KND31E6?Hy~uH z04kKE3xi*fINyY&7D&~#)#ACoSSJ4Mzm^C)HoVDWwUN+569Bt{oOcjXee~f6*e_NW z;8zm7npBB9q`H*Vl}FtH!*Mz@dH4Aj);N%#&@HSyY}GUp#?wd%>(`hx@X8$*e=QzncNsqI*6mW!SS0LGF5y)tBCIQGu@}~CclYjYhYA3_*mUwpZ^=OlWdq(#E54M$BtBIZ!QknIkf00Y z<$~4OnNvkUHkg1gW1x{u3~7d2z@vC1L4Y$N$;0$wk*IX$qSJ+!UfY7XiTv=huj9)r zDmZ?`aE=v>pmF#J?%1g#z#cpwSp*&u2)ymRIkxUQ=RRx{QBDDzQ2muGsz|2H;Cl^&jNeeV+-<~Hnoc2xD zT3^op_VW2i3krluGp2GgCpGg)9dU2`w_#szaNXQPyxUf73Xq$~?tS=WzzWH1h#|vn zC;$q1*ADUy&+^E6%GgOizwwq!|KXV40d%67k>ESx;vdJ>-2b0(Oe6-@8i5Rnz%q}L zdj>|5T0i|1^*?_6UGcJG4iPj>;k|e*Cl^`3FDi z-^c%6f&axT@TqCyGoC~7y|gbL(<_R{AG}_Ceev_b_ZB}ZUJEr)oY1|&k|j%=<4-wz zik0p;eAVi;k-naOE}AIujyYoTuKK#VCQXrLn5|^$aj<8&fr1mfv8^+RX-aV9$QmvJ zCw8cfLmP%7yz8mQS3P~j6$=Mjm*IQf8^i~Bz`@Q3Un?F%C;Fe;itie{FCNn~3*xX8u1(0TD1-BUac_r-}8 zzx=P*7vDkq;$QJS#q;8x21Scp#A-UGYyOgD%YtTKTCisQ*7`@5uM%uu5l5YRuILQ( z@)IjGp{61!aFLjRB0AyrJ0Iq`fgQY%8qObn(X3_l|BU^=FQ6KvaqMbP=_9f|Kdlv;CpDbLWQ7#oK6(G_T@04#VT{oIdL73W{5WD*G;us`| zytrYn@XT#D@h8rlE;csR<9WV-LM*EBrc?!L-a!5_9-bizIm1~)ZW*}xP&D@Znr-~i z=YPpRvNeUIeH8y7I|eHRzyE&qLV<$_My~(eyI%mI0PP*u*Afx$n)%a%(wGjHIYs1o z5BDK+0EQ`!TdPYPjOocQpD|;{H8=ld)Z6XZX;;jh41X2U@9{b1b98sMKYPx}$7V5C znr{ez;=Z^rIR8wx;`3-f_>Uf5JTD&m-@JKQvQEgJ@asQ48QrtDT|{~XyzRWGZu%=s zGC_i)N8~V*Eg40u4?4ud4?hgHB`hu~hejSuDJTkehK{g#F8=v+mC55@Sv50ffJ#4 zx+dd6JX~4i3c=&BN1Ov9gj`(k_!4#DnuoHJq18#xbd2>UOq;OkH-CNoEC7p7B{kH` z1StNJ&9aE!efXp?l*>%(vi~1C_zbqwoqIm_Bc#*9nJzbf?hK*9 z@0Vm<6Wd>TSQbSYwiT7}!Jdarj}#HqO$#E-GAiK~K`9i+$DZzCV(W+zDD{KKa=+UZ zu_ep}Rs$9Tp3CrF9AVXQ9ScjiP6R=Yn*F3gxiPfjgz|))MbfiFZKYz)?!I@}a{NWdIODNP=+V zn#4BmLrI}57($?$ye1jtGG|?gl61ryi>z??h z0C8aPp&|yOM~@zM$v19|R~~X)1kR)AjFIJfr^#v4Mm5R%c5atny8kw?)sQEIfjwGm zItM~ZV6$LID5FH_Fpv@e;AznXlxdKso2vQ{w)I6wP@p(g2S5mc0i1{X5CEa-fc?c} zKx~pf0@81|%2YW4gz$u9aTsGkfDS8}9hlR>w*6GFeEIVFo7ee~l%J3E zXAEuf$eL(QAb+>1|7qzh3ZL1DAQ7;Z3U`nughi5}i=#Y7l;B6ig73$AEE2MB!XSu* zs2Nz7h+a1Y1RpggI3`&Uu5(yNLsUTJi+CoTQ^r?F6%-i)vw~yK;Mv>XV6DSj z*kRMAc~3t1SN6&_)but^V7jg`EfHn)73J^;Nep%g+ShQdswhlH4HZHOOcQt)mClUh zNfZT;n12DtWz{dmN=yH)jemaQ#^@6p3o$Gl@=_R-bUuRdN5K$L-Ooo> zJ+oZvTCpqy07zH{9!gMK!UB3=Iam!!l(2_tFM=n43MiM0ip98)9bs{C%u|%FNI?>c zXHa-dJxi$hN=Px`q7xtpKtNvrC6ouK5C!YTcgY2dXNQakNI)P7u^+buHPuy++wdhh z4h6%!sTW;Gy|EC0qk1pS8{uy8_U`Lq7hiOq^ZfHK`CHq1{q#y(dpW3Ul()uB+v^vFx)K_?M)KBTqa$?~9QC((Rc6GCLcm3S0 zF4fuA%^M**G*tZxC}6hPkRf<3qOg5E1LXE#k^<2t005lma-akNpKN(($fjG`Jla0$ z+)K^Qyq$mUC)X7Q+IJX;pc?|h1E0v6X3d%v6_a%ll*mVH(~Sc3k%G-4iHWl#qoy4m zFCbZl77EBE!&QStCf0$)XH16TfdXE_YFbEKw;dUx6cv={cL0peboR>||9BnPmW|vg zEI2QMDne>OK^O^e0*r_25}pZ}Lc%_z1mrY^K*Bk`1OW?U&H_+)v25yT+^FF#TtSEt ztRaL0Z=$l>>)hAo{l|6Jy7w)6(0_3!^rxB@R^L?bRhO5scwBc&PeqM!LsP~ZZT%lj5x`V_ z_W9>WxO_h9m}&&wHITRHMG;+yL0gL=;-I^hiEKH*y?T^1V&3_PwsKGjP^yn!ZIFPJ z{}C=I3^Php7NJkepd@f(2brZX#vntWvH)NnQIh!1!?(*;`_@oyK>T7Z0`h?Ykp20< z#F8j480G^EVo4Q^LS7y=>q1dZHA%2?vFc!O(6*96A>j9{^o}_4aBt#-vCiYmUkO%P z^{l3`j@8yxvC?FOl|&RbsVVH?r(b9BO^>mj-cA=i9$36I#SWcuxEqPZD1Qdn3@jIs z(S^_)Ei$tBST37JkQz;1RM{=$^2kX*)qZcUJ7Mf_w|^kb_U`Lo?Ynonhy+8SLoNxl z)}}Fs7ABp4jWM#J%BU#Oj8$9r75cmT4R8muBGHJL>ql&}&O0y4bpZ%M5U~vO5AuR2 zEYT>E>7vN#h@jvBDZF4UE;`(Ry`Xs!*bK74BPnUb1>X>D10i~pokPhEyW50|4gf$K zBDDo_!$a;Gr~nHKO%YB7JPSgd1UylP)7vKPd15Jw70AAzMrZ;7M2R&|k!q&SAzO~v z7dmEuf|x5MG+xTS@fYbUS6|M$Iy%{-Yx_L2teLfr9_E%J;9Q=JvQ$E6_uluITi>

sZ2p6!7As3s9;IO^@@Fn62Ca`PSjG{W2ENnOo1#<2}roa)x zh*+i+?I6gWcO^PTS}IFk!j*bHZmR=lzAmm*wNjvi%2Qu{)SU<_mG|Q)N{ABgM+<=Ob`I2)yytaS+!?!y36mzx zWp^r%zM;MJyW7J+wQEA*hA?(e`Hc!7g2MQSQx^y~u(^`P#JgMgR9D6vMKf^5G(y<| zn^R~sp@6`3v(!un4y92=J++FcM{n2*uRqwcZy%<^VYcM@yvOAiXf;LEKm=eeoThRD z6!fo9S#HMp6FPv2%Ps<(6HYS)*i7ssQW?Y!m>Vf%S-i+82*YMq2p@Ke8Tl|Lf?(3& zZY#6*-~ZZ2b@`E>pKhGh#vfPbJHogBE zQYjY?`{VQ*uYWuL&VvK{V5gJfG8@pkj{c*K24asg7`Q(7Ot7@NVKVgvC&9x&jg2}j zP67>?B%!SpxI~2=Lk$5l93f^rcl`=TdF{axgqhH|Cs5UuModPq44^|Bm! zl7y-Ya0+k5xx0qTQYy>V0a%v10E$}48+8%@rvJn*ce@_Ri=gNMUapJjHr3Hpm?|Q8 zrt(gZPM^6r3MUe4`f(c9-4YnfmJ^k7)o@t>`Y@Z}##jx|0MU4!^C)qJshc{}^*(L! z;i~g-Jf)1YRC;2?&c&JMO4iQb`O)!;ML$r!PQ9rN{K$p=q{|>?87IXN5M{`jUc|v~ z!mdE(J=%Q`#yAsB7M?cepZQSq;pZ<#x}PJD`~Yqt=!O9V0Z90bOqL=TcV#%I?&%I^ z*GY%t%A}DgaX0ZqR^Vh|mRurPq;&(NexQc#ueyUU3Bt8QMG#F1swX>f%yCu1E`r{H z)TE`3B?=&;&bD4*B5g-RnZEMkioE(xs3Np_3w_Ag|Z#3rz?A!qR zxfGA~kI&ze?bf#z08gipG=G0zha}Q{oc9Xxz8ZlHqV@Il)IkR0bd#`}54%{6E>sQ= z+xE|2eLH>q)+Tq+bkoy8Hvr$W&t&QAf8%mcJNFcpN|&)lmbT8oTc;glhX>5kz!ov< zyafL|!$BE9sHj2K0QcGiC9}3%4c5z8ZUJ2GJbYvyy!8!p_~;>wQz&|oAW{!kquiW! zNWjhfxQ$w_(1$=x0V64;2KQ}#IA1C!Z(&jK(5E^sO!rHe4UW-HLH&zveJtqK z!MzFWC(v;$YoN!pBS76)b#YuO0ICDTE?-SB6uqIvl1Yohti}CLo9}{yGVzVQGYT%*zc@ojt+kLmw!3tPpVH{NBsEwIjz0;U84t* zKOu=deqW6zkDJ%WorGr5%jV~QzMRf2wJOtIZ@HSUWU;58+uq+#|K&HYr{BD_mFi0S zg3a7?*oPyN%cP2BY!W?{DxZJKX0b`c9887%L3+%=vkKNhGni#qTtICTv(=pIMI8a7 zWYd8i+k#k2_VOaPmtnU^>$bhW9lZJ4TS4>Yt7xYVMTu$ZX&&*6ft&!a{Fy`A=Ffq> zKnhffLmDogzz%+z2XkP}+GTaPK-diU0~dfAXu<%zrJ^4r5edPa9}$FXMD4q{$N9O0 zG2jk2T=3AHFjpBUR8JO+E7z3| zMTv*9lAl(-dn#HSPj%!?(10Q#$ykh%L&Q4)rJ-=`Dv0807pITQh(i^LMO!MBf=aQB zsReZY6+%i!5vvB|uXpVj-1bDmarL@drfk(V*Gj6W?G2%f3Y3GZa~!6Gajs4XPR-TJ z@=@FM=^D#`s9#B`D!U?Fon85KE_ESe2FvM|Qb(FCmXRoFRf@uNR9nJUc@f=ZrE;hN zC=BEP?$;cPL3q5ObCF0H1JbzKu6zY(GLZZj^wSxt95azH0JWfxdR;M8XXP!#qF59} zm#}5kh^ap0<=9xWXEl$T}o6{}@TBG)^jlpGSyL;Z{RL#@ee>ET$h zL4zhhW}{szWTay=k#Hss8GT9H>36QnBI}t1(%SMOQwp;@kyEpSfCq*2V#+~@LHls9 z`Odos=I~}$@=>Znum1SBc(FfjZ{qtJzCsFKyU58Jv{V#F+C?CQpHDL(N>R32!{|=c zWQLio2d&^QzWMFowRg6H0ai;V;Skyhnyy$0(zOL!JokK1SywAzBEX}FQgTfD5yt0IBcc_a`Bs(_-eVp z9uh=>S@PD(!(Ye(piNeSyDD4l5`5CD`zJ`H$iyH+Fi5A}4UXDv!Fuczaa|?ALP$f` zU&cEzu}{d19fzqezpAS0^Ms>qf(V_2UUqF1X+8)QAuPTLMmjh1C`oc3K7s7@YdLa(mk4IY7hX}4W;TJ7qj6Q zYjv)ExY1x}J4bDuL=0qtVxtN$=OQTAbDBq!K?qa?$#T9yNLP7NH~kkoj&ak6=AA+0 zu5*o1Jv%VvphpFcq7HiE-1uiY?2ZR8^Xv8cYy|_8i;E4jgvDTX37iHWn!TL^yScR$ z-nxC4ai^77U+r>ewAq`6+s$5Zcc&XQQ#F&xS1>SH#ai(~n5hM338D{i4>#hWfQ{UE z$_{K~VIff`U|d+OX2qHS7NZY`*td|cBLca3*xBzfnML-_K`F9#3J`Rt(mW_7)|UYhpy3%$uW z^Ea>Gwtw}_>#4m?KMk*xX%+Aia213IH0G zlolBety`^s0dVD~r51w*-C^L$6+{6RiVyAB zy&nTW0WC@=8-O6m6))xk@TC?K=He)KoIYu)JHzBWs5an8)u6y?-K2qz7pG}VnaZMByzoqT=|dlj zE?&99fzB)$GE#B#;_}_}02v6aY3l<&MUxk?9VeAXP-*Q5N-c!_gX~}s_Yu@MgkRX; z5+iJbMJp@V`6^YyKKD_y*%4@G(CPHJpMpEi*`HwTDmv(f=Kek`B&^UjhZrZUHNvGv z#pFw6c&r>e)n-ew2>OH3bP`4#Y!rsj>1@f{B{wPNkrU|73i&Z!fB^apWC6Xy&X!$+ zRCwtmI#H^;G)3$oArO|Wn=87&iEVJCLvpYMCo`@-i7L5ZhE;SO_<_@;{$=-|K0yva z9oRu|a+^G-yi2($mCA%u1mKTu-kSZ#ul$F}!CU|7kX@2aS!;p(y>*&9iN?jtI^m&L z-+ty)6kWf5J@c(^-6DoB^s7uhjXiX7-dJjN!Q zffFE-Hd3&E(6kTU{JMQ~`=;%+_5|pu8_-ez1t9>gj4;q?4#1fbh@V~k34#XUkE8Bg zj#}jIML?NX_pY_fvQ)q5soAJaDsxdQ%L#KGg`#4VUbsV4xwZ<-O=cRfDy8c^X4JI;}8j13-Y)!1^xvbDVFH2 zTTR6wTc$B+2x4&Eq@7uv$BfSo^QpmwPbsE1S|-MJ59YNIa6 zwA$qzeG_}SwDGhes%smA#p+Wy1Lr^>IieT^MSR@8=}nlM>J(h2T_WmxKHFPH1a~viQKH_*piQ~EQ$;?fKd0iCf0J$z%8X`efnzA7l80;a1 z_xAecVK;3K#%XM=U^q_#=SD47rzKA$22zF7WYTm4gF@Y7-B;p`B7$i&1i3($%gR}u zh|0964EIWqo}L#gO#oYy3zb%}mqZ>goh9qhi`yyapd2Hi9hu7IJ@!WniS1xCgRGpT zWm1E#fQK||4cS1lNn5OD!wP~1rKRc6E-4I@MX=OTsMtnfS#*mHCNeHR072ZkeLMWt zpZ@#l!&~=yqtRjWrI%hpt?=)q(?XYX%SzAr_ch+%ha^u-jts2y^1I#_RuumKvAYcUF9v;5{8Qb8&&TV@GyYbr(?%FW|YzMd; z{ADTw*qJ{7K9wkKB5ex=bR0WJMA^Jef_PdcuCY8NLlD&#`vKquNF4xU{z8XPU672J zwMTG!RZj;F~h# zaxq$7UI|waAg`{jgoR>3rs~5-yL)DDYbzRX@=oiC5eG?4qdSidqc``ssV}IaM_P(9 z{9qmG9uxY*!l~C7Fk#psqM+dbxF~%tH{!4zBwsFt#t{et0H0!qqXm_xZyYJaWJSt= zt|C1}A2S3(5)K*DNgTvuv>8tDo@PBOMVd#k>_LM@F-#01q7tiHRb(2Hd}VP`QyMN4 zuKl7QwsNF8DSF6Qan;rXy|JVPU zy7lIbpv{PvF1;XC(;#2sU^)PAwHTxu#X_o{V_`A%xoJGz1JI901I99)T0($a=XQ1N z60|G?umq@qzZr2ukpS5NyNO}1Z*IPG-R@q0H5j)ZsUEU9Owy8PfM2a#pe{?A5uu0dXSFhwxWOn=Fp!?&dbM_>{S;Q-SKWf z(2pb(#1oe+M-(EdfH#n7G4(ETojCNgW2uPs=1gcf7LVH*%mwTeq5{cNKQf21#tubX z2IGWEnE;#%Q@Ld7!t^RwpeN4NZT{;0V*l9l_+9lT0*~W1%wy13F{_;j%0h_7(er!< z5^OpxDbW%HyYxyZxS0mm5fDPB%Y~@G?4pBRJE`4_E;rL`-V`;p(Gbg_Rfws0 znZs~)l*BGl|L|~q$`W#{9RYh-O^)Y@Wf0m%wo?Fbob%gVP}7TcH{LoCMaSKlapQb`%!j&UD5_M z>l%Nq9k=J&wa9$>(_hUto8xK;1~Fp%)PMN1Zw3GE>krbUm8XK@dLyWD^(FS~(yPUE zfM!Dgmy#3A9C>fKL-_#c`hx~(^bh6ARa_KY81xOLIy-KwMj=}kVs>iAI-n?C0cqy>F!fZ9@>hh%W#Xs$ z2$_-8t&IPlx;JZf4Rs{WEg&&Bp{p=qi{|xid z5gvkyutT8;DQuY%EC~V#bOY!{_nqf?I&)Q>nljVhx3cQq3sQWsC=$%>b1R2E@3q&w z*EYDS=M1<6N<qX4@Zb^0m=CZ8H8{UJFE)3F#m%i@eydk6Dosu%TwN(D7`jmb5x}b4pedJ*sbJ6e^3=LHV9zB{Ienq*e67Q0|0A?p0tl~W5W1R z#pFcrouvpu=e5ZxgR~~K{}P2cF>o?SS2Ny=}7~Jqf!I8oXu28 zR`(ezKsv&op^mMG6;R#Z+o?RbdM&wo=@*s$?TfTy%-XDnN-2<}%RqPmR**MTBZ-6p zX_6RJ2F%2gE~?N5-~-4n7eCo%x^|GQ$h<_ZBGNLyU>Rlj4@8R}u0Tk--OI)n<^ymk_16i0ZfavC^0;hJkpbqu^oH}y^k!INOEp8hSP^_ zrGH{iQRrOKh_*yoaQ-Esi1tN;V?<108?BrFZL=3$EZYd|Q#eJ4oFh&7-G52qQsLK! zlIU21J%FS1tp!E>vj^K3ujAhr<^7d+v+?7-_1e7W^;?2%@z=7;61m}u_YOdbB1@vA z3Pa@Y1d+zY?Oh;wjo$566C~AUlbE~M#SIb)AR-Eh$Ju?WGVYD^tZWyDSp@gkc^hp|f2NBeXw5n$5URPT7=A9vHwoQ- z?NN_+mFdC5Z?ik!UclW62Z8p!UDlpFfeJ2pHAWQHK!r<*ciE;YVKmD?{`ucve zck^jGJ9@hLcw9-ZZD-ZZ-dVTEHem|$W8(x2*}ktmr)&3M~U#L zmG`QBiri+^h~G>U zV?|!-mk4pWT*`0p>#KMV;+wzsofpq#p7MU4Ui~~hw|#Lj7EIn>N*`Zdq=`r8Ag0vu z1@X`F$G7=EzKh1sU(A19=PzABBxqmMtj^Ojk&!TnvxOL3a+34p&oeSW!PTp7(y+^i zLRVr(W!49V9*qf(tL{vg*-+qa;ib8-BXFS_9S%WM==~uE957HUoh6j_`PYhNPxae4 ziK=J`jtW%|^??yJ*nonZEd*<8qdpW@{DFI5we{~`Oov5lv{_U~`x=qifYt-S!MTH+ zbthe4UC&RPJXRb(c7o@HqKD*t|K9x^HBqv&h4Fbxlq0HmxQ!8cJI@ESc)+IBY+;4a z6^jrRPGDoFu)qgjk~ayZB0!_I!M?$mu@8ZbtVI(8uIeG|R?HQU9h^PtAFwau7kWLn znK0x)K4(#5Gf{mcV7m9hg(^~jNCbG2DWnlriwK)<*didZ8lO!^B`$YGdkEkpd9t}( z+`f6IczE?nez5bXAYdjtvf2C$KIb%Dc7HP}v<;7~utD^QtTU)B7aMQBUwr!cr^)%X z1twMxCWSffI5L77p#xKF8YoipN*JY4)G_v)yUT>*CC7OYNF3OZVxrJjeEYCh{Gb2q zU*`9}{%Lmd)M=*vAiw_Yg^aU5{-c0PcYfEedAnb%JE8u^KmKu*-L8#xyWRTgVP3z| zuUB_b^%U7bohZ)fO5Uq<81q4Mp^Bj&?O?S6hfv`}GB!X1BFtdDI>LZktrA|#wG;0c zdl&(vz?k8%@kzVu9H(5lbNN#G%|HL&s(TMFC!KB=CybE)%Z8a=I0-~mwi#xjWYdD% z*PfuOypjoQ0Xz%;khesvVrJj7Qh_V+E(rO&6*nYLcAafGEQ%O77pxOaRbJnWT@7TMjAW z-pb{m-SB0U(h0u)7?R;yr+H^#F**0aXZfL5-$`04YasB&@X8rNFpNWFrzllMHyOcA zG_r^)hUlMQ7cz=K}WJ2-&*09msGcx7d|IDY(ie)`mj;>5`l z1!q|&4<2t8H?Q4Ho<7Bpd_YVi=vtrCbM9~UihI3!vY##$<0b}V&H|y|dJwSjtS*-> z=2l1rL6#xH8|+W%bdbCt7$|jA@91_Mi-Hjimr<%@S%UcKP$?1MX;eXgXL8-3?vg;F zP}RrccQ!P)$-%oCnLJiZykjg?H_1+c2r`c8h6wEC*Dl{mZhiBsV)*1{o?}GUnSF&V z(i_Vi2q3$!F@`IR7}vtc>VqS+#9d4 zvlL;2HlP5Tv{=bQ`lL&1lL#f_nP=02rYYXhr)ie}eNV^GqEV9f4zlTE!s9-;ao^9Z>*a8VFv`CXr*jmyIZG z5UebhF)t#$LGZ{L254FOl8c9p!ONn8OJ6Y!TODc1L+2d;TkS8`yc}N4>WOihr{Vjo zU6DSh2<5!U&)2dYycCy6lxVb!m+($5x+9KZ{4`$A>ZP60hxxOwBegd#+R0N%gv4K@ z4J0|wGy5&)^+h|&G-Z0xqr@)WnLFxLCF3yLhG;L<%=*M#jEiN*MV_*Mfg8&)&%=ibEGbPC%ea5igcp3-!tfGSEOS>Ps4JNxqk24|qJJC9AJ}l)v)shxxIky5lg> z?g5Pqa2n4b4BPzS_KP11)iAN!7^m<3>g&n$(KWC^mCzs$ ziaYo2O?DqW&Vi5T930jE?q7_7^BI!D*|TSBU*8|qFCNq@kGF>){2s?qqTLyR!J2Gf zBc9=?D)YhqN+gBwvVk9f9|vSgqAlz2AodQgK!iBT=qB9-~9N`(>uTVH=Nvtda1<{3Mm47!4V#mM4ciD`4@jB zAwZvz1yoRG?qvWhaUViHXKJM;K%(HvRZ0xeZ?S~$;{BXB%*I5l9N&Cq_T!#vAe43& zH<6On<$YO}MO*$nKaU_Hk9Sgkti5EkTd_rg&hTo z8G{V@wOJB{vfh%T*T7Cv@EU{Y^ze4VZ5k^5n+Xa8yH>JlLbVPcHMd8QG&p_<~updu`?N$_4x96 zeY~4L&wow#^1V-#JRjI7f_G)XAPecUT&$;_@s?FioGv|hQlo<^7@-1@>_;~&M~^hy zh9weCUscgqh9hsS9ZtIEJ}yqb^Fgw()HP}3VJIv)?roi&h*p;3-t4{71Fo51rPTy= z5w?Sc@zdhL!zV=#+ksb;a1%@2#p2|tlgX>+&#^1{kX}^~j2?D_`^k-)HW|0r^U5xBBQ1YIg)tMVv`{{pg_(>+Xb@=NO=?e4?9ka1qeZBp;Z`&P6i4HLg810)3=Ka6#HwN=}?OnRkx9QoQ!v?@!)(^+aB$ zeG7WfSO&y`;m;5F+n!YOeLR&0M)rd@mMDP#*eU_51<@NEjPj>9uT7r(;wOj~oIn2L zNq+a*4V>L35MiQF)&8Ck2s#`K_D{e3vbs7xQoAtPs}A;{^P?V!72=Ocfe^b@i9?1h zZ#o$P83eMejv0%zK1PR=Pg}gpsu29zN^MA342S~UJTKV;k7^0o0!agWigd{=!vi8P zE1gHUvTDazSl|QZ0vb`N^Z{xjNHTRu)66K564P7v9w!gK`VW<@%fCvqUCvto5-CyM z+`Oe1lEA7&7(lCMl6EAZFxFxq2nh)NofB`7Hs7fWV0CTu{y)bp(6XP~jn5Z|bQJWMbe6e9R)v-OM*R7t6^pa?b5i6DJ)8z2}! zgn!7%yyU|P@-E&*AQ_Caon-0ovEuOgw~Ezs9~6tLDx?SMAf&|m# zP@oz*csH~ywt2=gNzPxpL5#Eaw7Y@dCW1lq$7MpSC%-$MstyTQ7Y^uf*|qW=2E=(Z zS296N7;D(VF=Mvh8x~I=gDmgDO<%p799;jlXbm3~huBMT^yrbI!)7_BcrX|da%Df? zLUq>XoNhPSjZq89Gq5O`5O$%Wb5P|*Gx+0%deDan3(&z$7T&ad(K>+}>Kor;E&R%x&mp?1^ZhezKyme=~we<*lM(k(FGNXx)XoCazyL>S) zDcjmA7k+%JzWWqhKHREQTN6Be(So)Q*xfv>au5c`!_prN3L}C9af(8;57 z5EuK|L87BcdH~lxqRt_N!-Yw!@h*_R1cP^hcSKdbSEKH9a!)U8o9SSzUIY37&gvGSh<@?+7$ zSv#2{KH74|(VFD7C18=m?gin2YnOsQFNXIo%JgA=QNHBG0?Uh1nFMMftaGcAwBe$k zJ$n+!$Nde_<@jv7IHv&l7{7jX?BwSIX>b=!YD-7*<>TiuW_~AG+BjCQKL-i}Mx1y) zfsNrmhIY)e2+20oKv0ICrVk(`^!eyk^e$Shve9a^nG6qhk|$4hIp%WgG67+?io-`X ziWA3<7w68O$q$1(aW&P&G`W1`dU5~$eY~AUG^$o?^+(0MgKDym33b1^igd7qF&W}h zZ^=Q+V(3z;mr(@GqwEZ|48ik=-b$H(7!$)5F_63a(~Kg_E8givL|>2;+zsrK7P&I= zs-cv$lyn$npv!N@Rg~-Vnb=0E$Tqikio4gZ<#(>#NS@rdS#Xe6vDO$D$B(Y(?6h{n z0YL)C$zU)b7~ft-ROVv8KScG_Uex@jZmrq`&>b#>QL;2ngQa^A0lISWhGzRI8;Tm(0S}f~ExDX4ZGq78ET4e)l1I2^+3XAmrH8v$ujQBi#s4yWa`!%G3iX_SRACLw z9_*i^t^WNM6x+$)rR&e2x7%NSSs6W9uH5WB<&5REno`4@IP6Xd-LKRDaX<-IYXhPq zaCeLIG1$lkHV3@0F#vv*CJy!PM}t$khfi$HJU*7Jsv6r)>7lwNa)G*ac+$ zM%I8;@ezelhvi5tBE9ufINtzE1t$xPx+%(Ex(XEArl=>{pd>tdj$aa$&y-)5ZEY_I z1ZkrUtfcsz)m`SXin46$i1Mk4SF`p#&%>%J)6Mcln|V|AWmbmYyaEfBw-6|w!Hytq z6kA-V#jRo1UDa?Bh%#4X;v>n`H!vvt8@VDy$#^>~Bq?7<2gK}j#PQ{BUWi$2C+}j2 zX7|4Hf0}MXR0FNAZxo+?_TA*e58f?S@DBRw*WXsY`0^LUx8Gg_L2<5plq)cxKc{Xt zD0Wtk6h~kGu)wn@X&*TSr-LCmnofy9z-A3E8xgIwJ2sMJD$ufO(6aqRd}H=?E6Tif}y>o?Ndx9=2tJA1UNVCU{Q zxx2?%2BSvNub@L`RW=E4A+nL{SNee}@PDmnFSZCj(k9#mdp+nA=T5`bqv;2^OKeoL zFtDNPM*+)wr9XfI;>Ga}N&pNWJhA`|h)OWXPX9%&{9;wao`{cDQEU&g;`aS##l4%i zirs796q}cSUgU)1c>V0j{Md;T&K#=aO9Zl|Be?zUP^@ z*cHg*CPz0s6!|K<@0V6rv*w9+inHJQe0t)@D%&3^eU(FApAf!A; zkQv1l^%sFTp4_=P{r3O*Kk|E*zHo;-ZP$GfuP&&R1ftPs`TTqV+V0<(OV}k&RAu}8 zmlZ;!)O*{QVV3tR>8MrNCiFeW=b@Uxa)6xyGd}xO*h4;nb|Nw0!&PI)W6E)o#Gs

!$H-_kxHj_^6&(@?ze*ZtToBCAEXg47FLXaceaJRA5CWq=5dnft zVyp242|}L)-(h25d|^t^2zW*=(`Mr1`e7GQ)kKuMfdE^&!PT(0XdX7l8I$z=z;qEFDa5m$+gC@a)iremE% zdRGI_q$}s2o5;gwf1~{P6?2tDiN|;^^hR2qpQm;0&cDxoN&O<-tUf+jM%jkAcS)4x zMwzAy>BE$OwW;}kRv&3gMb~V+XYXB-Wf?BnGA;k|@CFb+#7SX3fI#>ij2m^?(sd<3iG=u8`oBtW+i zDB!g1D+{@#f-|H_=n3{NFur2LWS`Ao7j8dFu3x&HZQj3?Yz*!f-P#z#dzG^nv{&F^ zwZ9+zfUsdSKb-6nvYT+-^a&yZgmD9^F1eyu*b*+;C@$6st4y0!Nd$aP53HIME0J>) zk$(8abBK>_J&N}M7fcuVBQca>Mg*-B93rf61<|0(0!+d#H;}dn0XO5-rG)rYlkS;! ziVr{gJYQUBWdj964+2nPATv~bGKK&*nRez{FDFf}gwx=l*2%$?7=-!7U;aG5_2>U9 zy2$+rJGD49j}1-01uEq!n=?bzG-~k92K+8v^e_FO$J7Zl&X@#Gx`BtKz_{f|hh4FglJ5wJL^W5UQ9QLVzTZ)TWwlJg^v$gYRl(l_8@6 z!@^bwcEd9yKmnRnkQv1=M~p8sYZVXz5Co)L6#}a+M+`v4#MB4khjkQEnS8)0KuWh$ z*a;03=!~&X6T^#gWCi%gcZhm|MS_=sj19zsP~IH6f?FXD&V!UgJJM&@u2gRP@+ax^ z@in*xH`$4>f`bPFB}6>4?7)RlKgGp69-K?sBAA+oi`?-$L*PJX`93gNDFORk32T-o z%Aka(gLjeNtl`OXG(B-6s3d%`HIqzWfKEw*+B`TfyiGHS12JLu#E9!5$4Dq@k-0S5LwG+TMc9nTPi zMpJEWRSCkeLVck-X{e6`A|?#4qBvFqseyKDh$c!%06S|d`eB#?r;PM6gp;8y^>3u-8X`2N8}vKo7!f-%#fSpl=>NJv4Ugn+zM(e=im_8Y@s?LkUN70 z&=CWJG+}QDi68)mcc^fXcI5D&g|y9Q84bRhPq5U5iQggau5DCN3#)4x5=7oS`C9SL z5B`g3%M)YSw8i=&6`SNJpDlyNfSPbRJzi4de819!A06tsj2+`3yM6IeapTYb_i2Co zi5~rM%OJ>F4K-68j5w0OPl-)Mh>_9;WqW=nE{Oxj-Ql)+yxQ;Yrn{|YmE|D^{Jrx> z)x+n`uyr0YSvo;VsH9D%g8{=0$sw*)N9+*+L@^-ep1W5ewu~GeA-P4;rLh_8?Y;-X zV(7U7i6yQ0pOtASNSG6bH-yH7&>GCV%oHgp6F4X#0X&Z*AF3cRKWt2%5e66p>ym^e z1VOuzvE-iRgP45~3Hv;eb)YUOo>O3Z-ZP(+0?Cms$$$X)#@K;~j0g#CnB#-3z4YPL zuQ7W6BJDlCjm@i1V`1+ouyi$@6M{g5C1Ru<^r55-5#$fzL?%CiT!c3J!s81>YQKSZ z`a(lzT)OFf51g0f+6lT?5+FYY5-h(_e!O}9u0;4i`t!WA^i->z#LM~_+(=R)a&9R{ zV|m#&zS$m#5G~=C>qU942Rme|Ug`_T-gl%c*O~RO{;Ug;Uc-Jlm-DjXgC$4V)L5$9 z$Q|q3`n=}9-rH9TH!FYQ=R`fg|VN^u$Un79xk+2_r(ZVSpG4#+dpq^*UJ?&SWvaqxW=jaJ{5C%4vX~>lDl^P`~1d6LzG#5csrxw5- z+xH6&nF2}f(+0v{FD&HC%S*|blgEoU-h5+v>=;C-y_iBYvTN6GrdKXsPS~l;Of_)D zWXJ7JFL^L-7o+BSQNh(xFQOVqkL3pq=}1ZdttFyfmk)&DGKi(cf^05F6A9)KMo08&wqzU`gZ< z8+LL4QX7Xiip{4_us7^5P0p;yUjiXvaP^f-MXxD%RE%-VD5-5AuyXw9Dtm(_taermgaCsPY81wk?h#rWVS>$X5CbM$ zdQDU-L4s#ikp^n`061D;1fdmL1CNds1NT+%4F#46jC`s)%o$?@`9**LfAEZB4=;gz z{nC^MfCw0|fO8hU^?=l*8j(5jqn_lYNR1g6E0W&t0EotI%7fkjFt(e%vMLOxg4zpO z#-uaLS-SUZGkx&wU!+@CzpC_~-UE9N!JC{uS3)^uF$z)|o@KSH&q`)ftaJplmk1xg z3dJqo>=O`Ou2YbVRy?k%CMc|ai>(zXLV%q6*?bCf-E;vR!2E5!na?d|RD{N}CO$(1XY zlD*wNn5LHZ5x(zi=f#5o`v^e#X$Q`lO=c`9@EN}l2jfHG&P^Ev7^Hm&?;tpN970nF z1gtiXCS|v-y{2uRoy>I7NY)#RD&Dy>x$Fn;M1-uq=o1bf`PTM+aqHfr;^w8R#j~5& zibnrgak4Wm)>k@6Pz^WoA#@K62Vp-sKLWOG%C2t~n(8JR%gk`8!eVhtJa{e^7MJq% zwFT}}CAsANEkkab#`4zIR&tIKEpBlrkP%;%0GM?EjF}EX!5z1%johN-#F99*W+8J}?j4H)C<0OVFpmO2aB z!rEGvub(eY{N6v9ymsc0(PC%_0LGC&6He5^hd@UH2ue2H>-DiQT*>eL>ZjBFn_sb@ zhxj@1p9dE45Bscn$6z-a6T<9D7&0VT2!11^hwpsn<3JX+>F?}vIDhn`A64eWA z!4eXPR6-=i2$&E>Is1Y5z>m0SGR^`B@BuB-|4d(6>MOB~#D(y^>6jIQWPpyenl=d` z&aLokBzFh}8Hp&#X+la6$w7ZqeRTUy^7!&Elm7inmFd<)WD|X=WNqZaVGht*z)jBk z68&MgMfzSkPL$WIzY@gR8`JW~@RW#Gr0y$-X4yyJ`lYmzlo+o_#ohebOx%}9o3du* z`a1IP>3LcQqs(8X5B83izINHM5>y|@n9a+HUoa+P^a81uqxxIvY=f0@y=ZrdK`4Ay zhvl1qKjyDQ=-!uk917R0UE|IP2f*sYGzikj*8@&H%ckM>=^R8l+isES9XVwzuP?2p z3!PhvyBRMnWx4+{rR> z^G0*XAvisJ8#j|pLN^e$nT1|0mI+9A9GA@3UV9~Z<<)Z;VXtG~!Oh#Zk_+El$ai;k zfnDtqS@GbYQQR3o3?N#>&d7B+)esEojC~dm1KQLq78g1Z_0-T38k^-bgJ989MPyt_ z9g5(zn<9T#7bB@%fv4EO<^YRmRX5Qoc-_2sx;-fF-FsZzy?wXXx^=0@wjLJim430Y zWE`e;uo9}nwy_r&@N&!^1DX!f2Vhws5-+`tTr7r_aI&dGf)t1vg%NLIkNF!zv^z)} z8|$m8)&O|smHf)}B77l@(BZ|--hQ#pM!ueLp?0?HixVF5cTQ|oteygc=s5tY{0496 zB1hF0Tm*y=hz)cgFG=fcBcD)nLBq%y?F&AW9tkiKE5`-I4`TuAtMmY~frKY)WR0~G z+2YyvvbTTlefM2tBWwl}j86wp5>!apV5gtmxpp~!{MFC%$&)M7V}};=6DQ8*x9;E0 zuY7xTlHx?^(UTxSh=E3FZ4YTNsWql><#@lH%zp3>Kbiiw|J8q&zw^$?zgq(FGI4;L zsqOBzSSQaw_KQr@v^H)GIl^&8wNO3dSPZB$=6Lv=T3TlZCQyoHVtu8)`1&W6!>_y% z5m*Tyg5r!m&xnH(1CHCFO5$Z~N|aa_CY#01K05a`sDe?FU_4xkTukN6-jJsaP_Lfh z5))NNP^leP!w)mpB~c$D_E+cQnKG>z_Yj#Bx3JE5hS})bfFmHWKkE`o>55R`z2y z1QtTiR9!t!Gov)+^Gw}kJu!yd*dHY*=7hY;FswqBaPVmSMy2YCq;An9>+sL^iWFdt zN`@@z_M2DPwlXb68hfg|W@YkV*}g5?M!U-dmU}oY{DcI>F|IZVhe<6E|SB|LE-ra``a9D!x5a}c1mof)#X(;r4{GSo=)C*=Pe?f zuH;W1Jua?Xxt82QN*JPNhZYo@JNw1WK_}VHmyib7V%6>vm9(x7nz2jJ&$p7+Vk=)< zLb@R=bVqd(J#rt0!_4?1K|r7&4i0M^bQp+G$smXT1D@oV-yk3&Ri~8vK($=<{b&9B z%JqB6%?p?F{rgvoZoX4&)W^jVDxfCqai8eHpr7q?h>x4@v=R6RIDlLMUkMk|0ZS6% zz`h8=m%3jAyDZ$cd&GbOjYYKC)x@%5-UuNA>WGOI65yO*u=6e_2p>7L>LwGterP8M zhVqr9*xi=w?(brsm@t-0Nq={jbHT=R#fcKRi(E@70%J5fJ%Z@r!=iP9Vn_oNKy*kS zszKEeA!P~8kp>X7Pa#gAUxIkK0ow5AJjj#kcFNxfsb?W+<9^!cbc^KBnQZO7&$836 zoX7?}l-}y|2G6cCP#+YfN^sS5KbG-g)P3%AV$Ly!+<#FaG^sVKK=C5;vfIxe>6FJ_T8d&xRZ6DOpLn->hI=a z5S~j8C2`n=I56Z$4AW^RZLBfvqh(In*u^HX2wH;c&!^x{W7#r~IBm&@lqYP0_3&+4 zK5?SD@cQTJ`l*wpDhZense^5dtW}i@$Jhmu!$M{xD`!E$FIGQfMH3HmDkLKjGiAGtwr3d$K zq>nCtk@oN4Qaj$G56HGGGsI7j8n%*h>UkNL?YGQWNBnXRI*f^a zC?zToySCaKRla^QX|UTB<^_+QRbs{!1&AoEqdQ(QW)gFFz&FG}cSA?uJ=Q{WQq*B5 zs?!1MmyJ`nx34bNi?u3oC${bqsP35rAt0dH?i43a94}sf{ng^V_ukFmi1Cga=HGn% zO?sX457?AOcc35UAynEmh-gY|BYg51h6WKr zQF#iUN(=h-+c+i@qQHr0-nR_%L4$Gmc4g#BHLNZmmEq@iuRkfS-QO%Oes!UEdW~3R z2lw-h#-vzXBpe1@wgW#LjS@DS;SGhV2)jpuP9FjQ1Ows_QxP`jd}9Ewb9^g$es(Ln zX9B5#K`X;#dpkxF0iP9PIDU2Zjw1~QIm@q?(`|jBx&gnFy2wTYh(i1K; zID$CrgKAeROVugiDloU#*lb_z%_Ij7=aGI?u=OFULl}l`VnCr*`ZSM)BDMz$5Z1ts|Wjf*0yOWKj~rh*T#W zy|{bpa{BBy|32ME(g5(p@KKlQDAIX9`}0$@Bfhhof{56_7ipqT<#*dcURffrF8vl+ z^K5w_WhQD)U|!^pFE&ql`#E8d|I4A1@s` zeneN+6<3UDq<7rP%cS1V^7w&bAPlfkFb?>^L$FJtQ07tB)q?x3tsPIQ-NR|pKCEjF z4n3XZ$Z9+3vdPU$iD8&<(iBKn1q4qs2+{zZFizqajvGl%G!KgU!INU= z$>U_d-*;4tHi-K$2jZMXLip&T4<@Hho``ClO0iq46P~(_%1lCIsE=Jdw{R^b zT=xK;nNpb?kuAqPfrM2(HHf){Doc0R7B&|`h}78($Z&%;VFf~!C<{c!SR%B6#Z*4C zdM9H7`wjEaV8|G|;uv2MGh^#Lp%OeDi*aZ9Aa$T}hE`0m^DuAgE2!7lyFptt{i%mG zBZu%Ld)rTO10EI&-GyQw+XwzZj2C4_*}-1ehj44P9vDo~JnfD?GPNuZ{x=gB?Nwzh zF>n`y%g>dAuOw$`jEHUvg9nkW7DtaBWgi{mSI5n%durNmt`@tOf0`X#s1=`o{^|6i z?|vuS-`>g}K73R>dGciP)mK;YXPh{_`u1njvk-+E=W9!KVB@CvxuKrGR@H7y))onr zxZcfAE;X6U`g8|%9mhaqkN2KVQ{048;$J;&jh-(W+xNF}Jtq!NAr6O1;=rNd^~nUO z0bLSD>cD^$)si^C>9WF9Ct(;P;#5f-svxwIb1fwZ5FB=%aeAN$(b)}-kd?`lAsSa3 z$KOv^-u$?>!lFVu0Kcy%)2K?^*K`jxfe7Btg8)=d#JxsT*DU&0)lmTfEOKEnkP5(R zaFZYyszWqM0BMGRjPJr?00AAKWB>#;6?s{AAytUEtdp#QOhAZvB5XdYTowZ5fIVi& z*?NQE7`YXIg~)}y0*JFiWu3I0sSS@QHH$EPtSYtNaIFTJvOwR#nDigqu0FZ=WwL+g zTVhCU3eJJhfmp}ZrbYWA4>^J0;MqjD<+?732I;Jurdxa<*vL1}|KfK>P+lNq(~+ml z$Gw;D=J_oTvJgy~w`D!^UxwV5T=Vzd|CRjZJoxE(x)S@xbJXnzhnB9D1WpC&f~=k!|9+ zgm9=H9$N+bKf3kFVZ6+iR%-d7PCa9ndiE5%PJfKI6P?*UphLqg1Njw151F*OlcJe4 z|91C5IK#TJ-o1MlDG}Gy5xUvsA*#@NrEvfPMQTWrc6Cx4iKK!!$SnhyDtHJQjKBy{ zV=Fa0Vo4luS!GR547V5(1a4;r-;<~WawH$jwo_fC{j^(c9(}!f?1PUh8>dfK(67Sr zEAKI*s))c5VN+n*nMRZkgh2$XMBu@Oz%;PMEeOio<^Z}S75OOyOe3`M2ci$5Q)w6n zH#g12chfP$<%8l*aQOBWTq2?q)kj)Dio~kBC>*3N64O{+BcQ%2BEUPidc;w)gj5m) zM38kU@}6}>GU*DiNO@4q^ni_hR)BH{=MK465dLtG?%lqY?p*mry7%yUrQk3aF{<#5 zQIEEn-u4BO_mj^e<4E_Hh{G(c$>wQh`C&TaZR86CU*<2%dAZEz?^*HldR~-U5{G$N z7WrFwrB<_g=4oPFXX*Tj@pM$3JK6gTcmat8&Y+*ZQ&p5!Aq0&>=abITS~~5l69b93 zMjfQM#v&uBJOGjf_vpngrp2R$1Ej10UA?f9BIOQa=9(yEu$>?A| zjH}iOVWs1g36W{R2{)IP*d>m;<`PGa66!n9w4Ij-klsOJ@YS+7T8yU4(i><3oWDkC zgA$d<9@C#GUAintFR~FIO5(uoF>MlXLs2rAn1vLC#s#3{ZSF8DQ-NBS@pvS&ovbe} z6zl9Y2sM}!r%Nx=pQ~sv8Wc|+J_=id`##u<5h1VatEXPXVgcKzJq9z72g@Xm1+WA3 z(B?@LMs8Zf(WHl@vrk(wpEIxa+o9lME~^k};!!s`1n8?z`~6XNK%XcBK63&`yily1 ze>*$!!4Id0-*}g3w&)|+(MxUY9IoVT`nuF@Ob-)Dc6GUvFXDDfk=Y)G?EQWYVd!T= z9w13sZ)=*5L51#_m=Id!5U#JyL(OdZXyyyqnofC(V z27&`@1vNH^K@3>0s2<%0$_@_IARu1=n0@CG2P{IcI1ml&5~X@cH4_LwtVQSnK@zM{ z>LnkxjZ8}r%#$0e!CVlfWbI7aI{kif_M?xiC&|X{jCNYV4&Y9pDY$-cJji1{RwYL( zhYt<_Ua@l%w+Z)Dmq8E``7PCl5C@uz8j7SCDJWJxCv^6JlSD^6<&r>xusonlbqPR5 z_gSU9iS+crgg_U+3Isr(-%8|3S=Pe3VyU`Xyj*X0-kUP8zHH=Cc%rmYc3s1>x*k?x^||r!a?_GYdvki-Ex)yWy5K(0|p#h z8RKKdY}i-x@}ITR2|yFu&g`wPl^W7w0hRxm<}R+9Pl{c4E${XS3OB_muYvyiNOAs^ zv&ma;zLmdn?p)ql=%jaV-DHE>g?wjci_Mcn*&OD{z5PnDIcgSzMweJ`9V85pIh;6$ zpTzFuavwqqH4vgD?`<($I%ei5)dXNmpJ4ItAro|V8|?qn$6E7kxywt`JQ`-1bPOs1qFdAurU#I zFCI=EI}|Rjf*(0uSTQ~rFYu`96%g!V4Prb*I&$~6UST?)q!0i@bKt9}_Y~yJCLlH7 zL37}kan?gAr1KWyW?Q0>u#Vszo{e?YWFG>aOPwZ5PWRiL30z9Pdj6B*mCt@KSv_?g zGXjJS!zzmxqJT}I-po-QP1kWUSmE49DVi8%Ic9d@c9(|Ge}3lFowpt zr&zE8#gMC1F)0n`?n;rsEGPjOQI%v}V4ZMJC57uDz5}R%t3pDupc0|dwLtL%)%#f`p2?Wkc=Rb-jfdt8~gewW_nBVBLqKR#{ zM>Jb<1ZayeV@MRII1+-K$WpoHbN8f$KzmTNIR5!U?pG9bI_O za11G9yw+(?Ry&n^32Cm|0R7R3J%(?0Zk2yQc`f6he&Tm93X=b2TVAwU|2YS zSL71J!E&%`BT=w^LA-(i!X+vxkR-6}iglL!6^Z$+h0ph}b2uf=P37o^-%H^ndGFE^ zoCPVSER2^x2-B&G3kuGAVH636Z%P-SBc21#f!KNG655$vF(Y7Ds)*<_iDcaXWe_-@ zNEi4f@<@p0ZKnllF~y={UdD^YLrL{vB8&f82puX>Bm%EDAWXlT#WsSlNdc0Cj|5YL z2erLu^@ashUrN8qSWX6)g#6Haku@3Db ziv1_6CJ2p*#`+!WG+LGb(o ztg(tBhr2N?YzhGYKoD*ll5zslWqKCn7rwrnJiK^Nu!?;`1(#9)6P zLo&wLA*{JLQ|Us&V>s2iyM_t(v2pltzH#`7I(w0~5(}S^AQ&H?fibWp2pS^Bh?Sr% zJpexn$=W|$Ibv9t1KN%>AsY^)`GHU6K*vu!afi)Sy^;$7%!&&^;P){YS^_bI04PaB zLb4dp4+lqxX`4mNGGo4mp4P^Gk=U~mQyeSFIgNa_2eAg!f@?6wbliQDlV?ull|~ot z1ql(U2Gy$)iKnp^TU$?)L2pkN;es>iivz}vQ}eWqh$6fscHDurUEVP&zE)ikb!G1P6HzW9k%Lyqj9o z+Z>@zfAo*1fAS~NvHy%0qg_f4O(X}1Lkr^Y5aLjUI80~6p*F%ZiGv(C=@7Uc zx-{YV-M2>ga=3SpJW_=F^j{DMG8JZWL)6Ng)_IMj+HmKpOAp8juMeg@j@^ zLzn_<0+~S+JfMdIB1jA5hy?LJ=j2u{kpb8SpY&#@nbwYfP(At4XGvpi8L0v!B>FIc zh#aue?NQ7(Hec! zqlh1Jdr%BxsFK`eOLLe^M~%NA@_zN5Dn~xrXJ`!Zvp^CcsO1_PnBZVm(|$7Ax?4PZ zx+zzix_@Bf&_?mrn{N~!eE5EG{@fXNA14d}>uo5U!k%6Y}mhETo7L`y3<^W3f>a+OHiH=Y2;VLwTS5YVe@ z8&DjOco3QhouWs4wB-@b0}pRqw+w2COKE{}Atcg6AjSdWnh^+zgJa?HG>x85smG5d zYisM7akzGpg~`!B_;2!eKKP*MG;5Q!b|qg}>=1AeZ@FqZ!M}}-gAj&;(R3HWup3cm zIZ^tcKh4GmNQWRe^wE_J9+~Bg8G^ubH9UR*UWkO&QBF3`7uSf@)Xt|HY~FO?`jfmEcjpH|OJNZ{Q?7B5oiLKoDk<11QUH&;$^m1R|3N@Qf;zF(xXOm=~8&-Xkb5 zoq#5xDwqxGv5)98OZRD#(|_C-MFI+=p3y*4cqie+J<~UQCm{rc?Q)H7T16eP{@Od0 z_K7ob2DP3{mI`Ykml}w043*Kf(06(axgz+0x(Q4J&jY6=^W)k8Buay}w=^UO8MTF! zVR>@xE_d&xMo|~U$2Ab`8JNpvl39+b?6F@&Rvt&vrK1bMaMW@8++QVSitOXggu^ zLbGApU;cBvz!46O^;4$U?WHtED>nQHUmX{}d6}Mjak+OfwDif{<`aV9wJYp4O}eMw zOS{L362fLHv z=6*dHR5(TxX~4Kf`uQ8eqKg5yy})y`4Z^RXqN$?H09YA*n~BjhZ>t`1UjVIEYG4A9 z6qq6y2odVm?x47Q{a$|Un+wI()o+u<$&>8VN{!<_@wP&RGGed9&ekq=5H{Iy9b zg)sXXqqzz8hF=T`fLzIuqikY&ZSAaW{Mu*S&?COlkdWTPA)5uFe)=gi3lQ`m)+jb0 zZ48E3Ikdj250bzLvCBA8b(^u=!UO4mc3Ivu?(I)357l6E;=l-bFDNlwv^CHk&jDaA zVbpT1;skE3O+sqy4~Q}K#^>1&fApj5=vo__LOVk!%mxrkrZ|5#91xXtjKt8-dmIuz z#qye8Yw4LBkA;75R864?LZv5gk)dtR;Jti zW5xI1+ssz+j{1>`2Cn&{iwXRj`p3C=nK+bcCA^g&4tdN%YlntzcS_$Vi;;AR<+zVoG?H@gl)Z@1pLt0 zksS_OjFb@)fn$YS@XRb_2j9R4=1wk=_rx`k!ND#9M-=>HsZyeEAa|lc5@oN}J({k5 z^uu)N%&QfQnHs}^Si%XS))4WE^nfGE3zh?DC)SciUQjwiB%%rlM9c^@hU!R2u^e(! z4{1Qq5}KGB5k3Wn^94%;7$yP8PS{uV#3cl}T>0SKiiEub*P9liVgY<5kK^t$ZJsl5 zlucRm+oWar5*NyeT@yAA@(St0%S-mJtdj&t6V#!-llMq>N!H(~?A*ST4(@!DjCUSZ z*~cOxu+LG4ZDaXRSJ@s)cD$k=!B5czXdB}riD3$;*{O>gI||MKQAPV(tB2F&<8N1% zUVV=P$JbNT^)wz$0P8$z#B7VABtfAWb%6h)?KfRkyLp4%!0PKofYNh!P)jg~9l)>Kb&w7`D*=`W zT7m5VL>@zvCQo;I`L~yDB{wc#&Udb1P#!%iPAuj5GAGU%4~d{_IR?&RhaJ@JJpc}5 zLzG15EUv9Po}w!N06+jqL_t)YM!vLiBss)pv5g}~@-@zVXb_|io;)}k&^6q4ATe)a zHc;mP9o#w#B@oG8iP%NizDL!A%8h}=R*<)w?PPg%N$ki}aw#jpZbO^7z;kq((QIdS?#_Th)`=dZnXKKuOh&-2d4 ziR>=ueQS>hx^!rF{~&+1J3)nnduo3=rOgsLg%6r)m;~kwXHUJDU~hTmkAo1DAP9Dq zEkdg$4hh6zT4?|yu-$n*TdT7#=G0Plta}#XkmP?t8)G?^W95+j&0Q|C7sTO_Gl&$> z1z`_sLo8<1{yw3V;6*{>5{Cv{DkhvzC$acp0`yR#-TdiXj)7W10n{UEfH3lqAt04zk93yFhi z0buYVGeck2B`8tx zMl>n*fr!MqrP+=m;x1->~@ zF(^)gS0J$%9v*PmP|{$TfiyYG1c?B5TEHYg!r~d&SQ0`PkU)O8ZtYyC!y1MGp}a_B z4v{^>PE<|CMKESqXCMVs(gIYQfuNKskfd~xbzzVuPcTTssoNu<5>|+VZ9=-R1D56G zugF_tv}?%zm|ETVjvGH2cZz-R%0-sMzk~fy8D74D7U#ZMy8O12hn`WM3(Z#etNm zR+sx)DLpW@FB69b%eb=Go>rR~JNs8au#N2ST06_x47W(ksbk5p$zLW84jhp2H+MNV z5{K2*|ECh+Gw@bw?be9_wa>l;jG3710W`+9iR=J@fVfpE7$Go7D>*QmxE^M>Xw!a> zCIbqAm=T95&fn^fxR`bkVHl=;g1&V$)xD zEm=JGUS;8x_tT|~^^{FD!Nm)`f)H(>kK}SZAQlwsDuoviH6lF-ZjuYZN(}8c5|NWW z@=Q4r6x$R_0yr&kta&6DVtV>$10kLO5vv3Q35Vu5QghjLQ8e#OWEz?VIr+hKr43khhmA#GHA^TpT6jW7Of zRy?_ybm`b~x1IFagx13~ zwG@PCFg#Aivrn!Vz?oDtpeWN?P1Ff!Ivack=USJF0@X}%dbsok*z=Dl0+-fMaRHu? z0f`M|#34m+1@q(ynRz=U+it|V3hC29*Xf`AGOm# zZ0^JUAd&G8)eQ577n#+DWZ)=pFUFDIaEz^=@@Xihu*rzcf>;6qwIRc@)SYjog)?VP z7oY#Z_w&y`{Ukqs{(Qnwq8Us7kbp27BmS8Hk>6?!a(%HF8vK%g2$XVT){oHftQTLVKCUQOxtYRgFrNhM2b$o4%t_g zT~)1w>caRLo+iT27`3XV1qcK;uza|&VgrK^XRsSe4%~_1L}w5W5TC|KLwr~9uu(gd zXPj8V3KQ82j-WWk6=)$Fh?m~8d^Bd`xC8NURDx&;!r%_92biWOaQ$ZOjH@f$2&_fDTdAxcPuE}lDD9qq4LlUMP3LOr!CoRF z=CZx4L`tQ-s$^Yx(N}{6Qor{iaPkLn07=FxAWsz%Slsm)h%d?$iEgnaY4<{hbc z=7mcV$f7SQa4nmEs0(7QPd`K;)-Z{qo0e6krG2!s>?h@^WFohOGRj4Ik{~IO&}QCy z*%p{j?2t5(dKpBBnld0AvM}a7@Puu!!Dbb&um)`}>#Q6rCf?p!y0o&XGq;4tYP5HV z?HywZrTLUCQ=&^8`(|i2%bWUr=U5d)_e|46m7R2S|5Ezo(S2f7O;e(XCKzSY58i(- z{lh={LBWpZlt`k*m%sd~xP9w3A=-=L{?q;BO0PxieGai_e*i9~oTS!B7KxqHT3KNK zL<=LSJCz{}NDwWMz8tj?P-!1AjW}l0cOXDfjS9yh2G<+cZWUkr-~XJL+ZT%!PJLS< zyaPlk5cUpHShu%un$+uoHlwa?T#6o9qV0{%{ne^yYgX zM|q5qpu-=7>Hssf*uaBu?SbDJUGwQ@&j?oV;aATN(ucSqogkt!<@$B7$;*_MC8#;a zpTg#@uj61HYOpJZE4KW8KpdZ2hA@NWb-e4^Z`^SzQ&OiM4!{iVD;0LHB z-^L)l$g$jPG^A_yw+EAdedSsHlgrPFgE4MM5(MfD|0LqC!i>7a*%w_kI9x~$5(2QG zf_SKt0D2q_*#m>Lu&`L0pkpCK3tD@m)P-(matvDo%oaf+Ta$Vh;bDz4Lxv~wKYms2 z_pcHMhdLImH~*>E%jY>{8-(nh5eKD)IM3mrlpfNwhxE`1;-J(p9u0|srMD6utOywz zrX>zwWC#QY_kb4w6ukHodJLp8W}q7QD6mdGMhaoUtM-OiC>7unqPBTb|u4_J(?C2DB}PbFPhItp}!N9LsVUFA6TllwbQzC+rd5EsoV-W=f%> zL0Z%Yf&wUx@_Fxyqzr)}qy}3p;qtRY0BT`Tj6G>BiSLvf?Sl!4cTm1`y)mw=4Q{Y8 z?OL+Awe9YHeE8SWciws<`RpHjKmGKR-=hUZ_0q+w`K3#jD|`KM@u)X0ZV~+MS%u(t zs5i(&KvaDG*t21OP#>Y(pU0N($(^*zF1j>DdYi9!ChoG>x6o`GdQU zi*J7Z^JMR+R=VHu4dIgKaL< zC&KU&n!)a>ax_S@GP0HRwd9R=KO(^23Bac0x&<)Xz_^w9oIR()+2ME2C69HyAEQb{ zBJhjqE3Q&<;D*s;u%9&2bl~T!urj5=WV1hGeE!zX{dO}sUxj(N5iQ< zn&iJW&42xejA0Usds{n#v(|D5!LmsiVau6myp`A&Auq{0+Rs5isAZI>EQ@d!Aba?6 zb}v8j3+6 zNES_EbG`oN>-j(W!#^lK`n?Ybm)_0^42V>`P(0Y1BtO3RDF3%t9!`3A4?)Kf5kk^{ z1r$?#62T2u>ea~- zQo|}5rTVy=FW1M@-5GJ{K^$JTIm9%)^iMf2FTMExbIV-()FGJ&dj%ZEt7M^z?J5}-rLXSUSH&L@ZkRL{c55$q3Tg8*fn+16x4wB~BE zxPG*{_{xV#=g6r_gNUF2iLSHuM=c6Xn;};VAyj$5r#O^?g~dR^@r^MMd6!M+o8%R| z3G$>zF&>dNh!%Yn(^3ps1EafY!JgDdy}akfvcTVz6U2aLS89n50)dkk9WhfQe@K75 zERz4|GwYuBbcCr3M*uoN8nQTU;&c))luv*K(7R5a<*>U!Sbs88Kc zJw>gBVOc%3`w@KR90Y9*glZ-a3*2a+@P)>KwNYBV21q?1 z(`5a`>HO{YJ^*pINhIZu>#tEOnFN}P>!>zRd_kr5Jc_FVz)Rv_1-6Z!*tiDa>9F6R z-Qm|xVB*F@X?oS#q3)mPzcb{2Adgu16--dM=>;# zNqN>aOTaeTR=)!rAXU7=Al!Os8ODO-N&@*F(t`J6Hv6IWE*?F2ocDHim^0c5z{p0! zi69)asDMyMa&+Kc214c23cbkmATw>WgE;{Z%Rb5LU>pDh(e$*~Tz9JY!ykNB{P7?E zmxa6Kn;M5H2(U?@+RWD!|=!G;BEK$^e#6qk{r3HL&z-)>9 zw1zk&8G6Zq6iN_m&d5+3;U?XfE^z$o3aXUGQfInWZR88f&3t*WIc>4%ml_k!uI}bT zh(oJC$se&j|7h>ka<7B)@z-4R??3HwPL0gk>m99m65P|LNQKBabK(HSCI}1A0YR*y zR?_w$aX{t7f@ORO0V8oxVnEpvHV4K=%)veC0;GmYHmc&VLO$jnyj)AB^${yU7((Ae zFg;Eq1qEq?0_nhCc~KgdhUe1uz&BW46ep%ZDkm|&K&oIY#6p9_T-pO7ClUd(0WpKR z@Qv4!aAt}=gApxU_@EGOVPb+f@DRVea@}wrY=v!!v@_8^(|s#W<&A_#2Zo&{h^QI`k;06FYvzkgx*-T zj-ze2k=9-!RK`5g_?jD^{9%mZJ)Pv2K7sm88vh5uVd;8BdduTtv09ddC&t$YDx+Rg z`EHhnlp=H60l$eHqF`W+5}2~RN=BB zU^GfQ*6deCcYnhPYX2W~Z`LK*bsgy48yR!tTv=H&stQA4CP0uBh)EbktJ_lBlGRK7 z;-`MG|Azb@`lWl>UQ1ePEicLHmP|I?YKr0{a1uy?12`0j0#E~L%sC<>A|v8nf8Rb4 z36KOSiqx{m3sgqLz2}}`pMCax_Q6rk`524y3;DV8cjwPP|5X05-*}Ooz{@DgY4q9cni7ao3C z2*bc!TG$UMFTIyeHI(p~6;j5aY(wkl7nD#F6NCzxNGRh+l5hcPtC3pUEieRq62~!- zS1_QqW+7)#vTi460|HHjW{Qm|i+7nuF(WRgjiM5G>ZTOQDxzpGkyJ*h#3h9o^KbNGFSrKJ#?;!b>j{4_-Kr?`auy zE^#uC%CEn@Rs792-_E{wUB3e7N(eaQM;RetnkYQXRU4Qh9E>~tq!hr2xpa$GFbBh# zAunvm3#W9awJ>SI9NMkMcplZEv(%X!<>;Jxr#_jlPtYD(1=}7}gvu?F0q)j1<2jha zE-6&rdCy*lDSY4eLtOj0FNPA#!PDS$O5aAqZ*}XHy~_4nV^FVn;LpK<8DJP6%wfzP z4bF%LFAs25D|I4y8^)^St#OISFi{E_nI!_L)|8|cQ63<{M+zlvNfn@oj0WD~%x51U zbHFw_-UHT<0f?jX%_U=i{<=;OPFY`&Vtfx$FwqvQrd^~~9ZZY`yaFeD+vQy*p8~i| zE+v@&_uMDJ6j7Mpu2WH(j?$)WP}X+2?TkU7Z_D|=^a7TFAe)$km4{)7hxEyVHJlRR zYx7K;*j4ZQMJOMI@!Pe*Z*Vr!6zQiyQF(3Wp@69H{Z^`f2YW< z?YFZ1oaiHh*_))aSn!lL2wyTE;cHN1(9sN2m?uMO>|$24poh(-l6zKOzH+Pl_Gka9 z+_>~jLQi|y(Uqn)XH6KMnG93dExIrS32{IOq_W$LF(!{+fmEwxIc+GBQ;6Zn8wIcw zF^C@dkkEk4$23p7UR1=&;JDIIw^(B`k+QwIo?UqG!AO`#HMZfTCr~jJ7zsfGC%_t5 z8nO*e7{bIsowOyDp}e5>avy=d4z&L?Ei6FcL}upDdj&p)qa8XbgV0AaZP$T<9kvu` zAktW?W1D{ZJdhzxr{zu0O~)vphmif17R5k?&m$t1m`8>bJE|be%!3YWR#$9n&O7g*9bu-Dse*v&;j|G9B8@dkVK56Ak9_*o|y!`s@^1prU?c%Ks_Q1eM+{tRB8I}W8dbd=_U8PX; zjx=zL9i{_Gf>5G45N=EcUd}c^Tfi<^u#*LiwKe7>IWz-IRpeVb!teQJbuzz5dJfJ} zo5Mb1Y%%%wiXkV=AT<|rY>*gN2a_M%-kFT&j~2uAonp2T&WZSGmuUBMU+?uh^!qnz zqs3v~njICoTT}-K#LWpug_by`k@5gGd5<_7d&(S;OxOqE#y6#J;HuUzWe#YB={LlU zkO=KYU@G^}7{Cg%thy3`E@WM>@<(3-npjBwh!KFFq<>Qe0m7@J!*O6d!4zn1Mx=w_ z^S&)Y#W0z&JU}hb5cfJO$NN~aq;TLgC(f%-KcO&JR00m?8(y6GCHleN!0k}u!$SOt|011`J24`3KB zr&ztVi?|c;aQ!(>mx(J*ZAb-+va$RmtkjH3C*c)8X*dXRu!|{txNnC7Ch+l8R?`*p zL4}eM_!jqr5k;F)`lySgYt#^MCQ*JzrjW^Xv{KT+A;*~vctw_nM>cWpbrxK+(>v6s^@#@76N)*(Gcr_&%!gHC1AT_9n%o9uE% zLe+evrhsq3vlL(uIB_9d-}v^$^3BhDyd2+lFxfC5 zx+^_m>Ot!CCAuF($_ev6Ydl+;pU2s|KoPkp047^2qYuPzR`)nt!P1LI$Rp*8fYb>F z8lqLy1HC|4s+6bCoiEqcj!N#8LEzdb=s1(3oGtJU9YcFDN{IFpf0<+h4y=ej5y`|( z?)Y>kw-H4yK@xCgn3klnyeUejaZxR(h22EQHub@Dt%;>%drqfaj=%8<6zq6lrq;2bhl1q?oN3? zqM|!RZ9LgwR~*dYxu3zTB)n#qi}>fdoYz?bzAE`LHuD>EGKU^cX^yL7oep6H&72O- zk)}qSmi_bYA=a^sMKkp1K2ar_l9Jzn3|jss7y)tvQ(!v|3Ihf>f0NoAYa?azx#1Xt zF8Mb=U!-ivf{X`f8kq!BuyQ2HMAVWb$*a;RrCiK-NEh@^%^?w;sD~dQflDmNv#SRM zL+o%V1)M-Kx=k5=L+L_03G9c1a7BHt5B(0%)RT6c>lfSN1yyq{vZG2pXD2yckr*_t`KPJ_2?u%MF6a0AMtM=(L2(sdP4DlKmO8*Yjt%s{2k1xvl;Z*4`APMzSiAm;lb}j%yif^*bbWdqs&26 z&`iV3%T(2Xcs+s4{DSAIv%?F84n$v?05OdoYC&4rJyV zGd|Q|GGtE)n$+SFH9!S$s_QIfT?Wk6HaJ_lyz^%xt`}UR1^3T6?seJR!Zh62y7~@gx zC%x6)z#p_ZhGX?A+q{S7pq;v=g^RQz^bu$D++2OEnR2e(#MwMI=Ga$Ec8y5FNA%lh zk$I|

l<6JhHzYG3gg8Q$PbApl>!@%fixLd;DH$YA5*(f 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

X@{Ar(g4=G?CM?6we0r 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

;7iZ4@8Y;LnoCk)wkh9bu&7#8eA0{3x@r>? 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 +4i+a19 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 literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind4.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind4.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb0be9a2ab966e228e420d4e4b45825531bbbf9 GIT binary patch literal 225862 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 z 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%0AxMsO8qUiAVlbhpB!DpXs?M@0o_o#WGPawy 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

)|m7Gg8=9iNHly#ScR!oDL`FP*a1?J(q(=_ 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¨j$s3B7r20BEwW`SLB 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 cU3ks9|+5eLz7Z}Q!^4S85|MfnN7 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�HC&}LZQvwdBad988AzDSYi>|k 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 literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind8.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind8.png new file mode 100644 index 0000000000000000000000000000000000000000..712767f3fce9d9cec6a43768d093ddbfb03b5009 GIT binary patch literal 225673 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%0DPzy^Dw8tb)srQ28_7_{ZQHsztOLh{;Hjc?18HUj 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�S9pzlN}lLI+xCM2__RSFr)~ni00ppcVL)$;(XPM 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

LtDBR2Q)Z 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

*ZF!yXX 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

0~xy)5g`(Q4gx%}_;5TS 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


mNJ{7uaf* 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

BG60}RoI7O10+hdJUrc`=VviW@lPl#_H4k6 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ℜ@{Z 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�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 literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_hot.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_hot.png new file mode 100644 index 0000000000000000000000000000000000000000..15ce1d7928761e6cec941bc66e571f90e07bd2f4 GIT binary patch literal 132167 zcmce7cQ9Oi^!Hj;SwveTLI@#NO|XbwqqBBdthR)N)rsDTBnU#3=)EnL=)FWlLZbIx zqW5Tt`g(pd@67YO^ZWaqvom+*?!Di7&iS76IiDL2*H)nfGl2mB0HvC$5&{4qL;(N< zOr*p&cW8~i>fc-l+z=`X0DK?w1^~bYP*alE^D^6RnT*~>B^ETCaM^yKdNIV@6CqbC zbQeDJvJStQ6YCRRq*4?a5dPLHeT;CVjMjh9K!HG?lpq~yrHtZsSMXk4-W7G8iVCC@ znGzKi6VB|*atN|={I$x}pnBNZe_eC6!rg)(`ridlPvBWrHvAO|{NE+MooANlfB$Rz zogA>lj`)#72K)Q}O>W*K{Qv&u=4?F)3Xk*>i}qgAb*%q8mxP@5-nEsB_^-5|(+3lw z_P!o#VvZe63SY+mzXNR>Abn8bLoVQ#HKMaEDiF${4xVrz68)L{|ID<4;ies@4z1Ys zO%DMDV99j2T?$N@?LUH%29lM|g*34Tj~YAEytVGkb8cZtVrNnQ&!E~R8ULp#P7Ta4 zgUPF#R=br|Rbv0s-+uH{w&2kn6Y=P+^j=oa*3N0Nxu~B$-JYI^X2~Py z%t7v&Bx7dDJ!fD^$32fvt|*4|90O*A1oPg1kz0xC@D|D7ophjVYtYp35My8-iL zrMoh#PA_BXE_T!~$4|>0r@a3=c6plm6_w7==oNovzq;Z;C&PxbW!6D3_VV~#vb8dB zrm}7R`YQSz)7~HB1Wn=HKg1eM8vmM!D$NA-&E$zLx=cffP)hMPd%1T`gsQtcFXH>( zj$~+5F*Q2ziO+T!;+LK^aVl@F#uvykGyJT3ezelf!i%ZH`^^s32@y;fyLILhs{N}I zFDedajTq-Wi@aa)w1%cWwseNG-_ip$=6i@xVy^B(5B{rycmL<<+FR|{G3(d0e;?P;}7y*#yw|6BOEf6I(A5v?H$^@?N_GH?x2Pzh&~*fA^6`+H88WX6}UJ%Y8w- zGGlj9wR2Z!+-3VOVu6jjDNF5#O&hHyVi(hFP_)y!sCtvuzn6@IrhZYSSj_d7lV9PD z5^T~kliu@mHx#SQBs6h= zsjaJvS$@`T{6^d4;|0&Q%Nd8bi|EM>|{STBVfGLWx6+iX(vlv zu^d6LrNyf!#!_y0(D)>5t3up!&3zWqdAGG>?!NNY^8ne4#rD0GOpmB>ryow4CR;sz zryF;iu1BK<+fQR&NbUBfo5#-&QT6xDGG4E_{8=ntUC1PQB=N=TLP6$K4Vbn6-G!}LmT`dXjPm-rdzkzx zttI2INf!O>yh}RZdf@8x)!VP+r=6v)RN>#Ec+9RbW{2k`e`(s9V*NZqr*tR9C1kSc z*w3EuNhPvAyJJQ__wZMbuo%m`87uW)5nq2sWZ!+}FR*Mf_xs$>?C|9DjnZMGdt`w# z2Rr)5T{9VGO7E#SY}+@qXJvbB2fvM6b3vkaPxHcQgjG`rRlYmbQByYROqHuF_P@AF9qk$ym=z}*)IOjZz554-00&XtwAI;j!*NU(g)Xj zp8;~BoIFDJ7>R!eY`@;Q6CmC#zj8kwX(ZeK_i}DMWZwMUFSn13i%%9_nh>Q>63!de z7akoS4)Wd`H>3F5@`UB!e62i2L?AFRma03uDal1grF<_zyzS!1+-i277k>3jO6cq& zKR8!l-2Bzax$`BJrtuZLdXF^(|EKzcoNKqcX30Np0>$p!We(f(hs=`)O|{i-4s3ZV zb3T~*na->0lsZyVB5v2;TX`vO)lb%FL1H$}LM5Ud*tFfNVyDuy_u4mPl(p?Lk##%J zN%G96|IbAp+i_<2x;Z573N4Y-_JK^o8J)h@jU*`OH-E-A*uNG-lohS<=FJRMrk|=# zH~Fb+>4J#9^N_7sOWNTWBwsxp(|fxR$-=Kxk6OQbXUNkrx3AksSw8Yf7`=1b zrv1H0Ru1<;I1YE9&tRfUPoV~bnPu_pODS{hc?;URb2x*(Rd%_je(#s4sC7SH-Adwp zG%0yP@z&D0)3=t0=LZIWdjDd-!^03&BLmT5DVV?)ced!xVWit5JATMTRWe{a%$Ay6 zHo;aS)fgPzcKN}geMOf1^4}K}spCLwpL9PXBhLli4G- z9~{JZX$RSRv)rz}AWJuxyS(37b-mf@B|>Tyk)iIH9&$Q~3pp**KCK}@0ZV?0y+o({ zW6#>kH=)96Z$kU#(Da{nl6`(R&Wgt5dHQkU5?PbKK0Sov0)Qzxzebxc1)Sh7^SGSq zgg1_Ax@UUyoCsyIZZftr08hKuVg~Q+7C)J1n1k}y7Xdyo>-M@$bl+60m-|S-3faGo zRZ7`tv`zCgefp6FC(YsZgrXGLq(BieagZD=u2Q(iRQ9CM+Qw ztjvamwxPZI+GT5*hiOcVCaBts$}}ePrguWF#7ZZ-!fy^(jGj!guEw4BY&Ex74;m2X zah!AYnDF*QM%!+afXWISoxk3<1C=W58dKb<6&TUd())GaZW=C1X&nvRsMqWU{a7~1 zswE35Z*(QF7t5>dTJtUp`peL(qCah!itb(u<118VQ5b%;Vbi|gA&A5vvr^@ty?)&0 zO^^0v2AszP7?eWQ=&22H{QhKlz)1L5B!9+mii9DH|g$W~)TN;Bpy zmp+4lCYc){anZ6XgU$P}Dq(iO7>slcc}q&0*=q$nm~?Gp@vAO?0#F$nMls7w>2aZ#-t187vR7 z<1w{k^Kh?-qiYpPa+utQR|qM8j|i;(`ewaOslSiqDy46a=h3ARJ(t>#PP#m9jTrMl zwg^O0ih)F7;Lk#r6&sJ9E%P5rMy}7)I+|o5${X9qGj2R{;dx6mh{G)BN2)A?y2n#m zk=eO8_gl7}?!8d2s%G~?oJ$|Q8Da+;P^c}>^a8+*4Iwm4AScKP?v;wqT_XK!(s6&( zQ4Xa4ldq(5M(dANh@|nz9e~Y}8v(a|bkXfICTAkU&jH4(w?DriE>QsRoC3A2w<-&c zZ!r&u?^SYn!L{hDT1t%jWuF;oP?$+&Gs^Kiz6Xe>sc~?gs0U?P@DY#5&ow3a85&hD z@;<+?!gMJz;YtbAn7F!f${ zP*iVNZhYL~t}BT+@13;QIKR;bZj88bkb!oqwY&Ww(QkntQz-;HBE6|N_LLB8s>H9! z`e3fF#czYkBDk$&1}wRX!#m%}M?$KBY7vX?vD)&@Do@(_dHajsay$f2lpA`IMvvNkia$Bo{y3CYidZ~&H1JpFR?j${7R)||m>2pw zb13<%{6jgc#dUs!!KrBtT1>yS71?*jgJ^Dq&ZWnHHa=qv=uBegSN}&hp8XShsjbr) z?lcOPUnsQ*9iVr5@v~;`m%d=sydOtV_1=a%#u_~w-TNmhg~L8m7Jc{tr+?O#gN|US z(fp+L`84J_F;K^Uvcw`}lHeT)yz^-1Fq!bdF$%3lV?oBQhITp3$v`Co{o7nYVM2ba>JHO zZxnM53zq&y3l}Tr#LDSOmy37dacIFTJ(|BW>DJov&{A$K_bs8Ifydm%l)E|hZ1;3C zD4V%8%^+M@X$+TLs9m$CmcF&7q>OlxdNS25OgxnOr+@E*HS``pJE(Om)(+cGtsi&j z2NaMKb`6Vt&x6$Gl~WG-H0Nm`if#oMUqJ0emu=je-=w@ce3UcP?a}_8FNt1x)k=#i z=-KjgBJe32KO9m%0Q^!JZ08>-(oSrd+)hCL#{GjgV^3JnxWau0Ipx$aE-S+M)sC>@ z0w~^gB(A*k6PHVk zQ@%Za7#yr&*Qhy}qSQ0C{31&7o>jKAsp`)O1-r)Q-dT)FR98uAy)e_^u-xy6NuL~$ z*-k^ycubHGUeE8#;YD&@!Is!Gwh>=s@1XHyd$+l4=MgIK@$M{sDMd$r@4Zp~CZo9j zKYFx4YI11M?t8Z@9$fEg>qMMo-(##pFq8BM?{bbtPr(Z6Uk>AUF)=LLl&I-=JpV!E z;=F9^JYCzhv+>aUt%?Y@Q%#E@xAWDo5&p~F;0w<4^ZrDxJh*rM0} zEQP&UdcZc?Xf*nENhC3aQ>9^TL>ixII~$_soiih>IvSQMRd2yxqi$UyC1j)I-4pVx zD}1%}cS9;b#IHR-98|vF(CMp{QfW|)6Sr<=_MzZa`Sm0r=J%MJ5n@N`-gIj7Z+Hsv z{d!^y(O+9oo{~jMXxVKF19@K{GFLQc+CdNf5jek%=cjx}m#Y6mxkoDFl9%HJ&#_s9BfW7ayoT|dg<8&V5 zX_MP@hGqVtLm~epO2+>{Mn5}lQYYFZBGiF{YYFCfr|#$&^>%W(u0ym!4{?T)w{7wa zE&W6i_d&R3Qf6?;ZFXN0lvj2#-Dqjsc4_>?D{o~nzu22Qs6Si6|E~o(2%C(nn^YDo z6b^8{hF={1at{Y8iLIW%chetL8XK%kpU-{u zsX?|!Hb%JFZ!ai=uqHKGo%91ajRnJtMa8%Xv*JzB@4sIs@cp1_PiX=SL?o1c2>)o) z+{c3--25TT;2s$-KYd+c8Snt-_wncRqy5+s8|gA*vG4x%aAiBcJQx~pRri_BgEt<{ z-#nESfugF1=N|97xj_9SOzWw9A{cDT{`nPaEXD-J{>6gI^K5oXu{(k8L;e2%BA(1Q zpjb=Ly!U42&iQNMawmMjCJO=1Sg*)~V5Ie{D~W%38!T@!uq1)shvfJ;Y3rIa@Vtc^ z-qeoc;02ZJ+E9Gdv#q3%?j8B$V$P!?@BX<`P!91zSmohz`<`j+2gd_-Z2G#>ufu-X z^tX42OpY+EB;(C0O4lV%l34;7*8LVUN?5#0(QUDAo{B7M4m9<}8!GBsRzLLDACqqqr3o}(~q!dkEKEf`$`O9p3IJ1T}e^%t9yaTPR8Px>2558iHiAwp7 z%fs7yAiSBr#H8;!n*n$&42-Jg&@T;$0(rddcetBnl6?iH^Zsa(rOoSE_7P)cUlgm` zn+K$$=wsN1@O8sbhW%?+Td|^~%kRXM;jZ}>J&|<-o_X)@1 zzY>nTN*{Jf{=~aTcGV3-zu<+T{pl#SsctUHku3`rB-f*A8nW5qy4&-VrMFPkC)I&E z5n}~Trs%|*jL3QP1{>N`76{h&yL*!g=~grXAC;NJYH;78B6%oVR(KL{e5W1T`&w5$ z!#!XJQs8ijp#P{E{5`KwmM{^{aS(VEF>C<|j=$G@SA1~I4;{0o##(qWuOBSIfF#Y^ ze$1CG9)M^F{9Eiwb&opz$tTupsx!v@@$%PKrKPjw0oHim%}PdMUc9fp)|}hyT}DgE z-LJhP(g8snJ(KQ&NaqlWcD!$L5E8F157xG1AUNMg|6pGbYKOr!oPlgV1qdFNvKFho z3Z~=n%Oa(8mAY1^)JuFZ@;Nh=B4G4VeVIXhjL}X#QFL}Fg-^6+fsCkL_1qy_l-$j~tj5UnGJn=w*I~@_f#YrS z9cPvqkjeSUw0ez^$NeGSh;~7a8!-Q95a=Yv$L!D+>S(L7SB5xlOzoI8!!`9|WU62tY25?4&L z-TM%0E|V(S%Ka9{eyF-}H&^yU!O17ugzy)H(e%ZB<$sMN>a&xkxZzKqK1py$9-V7K zzB}wlsNt3`a}vrsBB(YD#!dMvvZM=tc2QmQWj=|TZw|H{n+$hq_v^?ndOG^*t>ho2 zL@4ZOnf~%;-krJxyEguMuzFir1d_;nJzVxSe0Hz=SR_?)#4@Zw^ieIkG$W+TJc+`S zX$GVbz1OKWm@_^Gxg7MltU)V8EIjeoyutYOKz7DjiKEZ6vmf{0ZJ-pmd)GLyOus@% zNf^GY*Kx(`%5w44lqB$!ij{2I$<`{Z9eaG9CX;`I#c%&p@}VtkDl1mU)XdM?=FWLk zG+JZMw1aK!_>mOa(wHS`eEzSpH>~d3sKcXNAf3s{pZi@*3s;SGvyoxTU$X@nc0Y-> zU&hNU6U>(Yj|WX4+<^}OC+{(L(y31SCe`LR>0+uK@x65B%4I-)iyJK!{xq* z@#v!Hx;&Ob$D{*MzC5q{=oxQ?`!4&fqp&$bY8#!ove*nm{~q+I<)-ij#k4D*M6_K_ z(Ln+g-jL``O3~UVUq5tjGEoCO@3$_;OyRx#^+oN>;5%VAue)j*xn#^Bar6S&T2KzF_Tsnk=GKX5wElT}rEij>cV#r|dWN5OrDoQT`B z4Ok;O(74Qq!YGO^UtQ0Hke*!6udzVpnCWcFlpO^w5yS^0kfg>j5#_Dyqro4KGl!sP z03BPLLqE$}r-gBF60uR@@6=H{$^?gUqSt7iA3OfN#lFvzZoU89T;!z~!z;%iSB5Oo z3$Gk$s|gKLQ)@_Mo(KBj+}p83t2kO*8BUBYBGUYmOQ>p$4ZuwL5UUKy|Fk;vsR+ zvCRbA^ar~lxGyZoD4;y}@eI-5s(VRL!=2k~qJ;;1PT3f({V+c1Lart2-H@BiAv~I7 zsNKt$e@t3G$9!ErcGn?k>z7DIGa^D|w7%eBjOe3yNaM?ao?Gfci90X~s=HJiP zxIIFqh)xBX$;A$~9%pd$^Sj5aFE6wE>EtN+f4SwS6o8Vf80ie;@_Af58+xEps??(Q z{`W0MUscMu@k!+kLEIP%YhcKQgy#k8gRXC9a@kxF(OgP6rEFG6d{G0P@1cS6SActr zZ$+)6#mOoF$5+3o$F#Xbbqc^m`h8iYqmon6)q;SnBfy)agLb$H6Q`jfUUPvOoi)nf zs@rEoMNGt{&9^JFJK;M${hM4WT6zUAT`fJj1p41^SZq{LbYcD8gj(TjMa5+eQ>3`x zR>^)2{2uG@ba87zMV{>Xy#t}L@TJu@pVHgrMrWBoMiYSG`Bx`kiPmym{vY=U2(PZv zBad|m6rTXJBE7)OIX3fXxp_P?8Po2t57`rTpwQeVCf%>R()DTNhFT7j3GN1(AuhR9 zHnS#5I96hOHP!AghtBB=Sfdlc6FQg1k4tV#XsPg=TuKb zIs*+|91=_CiBa|K09>Q(A63ca&Hu{yNU5 zFK1LZw0tt!zkT}LS=7)uV!`Gka%pho*ty>>k{Z-GIpP>z4sG@4{Lt$a0 zjU3<9Sjxalv2s2KH3S<{%~*x6x3n6a^BB!aH!6NVGfOBH^yD_0^&=}4ICqa7%O}0C zyg?JOhxs}f_x$oN=OEPepPK}YDk(*3n{>!buQm`oe;RA_3aUG+`x2&O9L=k~cz!Ti z2!vx9f-|#a{Cy-yj~ZVF73zH2zo3cn&EcYD)#iPZ;}%mbU8GY*cM8~$^y=timW|;# z-85gj7r*QS^}FrrDsiN`BKcJ7>1cgq@X4DcJsB4lxwCuyQLh`1!|uj(Yu;|2Td{P? zV01K7EH0MD=5i-Z6)i#p+{>Ci`tB0COZAyf5*gTjnDrU(lH#vgN?373@%!lp#iF%W zI)zHjtw47-EuQF3+~?06QDEQ`W6 z>xp&5QhBU_Fsk&$0p>-T!-r=Pkj%D__YKGH5%EkaFYkD(?u2TXN14^VGvh0%)7(M*^3#dCb+2(ATW!s@3b#6 zPcK`DEyVA&#q;t$>aWe&Z2Ik8gaUzaIV39)PQmJ5qsR#a35$|>kdJT+vvxe0P`x{6 zR<<0Lr~$)Ttj)q>syS=3l45iPKgTL!|4<_zoI2*yT8e<#aF-S^%ovj|ut$uQmN5fL zE781pL@4pA(tI2{5)Yp3S6&5`W?5xl)ALQ}y5;xKM|AIZzkar!QA4g8%L1%euTd4Ha{>d;X%U3=zJ525Eve_lJzc{rf<7WWceZI)bz8 zWEYyigE+!@#0a8KHwMd%!hJ51f$5&7sJC;f`5`P3H5W<=dmhOe{@N@ z)NgtGTwf#-li`zQQQM)r_i=yMWJNdTvG=~w!bmHyH|E#W}W?us}v^UVg&Nfd&Z~UTQk+pp#-`{*@Ak`D$8Vq2w2c}C3*cPYfqc- zSbsC>1~k*j*xZXEe+diY-(%^FMa5u&ej)8ejv$&f^12~btT^VhrP*}sscy!g+_^T) z9ivQMy9VUSQH8Nf(UcB?ir}*JCc~=N#c@ipSpC>drXA7BW_ALx5rLWx$s*e_x9FCg zM{;&~XHgzM^UKYzh$=oyO>g(rT@KfMe+IN7(4<~bBlv<%o4BDX+}B>L3fB(?s=EA4 zz#EoCZJuct(^_XrE)0az5=sGXToCu;N>=$xmHi$ z*C2T1%Bjk^8*IX^e@cXgmJ!1TLI(Sn+ zpA2+2v1=@hOK8VVJH4-#QeH@+xrxL)UDD|cO$B@Eh*0pn{l-e3k= z`&g#aLY2^t)msetxqNQ!w|oy4z7nyM?fTX0r#Hzw6p`oXZ!-~jaA#biW8kxIu|wQzgw2;;yuZm2=f*23GXk)9d!f9grA5z3 z#k?$-kfNx9Dl>K*-=Hz=w!@JR9&I)M+6t0r&v&*w!30@FAWjIAu4vxU)Y}-!HT-INy`HF@6np33#SY^by5r79zRMeg@!+>T+)cK_EUok;T z60nd7ig(2Rp0aZ>{u)>Q`A@GVT16Kg^rmxAn^criwmT(*4)<}Rp$uM z=P7w9Lr`N-)7%X+tZ+}7M#x2)y_ljZSqLyh?!2*f3|aRG8gDr1IuqZFJg&E|r*VOE z@+zq_95c~Yg}5tomJkZKGb-swpZ)UMG2h$M?>YNDOwznta1&f5@SPXnukMRLjn1!# zHI@-XbDBf}v6xZvn6Q?E`vJp^|O{btb)qp%?Io>5;ClxLo*JEdoO z-tI9y)SzZ}z2gN~51z;MYyHN5MWuFZUewed-;bh#=|;NrMU1qV3|%vLW30jcxp2+? zMt~la8=;s}si(}7Dn4Gl8$u7gNVvBV(2$EIa8Q*aJFLd3MzP7%;P;>K>aN|QN0h)2 zac5!}YaUjw$LTiH6pqA3#!bYOUi$LD2L$!?@`7jbP&mOW@h)wxhu|YM*Iy}5u|=zZ zhxJ>wu@J=7A6{~0Yvtsn&HE(eWUAcOL=fzpTF8qU&RshB8X&fo8N$op3JF0TTdjHLfwcSXS?nOy0`ewZU z4c$%B*I7+cou>XDe5p|*_4tO*?YIq?jfq`Jrp$`M&EuLV&|&Wg}m!V%*kqE2704%lF0L?0?Bo(hld6+7bPRe$kVNT zYY=+G85K)<@*kB{=edyuS(xvP@`!VapndhG$SMf8z}6#ivQBBwiY*y*Ga zyI&=QjZ>VL&528eJ#?%!31aflC)LC}h^*~D=(4ciL3bZ}K zMzW48Jo%`rx)UE9SGLC0mLl->)Fim4UGYiOfNbQm&oE_StHt+I`}hV%$}aB_3zxK0j^s`qPeqAv)t9hQ>nD zEtKCU$L7_|*YQQ^oyd)IB3kEps_q* z_~5yM#nABU3|&|C67Xnk`C3ZvTy3y%{KLBe&Xn_ z&yS>&WXi&M;EJ5P?m%`NX+llGNsVQwqqjF`I$JQIsPsKrklT5??*$Cu5h4kJ<`Dt2 z7B;(K$g_w9XiBe=A_(e6F7m$e6rZS$Ji$E$IF@3%rY+J%iFY+6av*K=6`!MpLA>I| zu4M_#CBdV#a=wnie)EYBJhuPb>gX|rK!Xy}w+gNd(i_4;^i4vogFs>(x~rjOg$i=^ zp8R8k?(}H~ULQ^EH)Cq_zYkp*+T)&;Yr%}n)2ol@2A^@3z$%6u#EyF#qvJ+dZdi~G zZOKEwA;F$JH&`L9;p_zE`PX*!gyO64X8MSDmiH&IIfSO?^#=lGHm#8c{Vh~@|GZs) ztJ<~UH$uCHc6k_~;G|LYLBdU5M0o&yw#8TJ1sMJZ341Lmb~KE0VO5S8(X=ay#t7-w zL^mOhAyB=^!;^U5qu54I^;b;ARZ}m5QZ43kHp+6J0>FE!izO*39X9V*@K|F5dYozp zUrxEI?#6xC{RAqge~sub&W9&!4UC+m0)DD1p|o8mYw)W2*Xk0-iDq*4x3g4Z?Fd|r zo>H2SgnAMtX_V*30tQSH_=@yqiWv1ZGfZB)9blAn3szebQlKDqkFZdQe9Q<=!MZLC zs+SB~9i?9da@*SV?s&t>t-wa-a~?1?lA1l9CHfGu7|4H+E%EvhUK9mWlU(VE?L~u9c4X=@pan&l*;_nLj3~g6eN-|Ei@R?agyvtlxzWt{CZvw+4PiEl z=1+d`XlhyUlm`j(pRM&x$Dr{RkQlG|Cvr@4(%l=MSorSY3;AgaRWYEbjXeE`aN$G5{BabYI7err1Njg`kFvQGN06HMcz0h!S_#r6HPYN`;= zs<-{QkZ!v~uI!_R65j744?au*%$(@CN{3T&@1tIoP({;)*-eR5YlT-rR6fa@i>|}Q zTk)bjK)P|&oBDbFx`nQ3IS*pymjQ4hfBT?*mwnR*lsfR%R@p!?f0@tyJ^jNx0s)>~ zWd>gT>2~b9wUXWq42n~(UY$@R4=kc;u!l$^tdYr2u)#x;E(~bT%R1e zx1PtBhK2Sn(21}ID2%Y{@2_dJtDm;0eP7Z?e^9<5aG4Nq$enwrW2}?JS_(;<>2CNw z$D$?$M5rXQuo`qRp=wmeCauqB+#V#Yb;<`a$h7ltlv2#O5+oU4ERe6$y|?-Bc)pL9 zWXr95;b>8%F}v}!#TjTx_2t~eYP6+@%}~j z-YRGyY}o;(S6T`7TcmFsY0FpWS|ej@&#(;36oaAw4>P{C_i6G;xNEfc=<#ZP_QzMR zs)I@e5}e@%CT+xp?NK!bvAzomgd+V0b`{$)k3qfI3gC>w0j~E^YM+e>b68dd?0eT| zmhyUrtu!scfzoFCI~9FhN1xB0wahK?*ql4DMo+Kxhquc0EZE=9&}Q5Xy*ZlJ2%pI4 zSK!ef65>l8+7|!kIFbamaaS}Rpm~~3NJ0knosusTa5uGw%EQT2&y#!H!sgEvXu4f< z6>1cd8|^C20^JC*uiw6ICOP`xV~Me5JGELR`|CA4)xs>gd-W@{UDi$(%B0S-Fsb3P zCpoAm8mN3z9;ScV`uHC8;h1zrxX?-|3R_>Apnx;CtwB^Ms+5hCI(sdB z4K2?*`?RkZO2f2Q>!_}JjI{1~;pj(W65H9LBUj9}#|!xR=-Ho;zeK!9ndQRM?$Ep@Gk10TYBZfjM?lMEFR^o5QxAY49W1AcPpbN6MI=!l$ra9lwX zWr;DdrG^`6*-f1RtP#sASz%ZfCKSfwv9iSrr!_AQ4*_CNfh)39M0tRTv<+U@u5}Z^6qiW^e3^&8XHtDs_f4+>(d158l7*=$ zCMMs8)iLpDQ8Jed9h<0aF6P-BaEP7k9(M_e$s;RlDoVRHTL}StJ2CX*mUj%pVnx_) zp+6iun-Ga8Tm#5s-YjnX)!7X-qRH@k>$suBIz$!-strllm4X^gF<49sw*Lc(NJrj~ zbyDlI$V$Z{d=H0egOl=(cHEN#RE~B|Qz@kltEYtX%cpPhwM`QJy!zl@1qLHJn*(Sl zA$MU7!ptuJo?~&sS*BZYLZjHo>*jJ$9y8_N%iF6|fFh3SWzLk>!KH1~Nv$rkt`T$g zPk;RmzDti(5qX-KLV@>Z{d7(^IQ$fwPrSU)Q{b*RqHf)hP&Gyg&cW^qYwt+L$>VD~gtOnQKXX9*tB_b!9?QB#8v>!C?*Ltq2m>{1_iv$;;{MZbmlYsQA zm=|r_`Q;h}@AhJCOenNPn@f^~y1t{n^n4Jgi*LyP{eViuEaAaNQD;`}9oEsw>=!wu z6$fXDOx&enoVEi{cyBA5*}!cXNf-Y9yHD`roKl7l9rPgeC=$P;<5irdg{QbhX=k1m5pNo?h%YpD6HiiUN5!6O{I^;1SyqV%Tu8}%7J73b7hRs3My zdfmeFB%$%l)p16HIQ?0+WnPQm(3?_j=Tw9f^Nc> zvc~)SjpqUS=TLK(sL{C~`oL!%!K3(a-z_nMvF|#+L<`Ry)PT(bhNhoTJ?)zbW9rgF z=wcFMY<{Wy-iAW^=0)@Gk{Se1Pe+yruC>0tR8#o<rMLjIh>mD5497L@08?kV^2@1r9NkHTY!x8_g@rE`<+`f0Kn0 zo;)u9i0sWn#WJo$3{SjQ;0DJxoFqhhN&SG{mcVp7yrz|cJ7Ol}_Nm;7j?>G|Hlya0 zF#2B>Ac2Bs&mrQDC9qAV#U5hRIgz#6nQS%#S^sd$h&VMcZJl;bIZ+angC z^W|L;3Ao<&9{X{Adg?ch5u-AguEIw71|CMGNDH-fUr?(8)`9|+2S&jMghC@*8$gM7 z45Mm@w;DY5eN>Ghe6@C&v>h#w8bfVt#R8X2Qh|BovCfKy;`u5SaZ@JMY}gY<0;q2R!=s?}|V`0Q%f} zwy|IPz*+cZjCtDM0~<{a_XA@q_L&()bt;n!;^Y)-dY9}T2voH}H5prqRy)(CeDmbgh27zsF}5c| zX_FwV6ptLWo&2ELm$IffQV(p_$ z+(_+Ta^v*e-*>k(S@nXKyx3ZF`lWZt!yr=HT}U|*vDUDYFxsx%Y|Ys}663Nrd7|9N!VzT_&Gtv7c+mvTf_vx7^ix|wz&!LT&}xU^OMkb9z<)FwuSFe z8*QCjaYM*RbBya~K4~;oX3k`udMOF8z=uHtO~>@j0UZ0fHj`cgat zc>!Y!Q>m$A2r;@}#oOy3WWD6g2M;&?M6*nOd`KoXkgw4*Plq_dkg7Xa=E<$2akuWh z!L8aeEB7X~-4K^=!)uUWUgd=r;u7PM;s`~5#RZ5?Q=pc9^GbmFaKi3wz)ZLeYE42Bdq|{%H z+O%S?L3G{$6uaviSA2h!YFjpP8@17)Zz7x^iDSr!0OEu1)WB^{D<8!Oaq#JB@JSMtRa~9O5Uc2K` zKXjupVoW!+9Wk0KA{4LgOtIz;u*7uB!O1gElVx+s^I6YG@u<2!;wLhCwtD+G>88A& zWAy%5rE1D85PG4^SU@L;)h~bx!*W`M!VYBlO>W)3qm3r9-Xww{TiqEC7a|CB%h>eO zR{OH$1&6Lv7K-A~g+Q>r{FmBwW$m@7#=n#|!RS6wJ1&%4j}jMO9SD)L$p**wqRmNM z6#+EZs+1KkxzB3y1Y6Tg-(b@s|Cb9;qjM)A0k)-YAPdWWPb8m%bDVrl9YL4)l0Q?g zmGr!jDhK)g*q$R#Zba;GiA_R|hc}a?KG&9Dd}uPm|-FvnF(C zr<4Jk6#fMT>H)}~W*T>zN#e@{{I_7bwcoAP^*mWWl4oL{zTrXe!jP*oB!m=xYxcXi z9JR;TY(@uU!M4{}hXy?^gO@GPsd1B6_mf1EdzI}t8RdK8)hot)U?p;$t3pUj!Cg2W z%$LInPaqg~O>(tntAQ#zvw}2ua^8j%5Nk)5qe890WBz%!*tLx5`BDU!%j(H`u1XoU zI{i&S;iTv>C%x}yH($l>Mz+S~Uw$gp8cPDBr#K_=tbj`c1wb-_;v!9ukxul%zWeHPBF=Hps@9w5x zB6UHHNdMDeBTuL6-pFLd#Cd(>l|+S)e$zC(;73-If)CdXs7rZWIqS5@pVn0^cER$qb zFH?UXTez?}o=?OBFJ@`X|3%px1c^@WO3Q*F6Xyye#)OV_=u7SyF4or@=Yzp#48go%c5z?i=@G6I9hIifT)R8XvRvRy9L{)TY#?wo<#O zsFqr_YDX4A#a`8-wY6d^t)dOFD)xBtea?B#dH#T$a$IKexZ|d*G{mpp3-|JR+xx4plTf(qx}9o^WdNKrcUwj#iQk0FCTN* z{gY_fB@vkkt-G^KThl_`q4Fn2U*EQHqfg26dRx!ievKC(x8C|&l&jET8LTBx&yN85 z-ePcQ=Eo*G`?JlYkdE5RY$^MMEb5ZCc&d4KP^|i5noqTiNNMU)jqpxKC>BcY0dBBS zNsIuX?LbpHJtODDXN1qLY`ET-$E)Z7?~ka2f@{|k2_`;uu5@XiU?*`p-yh-`&0*gQ zYU8+)?eX+!AA!=L9Cv2$8<=hJqs!vU--4s?ow6xcQlrnbvJ|F|Xd)vhkh1;Pe1Eli zC8Gy@m}I1hVC;zh-%=;7w7c4wTyk-ft@OXk&0l3wzuW2OPK*KQ*kcw1_(7jnOlJWo z8Er?DCI@EEg@0FonA6vMs)&;?xUu~eY9c!Gv>dFYDgRf%DMAcVhkr6S=Md^211>tM zW92P0e^>)>nFOV>l>=$R8E7Bt0+t?I3Y`R+qzmE?!kZ%Q7`qX8XZLo(a zH75e>+ZF?^PgmBLiVAc>`uRVnm!*F@Z+UocRLP2&;GiV8)DmQxJ<`~&2)u1$c^0WO z*3XAxg+qVRbqtFx#(hB$7fyV&^IXN4PgVjyKZtX?=oH>CE$fvP#BkKc7g1#zndFIE zy}Q2bg||M3_Ap{MagSBQEalQ%q!es?{NoWB4%Dz;f`4?i=9XSes)OUaF;S%m#@^a< zajAqw5$o|2p8Y4?joij~xj1h2^Ro}b<7musQ?_=T_4(5qGdW?pl2f4$bln7w<2gQ# z!jP(=C2kSS;ZEepUF?rMx$}3op3<;KNPi?wd1JPS8>a&!xj*OY4i_h(vlr>%VU%q! z|L40nW~}cSJ?>gCyoyVo0kVygrOXyqE3e<2Ql^X8ufetXC#5Rkg$rkE#5IPCIN8tu zG3!ILPTWL>Xu=04PZP1MZmgvv7luO-#-gaDgk;%!b)Yc=n%7?5v#!A65esXM{b zkzyF_P2;80q@z`8o#rEB5jc12AXG zF~|0{yA~aP2t8V74inS-DXGqUKYr^q$H>q$OHQ{iksBu}rbOS$g=^wF9FpHJLDyfq+5x)_As z8UYTC3j@GHSrbSA#dp>-Xg|1BGwN*?xs{m6^~NGYwui_fRg1EBKnCeQ8TvsZv3UTd z!?eHQ#AXP5>2?g;?K9^%xSGl68rW(FlvEmF$X!MYzB&(xi z=Bxh$QP2M`Zky4*!UMFv{L2;#vp^iImPs`-v>f|&-B?IMM``Cb>}xn4%{vwdX>^kY zvlWP;nS~|f`~t%gRO&%~xnwlrLj9%r3lOAkmvIDP|8_8?zXO1ZM{HVEWxV7^Vw}p( z5%M{8{`SdbZ)A{Se|(#Eo?RI+it|((tyES{*lh^ z3wI1S_XdFVK29GpXP(cKH-}F_p^7cW8**T8Yts31V-}MLJD=GHH$putow7SmqAPr7fnfdc zkr<=w)@@;~r`NBbGgV-j4Kz>=U@)KvKUxGh#&qG62fatKTO#q$U7mhE+Q+{WK0k@3 zqABX9OIGgsNp?_joPy=JCTEd7r zi{}OQmKUM`;hN%WEq@jE-AlR)miO|SE%^x`sQ8_FoutNAWUlxI$m+fZ8M`dnsrF{H z85?i8Y@xLg=Q$8CZwC4nSfAhyige})+a5}oDVaa2-Oj4q>l=jFpH5aC1xi}$CMvFn z#|V?yqD$q^+0rt;g+F5D^b%jb^OE1mW{B|N_JFeFu!#;{IF8Hl35Md&vHLH}UlXeD zV`Jo0trv=a;Gm@}Rc6;U$20h=rJdWzpn!C|M}7S|*3mOsu)6kVU9G`wM{W;1RbA^p zu8R1!{n?n@e+~~)8y>N2CQuu8uX$G)h*M)8W`^DwQ?T@bXOmo*tUKJ&WZee|--=ul zi`z_RCD43sQhg}ar+Y72_rJnVokJC19H>re`=1o~^hFHo)c1cS{{uAmTH&OqB!-(Y+-cJ1 zl<3ToucY;%AB7Hdk|r8`()T}3ld0oL_zmpE5d#%=>A`=;2BuoRyVhoNbYR7gSz?5G zj>@SVkncB^I8VBL#XESmQ?{xP|oVq~inAW!!TsVbi!tNB`L#H>x3b z^>yXar0yBr4b}+!(qv;Mw5P&i3#^)y+~!+Y%Nm`j#*p#0zcas(<8_oSiE}xHG}{;Q z3(25y)UmcT4T9S0TBSC)gQ8_H&OBOHdCo@KzQMww7EdfEW=k=a?$d-GIIDC9H7xZJ zUBJ>g8;d7`!;Vj%yv3!V=JOd->b4bu)bBm%+NBNPYn>^h^{!e&Vg61Cpr{ETbCq>1 zs=l7|!^c2Qd%(y=5mS}$H$J2T5c*vq`5LmI*OdM5^R?I21JgE$4 z9e7)@;!4P1n3#ok+mC$ndmnw2pP(9TIfjIMXBl$6_mbym`x#B+M*c+`%H zw$Q!vtH}_@SQXBmNU~AC{nXPIig}-=l5zOy*yp+p5bPZ*9v0yg$T7M2IlBJkU|m*=9*gYGLK7HtD1UKNf4NB>&mz7H%WO=v*= zgSECkNCQRg#(CPS>PVeGpY<3-6_&^;bvK0aSgmN#TadF+X;i-7?*7K`ayr7YTt9XR2uO^9^K3JL3&gb(SENML< zjHqGYMS_1zK9w}HDjkWGw6}RJGR63NJyNBk6Q|8Pw7igUW1p1oW&NC;z=Z}to|0%N znO=O*n+Fa#;kwhwb5XFCf5(AKB4?#N)>E#z@sF4LHhZN;o*g?lfQl3jtbYC1((vrW zKPKI3sy$gpSI*`|GkCo`e(>Re^@wyIY0I*u~O~XSipY#v~0&YrkVjagav9J8PIo<|J zVGtu~pn?pII(RY3g;O-ea7sy!`DaPSAdf zJ?jgagPiELbs|F&da4T&?C3Z?4pmc5}}GVj1rRm8wZlj`(rKE@;mHCrfX6l3k%S4Xbwxr z?r^|^g=I5kIG9yq0FcY){upkfgZkKRF;zr#4sx{0Txl}qqq?Nw!bzC8#SpVZ;NOK) zYoE$CXtw~~5@9&oh#1wX;M1w`t_*|k*c83}^CGCLTP1Fql_Ym!=`vyem69CG@t+Q- z&L%}3295bgw_CcegzA~s&oN_jl?p1+1_txR+1FIE{-mh^thM4@DetI!EcSc zzgow%l{96Rk6F6Ok>qWZUwLM+fw>n<=Z(wQySo+>f}rGnC`a1XXX7PQYk}qDXjIF; z8VM*h^u+}PX!wm0W=SV}CvdQo`nvB{L`MOX<>#ICPM>vm`cfjmXa=rXhs&zkLj{HM z!fM29JBK>I4R{Ulc%$_G#(k03=|Pv7_`Ii|djqGcs@4kqUU8Wf?84`*mC<` z)_Nl9f`4?M)$GH@!qM-~PmH_;B1nroMomsNNoY`tr1FVQy8U`YN}$9*7@dtqJ4^jF zJc@g;-`}zv9yY5q*k3cL_qVq}b$KWUsh}ECC~sZa)&iFnQrgmgbanX-I0aGjOVuN=+RN&Wl7uxHq@{_EGDMmZym@^!cq)UL+C#t?Hi4@~;i0eSg$?}WrVpDc14v6P!JPND67gT(pEq&cQ$^BRpU*3t7v1{5 z^h~8dNC(Ne3J*DbPvnDvwER|(0ap38eN`7f$`xX}eSZv9$WOC{LXKt>_DH5KgPh#w z$ic|~X#Sv+2HLkz$3BXfR4DdFFDWNpd%w`{Z>z9X z!H^%9J!Pg|vwYWVpX$V9w}lV`ski|je#xy53j1?9Wj109OaE@HkaL6-YvGk@r&p?p z!e?Z6b?GGC>&XW}9l6kmPyl-Ll@94!>l&QD2JZS|UsufJd&5^PlYAlg-sf{f!ce4t zEUXIw1zi>9+q}ZKuDb2eikvwgvpiQReJhJ0QzCzD$=_L}pVctg0R@eDG|!D=YPKTR z=Bk4azMn=|NcXWumjEIRJ?zezqiLdK&AK<@QjEB(MDriV5goNT>-rOY4|R%}7mu{~U!B(4)i^y^n|S7nP9mC!01~Y$Ll$k3c<3j0$!|b#=n8Fy zHDLQ1-JlsJZNQfJet6n^WQ8tI46NwUtvHyQzo;TNMK6MebR}b!Ii`(Rg9FKFRGuS? z=HUzG|26`6XmS)z@VoUo?&om>Nt;VkW7*~XhBZ^uqW|E3bD>&^xUby&VTIp0CCrKq zY6u_tDG`+`xB>|X*0`I3M=MJIheh40u37Aq4v?-|C~vRjhCB z6`Vg1`>HNR)6x5IS6pd{o1>kmK7@*zz+2a}+Ld^5w_OQ#jW5~h?0ff+l&FYDtX z+Y?TJ_|w5BN$_4H)*KEI^jBJ}Gj_t}z4tfr+;X_(eY5jK!B0k3@?8+LiPx{>u8)Bg zk1DCCvjNrxz!{s`lW>_euDou;uXAL(Mvsw!t;pK-S`XIns>Q4pQXeWlx-j&eh92Hr z;?75@Z*SX_5G1_$eK!Dq&tnVWprQSiBtdE4@#9GrTAqY^^ipfR9_cZxmG^E;nR}bY z+sY-4OL8vw3f&HQtYdTpFsXuE<_G z%dFMPunN9%F_uaX3NVhB%}OoCgV|wZhvQ8??39jQQ_T#e$%v-)3~C|StlPcIebGbS z6(<9unghzw>@9vY5@c`KT;+qUnEANDgKqjKMn)-dTmiCNUtHywn*cAg--tcTdM=2V z>NX0$p~MoC<(#BD_v6s}Cv9Wnfw*Pu6)K5M4@}xJE5SLm8$sb(o$yH1#E#vf+-t;n z_9<%+P4Nc~%2hIhch1(#Ff@qUseE_+n!r94EH7Qe5jnhU$4srDF-`L`c4fCOr zy1RIkLz_AN39-A_<_bNhP*#EY4Gd-p>Turp1RZ=>!LT1>(SC|H@e3z&B#HYk_~0Rq zKGgv8Jc3!hwxWHxJj)+dI-Gc+Q8wn`&*iNF)2Qf;!KUSsYR9;Zi&E#peUL&C@d3~l z0S-hvX@@BKM898$@&Kw5`bWH339X2;GEFW`28<4!p{uiwCg{xG?Z%}`M!01aFdB8A z4*U@XK~JuA?0Tz|t*18X^n3>ZsF{I)oR^UpX`25WB0V1x3ck60c(DBWJfHft$o-f% zZ$2#?mYQkDe0`ep z-+9FmpeT@jc%*voY^B~KO$^s}MlmnRQzRDc|4!bFYjW&kHgZNmhR-QN`e2Q{D1Yzj zv~4Ka&U4Q2p;TLM#X02TvXg z*)u`lu05dGVvzp4Th7=5ZR}zSh|UssU*y5!Nz)`aUR*|+?@R~(A7R-3#G6iX(#*xa zHa&KtaoYY8w~&oSDehHSd!t#frHEbp6sIPpLUwg<8vYkJ%7wF&+vJ(k~wV80P<_0WOxUN{=N4v&3lg zvxM)aE*t^8sm*FCyUt>Q?DI~L+xTZX-8J9sA8?umVe(t}fd>Pv5%&2iDUWBWHM0da zta6Z5QA^jbDk9#-lG&u-k^(XQd2$xfe|)5g_#bRUwI_>z#=9~Z__6}ITSp3z#GBh- zL6ElRAva-E$QCM@AJuwnqWZ>=Oe8EHP2m((rC41OW~(=JAmVIP7*j3x)0yd*#eOGx z>+2uBZ3EMjRD0T#alam0JWh+jE(;#@X;v`J1RhCKV7zrg0t|syKTE_D5K9oRNB=|r z>Tbn1(_(8`!C|9z9a1VdxWjoHOrPREHmR8{pHC0~5V)+)t++&I&VG`guf@Fh;8Y1# zs7~B@Hb#&(+f|(;Y}-US+WAyZk^&IX)hCqPWkpZ-*0*r+7K^$tZ%Xw%JxpZp<3(pj zI1#sOcxs39fP^7szJqH5Z)huDXAn~ix-xb85S*sYD`_JXwI9sNY@O?Egg$AO43{o2*YhFp@4Ctt$wMzFC6OZ%Ch4 z`a9~WxisU#P%#Ab+njJv7+g*Ln@fgHf#B;-nrgy7?!FWqs|E+Smic8LD!kJsyJ0%t z^v~6z^=n=BunmSP)tATksByB!&J7u(znDjXlF&-S*+g7?hCpC7Q~;@!k03Wq>CEm* z<{(EDET(3ZYFp>pMF**QmHrS`DPO&$LC?4-uQFyxb?==l0TcbJUR+t*=DwVYMK=G=#g47`kH9Y6Vf z|7?fiUx~(bu9i~Dd=VfzILxQOCDrZiXooFNOsr|EI^*rh=M1U=#ri!RP&)0H~|47j_ zQBYwyJ-oG6jWBoV73#(@`!@WvuMQWXlS53UnO`->AmZO33BIEJ}wj z7EJC&ra!4F^B2K`>#3{Q+9-01hMwI7jf8dSi72;kOS~=8J?MA82E?{P@inm)S7>|q zVQQLU+KP5U96VGDo6@mp`XxJEmo!J=cP-+ zBg3@eEDJkKeLJ4ec1wgm^_D_VM6=g{6{3ws6M&7gE%}@tZ>)g%!yz3r;$7i9Z|>Xd zKeY4&*ZbcEqS~2MVNc_B^%qX)7{7GfQB;P{&;XsyJbp2e&`} zH3teNN0rsabT0;pc^@*+0AC&Hqkn~c;(Cw#EsyBx;YD*UbVDw* z%jHK~!V*FE8*Q#6Lh|lQK%SIE^)DI8uu;py8pc&aw5Ft$LLU;WH(2i{XS@> z6;G8bc(_Yb3$oJA5zlI{=EU?QGe5D7Ck?l_)?7kEjwxpLylB$Y!dCf57S>MNyLO$l z63+kuxAK@GBpIK24%$rul&rCv_j9FU8>-D(XTNDFSy#3Q<8EYh*n0i;Nq?rw0mRw_ zxzY^|-wFB9MkB!MmXXw&(WRKSaFknm`!=bC5L|v6sUYHAKNs%ZXI~yJ>3jKKX}xT+ zyw(Ed{uBSR`4{%4V)qE6CyJpZep_E+7A;SHxuUvKX-ZcZO+%DNF_ew4IHquunUM5L z5|t#2v)$lvXNZItWsinyV%zAp(CH1IT54~(|NA^R`8$R?0~o=c4;i0eA$gX12brovyZM{ZpWG zX>V^=kb9y@8_|-+y)PW?K*HG1hAa`;oB~iE=NzNl<$RxwKLlDoKShi+--r*V!`@>F zFldEK_bSA1IIj{}<8z7+rYXmhU%MAq%W(EB%DH)N0I332I`Ct^;kh} zneQwk=p>YC78u^Vbo8WD#-4sBCp>N)KX0u{wjrs8c2sR=Ki(M@Nu=uZIKnvlmN)1%wc7Dkxp}PEDKG8jEm`Ual+*ue7)#SR`FNUo8 z)Shl<#z9V!{m1BVL&9|t-%%+I4LAQ;rgG@A%RQ+>fgj%5;;CZr5#^Y-JgK$iaIc@C zvo02htTa^DqgndbNiV1vB%(A;27dbi2@co#d&R1IyZy}o z(Ei3EEjCV4U1G}rjh}xk1vxa8En4`WEQXO{J;1EYRXYr3`8B`wpWYaIyb%m3E$2g; znBHyU*eV7KmF8~P_>@{}i3Gb`(b^*C+WPFzSBY8sns)ui_2xA5nQ1!5i6Mr`iJDz;{l_Y@GsG6dF#7{eNx&>!k$k<$ zKp!Z0v7@P25vw4wv38>KHB~C|+Z^Hod^)Z3P|e>qUN#QCR6`lv33{`B&i>KAzBXUj zT9kt&l7xBmR&oleLF{u5``2`(s7_#p9K5la=f zuU#xULJET1!fXgFqb}zv!LyO_j28eQYj5ml|HTDB_>{FiMMLZSDsXi}aTd4DV4cf? zjKbMU%>QI1cSfe=NT`1I(Gd1OvaHnKhSL7v!nN^N5p%n*L>*$-Em+Md$R$FgMjDVRJA0$Mi! z3-G~Vr%^9bU_v*lBghMsg|@8?dN@RfOM{`0q>Aqoo8w>WSy2>gO$T6zp3f_20 zarGPGxz+B=oYMZFg={d3o{7tx)#;1#wAlyy@I`vlOyX?iV}5xp$M^>S&e7?@6w;6} zCjKp1^$_ztWY8>|uO;_ZD$~#F$|3Pj;-u?Ent7({Jb^!r&Y>YE#pN8Nv0vR!f@_Tk zh?FOg(g-t=oAX_DT8|Q)HoTHTrv^}}9fpC#oeagZ>V0xWH0}SX{SX+uXSoDq`iJ#CN_;ee2t^+rZuwM7Ht|`jUyrE zKw^-kPN_u?z0b*<5yhH8=7=h}j7Vk7qOSefdmVzn(9xyG_DJrXhYcHAR!fVwZ{5C~ zHwUKSETFTjv~zRZ`FuA)i0Z;D{IdT{C$^`f>5JM9%3bVt$k0_R6`xxf1`{;K$hNd- zFiMD;oUF}n%O7}~Z)GU)H7Hz8!Ab!yvOm+hzEBf;KBufXdm=$F!?&HHl8MKnV5z(O z?ztuxsBK3lpzdmQ!514|Wc>sfFALRmN6Ifvrn(@1v~>QiC}3Y6Cz&@wqq`ljx*F&h zXCyt)^XkdnVRnbhcVkBR;=9|Q^c?ch1x-frT%=iLgz}pB>(&WJcF$R`X6~EXL{`N= zVjS@=sB|U`RvWFAr`3nRscxXaJB@SIGv<%EE!HyUxQLuW@FrQX)$#+oQ04IZ)q`49 zW|1@2!RvCuA&D_Lv+%HGTXq1K*4q(=zLif+A;X?8sCqQq?S9>1_kMRp2k9WC_Zk)X zxZ6un8&E#1?Vb33$JU+EDcuDqQR&-lb5m`K>PAhXfNH)Nb#W-|6Or#p=MVVA4Szp5 z96DF$XH76*CRa}z74V45g6S(4-5tfKMX6;Dnk8S1QKLLX%M{oA;!>ZL4{jg|RfUF@ zUZ)PWlP9olh=(yN$8vLGwcF@Sab8gMt4SZ1N>}whq-#Pi*{=XqC?uK?8!#Jv%eiBRFNLfFcA^q`xhU*F$)5B_eb8Rv*3cH+|Vba4<11RMXSEw9|ao! zSyC#=VWRjDTFFkWbw!1BXU&&gwZ%F)?BMzf%)rk`HHXvnY5q&TIAUh-n@jhNC6n-r z=X;ec<3$j$CyVD9NcJJZli3u))?G#}FIVJ^YZs$M-Bziqz2nnLM#!z(f6o;<#ooB!6ke4S@By z6H}a}DZ%<5WcI2SGuHK%Ge?6*yp@So-@gh&lv_FVW~qep7R7mS6`>_rlC5o<8wg*N zk%|IwH9;nZwvHvCZ!Qv^~N-!Y2i%(|vAN_-Ay#(o>`Y24Q3DdnardBHqL z=F^Zc;p{!lP0DMqbz!=vFgfOEsArI@+)D)X%D>83y(Pn1#JQzE`(njbRjD8u_wf(9 z+S%xBFh5viy7?eQIL2cIz2ThSvKjWQEMjKByX;$E9FtUlRQ9!>Ir>w#Vq_l9O~w-w@BJ z`k7@uY9l9BmOuQxLkF94=*#*OMr=^*ZtuyP9^%f?S$1;_t+m6b|N4WapMxczGrDqtM@$6YpgdmKzkc9s80 z=y08sK8xhpv+z4eiv2Ke^j`el9?B%Egj4VtO3?Y+?8fQplSO_O2LE;;+QJZbbSdgB zVnOBw)*?}X<*Jx0*uX9++VUTezkHq29Yi@LQzMOczWG+acP|(wyA2Wc^t_(cz7gce z-?%n+mzSrCzx+|6+0IYz2swK3MteF{1DYH_wF(WsMopVuR8NwcUA?wwLzr!z`oFW+ zTEJ4#`-Rz0*c$C^Y&58=8#Qc8hTOlt=uVApxBtL|L&<>E)w?2=e;OCvr#ae>q;r&7 z&f*Vx1v7ca&x;}+^?i48slNuUSQokpqO+zo>~p@oej5krq(1cQYr7F(0ZyTo_fNaW z?Ev7K;7kl%J+pNVzDLuyf>}-a#>y?Wx~H4N0*$k@x&W03!AU|xTDz4zzea6-RQ}w+ z7xJ1y^OeN2i+wJT*$R~CFfX!U)tJiqvXs(>JQ#)Wmi7TukS(=^cOZA<`}a3PcwAR-c_Ze1ZC&4`OMJeRoI1JmHMeP0SBVdRo^K37`}C}_J)$gA zym?x78e`4^@9#&u;TmpV27Y3Fu&hgCy)F8C?8=k_Rkc$ypt`m!sx|AG zuCu!-2o^21zs=^?W0cA7_xNX%}khCJzZNh)Fp* zw4{0cSRBKIp(QUl6`(^S=li!fjncPemOBJfWP)S4`+w~_|iWe9@ zjdH7P6uv|6$VJIt(D#Vfv@_ErRkpu?4tSRu(W7bUU0o-(b6#=EgFSUS26V+7vyOEk zV#06eqGUVFr+D2Mv}k4A^U-QFRca26<@X3C`3i)G1x>IrbB z($P@~J`9f$fR)j`voo|ZdYFE#COb~tlbfmbn(;mt2*KDxEtV#n=+=QXFlJLBIJpqe zLUDZ4C8p?CQ}ryI15LR+MoKq^wAghfysi*_@98cYF!#mSiNde@O#K?2rp01K;ePV} zS>(nO(dn+mN_5s-21XJazt(It(mZw9r}Q9jHUO;t4c8j+vTe^vQ$w<(N+>?(Jd1F2 zdOMNe^)BXGk_NRzQNJp^b+;uTWW#$t4rcsPsBZjnMd;E3K&5{7NaR9eYH>T@LKIqa zT;0}k`t>=e{$bwIhnkev==}o;UU2~CvUTC)U-0_q5`D6GUaZlNr@gBI@~r;P2A!!4 zzuqZFlo7xDuZs}a$k?2+$QKWPm+sWnhII;GyO8~DuDfeymV714l(%B>hn*x>eAbJ7 z($&%CP{xg{j4t7K)o29T4Xwji%Att4Iv+;GN^7n5^VHc^yKrA}MBI`FK1m)^8*HeJ z9`?z3wy%G4V$Tyx#VM&N)00BjufP;<(mAo z&Y|gdV!ktg2s#en2DPW|(WVz}PRjDB#fQG}wmYBAh=u?NaJ1G1olu{lX2tZ_ZA9=@ z=d%|w6K*>3S%hB%WH)Xd^v^1v2Fi9n-jLQhsp-GDW1V+*1OGtd{Pe;nEsMQk5JAC5 zic{yemQ%M9%5K{)JrSKiB;BIv`&78B4{lh1GV6a}g64=7h*#X_KY*_nb`IQCf;t@U z*^1>hn`F1&mW0kt^ypbBSj6t$^eq1&6Q8{`&Lz`#fr%1|bsDBF+?Ulyj4J=m^L{qj zDpdfQ(oQBuSwh<4=Rmo)b^Df{A>hx@u!ctv_vWczLvPGfq;Mob#<=IMWhkr8eL* zB(kgxq>Hys_U4p_Ru6(7{<+F$wZn;rM!(oc%?s&VPO1J^&1frr$F%Pte(7M^@tyea zF0CO*>sv;*sIv%DTvTmolhNz^<@B<+#`|?t7<8HtZ*`GRqyWr{`p=zd$ajt&Y6Q{o ztKft~t*tR@&(mPYk81jT1`36#@tYc$axMC-B~TG>6!reQ)`aOTI;ojAsn7F~_Zj3< zB`k+RTVJyPQjc`C^_XG?zXtNP4Xn5^x{9P^3tpc=jhbZBX{E-93sk3<)h6GTRn=zZ z;yC+d!}saI)5&cvfQe0`jZzO1>$rHqSlY<_0HAvr#*EiZugF(l;lO}=ZDU8?|C0XmE&wC1Sxh}OD)R={=<(>cC zIG(H=2yc_wVFD_u0!u=_WPYNBb(bD$u+Z`oIGoFtpk}h#ph4jXmy$?YdzFJ1qomMaE!+0rftP6KqAK>!KrQwj2h)kNfVBNmo9t_DaCxggWqFTRN)RR zr>Ej;z;4f!E26;H(J+QJP@9EVALk_>HufuJkA|3&vNXp# zz_wcaV)2&2j$#KZ6oZL}@d%H*?`SX!=cxOe zq+>Gke=cTX1V<7}n8OkZ~ z3qu3ea;FP_1hpJGObqwrQtIm$AcAncrUL6-P57^%=Kl(|9S=& zjslw8ON*G&lD@)BSuEi%|k9x9rr#wzKoUBj`f_pExVo=Q~)PpCs~p)cA|j`?APT z<-_lPX?gEeEqHq^T!h>#*-rTSxkbq2Za2x3 zXS&;mheBB?XfPqvZl^fgCey4tkEw_Fqk7=NakOr^^?V2RnFTg_&iYqN3or$yZSD;! z8mZzgp$rF9ySaAWuOQ!es9({BJyb9yP~iY#28rLSkEWf(1t zRK`Pj5P|*XoSL}`EI0MnIOn8in;q9{m&k~KWsET&#_u7FxBd5^F; zak~P_5bQZ-_Is9LlHn=YS#2gU9ZeWF#(4NslOO&VVM_FYa&8YL{{~-4Q@DO|R{p2N7kLNfKm@!;({GN(Itd%sa1gSDrw-p7XbyVXB}<2K{ncqO@g-+u`W z<8@Qm=8afX&CKl7iYegNfc3*ao&PY8Sj(KCf_)X1*{?%XMGo|c%UV6}nZWAA6U62a zG*HUt_VNAV_q-Ze6MK`^b+Hd$p?&pd;JI z)i*ufYiDbN(#el68G~OYt3hA05bSxy(~l*1(GJc?0QSo73b-wr7WPqvPmws&^mm)i zP*2q8gOsBZAYw6nzlUlB4w5@n4X;;c>>%NJGlt}_MqjjMUrZvG>BIuo$32dO3X z6(<;b3&8R(UNC*2aej!kruvH;2NQ)SOikLX}0)v|?pWt>YU0g$I)gU}i*Fw67}lTR49S>CsW~<8ps$EbTZI ziwGaG08=veZY(^iqye(4VHU?VRSfpYDV4FUs-D(fz_M_d3Jxw()McpQOzFZ>ymA9m zc#Se$Y&DC(L7~`fPu(+LPv=bxwSSkiV`>e;vz1nec{0Xy|FjL{DdQx zw>k0o=sn2jd3L;2%ssT7IAAmOJ_EhPnA@zaCN-vZr6{*uvV#0$eO5{N4_idZn;taj z_f^>9PPz`|QFmU$zE98> zK_F+}ujAi8!jGsCUGjdpQ&DaB#Z}#;#XEXW?jO9&+WnO2bfrIrx@e6?cNJ=!B%><@ zu*&ONqUldi1a3&!ikrMWjMC&&RvIV_p$c;UBQ%)S9{je1Qg5~zbMH4^sQyL~PeIo@ z4^9MA9ksp38_Q{}RkRt>tDd2D9`+>Q4X@sd=AI92hf-OXTwe$)Zl3%!LVI=mzEwC= zMt^U;(HDU@&Nw$dLF4J4-v7@FfXHFQ#Vd6FWrzdL-P`b*($arQe@h0nB6?if(%#4_ zn&}cZA+N)+-)5TrNY$EILE%{$WfU;e6GdZNd$sEAlT+a=*&roZmTbCfrg>>H;LdN$ z!jif*+->YsLj96g!?k&mL>@bJneCaC!9-}m`&KTLn5UQPQlk)8I`r1_UYmW^lD}O6 z70Kc=RXp-lI4zT*9L04iW%tGNw_yDY%Pj5go8W7O!3z0?r>{vpfT>otgJ^cGzgLp( zwAaX4`XShTx7Tcu8BeF%cKaf8Qh#l?180X?_v(vJzv55$teJ=cuG*fI=P9fnI$4O|JTdzyUtca4+vLJroVtu z?M~{K*@78uXX?hJ@2WD;m<}!o@Wn-$=sQSHcJHa_cI1b{lAH0rpRBLn9Zh|%@(JwX zN}UW01=x351IXi4*2;(d0Z|yzkK2uGKAvW~VO-bIyEk84e5?sjpNZ=3^KdZE2|m|- z$>BSxghtJopiQh;VcKbgjnlu5@i|vkC<%`+krwfImY;g921IKE%*INs@gJu_d660g zMGK~h#NaYnGe4<_`i2{E-*G)f^xmamzp*L4Trth7iAHR9lB?b6$7L*!gep$e~9_qnzodbK!ZJu!RlJ`VM&-c^^iN^WSgMtF+@Bpyu>mXhj~87e5= zwC=zP^_tbz@a7J1S)+R?jDcf&@6a#aszO5OmVk3u$X%037gNqRE4OjL+nIAX55ZJC z!QuM7t$lWwy8$_uBWCM|3ah{5I2n6sIJ6j4^lVZn-fHViNV!MBIrQ;O_eRL3Q(E$1 z@=0K`=JWcD+aTR@>IdY3A)H2a*~!*|4AfMMXqczj_@G*|Iv{9cM*FV~&k6h4H zfz5)gx@bc%?VYHmiUZ%|0@#7E;_lIIU6D&JVQ;*VcYTl0IB|4qaqK(v$UBty7uqH< z!$^%JOl3`pZBayk#K1Ww_T_Ga-mdXc9z*jC0z=!dDpw+;b|~qD)t0Fz`$iY{;IoZhQ(1N;mT)gfBU(HJ3hf#w|Fo?&z^!+8zN^tcHvg8L{a57tj;| z6-+4_!~Xi~aQzOv0HTXwKLR6pUM&u0pn;f9ZnoI;h_1fd}U(9}|hJoVdWAj423s*k&t&=++6Yp{- zwdb=gecWs{QC#1diQ*17W~A&1y&r}u_qQR}S`*N^krs;$E2CwIEtkuS#oesu;NSk+ zvu22JWWFrce}9bD9ci@K(Ie-rcDLdu4y?LLcyjkaZGB!U^kKRJO7vA1>az0)bS!ww z&_A~F>tBWbbFmt$->7YR9Y)z}OB{8T3>pK7Y8 zX=0u#R*(RzindCr6OHt%g#vQ-V}TVJ5;9pGulCNxHkz>5Wo*)INMbFdPnn3V*%0$T zrG^y))haPua<%qN3=}(`GEf9F@jRL%v$3^O{JG2^URXPA|W+335VUfYNJokH64}f0kS^X^b0XU zFEb>&(_z23+Uz_&ov|ywG>G(U6!JlFb)n@g1I1&wEwH+OEmVs;-$!88`Pq+x#{jFY z6(7or^$}QwQT*jE+oSg?@Pb+Nj7%r zBe1&TGi9qY18gt6Uv|ttRZHZ{c9@6CiS0$3g)TG zF;&b{#e*fFQou!xQ*a6_Ljj`@h>3v#CK62*tBWpyx&pbbr28$bR5mfMxnK^M`Bh79 zLXGwEVNIGVs_9NU1ZYyABKs!CXn{>dv!xoSNe2zofG&I5ISXV;K&4tBbD)ulL;kS_ zH$EP7%0yKF)sb#|tnaS1P;-TFFkS)MCZ8~77zTlxe8-XjIAqdBI-WKJFzy$bG_8-Z zxO!j~Sdl0q0J0&28Yw8brceb#9IY7zLCu)1fHf6V=)jViDWmyH>q~P~rR$N@_w{z~ zncNrXdnsa1fURCpHo0)c;G}Rv05Z)_r3mU;8K+0Hkk6_ZF2lH+kiQcHteWnvt5Lr= zy;4jSfz_1&tN(Aa^C!c8Q78~YVqR%aZOmC86YIwMC&*`2E}ip2%``6*k)!GG&9zV~ z4<@Q&8UgI|wCW&n+mJnW_r94Zwo`ZUvuF6-GE+_0SJS#bfG^TLQ z{jgc~5ytn`@Bv&LB;*e{q@spujRe0lw@`*^){&utjrwZ0_vhnMM}_v^YGU8j3q}r;;*fanuumj?vmfEZnO%Na@ zU?K%YC9n!>?;BV}a|-hWvTk?fW;LzohrCqOJcZ6G65BWjtry()q7Av3xXZqYxdrRD zKn^vepfXLei+xf}P}&y)D*~#t-W1rSCK%}uq^^M}U=nx73geW~LLCXLO6^w3^aL%` zxZ=jgKJvIFG_~&wn6A{oixk$5=mi@YC~c6rq{PxZ0q^msba#Xpih+yOLJ_DKGm6|F zv>Jdi1(_7snp{;sbra+3!6dOE}q59^NNF;lPvv+b5BE3Jerqh}*nW zAjYsmO~@O=w?EQ^f?pc+oG5PD1&Up;ln50H|jDT~V=F*WEDrmjuDe zT*d3G#!NN)rMEFxxd%!u0k0O!)kgr6b8SaRU5za#`P|^UUHGLOtjncMLgeHfB+|k?3u*9H({VqH2_a=Hy>4? z495ci2O#Nsv+G3=SZ;JfwKI?5uG;anJt2|7S&QpsG@UT9cmQo_=qv${z24T!C|fNQ z$7iJDLlBq)Od}H_w=#e!?x*D}lLf6-fKN;vTT0+sW=R+z@zbnG z69<=-M!=MW`JIjXh2p7N!mj=KI7vWU*7I-?7%T!PZn=0gYb>80)^mU==NvxMdwt04;!c<>cI0SA%N|*a>mZANu*?=a z7?40sYVwOCLkg?awOs~3{_RH+Y?cA5;DBGc;(Y+C%1QXq`sZgt|Kb3@CtxL^e;W4Z zE*JjWi@-c_>1Xm#wQ8uQpA>Gf@vknNyMPPdG5{`WsJsDIe_k#7)KJ0Y@9NY!_)}n+ zBlJ&Q{M;yLsg~Dod&}Y2f3ZPW(%y?DamMX0)Di#|L;o7{QsGT3-l`Awe%$?1L5^j3=44oPXPYx>WVKKR83S0QdaG5E zXcxdKnm;rEtMt4OWX1lO(7!8vVPOFjffb9h8Oyef6@ZnYf@OzRV4IM*ceQe74+i@X z=T|}~0ae?=<1?4|m&bChOc!yRwNuYBWt(cU;02OYfw77jtKjzcXtR>fsHqzE3IHZJ zqLPu4ZF9VI>KC=VRKrF2muFt)t(rxXiNI8m!20Y=0hd9x7U=T$p{>HdI8OTI!E#W% ze(l`(r-S0vE94&>76|Kmx!CwF;eBp~FutaxqZaBTuxcK@_q?_Z4&KB?Fn34?f!I$B zSk)vUPoH*-y~<=d{s^oN-zi4|D^}L%mGBE!_+L5IoV=$S^hX1%S}yC~{3j<9{Wdd- z+6{9{hRSNFVqz-jsa^&>)!@y_e?MP)1o_2WRJlA-9l9Bzp3Jq7pjMKnZ_(7?@=BmyRz!}5;?qg~T2 zUkL+L^n?!y87En z)(hvJLoEBkxk9y9HdK#Q9LqrEm?zfPmLH1cx-(DDI!tp#=0G0t>T3?x;tC`^< zkZ2wMOf!FfQBKuS zRAhJv(3BYLqVy4Jfz>cFK~=Xq zxmFsOs3wN2DKAt#AC!61uN|?>RrYbOp?$0u07^n(bs23#NS_VmBY=t_d)z_qznnG- z%n_DQ-zZ{}T0-Awa~=S|Ws??a<=h#-(JFwXMlF=~E9V+$?b>tY3WWcqiwWVZrveUZ z9wtl`cE`HOU=`g0C#rFxw#sU(;1-xNSh(;df0de6Fj+7(R#={%)Iql6+-?ZJLR1FUKy(1S^FUit+XQuPeTAx2xB!?X;>BZtGEL0`kstcq=)pv z?f{D_w?LgSs@BjI0ObH&3b3X-Uo85C$7cXaCDfS?`V~M^16JDWCcws;Wc<~V+yXIS zlTrqX%nHI2Go}&P=UQ`mk%5Y#dBz2f_VJr#HSI(RgtX^|(P=tgO$-!IS{c#>y%>y4 zg2{wzPqa`Y)k2jgJ6xD4!&LdLTbdZBre~%FR^gg2>yM#!s*Pg1r_@4O#>+HvRskgA zz#{3rg>c3gN|%&Ni7H{44rrld+n`sPOrU+Nten@CTPlZ@TA`z;)k2k_eWlGh%1vs( zsy>Nbq}rzjK#{T9i}PQ8sR1SyHTj{qx+^2a^4&F2hkDs%TUSWZrLOm1 z=B7t;8z$>02CHp|G7ML{?K>;3x)ASke5n zbGkRv+s5)G9@LaJo>-JdQ6D5$qz4E<{aR+@(@WvCq9LM}G` z_4KfYijIF0`iER8kIp6Jk6oD$_4{V(7wfTSJ}L8PG4O+k?V8fV4q)bn=2S<3Df)UnH5h$gA%P>4vgOmeS zrQLW)m3sn!zIINoivwDyIj$EA-YUCNr_#7W<#mLKSLm!R;1U0kjEV(s02vO3`-eI< z1Wh8RN}>n>s1WcsQGHeA#!CQIx?aKuW8O3*3J$-Y8~b&*1!8@03UqD`Emi`={(3aq ziR0hdrMtQejMdqAP+YFIz7Rm=+ynirJy711UKZyO5Cxb;uvIWj5JIbDxiHKW!vDZp z;ork_n*y#UtUm*=YJJlcpMG)PY?kp6SmlQ7oveQsz^dzk6Nr85)Y7 zYcq5~*VTxqHf}nA8(6uq!aNq3;hH5!DlT5F&+niKxiB< zIB>kFt6=UB$Ut4LwmotFqvu4$jgPjUbuNoQiO41gsKz$&ZbOHpb_Iat=A|%XZ`6jJ z_-Ud5sn}L+)(NHvjBGQ&U^M2DPkA2pix-=nXV@Pg6P^G5S&w|X#IcrP+bEx z^e^hE8pabC3dJ5V{10U`1TZpIWT^gh@G_5~jJuQP2mexkiM)&-mm813O#xC{gU2va zZFS|g--$LWS2>ZA&co1F(~^c89y*S1Ui{zkJpCV9h|{{SA6G+RYjsrd+f9cm?iWKM zFAVUrHFsp#Zq9(+`cRIl;CGjoGXAl@X79gkWALmuLS_H=!&p_i@XoYWZNuL7IL-j8 zzc+RjcMYsypAPHvug<0gT>dOW1we&EquU=3v)2^*rwrBW+1CGzE`Ls4{#MFRP52oY zCju*IsPOx2v=4x4cwVG#eLBO(dA6 z1Xg6IkmCwVcP&*gr#Mxnsx3cN3arRVp}mn(RhFsRSQkL%0n&bQVs7o$?Pa%cA@q=o z#ZWiLRDll4h1^*t$o8v^d186<0zI}FF(Cj;ga7$#SPdD(j?uPUCixp-2W|gr6L|xy zatu_-Xw`vL3Ya8UQ_@HpQir<9K$YQYp|I^&WT0|DN(az}^olH0TU?DKz(}za zyDXok{}CW*;Y-6*#X4fhUf3hp^IAo%l`>PXR=-|^P-&Er`wWhO^CV|5^j8o2#mRb5%r{$qG90LDV2Qj64F%+J zmY}P2x)6Y+AS=Kx=imgGjtvq9iy`0}=K!#5c%b}#?c7%nr+VI1Rb`l~=TUoA9s8)Y zVt(HroD;B>asS&-378Heu+P6ZYqftjm%+!M$q4+Ifz>f5lEz+Xzz>cczZ=IOS&6yW zZ!Z`AOU%j4^4@?IV-AlQ1m|3-HM?VAmD7l|_3vCK}3@(NJBT1pD;) zd?f9r43+!_h+1rWV5s2o_xf_~FJSXG7|VFARCASMs8$NRE?4~k=;-#BVW_N@Dl%1B z*S~N^hi(|`rq#59=b4(SEK_9=kOfw0J?WL%W=e5WU^PhG{nGXGmQD+It|aw@jpdtcSclt6K2n5Ys^8Hi*1+wfQrEfg3P4fRZm zTqV$ydZf`_^Hm`fkP~(@p{@fay6;u{S1^%mh3P4KP?{}Nkp=;Y1z97f4g#xV7%G#8>bqXaP_=2O$WY<)WV7?H+_ndX%5C=k z^>!zTef^-2&tn-X*r?+qBd;(%H|t$*-4FKAjSLm92z5To+o@B36}Sj$uJ9eW0CwAg z0B*qv001BWNklU!y^+|mdP+9F0PepX`qcMbbfFXFqPxzhIxW2Axlp@YjJ3nj}25J_xP!Ia}gRY=! zFs+(KWRmRyBt01S_h6evKcy3Qe2$~5r!rRx)FPlGqosf;_Pt*!di)w4?_ZB zzrGjyb@s&)K94mKFz;K*bv1VmsVp2AtjJ{5GGIxSg)miD?sOFxsw+iZVSQL+74%ud zeo>65%bJJnsmH25jO4w&)?! zfqMs5hh5#<$K@TD_*Vz4_}8v09;%&>mK|%h>9q=sZ{zO+Q^k-!r$FkgtGy=uH`O%; zKnnGJ&34lp=jFoVzJtr31yXLl3`6rEgaZEemvdou`s(ucHSE%Ld9~X33+AE9F;r?i zaYm-hiWg5>iP=*n(zysB!A#;Kw5}P-xy^6otzOEQ%@a~sTvZ;<5^`WmB=cMwJ(WtAKM43^j7jg1+cN2?|pGnYN+Up7w&I>g3>Qn?n-pd#1GQ8J8@-?Od&L{gTNTqV7_$o2&hx?g(RYR&qfBrWEEkS< ziO<3j#PhIp(teJ)iZ$stERup^+pc-A0IHz7T5RWDK6OU{QUG8NdIdfSte!YEv(O7Y zs090VMWL*lZ#?Eb4 zyPhyq{c(XDRCTvMWwg|!;t;S3&SGKqpSu6yceGWvz$$~F+JMzfft0-;OW;#&kwB#> zq%RH8V|~L6uxi&pg&J&vU0FFyG)J~0)+9nZ5|1J>RrP#OHS-8qtT#CBr3_R#Zp~V# zxLw;ljd`A`Bc20Rml+0%2EzM1=_ZS}hbRyPGoZO0L=)lyT1R5e)lzjfKslo6oy zVCBEOxLf0tZ(pr^ypfOSSNRhDh@Fz6X^Mi3*=DDT!Qk0~Up;!qz>05jI`ueT=tmE% zZf$1KhKE~1{5Z6~QD&;A2kO_Xi}L-pPKiIo4G z{^?iY0pPAfKB{l}3jrjO&{sa4>%veuWu~sK#YJ#2mP#gebC?7)rnZP&Zr((m+Ocl3AU^NOM zfpL8=0Jmc`P&wwR>`k{j-ZE1$p{@ZkP0UtJ1BE6N6Nu1*77dhcj*L@kvz<%oBy5%e zOdT{(a&A=vWv#(W25Mc;2gO6!zD8GyrDi!y==_5Wo1_m|J{uS~67tQ_#)2(V)0`vGu3pMf__j%n+EZGu2!rzzWP( zp}@*!!J@_cMFXhfp}dR^g8*mx?s01W&*qN>)S_X@09Tdx-oV08;bbRWR#eO*7%cCmFF4-N9j?)BKN%n8~1GVsf{Hjh)$+| zcgNvMli$iPW|*iF80j6NGyQt~iRRK@tOr^*pdosrYthgBf z%PGJbE3o=u7qpaPbvcY}E0~FZiJ^M>X`3gINx_k{JE@LD#B0lH$lf`w2kS7HfH(rE z6%02-G8C?#xIVF+M~e@(vqHcdksqF8YQHXRQJ>WmvuG}mG+{7XECF5k#{SgIGG2u} ztQkhwr(aa^U@>kG@849fRhax)1Yl8HrGSgSp}~qkYdt8g)?0r%8pI^SycPnpRa&{f zRTm6^Eo_mTS(9Nwql<^*D_Kt#s{*)k;0su57BpJ)Yp3q&=`qaKPZ)Up*nm|RCh9ht zC^AsIPE#hTQz+kGWgmvE8-!^(V!18D)Y#N5fK^&wQ-bZARGqR{?-XQpW~_c2wQ&l4^==lqK4{@7%F$V(VO;h?8?i<#y`RzrP;>+m)DCP@=y)lggjL7 zre*S8YN$pt&oB@Gs~<)?U(rzcz)(Gb{gg6P_>>o{8#wzd9NhkvuusP@=)P*G)Re+?b^BZF#kmhl09XNRZA^ZuI4BB)2%xZD@>KQ51ziBKPK*=G zlA2d!&$kTL@ylkZp^go0VpUE{C4FUhqBt>EO%)nL^t27sIo}O}`<_7>jSN(pmnxPI zC2RdV1hf+HnPZ^H6s54PQ46&Xlh_(i;W$RXQq2n$HBhy3$1zZKEmWv5r-jNfP^DI< znUZ=t9|bnn0LJrVoMoPG*q5}n2v(5fR%7hOP04C8RToNWSssVA8AoR#?Nna06QjMe zp?M7L!}B1Fo%V2Bhzs8j`pLe=JX6Z#Q9A{;DqMKhTw?FV9D|IXb`9e@88DaWi*TWVBSH1yhW0fd|&=G_hl6ek?c&U9NZjY;+w#_rIXA0I03qF58=QWX;!b_bdCWM`f6Bmp8)43)dy_?NS-e`FY{SBn6+ zF8xvf(L>8n&DG^^tQx9|kcW!b#r#6Qi#bKeLq(Url%b-0;MF1kuZsyBwFq5?yO|LEM;aP>xJYM`1d16XbfteC{sxW(0akYTKH ziGkz(G;7FIXo1TR_T^@Yzyp)*$UHTvtjZlDKC%=}8v_+X025$ECpw!zH{-^4n1Qk# z3Vn{iLN^;vjCf#mH$F{ht0gQ0)ux5Idj?87qRa{>@^1{+wFUrz1`3XLONQdD#71vC z*wozkFb%h?j=a1uK%q8)&oCI}THU9g4S(}Gta_(xK+>PCK&itaG-{u?Un|}@ zP(T3CtGX5{$1oiQcy2=DbQz3}W!@#QYVOkAU)eXUF$HeNgzz;T*VmtQ(`Huu+TRDT z`e1>S6;mC_Q2nh7qN+c9_ev%JKmU0+P2c?a$|GmO-#wZZ?&ZRZn@n;B8S2+lcfU`$ zO*K?q8LEq=CiYc8<)h2rEKEp7yTc6Ci855$J~UMFhgBIW$(1r3`|lQ;-eiJ5xFtg+ z6Fg32^o_4&sGx=1F}O zAc&2L7Ru(WN)JaygfrFHpRn^?F;P|v6(`0uEmY`PP0N&;BS?2MQ)Xk|&Eq7KwA$`O z166U@!z6kVKmhekvLE`EW-xzHxU?J$T`Jl+G*t}4|9(>YFiG=9hxJW;t4?_QT zd;hTCEB?H@me1FQS$b$f&{#<=k*?nVar8_*Ow&L>Nnj-mRg)Gf7n+v85isQ*CHAV3>Od%-0I*cAy9zt0;~R8Y z)L<=LVazV9xdrDIWOtfC%#Acrt;owc z3$X44Shby)dj?*24Xp0p@v!~QXfM$`=(hn@oq?2XI`wP+2&|locSh)3IzIrc(tANbljd9k7-|X$Y`kqdYO4rX4%I7Vk_5SFdxwBkW4|J> zvJ97YSl{Hw{%HBq##;f4;+~VfFE*r!))_axzAvs2l1b2$j15El*w>sEs)?_v7*>$+ z$N;NYzXF^#TXQ>h&3suoQKo%50ap%KaeFP1E#~FRmHXuUWWU7hH(5k;v)%jf85o(^ zj_K&+v^=laCuK$|7@`GONob%f8hWPR0IXz<#F~Xd>>u8)#P7QG^&<5QbZ#;Y_0?cy zCU%X$3T$_JsL*DnzkSp^%}Onl99kbV|?Kdsqd0NJ9un*yYVGS(a<;$YP z*kOBsSdrlx1SV^yz>cOeme~S}g>nE~mzU0+;YSQ1%rjeXRY6fOT5+73LJE&&w1Ru# zGh|VQ-TOUjwCseJ^Xn$ZG;_<}=;wU_t0qS3HX0}%T$3B$K@HRq+9wN`j$)v0H2Md2 z`UtGd;2aN|j@<(Q>sZDr3#^Vwc>FGa)lZF~a;l+n%1}9FsGKrXxO%`+Nha$*UwJ%` zQU~>K-#iWOa(#r_Id@xzia_cunJU##osDPyO4k8UJyQ+Ui2^A<)VH)c$?z#dwH^EE zKpCp#rZ<`54{l(nIPvie`B9Bh>h||`x$6;7O$c=Q!M%?Y7drb@m?{BQ&Q)ChsH?G| zerfCD~E!5-yzi~~xD+a1; zKa6V)DCtZT7UbBToAAlM;cMoU}g7{o(ND0z)H3o1})ZwFa2u5U;wj<*@T2HD==L;hvyVhYenFr0=CtB=a)$R zFz`j1--^$#(lxPqr$m5l03%D)!V5DO7|+F|fjMrvt`IKD>os0qc-g>HN$r{eiC{EK z`}d`D8VZTLqIF(=ErXl5m+H)V;q3gVm=Z;cOt-Q=G-IT5-;H{x-%kW4;^^#c%-`4x;8+U8Az&_NNlA89Z zIVVO5tQ2r18l*5sQS*jf;X|li)mcya)0Kfr222>J)Qo~}wmWLJEU;P)HU&Yo^xFUf zxbX=PH|yD@HZ4@GobF&5sF)y^I~ZUkVM=C!9tjh1fUBUL2~*w4U>zAKQ(Yw|RMT}B zC(_)=8F->a5R z&PqdvO9racc`+1Go_EQB*z0m^%{5y7K6C%t_1zdNSXNdHf+<7*`eAQepJL=8*J%le zD@>{B4__3d&Eb2Y_hGT61K}ZtE75L|*&2oC)jTFLR?XJjxfvKS&82m$RtvG^JcKl) z&}km6SL#2QYPDR0QHEGzB>A++Xzh<+v~B{tY{(TSkM|C^G=iq(ay+>CMtPt*gzBY@ z0v!GAgN{0vrrzE&Q`B|*J_4(5BXtaTI#gp9gN%c0R)gt9XCsUIV61Koq?)~g>SNb2 z50%qARI!2^hWgzVLuG-KJ5fu{dB{ig{Q7}>K0&hI2A4l-sM;7RiE&@;{P*MF^5@qu zqX-%+nJ8TcE!BxKRI+ZX_UX`2EiZeM>BL=trb-y9)l&0Osg{a!iD;j$Zhxz72>F9{ z3U7L2XbptrnA2-0U`)`PIQ$7ywGK&pqgg>@pfm)K6Qm5ViZ<&!@i}Cpj(`Zq1B)}v zlxwntfT6@@zxPeX5}RceST!ZItz6XhjdTPmp+m!j*{SY#IFAmF300jK28xH7=7VCr z(0fHD3M<#noeo37Tj^F3CuL0|80yCawQ=~-zV<~fL!(KG;7 z#Uya&w0#nQrJ#$z>bvc=gdSFb)x=GhNLF8}i1r4l6o$PbWvr;ZWGGn-4c5j1z~s51 z%oY1+UG3Q4i85UPZI%A(iyQ$#2t{nlHRYUp-QRmSu?G!Q74%7c<6!a;FI_E@o(DX$ zP;@mY{5cpo9h@{Q@J)t+BD>DAHk6RS%AWWLoN5$S^YxqVUvn~)LvMc7P%^7krV%=_ za6OmTB(94$7^?$J7q3(73szUOx40G?v~(3_OJ5LNt7t37Y^9-t9Eq$8;iYqL6Gp2E zSe3@^TH68l!7`s#$!I-1!ga6|M>DcB>v54sK`*wm7)49!%$U$)y(-d?BHi^vDozR78nyBnK*4VAC-m( z#(Y!?q*kla?GODTz~h_X)ro2)bdo|-3en48QlfwezzQsu zV3nTz&dgGa#>xV#oH;|RCIhSpTt+s*ZlZx&CmN`zb5aeO7=Vb)x`rB>OFb9D$i%vw zr?Fm3OvT^Yhe9V#Ycs)P=p~t=5yA(}l1@hL^w73j(>xj5@2D|h0$#oD2&_1vPE97T z&nIw=TdmyqWLjAI=Fl5{dn`6I&;qGyxLvuo1y&24a8DFi0pLi^xK#VXx#F-_z@-!U zj94Q94FM2=3{4HHMA1}247sm73t)tR=R*cqu`JlErl+W7-~g=P06v{YCveg8EPb`# zzQO%(X&n9pWLf+5hKmY-N}K}myrRa*m`qq_MR~5NUps&nt4&=7)9W4|H_9b5sX=ORD4Yq&a{g4!?z36DrbP@bZ|Fq)qJTTnxMFW^vw+cWOOxKAoCb&1K z1vKMaW4H!^DZMGPMO%1iwa`@5ZWU_Zo`w)+T?jA5B?%~Kn`d%h7{f-u#!JIU5TdJS!mhu*UC)&GJE=dRo(KTGgMc~P@M*b z%DJbp|Ie>i{>f}yxarFO?&Wpw;=;MX>tLJyms-kdsN6cZ{hc95eYNvfXCcAw{3?X{ zk)fhHpr)g8*W10vTW9=62;l4GWp6qS0W>n%QY{sM5Z(Twh&&l}Oj=fCpa$WsZwjcS z=(g~}SVX2uH8pVmJEW;%J4Q1V^Hy;?t-qtW#Vzmmw%zRvhxw#*zqQFz)dY-CGz+W_ zw2#TtX+zRn>~fW)qy>94U+;RATvyaWDI-$?vCv?gXz2{C1Tbbs$O&64r>_oR6F`~drPq=P)hqKog+kG;TK5@8fEISNfGh%-3`Hb5lqBzK&9oq+g>o>FNDLWh z*)SPE15|Fn#Iiahx=kmHAs1ZzO@9PDykS|%wR11^!u;+@$ALw+aEY0w^R6X~O~yL)BE5UYXU?tbn)#R^^qM z_5;tvaAAkt+kg`r$pNtFZh6231DkkX$NILtBHRnr8zlncXbMwjY*U6y%vIDWQtGBd zp|};Ui$mJ2l-Z&iAsHbxP z6gNW))vAf=&~Aq_6N}t6v&4$Oy!h_MQ{`j&Un~31x7xdP=i7$v-G*^$?Hmdmk;f_v ztR5d3ih4`N>L(4X{_x$;{OHA%|N8N10hhnqYN)_Q2}3n+W~dPUhwH#k^iy5_5I}_G zjsCvgEc)~H-hVwhFWh?PuTBG?qJ}ERP$5z0Vz~2<5vsG@@^1-nf~EN zqF?;Pd_n%G+lhm|)nzzM6R^T=2$`9$_B|LiK$ijczk^H_@0$AtR$XT_xw}|_)tY&) z48@WIRx&0P4O9~Uh;YaT(K;qYS77!U-bT}fj}x|9nFw5(%?BzB?i1&k001BWNklw8++yv*64|)(C3_%xDM|T{;Qktm$3^ zG7-R4LsP}=v%&o#tw)$D?L%}0ZSai1wnu7a004(@urz!yy=53e7}wR@{{r(>iHw^# z_c{SM72^tac&ECj1W2)sI-n}SR+Ui;CB>{lFCILvur`MHX&$oJf9>d7188k%;A$JR zv`;cx!A_HdcTgzD6f@K|ZYR(pQ`}#7Vz}CvEip^dMNTc)O&Vd~H}YxC%amIwvjtY` z2i0m7s@3{b^J)d4WnXe!MpFzjT4&>a!BD~!cooy2U905IN=+=Z&yqLm8C(WmN_m=J zeEL8ct|NihcmFS6z=j4o8!jZw*Nrq#2d=g6AzS#uxlbRAid$=+Y&$n)j6MRZ!%v5g z!0H`5Jxvpjzufs>{WjQjcUXQDK^E`NTd z4ApoS-TnZme(=Fo{bUrhR80&O)(bu$sxna35-~qaqAmgxg+#I=b>71yFaj`!;+ctFoDdl%iX0DtO&wTOnJ5cv z?Cr&bpLRWr9ssP)0B{mu)dc(myz2zCoaj}jd^B0GIukmZ(eW(>W$aVUjgPt=yj4$3 zC`1#LnF!aIC?-^m2OgkJ&Q&c17y?X^(7v!^m{9)9X6~8nb-CHc@0d_pGAkYPxJ|#j zNVJqF_gE&Yvot5HTWogz@oc!i9_;<~B0MXAVldYPWLC7G6Y5hwCB&teQ>#wS=oOuhzA?5t7-8p9-Q1wRt}o_X|8r zCC$jFU$ik=50-=CA=s=bL;jeSSV!uBMk_E{&)t(*zhI=$&u_?Rbp}?d(T?Y_!SU`! zTBwE#gTRWL$UGsu@w>NcAHy7vxiDF_Ykc4xQ%ZMSUG2z`GwUY9apQgd`L-NVx0Y|( z%DppG?EVoi}W{Q(=MCI`Uc|%|&Ob@_7B@Ymo9K6)% z7X&J7mtuYkh>GD#*dN=!uE2`ne4L1~ezE{zeF?B;!(IUp_ITYZULd^iyjRTT&f)vx zL9ajv@eE@=GI^$q=|ofLUwRCS;k(SE1p8!A5k`%xJe#W{YlwVu+&k z5_mzcS0*p6yAYDm!gUQs3vPsPA8cc^&Ll+eZPaMN(Ih@oV3zXQx%2U$xKJi5br_^B z>xpHwKxZl7c{cx6uH$3!XZ=@A%Od6&4Iy*cXBajp`r&S1n^>NSa^r7&xgm2zfb!){ z8KgS~Rsebj$3-_DJDhEGrsIpUAAwbM#6AKm=l)eQRJa@lHmR?~Du+B&HHPX)4OM4` z>dd*z_0FH+P276t|2)zpzv}k)V!i0ggPPZ`PN;JX)gyh?8U^8GIQRzHFdmrrVB+Fc zBSkSd68=h)RwFy*{zOXI;R%)}JnpQA*@xh0e%~RF(q-)t;nnW~*$i>}T zOe^HLPwE z^>_*RVt@2`Gaa0S@JDP=be5h%Ym(u~RPo&FK4P*EPPHsz!Y~+#mI^?MVWM%Hd7i}l zeA>YWgK3zE!d(!W(&YJwM_dfOjYuloF*#sm87Zr^@)`HRG{0UGu&P~$2UbY5fbrS9 zZ5}zxaKW@k)^S6BQvjs#g$eKXRO^^yw&XripeA{@z-(>G&_Nz5UQ#UFwP^LG)EJt4 zTGVJ2>u{gp?`m`%oD7P~<<_4~u1gE|Nx#5bp7Yh9c-;i7v~luUm5@PpOto2VHY}cB ze-}bSjoaX}>kv6qDzD2EC}D=!HX9T%#*mvMvsORhh(7%Miy;4M0#@9kqJ8RsG(`J! zUS+5vup&UZZz{+fu5FITbj*FxRMrBedKr^f>f*8DN;r`q z5L>TyL35P@R-C9v=Erj4fj7SvSOtw$Ftm2Y}!KkDgX+T zNYijMlOVHX09gzLGJsG*u6DaJL@TLTKoJttLJM_1*iR(RuQb-i+v}J^D09xSU9QJW zf9!6h7AkD9p?yujN<#Lm7D~e7N=;D=l2a5yFhYh33{={e$WSGDs<2%Ej{#I^=wA$l z;tLe+kK76XLwdgx)PaG*K2JvdVm_ZacjDa1dQi+aTYoYPlK_67kHX{*RXtzt#NZ|_ zHKyvS(;MMPE9i@x7~!SBi1ovW!y0X1TMkeGd;vr~)Z>qUN-M;5CHtEfMOe3j(atK^ ztK%h4)KLi_(qF~~ozKQJd3icKC6KD#IRsK^NHq2%fQo==-2Q9}&p!pKnHN1#>zTP< zxO!wvcVcl3iB6w$c&72Wmbwq(*+n-{=Fj8ponyLavcXY`T14cn0~@`c@*wh#Ocf`joIn^&70O~V z!HFwe{bcf>fXZqKII&n|fEA`Jn8cjzl(Eullwb)HhQ?69j@R;C6cf$Uv;;>@b(ZdX zV?zApwhFs@RL1X+=CQTCm1Iu>##7W)Daz zs_QKfi4&*3<}1o%W&*P%lTia4(%*?8TO7*^Gnk9V!iWI)rwe#>O|kPKQkeC zPnGGKoAqh+b2pRc1ud*&JG0QwC&PX*ch~OZ+PUX=&Xmc{t75usX0)!|wL?fNLj~P!7_GMwG$;#zRtl_~1HTor*I^02oO_rg zG>*gmO23T<#Y=@)j~=VN{14)Z;hugHKARQ-s~7XFcRy5FuYC%#(w#qr3B|DZ{_V!& zGXkrN76-KdoV%(HufHv@x@+Ln4w!CsocX<~Nb|mcRV!f1bnvTBZ^^VBn-uDOYM}1= z)Y|&~)d8z}V5pwW*Z$>nLv>pX70;Drr~ zbA`}AJx~d6QE`KPyW54Ks$AO?YBkVSqh3C-t^g!8*2vv^k$Ez)J`oTRSaO14%ouEl zP*VsE+O`QlBOuWoa&CNN80!G4+A=08p&eZmNu{BE*ir*liiXAttllKRO6=8@fjU3w z6#zL+TBwH!yOeX~v+d@}K{Jt_tJjy|g#!|xR?Z<4nTANg4h&TF3ZNE>YiEP-<~t3O z!|ym@%RamV)QP}~YoA_8%uau&-__@&ggk%oFJZC0A$e8GEj!^ zmYyRSxFiD4=nAu!V#f_&ujWXi-snb(O4gz?m2N9TPWC=BT`REZzHkb_4&}8AHHJlA z&?GkTqt#$PQ6RTkF5Nk7-Zyn-JKFN={k|9mM(dH=1bg&Eqm?pRyrZq_AT?S}T?ao? z*Fl8oBfJoQ|G>rtpmpgk6>)u$I1+*l1EYmy|LK)HKh6;HN=C>~8; zOSw|VrTgX3R(ftv>LG;R!=V`3ExHzFt_1)u>927&tT9a;LI@9DZeKK-u*Y5Q9#~E8 z$y6c-nQkav(-G(j#MsK`M>1L;fmO$cVV7bAR)y-Ry6h9nv|N^Vm51tmx%@>D=Gzcr zC3fj>RBd6XzFBPiqesp?x(*K{r*407+{Ws{xY7yGXyy-Ts5&uJ+liNn-e}_g<$BWt zn0ll_1-f^=UIe$lss8aLz_Nf!{+Kl}RSc0~!d0W8Y6n&t>M{%F6{6M7%ucL^prT9a zc#-Bp0n7FE5~4jwft6KeW8yIChd<1jzQYb(wwpJ%1WIu?GC8qav&PFZKKAgf8(*}4 zHUKQ7{48Df;$$=esul(+1zyQamT!;cQqO3i5U%xF6O2kH5)G7Ppo$?(3>sh*Me!Vf z#Gbh_CN(#)>WGowN*O4Y2wJGC=)i~dV%X3Cm|}jN%=MU(J!z47@F$DF3SdYcFG-;^ z6cC|-P1-{OC^Aq0SZEV^De9*1d7?E-e-x1+Tu>&Ho2itIAT8+w88HGYq-v1ohxV85 zqq*A=W*6zUnN}3*d$adJQ>B!;asT6Kq$bPLDNvtlQw3IJsu&6yF3pL&5W>qJ(eem5 zTgn{}Lz~IioBJ4y)m;KBnpzwStPmj(8K_=q+`(sIz+K`0SU2AnzC{L_J5`PAQEes2;no+zW-+gx_QJY?t`9I;cy=(9Fx6s0 zk0sBWO|O_JqlG7mZFg(YTS0kd)QYMOJ2_*8+G+@lC1 zTNi|1E6kI%|UJ!=3~TA&8341)RoN`aLLDQp8)-)s7qwu_Fo^zPHo+KN`TKRvyf z+ur97?g~)d4}ju9+S-qWWdv5Y225Sg%CU@8MISDzUjj>EvuwHGEDVnDl1zofz zCIrwIR`_1{urG~1EYK#^Caw>Dx^@f$Vz1=ieU8+0;tgwF!U5Qj$wbmH2 zVjAPy;#7km_32yQl7Z6WH=%vBBhMX!WuRD&K*}c6B{m^5l@0AXz(BDLXrRtv5@2k} zCxcaiM6D^iltQ93iK}IxQv8!T$yo*}j)wtO)Iz1>MJ9^jb5#vgb!06A6}KuA#ox10 z09JTo9TsJr3{z&$TP;*i%bRLk0hS51&YgP(T@xl^>JR|#mnCFy71BB^SIeloT&`B` z{3L)l2|HCo92pYmIPv0S;0xc7n!dgf|#o`%&?(>f37_0V!kc|ya>o*;fSEBPs+^dSct8CW`Ng+ z3#{1nW1&!WT)Hw;)xGMbj_-`Q`UtGbQ*jiqx-mobD|_z4@8AEvDrWrqu=+z`sJ>T* zs@K3!#RHnIJRVNH>Bf_xdfhc2mAd_*F0oHHrWBT`s=gr(W)%Qfc*vuyB=uxyO#-OI zwF`e}jO!ms2LdaUNtr56JUD5vA%MA1n6&{`_T*#Yfw#8+Fno&}%V;Q|WrH}GXqyv6 z#tF`Ptc#WFA8dx~Rg)FD%+;?;aL}xU3bjSoFjIMsi7J6fl|O1?oTN&nptv7H@&J-#J1O3z zedO4|Plo!XT?301j4j^Cr}W~=xhqLJ?n;fNydghTUaaf~x)a$feb%5)m!I2^C;c7e>m*=TDutszd{$iNpoP+EMFODu2+ju;}ctO><@uf!V0nK50 z1;7aIT>)5|k~I>bh59vA_hhsP&wxwkim^W50K_K!;;n`toQt-8*GCO>#Zii9()emdQ(Q#@FnN;n{ZRQlEjPg%JPl%dK2t7F~%a$2f% z&XFeY%rRB1z)G)Sx@Wyzg^op>AztYTg&h6+Y)L1?H|2arQ-$-PEE)>JenmbNx` zt-y-y89;U!8x0$xtDlzVB<4&f0QM1K@LKH&5&@6qy&^OMYlJ1$4&Zk@KMihtvOTs? z0xNtw$7BKw)Jd;!){PHNTPYKTu&d0o4sUsv37cXg@i>W*x54R>VW5x)ip2nw9w+Wz zTrWA7uD87=;|a?|JvmYf)efwx17U#`L;VEwU_u49Nf{`(@%i=EpN$T<-WU$~en2tmYU*rzP zMX&_I0Y;_3iuFjCW-W1WK>aD8VtH(dFAjFs2@nWbuEeNk8FZ!5D8(c)zfI^L?!7iG z)yO=gsG&lrUpjukJIKvPtyG1XQZSS8;-*tpT$fcE8+gcI6^GWT-xY75j3Lo$W{ z#!{P7FD3OW!$mC?R*8127tAl@Sm@Te3ERMWz1r-0X_EG6t`S2Fb?5Cym@BxUrrIn5 zIl2;_t^z<4=fQrj0AsaUuH5-!gcthaEt1&}yd*)Enl-!-*U@K_{(iAo23z;7nr4Ur zpnexKjjH<~G+Xj);e8{ngZ;vR(E@8#d0%tsWSd44a$E#+f$19eiwEPtXt{*Zl8C`K z58cB_`Fs(~^~$*m1u8E=Z>0+nRKv+<$%k+;EM0n}WMsP(cyaeC1D^QCHl*ZT)nw&(B0yrS!P-4=kcov$u$X?oGM!z}ls2Ua&`s5kah$9)QTt2FV(6x}m&*rb4I@fZ^RQ#18{g8o0vd(dvUE-ur~sodX9 z4=cc6HHDGon5eX=lz}SO2Uo9uSX6-(0hu+Acxv)d*+a1*aybU-lv*gx%(SA@n#)(9 zqME=GFb+Dy+cdGxsc9=zTs?yM*qBu)fUWXs;nx+)YCgOsRxGVK zK96*OqS=NCN#s5@@o@}OW@u%6&dlU`k!wOPjFhn=up$s+NOJ&IJ6{PetpKaTOjSI# zI|5eGM%`*ojY&llutJIn&`>2q6>u09G}yRSO_2 zuY_UWhJv+mU18r?YOSUfTBY5)*!4uaHSBLI&zZ0;XtiwC3zU5gpw;UYCwKv+E{5_f z--IVRm@Y9Y(g*zMs3$-wnqn}-aEqK?ctN%)@Qlav8qfZxlm32*@Io-4FyX-qs3abn zNskxeQs|4xb{+eV4N42I;A5{OY-qt?7+UxdTe{9K9 z)m}p=@y_yDb?s1FxjP1CO@!UIkH6gg$6x(cGLqIo&5r<} zUWa;H2`Vi>Ak?HaB1@Fkl>NAp;(?^?pTuv0xKK2!hAQMt^38L0-v*0 zzqnk_{8_?4U9PL_Q!V1Jw&K!3@Xq5_aw`r4?b9)t!pc(xR#((knY0Tr)KF@u!Yg6D zV5zQP49^(oy6_p9E`9Jsa||8-*bnWQJuPX7pPZkl|EzLeDWEFBQ=O@Dn{hD9P(Z~2 z5hgWxj>Yvfqo^bVE}wZ|uhM5-mZ?(U#rHcoO;whu8VA=uYq(>zRAIYHh36KPk0zmb*0U$|Ot8=rdFI>+TuK`qh9w25f zd#!`f2MsygJ^;Fym|Yu>z+t!Fu`M{UKAZ2o+ir@d=TpdGRsaAX07*naRQ5grOyRTbS#V($`PC;!0pX>*!w(Tv}DB_=U&BiA+9hw6gD9)b8eBB zE3VRkD`px(cyd^y7597a{P2wPHnW0AT zu9z-%?wtd(_Xez50G0c70|=8*sxnl+QHDyTQ_jUNI;0&Ls^2L?rTmn0F3(hfp#p+L zKB{8@)u(Dd>gMMq$TYyJr;dMe1TCR|1Xg&bgd~IVW(oR)Gb69ixexUfO#B-|0jaov zC32!JM*?78oN)PqYY~%!a(zXNt}8hKY7&eex=G>SC4V3~-pOf5SGr4d`%3DQJVDBF zr28S%3nKQoE-5%o{>Vf@eB?>$o#gZ`-LLUb1Taupe_ba1(ZaDF%^Q>(4o=XIvA?d? zm9q*wKSb3v9$oF>_fQ))zwWPs=bZVZv*5wj`r9Py4HBS zCPdAa$uUnXS7)H=tthV2x5*_^0>Jw7<+68@BovjsWrxeiL}8UM*Sd&hv%Z?H0V_RD zjzerszx-K2S(9@hffaz%r>Eonm4ZH$Wjj|d%{XdB4DE|Ac=Y;eyDDRO=G&_~u5SWX%i%~~Dl}=TVtrkisup0?%2XWyR;iXMSgMzH6FH`;WT=J# zcoDH309I)jp#@g99RM>KqYQd7c&p>nzg}!>Rt=Q8+V1u5N|FX60x&5P3d*{~2qU$3 zm+#7W2?zp^ngkcW85k{fD-=|P&_ZR=g!NN~tLVX{uw)TNyTD|@?p?ym89}hy6nJU( zb`@ThNyGx3L$|$R0{eHQoY3P%Vq@gwnkYjy*@XOB6St5E>|%3LNC=@m_ZZ&HP`jxM z?thX}fz~;RR!iQq;D3Da@}ghJcLFQzhcH^_NM2k|Yz$x}%cNwqUTTQp!)1G@R|>42 zECQg4+N;jMD(shCZVjvs+qrkWu-T12x#Kyjv<(8QcL%80dJ8ma0bD;CV0Fg;ildj4 zlzsj9|7Y*bmLxf@G)+}oe2FDDAPIs47AYlUw+Kt5Z|Z8UruqTqa_V)a>UsDQxT`C) zjI;>Y(p8XZ^bER^Ab`w_jKvpQbmaffIcjR^=HVWZktiobjASQqcmMT|KyZVJr(VJ@?^DDJe|J0P^ch9)| zyKAvo2U~rAv+*CF%mbCHADsL6BgQ{*{Tu!3m-3|A3Ibk4n{|0iy?3jilbW?ARUexv{>jj?L7M$v&IteLp<=Y?ti`c)s1f{`VFd z-Q&JCb;E5pi+0n^W49;n`c&Rb0QUZn#v5Lh2ByNXpas}JP}6s`vHJ+j*$($_cA&$o zpMCvXGwUsjAlp5BZ9qUnZKMPL(xf4CsXh3x*|10SwGWW??dH&UulF=CWoKW%IB!s# zs32$O7O)db9~}EHtp?-dO4ZKh0ITF>`-+P&rX;6g2guE~S%Jz_t{7H0>V5YblCVR~ z@7lIL2dgvPBnQ^?0SJtIffA0c-jSj=f+A^0(0uNZVztUj#-6(l>wD?JLFak zCJQjFVD2E?|J1DFA~CSQwz*k_h0;QSf;wfPd&ju{p-pb1o`(KSx&B!$)k7;(DL^%e zJ^QNZrJ%5>RlTTV_KNQnu=c4_O_md8?F`KB0$_kFw8!6-DrWiiP^&P;Fqgl1?iOIG z?SqG6hOwYMmQ_&L3Lnt#vM&0jX-H)(ij0o5&KCPD(YBRPL!6k-hqqc}SqwQOK@98h zeF0FNdNJn!c;T;o|7s_$hPE7L8Gtf|WVDh$hG+<5n4iq69`MB`2q*MIeXVGuQI}z* z_4nL6E&E^(p464_0cvt3!9(qhIz9{^8$A z$$D_*>W>br4xPC}m%)*WmhEOo*|HT!DqLUuo8(+YMQf0@*wgP`NhlUW2KoA%`0lG8 zuKce)ItvUXG!Xmscmno?6z-iS12=8(%^RtIWv_4FZTb0UPM)CLH8S|ngBz>U@ak0S zZ`qD@L;L-)=Ql^!b*ePZy{4>HGTXz1Sa^}Z{z>m~2*pZ>>MZfvsG&oL1buW#RdqSwd% zfqi$?_?KsOz~Aad0bE>ilh;q8lhfenG_3w!71xmwi>=0kgCkzAR|))UnSr-99)}D> z$N$Q^@ykqJY^gnvh^_PignhOL6_-ia+|&>)=fM6RaTt?L^4vIUWKVo8Z-I}20YrNY zDB?Kuc%CF`*1L3@iy>cv{beDAagf?!4%BBc8v`wcz5r)GJ)8BH8v1A8mPR8Qpq&}8 zWlCWF;3Nm`Yjqv9@%hYr!X;oe=>n({_yATC0%)%^w<<3LYz}__Du%&ogHgRIRiJF! z`-0Ve_dij5^1{EeOzhMx+%AR)LaFK{#LvRl;sGb_ezz%9^+JIIstfb71a-KLQV-!R z5B0Opy2A)aRE}!rI{bFlxJQrYp)CUZKVYI4ms#Y(TET6?SoBU`y;RY%eetgj5CD~e z6nF{9Q_b*MJvkI z8@CpxRb9^fEG?jozc(<@z{AHzod(tE6W`ll?t^%^s4AD)!7nfC9wr!8(%4Q`bSX^F zp35ICj@%t)S4-QsG9#pPC{pzQA=<1Oj{Z89`iNAl- z`QPS>)uDd=$iQl6xMp&pEB1yG>U!j9;cW!3fx!08gehbAi$=JCk6@NE4c;t=(<&elxDy+2BHf%2woHwF7nuSdDDLZrXkaZOQ@^ z$3vwuHt&3@kb$8PLWpgnqM4asJS0$=%rzB$99;k-pvf)!Z9s+fX}zjHCZ)sYL@Zx5QL34o&5A^ zW-bvQC`Z?`BWdU$Sjp}`99aEWxm!m}>Jd$byV>_eHQCuAVEdq8b;R-hB{tzd4hQen z|IB74Ph5$|f7glFt6bWI?Wu2;&F5Z4GoSZd;hZ=xN7qPuh;y0&zIAD!Z=WN8ezA`{ zcMx?vx(wj<4c(p>?5cTV$&HHPFK+?4DNQFnK*BSlw2y>V3fK)_PSxvQm|Y0A9VPQne4PP9o^su230R8Mx$N z#Sp=|c5S!yZCQC-IWgZV%cVsh>%JdBP+RQFwHDZF`;ymFl?(vO?Gm$4z<9}(**C6} z&x4XB?{>^G8UZP5y8z@AE;POKbs_(JBRp``msH){3^lDRw6JxdM{Z9$?8m^(K&$V9 zg&Cr+5oj%Zh{~5a8$yvn4p%QZTGwi`ajL+B0>}Wb070oJ!c3Q=fIN%IYi<|cBb;y{ zpk-l$4i@lb6X2$Z@hqAx%Vway7L0?;6?M537eWJ+MUc;^KNo9rYnVOiYB8iyl`Xst z$kifPsY9Wio?CLXaI$aDGd1>r;62|;QT)h`8{V~(h2fDectu! zdl0y65VwQZLjc#00$O_j%Z@UFmV(s*jM_aze>>j76tcYGv0%mRZVPXWIg8GHbFuM^ z?Y!kxzT5h{09NcuH~RLS)``;%5XdABG7o>Wv87>85 z5Wsz*f412}y8w=qsdEV>I&v+F{i5q zc(oEzxOEP-7h#qW5@lz91QGJXwdh__x!RKF%5Y$~^HH^kApzCC!4@P-f% zRmpY)GF`A6>L@_AC#rGhxW0?IVY2GwM9vzP=fGA>gg#p5Z#Ip8{kP~cta6YtLz10o(1SY$td6Ny z6;H&G_UZtuTa_xaUC+R3vj?moW26^@neLe>g{?ENatc;+r?%>e%f(bq74vcGne%3; zo*VE*z?ey0D$Q+@8dcI*YFs6`Q~)at9gOA_30PsXh%?&%y6ua$sC-qlfq(VD08|ka z2uQNus7TcYP?cl-Ez7;~W4m;A7p6k{bWa#ZqDpl^w%<{%bX+O4P5%fbz&6zYW_-xe z>Khtd7_3>Y6?3-A6tp@4r>&05`#_CM!x90QRVT|9MH?!QI#7es6)FKKuo+D>Tu0EV zT-lqiAq_axM1#s(*#;Ish6{YN9h58-EY=(_EpUC0zw3#ctO!({lDCOFj2J5V4gw4Ee#da zb1>A?+ReR^yi_P!MZoVM{{O_u_-=D`?HpHJ0eoVak( zn7ou#4#etBh6+w!xF2Zg?G*S>p@#onz?Os6A<+8lg{YwS&Y8;3(msW1>TH@T;0HR> zkKO(W&cJ&E*AdSe(`orfRj~f=y>oS3$e?Y0P|3O_WY9p%`ue+vJb%Y3SGv!g@&b1p zOAc5^fz@4r%Eohxx;3sVm*8;4+W~*!w07`!rskW{{(>bc3t3xr$~$`{7gds45$EIXs48QxeFlcxT$FcY}V0EmRY?j*#g`Hl?owM zc;P+W{B#@RqP#A-fz>fUg?^D!#ayXOsX8r-kU|pLra4K-yJD>>RjOjHRjf-jSh8b7 zQ>jeRTDh(OVi;P-a646&S_PprBoHvh+^ec`?Y8l*svX)1F=yJUTG{3PatR`dYIuRi?^X0m&Nb^2#fesDcC_0_?2& z#-m9YEI+FYCDf{@j0sG2tteo!t_!WNL)CY|01V-X*k#ohgs})gP_h7AP`EhGjyYMD zn+3xRz!%*Pqr%lh*TZdhLn95CV?f!Wy*w=8RoOx)A>0V(Cq)SDmgX49%?he)5vZVg zCHC*pg%C9|;X=4_?nPa5roO*%EXW>a32-%K!0*Q3^qRU4D!?H2I4yuYzlwJTmQKo$ zL4EN?`2sbzBuC542B*w1(sNFujLaM(&BE$Wk2A+OsA#=%?yf4<)V1kuQ?%}&kWKb| z%fg2Ps~;=G@OE@M1XlZUtM(~Y2j^40(?+)H`!;$6tAo?|7uVnstcFwm7Xeo36@G+q z%hVUbOkA+;U;agYfu?xtD3`_^SI(^LKsJEtLe_s4mmi2t%nu;V7faXe1-6g4zv3pz zGfTFMA&C=G57n+DqA+!2{MXm!9x3Sc!g97$-g>9%6A%i{h@Z{NVCvNq_rw95hCHm+ zpTDevTemT{inX$m*LhYyFPd0n?Q-MxsBBpwVKtrb+c8+Vw)d7lm0GmNoGKfODpdfh zP1D69zOYwMYvvJ}RKT`IENvjwUrP)$(2fhh<%tM zh44RBmY^~j>{Qwd;Rec&s#UFSw{R811G^x(RyNKqQ@YTfjVBES+y_jQSC*@+;}_^ZU-g! z`fQ5!b>|Slss1zYN`cCn1FXPCM?uuoKK3YJ7D||J@=C$#e~&9ZG+0T9VR0k5Uis^x z!0NB9W0kl}(b}z(hlWo_9)<4~t$*^9Dj19bxc=8#iQ&9P;a;W6Lh)4bLFk|L7j4s_P;EP^Kejs7sWPQ1De5cvR%)|80aWb2 z)|{#YtVT)|LiIEx&m8}7V-Ht9tL=nt(p;*T{{$zAzVR@v=wP9)CtpBH%_icqlIzo4 zDfGE*L}3DWMI#ApUnoG~Jwz|$N+n+o^fOv!Af~EQsy=nW`LfK=DpRL0esq6G)v_U2 zC?J$3Zl{Wrtv7&*Ak}uRgzBWgMpX^rgRw(-W9@_HRCQhJ0>H}my*XlV-+(G%Zvm^m z4pr!T*vSLD8dbQKUP1?%6IJ+d?us5p7%TCYA3_VwoiJ0jO!?Y&2s0d%tt)6-8(dqW zlx?~qY&RSC(Rta^Btz?LStz09YCT&F^|e@dSQRbjw(N&S7q(+$S&o(|T0vb0U#xDiVYhRo;6)`XGZnm#qD8>6*ZYE2@*N?x zrLKeNx(9y$;lb(<0^RR`4)uD-1#sV9_X5|RdRVst)}vx|zmxkHy453C{q8%?!6R77 zH(&~^((lH-;cDUw_Vs`HZ<8QnP4@;A-qC;kn;iu#AB=$8t81~d&tJt#a>72zle<1a z(ebg$l^Slm{$Vw$cNX2|RpEN0xm=Sq!8Ygq*}MvGQKbB-PbnCYFfHFQ=S2!b>X+LQ=AhwvBZ3V!p4IXfXk$fP!F{wyUkD(?dQ%2gFpjYLRLFDc z#Fa0aP&g_48zEG|1AWqwuWDUeR}`!;5X+@n_fGn;P(eEQ1z#yxAx}yUv~peBGt7{R z75hv~DwJqqUkX;+P74xe&=XZf1F0r>C_-Bwuw?*DVXqOCd@=rh<@sAs$y9Bd`X26E z7QqRMl)?=6tLl`kFGJ6p=K-{|eF9oo2Ox>ihHJhQ#R*Cj6*wJ8izCzvD+Gi-YCEV| z8u|x?>yn_=hVydKwY0a85Jht)1aRSf)oci0xw3^cD6FqtC%Ii#gG=28x5(+z&_S$5 zE*CB1=|bp(J1qk0YXPuuY-01i#q7&*t)OTD^aL*E%aY46Euu#G0zLs&>Yw)}nmZ`x7 znd%SYE2BR-GE^{8#d62MQIB_3u+oixM6kNccjhi_2VfgdL_RH_9;mN%UqIR!>yd?m zk5#g)yI*`Xu6OmDPm?l7&;PpjfB)NYh{#w|rlh7110#e&W0(9I0POfX(#AZ2aGKsAL|+VZ(`Z|ALlh8u>P*8jij)?4@> zZ&-GeDgi4C70mqwzr7LwGpMrMtauEwL8(H$DrU*Eo zxB>(W1!#wU5FYppAx!n$udjL!4C z{nb{$0HJ*VrU+E$&TSJ%L4^AesG#B?ln)zqwTDVTU;?lyi%r$3iY66i22rW=pMu8; zW zRpK9=!4M-?v?3tt-nF9?tfqcKETk~5v)n3d=v@ef02g0eCID6TX6@cnnc8ZopoJ8c zRo@F}nPg^G@|tVaY?#M|{Z~-ayeeD_L2TW^&3cELS~$0z6f>4V$o6z0L?L9|FTjmp zHBz<)heFo#qFZ6hTrJnbfe;kk5VQbXH10t7VY?0Qw7yoFtA#Pl{h(-}kTLVM*0@Au zc~EnV=k=_kDaL8t<0%9baMZ~fen;^B(m7SIxEzYrM%yfg9IaS0D{%xQXuWan`C96E znHk25nw`m6rgHR$&I(T0QMfWeCP(KD%M4-p@e(tRauxIpbMdM zfF|5H&g}p*uwr;!^0K;A+fIw!o=Ra~3mvpvryJK5P?nw*K5Tn6qM#l6xS%ilr&J|5 zQx;(3%d3hCmAvU(UjP&~3P@;+{gehYswP>;9&@AekU_N1!Ula`aBd8! zy2izjLdmaEC5u1?k9Il66u_coyUIeR&Hw-)07*naRKXUSL4k^$I@jTSo^J)!3gb6p zi=+unDxx~o4dxi7S6~uQ>a67XMFnM@%N0X)s++?en>^@b*5;Ietq@B zBUnw%%AJ-S8(Me>upSJk_Kp4^XdMSukD-8fx;!2mKlBXz@tI-R5x!@gtUr=mti1(? zcTVKAqIHylwdbPv>c!Qq;dyrfseRYoj&hYXJQ}d>3|9G$WKU-QZfghAjI90BdxDjA z^HnLKfzx1R`^t(G-vU7s%z$cZ z%8%{+hYODL@F;=H_{>=~M{)OV2nM=Iyp%Sm2F@>5*$<=${tg zg?j{->wXFYFj-z{#j17F71#%qD1?f2p)VGt4>m_pq0(`Ta;i4Sk3tpP%DHXuP@BwD z0;Ur%nlN*UjfU6_`BtT@GeA;v2UirLZkZB=tgO^{f{YhD6)NqFfMf1~79ywsW>91x z*7eY6g6|L_h>5`d@G^HlEQCs^wXQ65us0ibI#9^e;)287d*Mn5F%p*P6Qzk=O*;x^ z-(u!VrOVJSccpAqP|@lbN=S8T=6mFCLD5V@1Q8mjgJXDL;ev#)*>->u=WQ4AF^I1ShVRNLi)tDP$UGy-?kOIeB*Wf+-=(N68o~z|U zjoMiFz5%!r_rX-rLI^Ly1u;f~ndWE#xS(WxT+cd$G16)9Ar&o+8H|e7QWPy`7VcA_ zgZV|U2fSD->mH$mdH18x!h5PnBSq_;edOc1%jXXdRtJgbxZ%EMH>OxUg4J=;{n+XQ z&A=mAJ@CY4%GSRpSh+nRgMZY@)jdy#aanaeR<8Df)n~}VN^+`x=G;`Fm{iYt`&IxgnqDl_Wl>2h2P=Omp?`y!#kkIs z(_+K1kZ`l~H;v>}fusOVsnt4^Du($j9U=u`AE!XFWC)QH* zQX6&TRH69qrVBK#SX8x73;Duif_YCfNr#FmlZF5qXxV;d$~oI!z^YNOvJg3^cIb7I zU`Exd=yBW<=9a)wboH|xSY0SB=8GCqSY-u&5fTUvv3xAityHP1oLi~t;sIHz)=8mT zoyRcbRCS5_AC4V8ZB&ICz)M2_Rk@-9vOi*hrX=#03E!Xu|CDqNK+RCb&i z@|T)Q0G14p%)BD1QL2c66(}Ax;`Y~VLjmyUW|-PiSOSU@pamZ^7Yjf&02CwH#t(Tc z#4!lun^-kcwkF^z6R~!FEeLD~|5M;9N>9*<5T(F1L*5v#4FN6`=@sB=JwyJ~#KLm1 zTp=NZ2sfnC)%T)wH9$xo=9TYnQ@C2>Y;{t=nC2O6-?M;m;psNm&Ydb-sQc8og}NC6 zY5-B8*@%)fFFV@5GYqf|r)KNkHvv$KiH4%JK^P#-FxsAVv072zXy>juS}aJ+T&*>o z1{Y-!7VRdiSI*tEo3Jd4aHAjqqd;8078Nba(aIDpIT2T4;eH9Tiz1+SasOQz&KXiD zeuG$!zmqvyj3IpMo}tZB4Jh6tRPZkWtPTOwhjs}Zo`)W?tr&k*e|etg&h31axgZbi z+Xbe(6tL2L{Kj?u@7-gL)%27vKn)PnsbEJsQS z%9~k*J9Pjl1E>*1B{@hSLadAS>NmVoj@eV@0(f!Nlz=D-OmnqI?}8^lvHjd_ph~Ts z+f=njXdeslmgcT^%44=1Da&hem98&(&(J&FE&`2$iC6Q8ZKh<^4B4x^2~5}r;m2&z z)g)qB6k*k>GoYSpDnv1?PWIRqJxwAE*Z?}I>mGqhx5Id&OJ3G4Zf{|3iQRhFm%fBj zRaR7wDjGa!!CTF#N}T{1y5~v}g#c&>{foIu6_=GMfT3O45prTb22_9|s906Wb(UKN zFcWwxai`%sRj$lhy>q@WxU#PbT>*tH1eTzhwNSsP4GAQ5L9VArN+lI712I$98b3CS zDQ2>LoL{v*IM!V-{~5_a%uF!)t^-pBr~d9`SrL2?Du_0Px)L@DV0A#~VCTxphne$K zhcHJLmRGjEr_xmgaT^R^A1FyZ+lIammBJUN$3i5VhDL~0Sx`xXE=XmoEqW9&ZtB|A z6Ux@2C_B{Ax@j8SUD4Nd(br|06er#~=$9Ev#Q9z!ep(rU+pvu7gW;8(fB}HwVJ7Edz2mPhhNLFXm!hxwA73{R3yQj+W+T zC9mF$ZzKklWKUrxoyc$Bi4wzv+$1aaKb_r@WSU4Y`9B7qK40jm9e$cQ zHWXSs;!Bi+2R7-?Py=TC+UZOG;j!_2dOCLRIlSxf#J;*-PhN+)X+_$v8CZ<=_3iIR zHHW{`x>VNYrCJ1jzZRf+t2s|{9ep%e7z|E<&zDtji`FC5#p|{Js&^LxNKaImLhUPj zzS;_ioJUX+a*B1V6sT4j!WWe&b>h2e7tED9sl`4W|2KG|ow~vmLig~p&u&u}P?_9( zPN%>50uFt%XqRs8=w>zn5ZactpRu5+sAi@>!9;>NP-XB}ZAH)`Z1ur=Rh$gGZs7d} zF>Nh<7+Bd~8ciU4Peba=o$mzC;t_@yZO;{~%AVnQ*aqN55CKUTG|h1{4S+JGZ%A|+ zU<)_C16XlC=mhS6W=3IPhS0ghR3d^EK!%}qxVJ5Rh1=({A~aw)*9v4qU8|DqX;7hx z7{;!c;t&!@fGI4*uM~T9Gks_T`0<&GG=vaJQ!B;}9^P^DvJ@a_^wwV6m+C5*TCM~B z8dnskZ3TC`zArprgrKF6v`%uo2t%q^VIHiWl?+h_isLAtV099(N5%_>|^yFfx2 z`*Bpawp8nUC>ybBFUz8b8r328JS=>;cAezDc?yAWrBKWG0^gRX zY|*d;Ia`G)TlKuJiZ+-T2EK$?zbrRhES6lhVO#ouT&ttteWj{kngm zDi)Sc6(^>JsyeBfqV-x8tq*B_A$!%=BUp{5!#?cQsqQ9Vxg4~HkiHzGCWmpig;cB_ zT>zT_iW(=qo<8(~jSmkFArAo-YMv%pd_vV-wv5ZC)c*UE|i?t{VSLw;TMKhLKyy z8kW2O7-TOiM)|RU6k;wEkOs?gv2S{Lnr)w2H68g~wM{;m05|L6+bbyyY_Hr+J*B2e zTlGK4cmYlZO_+yxzV*$U%{cTfo=z6FN>1+j++WOF|8!9W7*qh9U_@bm9SZ%PJI6x6 zTe#f`Sa~y>&|Ig}=;J3xW^R5f-|{*JKp__j?*UGmjVxb0(`+A_ONgliUJTE}8-(vA zm3udvNm{^qR?plP zAy3+GG>=fp32u6(HlaQGK#^Sosix9UMN>&?1uHw@nk!{}P`%QOC^)qtXNx8gR)9BA zeh4>-y*Z~xZ{DrYF4{oFG9_hG1V2ZY$|UUI5@ zQkXZ*jcP+dr76v+BD`6SlkUIk+n7_;2IqTKs!Vx`?F;#xjiGQ|Q4q0O9GmlfQTWCqh@Mf(6*>``|RUi}kOtT`Qr34)*UFT8J<~*ND5P=?nkh#eb(X zDeH(Ft@!U4aE;ti(qve zVdbHLN99T#@jahx@~Bwdcjo@|w!1el#edlEd(841^^gDfkD~Obz4<{m^WXkrx=oRpw`_ez!{YVE5R@*eQ?_3OXmdsB~0Ig0i9-VMr+sVBIZ{!ReZKZIQA;j4mx`{Qe>43_M1#&_2i zvZaex^*FSbR@cmNK_G>5o0Z(q!aRU~p$O=U>O)pv$kv%1c4{!Nb4Bb~iGS?z#4)wh zPPgTLt&NREU8G!=TpY)NLY1bN+;VB+sO4#=96w(ZZ56MMyV`etX2@c4EJpd;NtA;S4HC%rg-REUyXlZA7}KQw-bb)gbv ziN!)?8vqWCAMjH1h%GdX^wml(5?Ui)2^Qm^BW#-%+r65JTV8YzTxo8RHhQZD59kSP zY+Lk+I#4q{JrB&+0>oSx*qAF`T0j?VXiZ*9xSiI8VgcQu!mSM3q$+K<)?;7lase%| z)Jqj6)R7`gl?ZwYet{?aP>OhSX>cREFqc00WVYrF+g@vJsG%m*kW(d;q+xbCZX14O zpvJmWs42Ck7EzkddE)-ZP`pCS6A+juZhSH?8?;Z{|8Sd~I_p^&qk+;YSE{rQmes4G zVn($~38awuiJ}kC!9Hlt6+-+3YLXl(C_R{8uiJ)BAk*qwVLz&{aoe^Pg^eD52tzDj zPeEw2P(nfx=dGl>A^VTZ^r8kN;%#0xi>i?ey>|j}xr3l?ep^l!`&Gaq+VQ$HK}S9p zu3(5C#x3IzGYqIgp?9Hiz0}*%9nti{mjD+5rXWR(3n!o@=e$r0b-c&nb*?N!&+8KH z0Y@9LL!Xy@4}**ws9-#%LKH9LY_*8w6NPKhl^wUEI@^Y(p9NUC!^MzlR|yBfBDiKv z;9_`S3B?So)yBG705YqY#rjz*SjQtTOBAh{Dq0STR$H*178ETMEMAn`uxLGVv_gBq z9Ie%!9IaFQ=HoXS50qvrs#oBvRMEovu)ZGsj$4k_=r>Pgu0ZEPk+=G1^6$lMiq?+_ zRxv_wB2@5`30wEi@;Xw#I3lS2E+K!%@y=+P@ApA=WV^d>Zq;tK)!jz(tB;ZgE{{1@ zcbmLF<<=h@toGKG8Y@zJbCgoj(n7pb^ZmK|oQuyRNU8EY4u)o>-l<{$CM(g@6B+ssOCd*gm?hX~@-+ z#fkK@?fliO^8g^+K*l;ijo4J5z7&Y3va07EvE?h*7Mr%C0s!|j{9Rbg)KYGa zt>CGd0K`x#n>@YI-kiz}b1Zynx3XIA$8Kz`uqwl?_%HAHEQr!D+(M@})3IetWSRcP zOl`xEulS0FzivCcb;;ZKKJ5$tDC6m8`a<%we3lh6{9`@wnpYOOC@U}1e4)7YFdeg# zp&!6Nwp;c=*uYJL)<{Z*G0b3euNx=d%i@{aY~-lpX-LjTtgBQ7f2BD@c4%hGV2aGC zfx}u|(xy+1yHUmGR44Y@6eLxKj7+%N`qVZ89^-C>&5LV@#~e z(H3B}#+V}5$cV5E>kO!3D4rk|k3|kqjvTO%Dpk008YB@ggsW(>MLLi#qUB0+Mf z)<}FR1*oil1uB|BMA(7GAhzN(n$UiuVTBg@wetkC1%~FS>mNfOxr35G1rI?UN8GQB zA%ZegDz+1sKMNy-f`iZNwzp_RSC$%nNI)>ti9&L-VDC;l^uqU=Z-wm(oJ$QC#5!mq z2>)w>2VzOy7usdNN%+WPvRo~53Y5rEV1*o)Dt&C*qaZKW#g{2$982<@0!S5=4;X7| z-`;CcVgoYLkQ!phex>uG5Z#1zDtvjpd9e@ju zfe2cy*uJ07%dYN<&}>?||J7ATyZBI-JxnuZEKuCI>#m{u;2A1{@%K^{t&J#JmZOE= z**ShwQO_;{mzrYe13DHFS49iOiP7J6sCq!&OPFFLIa*i-;tEvSd|gqN4joz`Ut zGXbyjB%ClT$}o!bNEEHt`XunhgDYCop%}LGprVxk7v4_6R&x37zTKl}q2Xu9v&vt0 zfv{V5e8kGHQ?R;UZk2QIXBRj!y?9itjyP$5eogof#!>MMQ^&qiSp5f6sK%L5%z^qFQK%fk`}DN~SV~&oJo(gr`)=!zfi%w75jQn}70d%@A8^uo zb6tC@3Y33Ou=39asA96efz=I)c{atm3Ti_wNJY1_uJ`X2ZGn4i1G=a*m|{_>eKb@B z+@hb1Z`=U`9&M}O&0?D6Q2ScU0Zc{E?a>GFQ5vi3qjye&S(+@MijfpXjhD~?*h0G- z)bDW(?_tv%7#3aK^F7SFZBqK0*hZ{_<(2li9qBEyo^7-KBFO0*thPKI*`|&Cr_k3R zXUKAa0MrUx1DxPIjgPV}=Kc=;xem*krYp7uZj_vB)`7)o?bvGV>qepHgzIXy z<2Y~mUBhn71y7ExaTaoyZbqj$0E*`9aGik_`e1z=kueE0Nthq^k#yE1qrzQ48h0EF_$A`zK?Wk1s zB^~-0a%VU7TKIKt_S{`1j(jN2izojC!jS*9RZaHQ5puVIZ~331v`2z>

5fp!YRcBNs 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 SA;bydbI3_4Nmhv)2mB9g@;yQT literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind6.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind6.png new file mode 100644 index 0000000000000000000000000000000000000000..51bb521b62c3f43cbc43b5e1c8f72f2ef6b44bec GIT binary patch literal 226346 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�COy1`x48FRBekP@tnt*pal(y8#}_=d#-a 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⩔nF+`SxXvCsaa3v>lav?5&`OqEF{qF>)^sO9 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 literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind7.png b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind7.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4e3a164cd3487822f995ac66d6696e287b3bcd GIT binary patch literal 225961 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 literal 0 HcmV?d00001 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/hvigorfile.js b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/hvigorfile.js new file mode 100644 index 0000000..cfe6efd --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').legacyAppTasks \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties new file mode 100644 index 0000000..5335e8e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties @@ -0,0 +1,9 @@ +# This file is automatically generated by DevEco Studio. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file should *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# For customization when using a Version Control System, please read the header note. +sdk.dir=C:/Users/Administrator/AppData/Local/OpenHarmony/Sdk +nodejs.dir=C:/Users/Administrator/nodejs \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package-lock.json b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package-lock.json new file mode 100644 index 0000000..05b2505 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package-lock.json @@ -0,0 +1,1226 @@ +{ + "name": "voiceassistant", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/hos-sdkmanager-common": { + "version": "1.0.4", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hos-sdkmanager-common/-/@ohos/hos-sdkmanager-common-1.0.4.tgz", + "integrity": "sha512-LWrfF8Js+u54BcEAdyjzsA81iGBA4LPvQdQ1ig/pX6mvTieUPSvtjtAzdI8nnGVmJRLrHwAMHEO/syd9d8UAFw==", + "requires": { + "@ohos/sdkmanager-common": "^1.1.8" + } + }, + "@ohos/hvigor": { + "version": "1.2.2", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.2.2.tgz", + "integrity": "sha512-GfXCf7pDnyEcxWkG7Edd23XPxgym1vY37zdNt/Gj0pZmw0f+FrP+blfCzVWfYQYlI76krzd96+kvD4lgWkIPBQ==", + "requires": { + "@ohos/hvigor-base": "1.2.2", + "fs-extra": "10.0.1", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "v8flags": "3.2.0", + "yargs": "7.1.2" + } + }, + "@ohos/hvigor-base": { + "version": "1.2.2", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.2.2.tgz", + "integrity": "sha512-omwL/qjTE7DTCQdHZnMKuAxKlH1JOgOxaVAae1ca8j/oPuNgY6Spn+mpYRDHIktvav6axMmHT9zV1hJykY4GEg==", + "requires": { + "fs-extra": "10.0.1", + "json5": "2.2.0", + "log4js": "6.4.1", + "once": "1.4.0", + "pretty-hrtime": "1.0.0" + } + }, + "@ohos/hvigor-ohos-plugin": { + "version": "1.2.2", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.2.2.tgz", + "integrity": "sha512-gir91UxlhMbf2E/NjTYWJGrsNGBKD/1YYbaEdmswD/qW18UDY7jyuqSVyV/gj0h9+iji+gd53rXWzpLLztG5lg==", + "requires": { + "@ohos/hos-sdkmanager-common": "1.0.4", + "@ohos/hvigor-base": "1.2.2", + "@ohos/sdkmanager-common": "1.1.8", + "adm-zip": "0.5.9", + "ajv": "8.10.0", + "execa": "5.1.1", + "fast-xml-parser": "4.0.3", + "fs-extra": "10.0.1", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + }, + "dependencies": { + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" + } + } + }, + "@ohos/hypium": { + "version": "1.0.2", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hypium/-/@ohos/hypium-1.0.2.tgz", + "integrity": "sha512-HWW62q6hbd0PhvPTH96lo4j//owFwyCLj6Q2jmVLDW6mOt1dwJJwUQ7qUH+Cni/6MmcnyXKvt9I0moGAPK1aCw==" + }, + "@ohos/sdkmanager-common": { + "version": "1.1.8", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.8.tgz", + "integrity": "sha512-mxq69+6Zg/ybeQGnOtkBzOTbNBkEdiYehRKWsAD/je53v1W+ahauLqe90pNZEiBuVYugzb6z2EaJtAXYZtE8gQ==" + }, + "adm-zip": { + "version": "0.5.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/adm-zip/-/adm-zip-0.5.9.tgz", + "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==" + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "date-format": { + "version": "4.0.13", + "resolved": "https://repo.huaweicloud.com/repository/npm/date-format/-/date-format-4.0.13.tgz", + "integrity": "sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-xml-parser": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-xml-parser/-/fast-xml-parser-4.0.3.tgz", + "integrity": "sha512-xhQbg3a/EYNHwK0cxIG1nZmVkHX/0tWihamn5pU4Mhd9KEVE2ga8ZJiqEUgB2sApElvAATOdMTLjgqIpvYDUkQ==", + "requires": { + "strnum": "^1.0.5" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "requires": { + "for-in": "^1.0.1" + } + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://repo.huaweicloud.com/repository/npm/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha512-MaSQenn0f9oxIjtCufclpV00MuYTiHaXPbdcfPIM+quMqoa8cXywjHHx4LhhIAZlXqPWMdcUpYviajfmHtHRJw==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha512-CU2l5CYUAptUYq/671ajexQfXuxJFwwg0n243Kdkx8bTjeenedsWgu8TGHPm03vLfNtk3aTXgySKPp3Usykudw==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "requires": { + "path-root": "^0.1.1" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + }, + "streamroller": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/streamroller/-/streamroller-3.1.2.tgz", + "integrity": "sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A==", + "requires": { + "date-format": "^4.0.13", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "7.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } +} diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json new file mode 100644 index 0000000..4405e61 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json @@ -0,0 +1,18 @@ +{ + "license":"ISC", + "devDependencies":{}, + "name":"voiceassistant", + "ohos":{ + "org":"huawei", + "directoryLevel":"project", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{ + "@ohos/hypium":"1.0.2", + "@ohos/hvigor-ohos-plugin":"1.2.2", + "@ohos/hvigor":"1.2.2" + } +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/data.zip b/FA/PATEO_CarVoiceAssistant/data.zip new file mode 100644 index 0000000..d45de05 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/data.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cdd4904896de51c90269b8aa92b2535f684c96626cd4148610e041ca8ad1dcc +size 71961545 diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn new file mode 100644 index 0000000..80146f6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn @@ -0,0 +1,27 @@ +# Copyright (C) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") + +################################################################################ + +ohos_prebuilt_etc("voice_assistant_service.rc") { + if (use_musl) { + source = "voice_assistant_service.cfg" + } else { + source = "voice_assistant_service.rc" + } + relative_install_dir = "init" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg new file mode 100644 index 0000000..c33a20e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg @@ -0,0 +1,16 @@ +{ + "jobs" : [{ + "name" : "boot", + "cmds" : [ + "start voice_assistant_service" + ] + } + ], + "services" : [{ + "name" : "voice_assistant_service", + "path" : ["/system/bin/sa_main", "/system/profile/voice_assistant_service.xml"], + "uid" : "system", + "gid" : ["system", "shell"] + } + ] +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc new file mode 100644 index 0000000..20711e5 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc @@ -0,0 +1,21 @@ +# Copyright (C) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +on boot + start voice_assistant_service +service voice_assistant_service /system/bin/sa_main /system/profile/voice_assistant_service.xml + class z_core + user system + group system shell + capabilities SYS_TIME + seclabel u:r:time_service:s0 diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h new file mode 100644 index 0000000..4c9ed8f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h @@ -0,0 +1,51 @@ +#ifndef CAR_VOICE_ASSISTANT_AUDIO_RECORD_MANAGER_H +#define CAR_VOICE_ASSISTANT_AUDIO_RECORD_MANAGER_H + +#include "audio_capturer.h" +#include "refbase.h" +#include +#include +#include +#include + +namespace OHOS { +namespace CarVoiceAssistant { + enum AudioRecordStatus { + AudioRecordStatusNone, + AudioRecordStatusStarting, + AudioRecordStatusRunning, + }; + + class IAudioRecordCallback : public virtual RefBase { + public: + virtual void AudioRecordStatusChanged(AudioRecordStatus status) = 0; + virtual void ReceiveAudioBuffer(void* data, size_t length) = 0; + }; + + class AudioRecordManager : public RefBase { + public: + AudioRecordManager(); + ~AudioRecordManager(); + + void SetCallback(wptr callback); + + bool StartRecord(); + void StopRecord(); + AudioRecordStatus GetStatus(); + + void OnStateChange(const AudioStandard::CapturerState state); + + private: + wptr callback_; + AudioRecordStatus status_; + bool recordingTag_; //内部标记tag,用于退出取buffer线程 + + std::unique_ptr audioCapturer_; + + void StartCapture(); + }; + +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h new file mode 100644 index 0000000..598274c --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h @@ -0,0 +1,35 @@ +#ifndef CAR_VOICE_ASSISTANT_I_WAKEUP_MANAGER_H +#define CAR_VOICE_ASSISTANT_I_WAKEUP_MANAGER_H + +#include "refbase.h" + +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + enum WakeUpStatus { + WakeUpStatusNotInit, //未初始化 + WakeUpStatusInitilazed, //已初始化 + WakeUpStatusRecognizing, // 热词识别中 + }; + + class IWakeUpCallback : public virtual RefBase { + public: + virtual void WakeUpCallback(std::string text) = 0; //唤醒回调,返回识别的文字 + }; + + class IWakeUpManager : public virtual RefBase { + public: + IWakeUpManager() = default; + virtual ~IWakeUpManager() = default; + + virtual void Init() = 0; //唤醒引擎初始化 + virtual void Process(void* data, size_t length) = 0; //处理pcm流 + virtual void SetCallback(wptr callback) = 0; //设置回调 + virtual void SetNeedClearBeforeProcess() = 0; //处理pcm流前,先清除当前状态 + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h new file mode 100644 index 0000000..e6439f3 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h @@ -0,0 +1,70 @@ +#ifndef CAR_VOICE_ASSISTANT_TTS_MANAGER_H +#define CAR_VOICE_ASSISTANT_TTS_MANAGER_H + +#include "i_voice_cloud_manager.h" +#include "media_data_source.h" +#include "refbase.h" +#include +#include +#include +#include +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + class MediaDataSource : public OHOS::Media::IMediaDataSource { + public: + MediaDataSource(void* data, size_t size); + ~MediaDataSource(); + + int32_t ReadAt(int64_t pos, uint32_t length, const std::shared_ptr& mem) override; + int32_t ReadAt(uint32_t length, const std::shared_ptr& mem) override; + int32_t GetSize(int64_t& size) override; + + private: + void* data_; + int64_t size_; + }; + + class ITTSManagerCallback : public virtual RefBase { + public: + virtual void AudioPlayerStatusChanged(bool isPlaying) = 0; + }; + + class TTSManager : public RefBase { + public: + TTSManager(); + ~TTSManager(); + void RequestPlay(std::string text); + void CancelAll(); + void ChangeSpeakerType(std::string speakerType); + bool GetAudioPlayerIsPlaying(); + + void OnPlayStateChanged(bool isPlaying); + + void SetCallback(wptr callback); + + IVoiceCloudManager* voiceCloudManager_; + + private: + std::string currentText_; + std::mutex mutex_; + std::string speakerType_; + + std::shared_ptr player_; + std::shared_ptr source_; + std::recursive_mutex player_recursive_mutex_; + + wptr callback_; + bool isAudioPlaying_; + + void RunRequest(std::string text); + + void PlayTTS(void* data, size_t length); + void CancelPlayTTS(); + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h new file mode 100644 index 0000000..ded440b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h @@ -0,0 +1,15 @@ +#ifndef CAR_VOICE_ASSISTANT_VOICE_CLOUD_LOADER_H +#define CAR_VOICE_ASSISTANT_VOICE_CLOUD_LOADER_H + +#include "i_voice_cloud_manager.h" + +namespace OHOS { +namespace CarVoiceAssistant { + + void LoadVoiceCloud(); + IVoiceCloudManager* CreateVoiceCloudManager(); + void DestoryVoiceCloudManager(IVoiceCloudManager* manager); +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h new file mode 100644 index 0000000..7d8f2c3 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h @@ -0,0 +1,45 @@ +#ifndef CAR_VOICE_ASSISTANT_WAKEUP_MANAGER_H +#define CAR_VOICE_ASSISTANT_WAKEUP_MANAGER_H + +#include "i_wakeup_manager.h" +#include "refbase.h" +#include +#include +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + class WakeUpManager : public IWakeUpManager { + public: + WakeUpManager(); + ~WakeUpManager(); + + void Init(); + void Process(void* data, size_t length); + void SetCallback(wptr callback); + void SetNeedClearBeforeProcess(); + + private: + WakeUpStatus status_; + int lastVadResult_; + + FILE* file_; + + std::recursive_mutex recursive_mutex_; + bool needClearBeforeProcess_; + + VadInst* pVad_; + ps_decoder_t* decoder_; + cmd_ln_t* config_; + + wptr callback_; + + void RunInit(); + void RunDecode(FILE* fp); + void ClearState(); + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp new file mode 100644 index 0000000..8cc35bb --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp @@ -0,0 +1,201 @@ +#include "audio_record_manager.h" +#include "voice_assistant_log.h" +#include "common_utils.h" +#include + +using namespace std; +using namespace std::chrono; +using namespace OHOS; +using namespace OHOS::AudioStandard; + +namespace OHOS { +namespace CarVoiceAssistant { + + class AudioCapturerCallbackTestImpl : public AudioCapturerCallback { + public: + AudioCapturerCallbackTestImpl(wptr manager) + : manager_(manager) + { + } + + void OnStateChange(const CapturerState state) override + { + VOICE_ASSISTANT_LOGI("AudioCapturerCallbackTestImpl:: OnStateChange"); + if (manager_ != nullptr) { + manager_->OnStateChange(state); + } + } + + wptr manager_; + }; + + AudioRecordManager::AudioRecordManager() + : callback_(nullptr) + , status_(AudioRecordStatusNone) + , recordingTag_(false) + , audioCapturer_(nullptr) + { + } + + AudioRecordManager::~AudioRecordManager() + { + if (status_ == AudioRecordStatusRunning) { + audioCapturer_->Flush(); + audioCapturer_->Stop(); + } + audioCapturer_->SetCapturerCallback(nullptr); + audioCapturer_->Release(); + this->callback_ = nullptr; + } + + void AudioRecordManager::SetCallback(wptr callback) + { + callback_ = callback; + } + + bool AudioRecordManager::StartRecord() + { + VOICE_ASSISTANT_LOGI("StartRecord "); + + if (audioCapturer_ == nullptr) { + VOICE_ASSISTANT_LOGI("AudioCapturer::Create"); + AudioCapturerOptions capturerOptions; + capturerOptions.streamInfo.samplingRate = static_cast(16000); + capturerOptions.streamInfo.encoding = AudioEncodingType::ENCODING_PCM; + capturerOptions.streamInfo.format = AudioSampleFormat::SAMPLE_S16LE; + capturerOptions.streamInfo.channels = AudioChannel::MONO; + capturerOptions.capturerInfo.sourceType = SourceType::SOURCE_TYPE_MIC; + capturerOptions.capturerInfo.capturerFlags = 0; + + audioCapturer_ = AudioCapturer::Create(capturerOptions); + + int32_t ret = 0; + shared_ptr cb1 = make_shared(this); + ret = audioCapturer_->SetCapturerCallback(cb1); + if (ret) { + VOICE_ASSISTANT_LOGI("AudioCapturerTest: SetCapturerCallback failed %d", ret); + return false; + } + } + + int32_t status = audioCapturer_->SetBufferDuration(20); + if (status) { + VOICE_ASSISTANT_LOGI("Failed to set buffer duration"); + } + + VOICE_ASSISTANT_LOGI("Starting Stream"); + if (!audioCapturer_->Start()) { + VOICE_ASSISTANT_LOGI("Start stream failed"); + audioCapturer_->Release(); + audioCapturer_ = nullptr; + return false; + } + + recordingTag_ = true; + status_ = AudioRecordStatusStarting; + + std::thread serviceThread(&AudioRecordManager::StartCapture, this); + serviceThread.detach(); + return true; + } + + void AudioRecordManager::StartCapture() + { + VOICE_ASSISTANT_LOGI("Capturing started"); + size_t bufferLen; + if (audioCapturer_->GetBufferSize(bufferLen) < 0) { + VOICE_ASSISTANT_LOGI(" GetMinimumBufferSize failed"); + return; + } + + auto buffer = std::make_unique(bufferLen); + if (buffer == nullptr) { + VOICE_ASSISTANT_LOGI("AudioCapturerTest: Failed to allocate buffer"); + return; + } + + VOICE_ASSISTANT_LOGI("AudioPerf Capturer First Frame Read, BUFFER_LEN = %zu", bufferLen); + while (true) { + size_t bytesRead = 0; + while (bytesRead < bufferLen) { + if (audioCapturer_ == nullptr) { + break; + } + int32_t len = audioCapturer_->Read(*(buffer.get() + bytesRead), bufferLen - bytesRead, true); + if (len >= 0) { + bytesRead += len; + } else { + bytesRead = len; + break; + } + } + + if (!recordingTag_) { + break; + } + + if (bytesRead < 0) { + VOICE_ASSISTANT_LOGI("Bytes read failed. error code %zu", bytesRead); + break; + } else if (bytesRead == 0) { + continue; + } + + if (callback_ != nullptr) { + callback_->ReceiveAudioBuffer(buffer.get(), bytesRead); + } + } + + VOICE_ASSISTANT_LOGI("Quit loop"); + } + + void AudioRecordManager::StopRecord() + { + VOICE_ASSISTANT_LOGI("StopRecord"); + if (audioCapturer_ == nullptr) { + return; + } + + recordingTag_ = false; + + if (!audioCapturer_->Flush()) { + VOICE_ASSISTANT_LOGI("StopRecord: flush failed"); + } + + if (!audioCapturer_->Stop()) { + VOICE_ASSISTANT_LOGI("StopRecord: Stop failed"); + } + + status_ = AudioRecordStatusNone; + } + + AudioRecordStatus AudioRecordManager::GetStatus() + { + return status_; + } + + void AudioRecordManager::OnStateChange(const CapturerState state) + { + switch (state) { + case CAPTURER_PREPARED: + VOICE_ASSISTANT_LOGI("AudioRecordManager: OnStateChange CAPTURER_PREPARED"); + break; + case CAPTURER_RUNNING: + VOICE_ASSISTANT_LOGI("AudioRecordManager: OnStateChange CAPTURER_RUNNING"); + status_ = AudioRecordStatusRunning; + break; + case CAPTURER_STOPPED: + VOICE_ASSISTANT_LOGI("AudioRecordManager: OnStateChange CAPTURER_STOPPED"); + status_ = AudioRecordStatusNone; + recordingTag_ = false; + break; + case CAPTURER_RELEASED: + VOICE_ASSISTANT_LOGI("AudioRecordManager: OnStateChange CAPTURER_RELEASED"); + break; + default: + VOICE_ASSISTANT_LOGI("AudioRecordManager: OnStateChange NOT A VALID state"); + break; + } + } +} +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp new file mode 100644 index 0000000..177f5c9 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp @@ -0,0 +1,249 @@ +#include "tts_manager.h" +#include "common_utils.h" +#include "voice_assistant_log.h" +#include "voice_cloud_loader.h" +#include +#include +#include +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + class AudioPlayerCallback : public OHOS::Media::PlayerCallback { + public: + void OnError(OHOS::Media::PlayerErrorType errorType, int32_t errorCode) override; + void OnInfo(OHOS::Media::PlayerOnInfoType type, int32_t extra, const OHOS::Media::Format& infoBody) override; + + void PrintState(OHOS::Media::PlayerStates state); + + wptr manager_; + }; + + void AudioPlayerCallback::OnError(OHOS::Media::PlayerErrorType errorType, int32_t errorCode) + { + VOICE_ASSISTANT_LOGI("AudioPlayerCallback::OnError:%{public}d", errorCode); + } + + void AudioPlayerCallback::OnInfo(OHOS::Media::PlayerOnInfoType type, int32_t extra, const OHOS::Media::Format& infoBody) + { + if (type == OHOS::Media::INFO_TYPE_STATE_CHANGE) { + OHOS::Media::PlayerStates state = static_cast(extra); + PrintState(state); + if (state == OHOS::Media::PlayerStates::PLAYER_STARTED) { + if (manager_ != nullptr) { + manager_->OnPlayStateChanged(true); + } + } else if (state == OHOS::Media::PlayerStates::PLAYER_PAUSED + || state == OHOS::Media::PlayerStates::PLAYER_STOPPED + || state == OHOS::Media::PlayerStates::PLAYER_PLAYBACK_COMPLETE + || state == OHOS::Media::PlayerStates::PLAYER_IDLE + || state == OHOS::Media::PlayerStates::PLAYER_STATE_ERROR) { + if (manager_ != nullptr) { + manager_->OnPlayStateChanged(false); + } + } + } + } + + void AudioPlayerCallback::PrintState(OHOS::Media::PlayerStates state) + { + static const std::map STATE_MAP = { + { OHOS::Media::PlayerStates::PLAYER_STATE_ERROR, "Error" }, + { OHOS::Media::PlayerStates::PLAYER_IDLE, "Idle" }, + { OHOS::Media::PlayerStates::PLAYER_INITIALIZED, "Initialized" }, + { OHOS::Media::PlayerStates::PLAYER_PREPARED, "Prepared" }, + { OHOS::Media::PlayerStates::PLAYER_STARTED, "Started" }, + { OHOS::Media::PlayerStates::PLAYER_PAUSED, "Paused" }, + { OHOS::Media::PlayerStates::PLAYER_STOPPED, "Stopped" }, + { OHOS::Media::PlayerStates::PLAYER_PLAYBACK_COMPLETE, "Complete" }, + }; + + VOICE_ASSISTANT_LOGI("AudioPlayerCallback::PrintState:%{public}s", STATE_MAP.at(state).c_str()); + } + + MediaDataSource::MediaDataSource(void* data, size_t size) + : data_(data) + , size_(size) + { + } + + MediaDataSource::~MediaDataSource() + { + if (data_) { + free(data_); + } + data_ = nullptr; + } + + int32_t MediaDataSource::ReadAt(int64_t pos, uint32_t length, const std::shared_ptr& mem) + { + VOICE_ASSISTANT_LOGI("ReadAt pos %{public}lld length %{public}u", pos, length); + + if (mem->GetSize() <= 0) { + VOICE_ASSISTANT_LOGE("mem size should large than 0"); + return OHOS::Media::SOURCE_ERROR_IO; + } + + if (pos >= size_) { + VOICE_ASSISTANT_LOGE("is eof"); + return OHOS::Media::SOURCE_ERROR_EOF; + } + + length = std::min(static_cast(size_ - pos), length); + + uint32_t realLen = std::min(length, static_cast(mem->GetSize())); + + if (mem->GetBase() == nullptr) { + VOICE_ASSISTANT_LOGE("mem->GetBase() is nullptr"); + return OHOS::Media::SOURCE_ERROR_IO; + } + + memcpy(mem->GetBase(), (char*)data_ + pos, static_cast(realLen)); + + VOICE_ASSISTANT_LOGI("length %{public}u realLen %{public}u", length, realLen); + return realLen; + } + + int32_t MediaDataSource::ReadAt(uint32_t length, const std::shared_ptr& mem) + { + (void)length; + (void)mem; + return 0; + } + + int32_t MediaDataSource::GetSize(int64_t& size) + { + size = size_; + return OHOS::Media::MSERR_OK; + } + + TTSManager::TTSManager() + : voiceCloudManager_(nullptr) + , currentText_("") + , speakerType_("common") + , player_(nullptr) + , callback_(nullptr) + , isAudioPlaying_(false) + { + curl_global_init(CURL_GLOBAL_ALL); + } + + TTSManager::~TTSManager() + { + curl_global_cleanup(); + if (player_ != nullptr) { + if (player_->IsPlaying()) { + player_->Stop(); + } + player_->Release(); + player_ = nullptr; + } + voiceCloudManager_ = nullptr; + } + + void TTSManager::RequestPlay(std::string text) + { + mutex_.lock(); + currentText_ = text; + mutex_.unlock(); + + std::thread requestThread(&TTSManager::RunRequest, this, text); + requestThread.detach(); + } + + void TTSManager::RunRequest(std::string text) + { + if (voiceCloudManager_ == nullptr) { + VOICE_ASSISTANT_LOGI("voiceCloudManager_ is nullptr"); + return; + } + + MemoryStruct memoryStruct = voiceCloudManager_->RequestTTS(text, speakerType_); + + if (memoryStruct.size == 0) { + VOICE_ASSISTANT_LOGI("RunRequest:TTS data is zero"); + return; + } + + mutex_.lock(); + bool isNeedPlay = currentText_.compare(text) == 0; + mutex_.unlock(); + + if (isNeedPlay) { + PlayTTS(memoryStruct.memory, memoryStruct.size); + } + } + + void TTSManager::CancelAll() + { + std::lock_guard lock(mutex_); + currentText_ = ""; + CancelPlayTTS(); + } + + void TTSManager::ChangeSpeakerType(std::string speakerType) + { + speakerType_ = speakerType; + } + + void TTSManager::PlayTTS(void* data, size_t length) + { + CancelPlayTTS(); + VOICE_ASSISTANT_LOGI("TTS Play tts length:%{public}d", length); + + player_recursive_mutex_.lock(); + if (player_ == nullptr) { + player_ = OHOS::Media::PlayerFactory::CreatePlayer(); + std::shared_ptr cb = std::make_shared(); + cb->manager_ = this; + player_->SetPlayerCallback(cb); + } + source_ = std::make_shared(data, length); + player_->SetSource(source_); + player_->Prepare(); + player_->Play(); + player_recursive_mutex_.unlock(); + OnPlayStateChanged(true); + } + + void TTSManager::CancelPlayTTS() + { + VOICE_ASSISTANT_LOGI("TTS Cancel Play "); + player_recursive_mutex_.lock(); + if (player_ != nullptr) { + if (player_->IsPlaying()) { + player_->Stop(); + player_->Reset(); + } + player_->Release(); + player_ = nullptr; + } + player_recursive_mutex_.unlock(); + + OnPlayStateChanged(false); + } + + bool TTSManager::GetAudioPlayerIsPlaying() + { + return isAudioPlaying_; + } + + void TTSManager::OnPlayStateChanged(bool isPlaying) + { + if (isAudioPlaying_ == isPlaying) { + return; + } + isAudioPlaying_ = isPlaying; + if (callback_ != nullptr) { + callback_->AudioPlayerStatusChanged(true); + } + } + + void TTSManager::SetCallback(wptr callback) + { + callback_ = callback; + } + +} +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp new file mode 100644 index 0000000..f9f6fca --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp @@ -0,0 +1,88 @@ +#include "voice_cloud_loader.h" +#include "voice_assistant_log.h" +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + typedef IVoiceCloudManager* CreateVoiceCloudManagerFuncPointer(); + typedef void DestoryVoiceCloudManagerFuncPointer(IVoiceCloudManager* manager); + + void* g_voicecloud = nullptr; + CreateVoiceCloudManagerFuncPointer* g_createVoiceCloudManagerFunc = nullptr; + DestoryVoiceCloudManagerFuncPointer* g_destoryVoiceCloudManagerFunc = nullptr; + void LoadVoiceCloud() + { + if (g_voicecloud) { + return; + } + + void* voiceCloud = dlopen("/system/lib/libvoicecloud.z.so", RTLD_LAZY); + if (!voiceCloud) { + VOICE_ASSISTANT_LOGI("dlopen /system/lib/libvoicecloud.z.so failed"); + voiceCloud = dlopen("/system/lib/module/libvoicecloud.z.so", RTLD_LAZY); + if (!voiceCloud) { + VOICE_ASSISTANT_LOGI("dlopen /system/lib/module/libvoicecloud.z.so failed"); + } + } + + if (voiceCloud) { + VOICE_ASSISTANT_LOGI("dlopen libvoicecloud.z.so success"); + g_voicecloud = voiceCloud; + } + } + + IVoiceCloudManager* CreateVoiceCloudManager() + { + if (g_voicecloud == nullptr) { + LoadVoiceCloud(); + } + + if (g_voicecloud == nullptr) { + return nullptr; + } + + if (g_createVoiceCloudManagerFunc) { + return g_createVoiceCloudManagerFunc(); + } + + CreateVoiceCloudManagerFuncPointer* createFunc = (CreateVoiceCloudManagerFuncPointer*)dlsym(g_voicecloud, "CreateVoiceCloudManager"); + + if (!createFunc) { + VOICE_ASSISTANT_LOGI("CreateVoiceCloudManager dlsym CreateVoiceCloudManager failed"); + return nullptr; + } + + g_createVoiceCloudManagerFunc = createFunc; + + return g_createVoiceCloudManagerFunc(); + } + + void DestoryVoiceCloudManager(IVoiceCloudManager* manager) + { + if (g_voicecloud == nullptr) { + LoadVoiceCloud(); + } + + if (g_voicecloud == nullptr) { + return; + } + + if (g_destoryVoiceCloudManagerFunc) { + g_destoryVoiceCloudManagerFunc(manager); + return; + } + + DestoryVoiceCloudManagerFuncPointer* destoryFunc = (DestoryVoiceCloudManagerFuncPointer*)dlsym(g_voicecloud, "DestoryVoiceCloudManager"); + + if (!destoryFunc) { + VOICE_ASSISTANT_LOGI("DestoryVoiceCloudManager dlsym DestoryVoiceCloudManager failed"); + return; + } + + g_destoryVoiceCloudManagerFunc = destoryFunc; + + g_destoryVoiceCloudManagerFunc(manager); + } +} +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp new file mode 100644 index 0000000..0c04422 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp @@ -0,0 +1,209 @@ +#include "wakeup_manager.h" +#include "voice_assistant_log.h" +#include +#include +#include +#include +#include +#include + +#define RATE 16000 +#define DURATION_MS 30 // 10, 20 ,30ms +#define CHUNK_SIZE (RATE * DURATION_MS / 1000) +#define BUFFER_LENGTH CHUNK_SIZE +#define MIN_DECODE_LENGTH BUFFER_LENGTH * 40 //最小识别的长度1200ms +#define MAX_DECODE_LENGTH BUFFER_LENGTH * 100 //最大识别的长度3000ms + +#define BUFFER_FILE_DIR "/data/asr" +#define BUFFER_FILE_PATH BUFFER_FILE_DIR "/wakeup_tmp.wav" + +namespace OHOS { +namespace CarVoiceAssistant { + WakeUpManager::WakeUpManager() + { + status_ = WakeUpStatusNotInit; + lastVadResult_ = 0; + file_ = nullptr; + needClearBeforeProcess_ = false; + + pVad_ = nullptr; + decoder_ = nullptr; + config_ = nullptr; + } + + WakeUpManager::~WakeUpManager() + { + if (pVad_ != nullptr) { + WebRtcVad_Free(pVad_); + } + if (config_ != nullptr) { + cmd_ln_free_r(config_); + } + if (decoder_ != nullptr) { + ps_free(decoder_); + } + + if (file_ != nullptr) { + fclose(file_); + } + } + + void WakeUpManager::Init() + { + std::thread thread(&WakeUpManager::RunInit, this); + thread.detach(); + } + + void WakeUpManager::RunInit() + { + pVad_ = WebRtcVad_Create(); + if (pVad_ == NULL) { + VOICE_ASSISTANT_LOGE("WebRtcVad_Create failed"); + return; + } + + if (WebRtcVad_Init(pVad_)) { + VOICE_ASSISTANT_LOGE("WebRtcVad_Init failed"); + return; + } + + if (WebRtcVad_set_mode(pVad_, 3)) { // 0-3 越大越粗略,连续静音多 + VOICE_ASSISTANT_LOGE("WebRtcVad_set_mode failed"); + return; + } + VOICE_ASSISTANT_LOGI("--------init vad success--------"); + + VOICE_ASSISTANT_LOGI("--------init pocketsphinx--------"); + if ((config_ = cmd_ln_init(NULL, ps_args(), TRUE, + "-hmm", "/system/etc/pocketsphinx/zh/zh", + "-lm", "/system/etc/pocketsphinx/zh/zh_cn.lm.bin", + "-dict", "/system/etc/pocketsphinx/zh/zh_cn.dic", + NULL)) + == NULL) + VOICE_ASSISTANT_LOGE("Command line parse failed"); + if ((decoder_ = ps_init(config_)) == NULL) + VOICE_ASSISTANT_LOGE("PocketSphinx decoder init failed"); + + VOICE_ASSISTANT_LOGI("--------init pocketsphinx success--------"); + + recursive_mutex_.lock(); + status_ = WakeUpStatusInitilazed; + recursive_mutex_.unlock(); + } + + void WakeUpManager::Process(void* data, size_t length) + { + recursive_mutex_.lock(); + + if (status_ != WakeUpStatusInitilazed) { + recursive_mutex_.unlock(); + return; + } + + size_t vadLength = BUFFER_LENGTH; + if (length < BUFFER_LENGTH) { + VOICE_ASSISTANT_LOGI("WakeUpManager::Process: length is too short : length:%{public}zu, vadLength:%{public}zu", length, vadLength); + ClearState(); + recursive_mutex_.unlock(); + return; + } + + if (needClearBeforeProcess_) { + ClearState(); + } + + int nRet = WebRtcVad_Process(pVad_, 16000, static_cast(data), vadLength); + // VOICE_ASSISTANT_LOGI("WakeUpManager::Process: ret:%{public}d, length:%{public}zu", nRet, length); + + if (lastVadResult_ == 0 && nRet == 1) { //开始有声音 + VOICE_ASSISTANT_LOGI("WakeUpManager::Process: file reset"); + + if (file_ == nullptr) { + VOICE_ASSISTANT_LOGI("WakeUpManager::Process: file fopen"); + if (access(BUFFER_FILE_DIR, F_OK) != 0) { + VOICE_ASSISTANT_LOGI("WakeUpManager::Process: create dir:%{public}s", BUFFER_FILE_DIR); + mkdir(BUFFER_FILE_DIR, S_IRWXU | S_IRWXG | S_IRWXO); + } + file_ = fopen(BUFFER_FILE_PATH, "w+"); + if (file_ == nullptr) { + VOICE_ASSISTANT_LOGI("WakeUpManager::Process: fopen failed"); + ClearState(); + recursive_mutex_.unlock(); + return; + } + } + + ftruncate(fileno(file_), 0); + fseek(file_, 0, SEEK_SET); + + fwrite(data, length, 1, file_); + } else if (lastVadResult_ == 1 && nRet == 1) { + // VOICE_ASSISTANT_LOGI("WakeUpManager::Process: fwrite"); + fwrite(data, length, 1, file_); + } else if (lastVadResult_ == 1 && nRet == 0) { + fseek(file_, 0, SEEK_END); + long fileLength = ftell(file_); + + if (fileLength < MIN_DECODE_LENGTH || fileLength > MAX_DECODE_LENGTH) { + VOICE_ASSISTANT_LOGI("WakeUpManager::Process: judge process too short or too long:%{public}ld", fileLength); + ClearState(); + recursive_mutex_.unlock(); + return; + } else { + VOICE_ASSISTANT_LOGI("WakeUpManager::Process: judge process: %{public}ld", fileLength); + status_ = WakeUpStatusRecognizing; + std::thread thread(&WakeUpManager::RunDecode, this, file_); + thread.detach(); + } + } + lastVadResult_ = nRet; + recursive_mutex_.unlock(); + } + + void WakeUpManager::RunDecode(FILE* fp) + { + VOICE_ASSISTANT_LOGI("WakeUpManager:RunDecode start"); + + fseek(fp, 0, SEEK_SET); + ps_decode_raw(decoder_, fp, -1); + + int32 score; + const char* outstr = ps_get_hyp(decoder_, &score); + if (outstr != NULL) { + VOICE_ASSISTANT_LOGI("WakeUpManager Recognized: %{public}s, score = %{public}d", outstr, score); + if (callback_ != nullptr && score > -3300) { + callback_->WakeUpCallback(outstr); + } + ClearState(); + return; + } else { + VOICE_ASSISTANT_LOGI("WakeUpManager ps_get_hyp failed"); + ClearState(); + return; + } + } + + void WakeUpManager::ClearState() + { + recursive_mutex_.lock(); + VOICE_ASSISTANT_LOGI("WakeUpManager ClearState"); + + lastVadResult_ = 0; + if (status_ == WakeUpStatusRecognizing) { + status_ = WakeUpStatusInitilazed; + } + needClearBeforeProcess_ = false; + recursive_mutex_.unlock(); + } + + void WakeUpManager::SetCallback(wptr callback) + { + callback_ = callback; + } + + void WakeUpManager::SetNeedClearBeforeProcess() + { + needClearBeforeProcess_ = true; + } +} +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn new file mode 100644 index 0000000..6dc0606 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn @@ -0,0 +1,119 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import("//build/ohos.gni") + +config("pocketsphinx_config") { + visibility = [ ":*" ] + include_dirs = [ + "include/android", + "include", + "include/pocketsphinx", + "src" + ] + + cflags = ["-DHAVE_CONFIG_H", "-Wno-unused-variable", "-Wno-unused-function", "-Wno-implicit-function-declaration"] + cflags_cc = ["-DHAVE_CONFIG_H"] +} + +ohos_shared_library("pocketsphinx") { + sources = [ + "src/fe/fe_interface.c", + "src/fe/fe_noise.c", + "src/fe/fe_sigproc.c", + "src/fe/fe_warp.c", + "src/fe/fe_warp_affine.c", + "src/fe/fe_warp_inverse_linear.c", + "src/fe/fe_warp_piecewise_linear.c", + "src/fe/fixlog.c", + "src/feat/agc.c", + "src/feat/cmn.c", + "src/feat/cmn_live.c", + "src/feat/feat.c", + "src/feat/lda.c", + "src/lm/fsg_model.c", + "src/lm/jsgf.c", + "src/lm/jsgf_parser.c", +#jsgf_parser.y +#_jsgf_scanner.l + "src/lm/jsgf_scanner.c", + "src/lm/lm_trie.c", + "src/lm/lm_trie_quant.c", + "src/lm/ngram_model.c", + "src/lm/ngram_model_set.c", + "src/lm/ngram_model_trie.c", + "src/lm/ngrams_raw.c", + "src/util/bio.c", + "src/util/bitarr.c", + "src/util/bitvec.c", + "src/util/blas_lite.c", + "src/util/case.c", + "src/util/ckd_alloc.c", + "src/util/cmd_ln.c", + "src/util/dtoa.c", + "src/util/err.c", + "src/util/errno.c", + "src/util/f2c_lite.c", + "src/util/filename.c", + "src/util/genrand.c", + "src/util/glist.c", + "src/util/hash_table.c", + "src/util/heap.c", + "src/util/listelem_alloc.c", + "src/util/logmath.c", + "src/util/matrix.c", + "src/util/mmio.c", + "src/util/pio.c", + "src/util/priority_queue.c", + "src/util/profile.c", + "src/util/sbthread.c", + "src/util/slamch.c", + "src/util/slapack_lite.c", + "src/util/strfuncs.c", + "src/acmod.c", + "src/allphone_search.c", + "src/bin_mdef.c", + "src/blkarray_list.c", + "src/dict.c", + "src/dict2pid.c", + "src/fsg_history.c", + "src/fsg_lextree.c", + "src/fsg_search.c", + "src/hmm.c", + "src/kws_detections.c", + "src/kws_search.c", + "src/mdef.c", + "src/ms_gauden.c", + "src/ms_mgau.c", + "src/ms_senone.c", + "src/ngram_search.c", + "src/ngram_search_fwdflat.c", + "src/ngram_search_fwdtree.c", + "src/phone_loop_search.c", + "src/pocketsphinx.c", + "src/ps_alignment.c", + "src/ps_lattice.c", + "src/ps_mllr.c", + "src/ptm_mgau.c", + "src/s2_semi_mgau.c", + "src/state_align_search.c", + "src/tmat.c", + "src/vector.c" + ] + + configs = [ ":pocketsphinx_config" ] + + deps = [] + + subsystem_name = "miscservices" + part_name = "voiceassistant" +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt new file mode 100644 index 0000000..7c19c85 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt @@ -0,0 +1,5 @@ +install(FILES pocketsphinx.h TYPE INCLUDE) +install(DIRECTORY pocketsphinx TYPE INCLUDE) +install(DIRECTORY sphinxbase TYPE INCLUDE) +# Install generated header file(s) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/sphinxbase TYPE INCLUDE) diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h new file mode 100644 index 0000000..806b836 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h @@ -0,0 +1,108 @@ +/* include/config.h. Generated from config.h.in by configure. */ +/* include/config.h.in. Generated from configure.in by autoheader. */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Enable thread safety */ +#define ENABLE_THREADS /**/ + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if you have the iconv() function. */ +/* #define HAVE_ICONV 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `asound' library (-lasound). */ +/* #define HAVE_LIBASOUND 1 */ + +/* Define to 1 if you have the `blas' library (-lblas). */ +/* #define HAVE_LIBBLAS 1 */ + +/* Define to 1 if you have the `lapack' library (-llapack). */ +/* #define HAVE_LIBLAPACK 1 */ + +/* Define to 1 if you have the `m' library (-lm). */ +#define HAVE_LIBM 1 + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +#define HAVE_LIBPTHREAD 1 + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `perror' function. */ +#define HAVE_PERROR 1 + +/* Define to 1 if you have the `popen' function. */ +#define HAVE_POPEN 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE void + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Enable matrix algebra with LAPACK */ +/* #define WITH_LAPACK */ + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h new file mode 100644 index 0000000..205289a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h @@ -0,0 +1,17 @@ +/* include/sphinx_config.h. Generated from sphinx_config.h.in by configure. */ +/* sphinx_config.h: Externally visible configuration parameters */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h new file mode 100644 index 0000000..bbe4b8d --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h @@ -0,0 +1,731 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file pocketsphinx.h Main header file for the PocketSphinx decoder. + */ + +#ifndef __POCKETSPHINX_H__ +#define __POCKETSPHINX_H__ + + +/* System headers we need. */ +#include + +/* SphinxBase headers we need. */ +#include +#include +#include +#include + +/* SphinxBase headers you need. */ +#include + +/* PocketSphinx headers */ +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * PocketSphinx speech recognizer object. + */ +typedef struct ps_decoder_s ps_decoder_t; + +#include + +/** + * PocketSphinx N-best hypothesis iterator object. + */ +typedef struct ps_astar_s ps_nbest_t; + +/** + * PocketSphinx segmentation iterator object. + */ +typedef struct ps_seg_s ps_seg_t; + +/** + * Sets default grammar and language model if they are not set explicitly and + * are present in the default search path. + */ +POCKETSPHINX_EXPORT void +ps_default_search_args(cmd_ln_t *); + +/** + * Initialize the decoder from a configuration object. + * + * @note The decoder retains ownership of the pointer + * config, so if you are not going to use it + * elsewhere, you can free it. + * + * @param config a command-line structure, as created by + * cmd_ln_parse_r() or cmd_ln_parse_file_r(). If NULL, the + * decoder will be allocated but not initialized. You can + * proceed to initialize it with ps_reinit(). + */ +POCKETSPHINX_EXPORT +ps_decoder_t *ps_init(cmd_ln_t *config); + +/** + * Reinitialize the decoder with updated configuration. + * + * This function allows you to switch the acoustic model, dictionary, + * or other configuration without creating an entirely new decoding + * object. + * + * @note Since the acoustic model will be reloaded, changes made to + * feature extraction parameters may be overridden if a `feat.params` + * file is present. + * @note Any searches created with ps_set_search() or words added to + * the dictionary with ps_add_word() will also be lost. To avoid this + * you can use ps_reinit_feat(). + * @note The decoder retains ownership of the pointer + * config, so you should free it when no longer used. + * + * @param ps Decoder. + * @param config An optional new configuration to use. If this is + * NULL, the previous configuration will be reloaded, + * with any changes applied. + * @return 0 for success, <0 for failure. + */ +POCKETSPHINX_EXPORT +int ps_reinit(ps_decoder_t *ps, cmd_ln_t *config); + +/** + * Reinitialize only the feature computation with updated configuration. + * + * This function allows you to switch the feature computation + * parameters without otherwise affecting the decoder configuration. + * For example, if you change the sample rate or the frame rate, the + * cepstral mean, or the VTLN warping factor, and do not need to + * reconfigure the rest of the decoder. + * + * Note that if your code has modified any internal parameters in the + * \ref acmod_t, these will be overriden by values from the config. + * + * @note The decoder retains ownership of the pointer `config`, so you + * should free it when no longer used. + * + * @param ps Decoder. + * @param config An optional new configuration to use. If this is + * NULL, the previous configuration will be reloaded, + * with any changes to feature computation applied. + * @return 0 for success, <0 for failure (usually an invalid parameter) + */ +POCKETSPHINX_EXPORT +int ps_reinit_feat(ps_decoder_t *ps, cmd_ln_t *config); + +/** + * Returns the argument definitions used in ps_init(). + * + * This is here to avoid exporting global data, which is problematic + * on Win32 and Symbian (and possibly other platforms). + */ +POCKETSPHINX_EXPORT +arg_t const *ps_args(void); + +/** + * Retain a pointer to the decoder. + * + * This increments the reference count on the decoder, allowing it to + * be shared between multiple parent objects. In general you will not + * need to use this function, ever. It is mainly here for the + * convenience of scripting language bindings. + * + * @return pointer to retained decoder. + */ +POCKETSPHINX_EXPORT +ps_decoder_t *ps_retain(ps_decoder_t *ps); + +/** + * Finalize the decoder. + * + * This releases all resources associated with the decoder. + * + * @param ps Decoder to be freed. + * @return New reference count (0 if freed). + */ +POCKETSPHINX_EXPORT +int ps_free(ps_decoder_t *ps); + +/** + * Get the configuration object for this decoder. + * + * @return The configuration object for this decoder. The decoder + * owns this pointer, so you should not attempt to free it + * manually. Use cmd_ln_retain() if you wish to reuse it + * elsewhere. + */ +POCKETSPHINX_EXPORT +cmd_ln_t *ps_get_config(ps_decoder_t *ps); + +/** + * Get the log-math computation object for this decoder. + * + * @return The log-math object for this decoder. The decoder owns + * this pointer, so you should not attempt to free it + * manually. Use logmath_retain() if you wish to reuse it + * elsewhere. + */ +POCKETSPHINX_EXPORT +logmath_t *ps_get_logmath(ps_decoder_t *ps); + +/** + * Get the feature extraction object for this decoder. + * + * @return The feature extraction object for this decoder. The + * decoder owns this pointer, so you should not attempt to + * free it manually. Use fe_retain() if you wish to reuse it + * elsewhere. + */ +POCKETSPHINX_EXPORT +fe_t *ps_get_fe(ps_decoder_t *ps); + +/** + * Get the dynamic feature computation object for this decoder. + * + * @return The dynamic feature computation object for this decoder. + * The decoder owns this pointer, so you should not attempt to + * free it manually. Use feat_retain() if you wish to reuse + * it elsewhere. + */ +POCKETSPHINX_EXPORT +feat_t *ps_get_feat(ps_decoder_t *ps); + +/** + * Adapt current acoustic model using a linear transform. + * + * @param mllr The new transform to use, or NULL to update the + * existing transform. The decoder retains ownership of + * this pointer, so you may free it if you no longer need + * it. + * @return The updated transform object for this decoder, or + * NULL on failure. + */ +POCKETSPHINX_EXPORT +ps_mllr_t *ps_update_mllr(ps_decoder_t *ps, ps_mllr_t *mllr); + +/** + * Reload the pronunciation dictionary from a file. + * + * This function replaces the current pronunciation dictionary with + * the one stored in `dictfile`. This also causes the active search + * module(s) to be reinitialized, in the same manner as calling + * ps_add_word() with update=TRUE. + * + * @param dictfile Path to dictionary file to load. + * @param fdictfile Path to filler dictionary to load, or NULL to keep + * the existing filler dictionary. + * @param format Format of the dictionary file, or NULL to determine + * automatically (currently unused,should be NULL) + */ +POCKETSPHINX_EXPORT +int ps_load_dict(ps_decoder_t *ps, char const *dictfile, + char const *fdictfile, char const *format); + +/** + * Dump the current pronunciation dictionary to a file. + * + * This function dumps the current pronunciation dictionary to a text file. + * + * @param dictfile Path to file where dictionary will be written. + * @param format Format of the dictionary file, or NULL for the + * default (text) format (currently unused, should be NULL) + */ +POCKETSPHINX_EXPORT +int ps_save_dict(ps_decoder_t *ps, char const *dictfile, char const *format); + +/** + * Add a word to the pronunciation dictionary. + * + * This function adds a word to the pronunciation dictionary and the + * current language model (but, obviously, not to the current FSG if + * FSG mode is enabled). If the word is already present in one or the + * other, it does whatever is necessary to ensure that the word can be + * recognized. + * + * @param word Word string to add. + * @param phones Whitespace-separated list of phoneme strings + * describing pronunciation of word. + * @param update If TRUE, update the search module (whichever one is + * currently active) to recognize the newly added word. + * If adding multiple words, it is more efficient to + * pass FALSE here in all but the last word. + * @return The internal ID (>= 0) of the newly added word, or <0 on + * failure. + */ +POCKETSPHINX_EXPORT +int ps_add_word(ps_decoder_t *ps, + char const *word, + char const *phones, + int update); + +/** + * Look up a word in the dictionary and return phone transcription + * for it. + * + * @param ps Pocketsphinx decoder + * @param word Word to look for + * + * @return Whitespace-spearated phone string describing the pronunciation of the word + * or NULL if word is not present in the dictionary. The string is + * allocated and must be freed by the user. + */ +POCKETSPHINX_EXPORT +char *ps_lookup_word(ps_decoder_t *ps, + const char *word); + +/** + * Decode a raw audio stream. + * + * No headers are recognized in this files. The configuration + * parameters -samprate and -input_endian are used + * to determine the sampling rate and endianness of the stream, + * respectively. Audio is always assumed to be 16-bit signed PCM. + * + * @param ps Decoder. + * @param rawfh Previously opened file stream. + * @param maxsamps Maximum number of samples to read from rawfh, or -1 + * to read until end-of-file. + * @return Number of samples of audio. + */ +POCKETSPHINX_EXPORT +long ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, + long maxsamps); + +/** + * Decode a senone score dump file. + * + * @param ps Decoder + * @param senfh Previously opened file handle positioned at start of file. + * @return Number of frames read. + */ +POCKETSPHINX_EXPORT +int ps_decode_senscr(ps_decoder_t *ps, FILE *senfh); + +/** + * Start processing of the stream of speech. + * + * @deprecated This function is retained for compatibility, but its + * only effect is to reset the noise removal statistics, which are + * otherwise retained across utterances. You do not need to call it. + * + * @return 0 for success, <0 on error. + */ +POCKETSPHINX_EXPORT +int ps_start_stream(ps_decoder_t *ps); + +/** + * Checks if the last feed audio buffer contained speech. + * + * @deprecated This function is retained for compatibility but should + * not be considered a reliable voice activity detector. It will + * always return 1 between calls to ps_start_utt() and ps_end_utt(). + * + * @param ps Decoder. + * @return 1 if last buffer contained speech, 0 - otherwise + */ +POCKETSPHINX_EXPORT +int ps_get_in_speech(ps_decoder_t *ps); + + +/** + * Start utterance processing. + * + * This function should be called before any utterance data is passed + * to the decoder. It marks the start of a new utterance and + * reinitializes internal data structures. + * + * @param ps Decoder to be started. + * @return 0 for success, <0 on error. + */ +POCKETSPHINX_EXPORT +int ps_start_utt(ps_decoder_t *ps); + +/** + * Decode raw audio data. + * + * @param ps Decoder. + * @param no_search If non-zero, perform feature extraction but don't + * do any recognition yet. This may be necessary if + * your processor has trouble doing recognition in + * real-time. + * @param full_utt If non-zero, this block of data is a full utterance + * worth of data. This may allow the recognizer to + * produce more accurate results. + * @return Number of frames of data searched, or <0 for error. + */ +POCKETSPHINX_EXPORT +int ps_process_raw(ps_decoder_t *ps, + int16 const *data, + size_t n_samples, + int no_search, + int full_utt); + +/** + * Decode acoustic feature data. + * + * @param ps Decoder. + * @param data Acoustic feature data, as returned by... something :) + * @param no_search If non-zero, perform feature extraction but don't + * do any recognition yet. This may be necessary if + * your processor has trouble doing recognition in + * real-time. + * @param full_utt If non-zero, this block of data is a full utterance + * worth of data. This may allow the recognizer to + * produce more accurate results. + * @return Number of frames of data searched, or <0 for error. + */ +POCKETSPHINX_EXPORT +int ps_process_cep(ps_decoder_t *ps, + mfcc_t **data, + int n_frames, + int no_search, + int full_utt); + +/** + * Get the number of frames of data searched. + * + * Note that there is a delay between this and the number of frames of + * audio which have been input to the system. This is due to the fact + * that acoustic features are computed using a sliding window of + * audio, and dynamic features are computed over a sliding window of + * acoustic features. + * + * @param ps Decoder. + * @return Number of frames of speech data which have been recognized + * so far. + */ +POCKETSPHINX_EXPORT +int ps_get_n_frames(ps_decoder_t *ps); + +/** + * End utterance processing. + * + * @param ps Decoder. + * @return 0 for success, <0 on error + */ +POCKETSPHINX_EXPORT +int ps_end_utt(ps_decoder_t *ps); + +/** + * Get hypothesis string and path score. + * + * @param ps Decoder. + * @param out_best_score Output: path score corresponding to returned string. + * @return String containing best hypothesis at this point in + * decoding. NULL if no hypothesis is available. This string is owned + * by the decoder and only valid for the current hypothesis, so you + * should copy it if you need to hold onto it. + */ +POCKETSPHINX_EXPORT +char const *ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score); + +/** + * Get posterior probability. + * + * @note Unless the -bestpath option is enabled, this function will + * always return zero (corresponding to a posterior probability of + * 1.0). Even if -bestpath is enabled, it will also return zero when + * called on a partial result. Ongoing research into effective + * confidence annotation for partial hypotheses may result in these + * restrictions being lifted in future versions. + * + * @param ps Decoder. + * @return Posterior probability of the best hypothesis. + */ +POCKETSPHINX_EXPORT +int32 ps_get_prob(ps_decoder_t *ps); + +/** + * Get word lattice. + * + * There isn't much you can do with this so far, a public API will + * appear in the future. + * + * @param ps Decoder. + * @return Word lattice object containing all hypotheses so far. NULL + * if no hypotheses are available. This pointer is owned by + * the decoder and you should not attempt to free it manually. + * It is only valid until the next utterance, unless you use + * ps_lattice_retain() to retain it. + */ +POCKETSPHINX_EXPORT +ps_lattice_t *ps_get_lattice(ps_decoder_t *ps); + +/** + * Get an iterator over the word segmentation for the best hypothesis. + * + * @param ps Decoder. + * @return Iterator over the best hypothesis at this point in + * decoding. NULL if no hypothesis is available. + */ +POCKETSPHINX_EXPORT +ps_seg_t *ps_seg_iter(ps_decoder_t *ps); + +/** + * Get the next segment in a word segmentation. + * + * @param seg Segment iterator. + * @return Updated iterator with the next segment. NULL at end of + * utterance (the iterator will be freed in this case). + */ +POCKETSPHINX_EXPORT +ps_seg_t *ps_seg_next(ps_seg_t *seg); + +/** + * Get word string from a segmentation iterator. + * + * @param seg Segment iterator. + * @return Read-only string giving string name of this segment. This + * is only valid until the next call to ps_seg_next(). + */ +POCKETSPHINX_EXPORT +char const *ps_seg_word(ps_seg_t *seg); + +/** + * Get inclusive start and end frames from a segmentation iterator. + * + * @note These frame numbers are inclusive, i.e. the end frame refers + * to the last frame in which the given word or other segment was + * active. Therefore, the actual duration is *out_ef - *out_sf + 1. + * + * @param seg Segment iterator. + * @param out_sf Output: First frame index in segment. + * @param out_ef Output: Last frame index in segment. + */ +POCKETSPHINX_EXPORT +void ps_seg_frames(ps_seg_t *seg, int *out_sf, int *out_ef); + +/** + * Get language, acoustic, and posterior probabilities from a + * segmentation iterator. + * + * @note Unless the -bestpath option is enabled, this function will + * always return zero (corresponding to a posterior probability of + * 1.0). Even if -bestpath is enabled, it will also return zero when + * called on a partial result. Ongoing research into effective + * confidence annotation for partial hypotheses may result in these + * restrictions being lifted in future versions. + * + * @param out_ascr Output: acoustic model score for this segment. + * @param out_lscr Output: language model score for this segment. + * @param out_lback Output: language model backoff mode for this + * segment (i.e. the number of words used in + * calculating lscr). This field is, of course, only + * meaningful for N-Gram models. + * @return Log posterior probability of current segment. Log is + * expressed in the log-base used in the decoder. To convert + * to linear floating-point, use logmath_exp(ps_get_logmath(), + * pprob). + */ +POCKETSPHINX_EXPORT +int32 ps_seg_prob(ps_seg_t *seg, int32 *out_ascr, int32 *out_lscr, int32 *out_lback); + +/** + * Finish iterating over a word segmentation early, freeing resources. + */ +POCKETSPHINX_EXPORT +void ps_seg_free(ps_seg_t *seg); + +/** + * Get an iterator over the best hypotheses. The function may also + * return a NULL which means that there is no hypothesis available for this + * utterance. + * + * @param ps Decoder. + * @return Iterator over N-best hypotheses or NULL if no hypothesis is available + */ +POCKETSPHINX_EXPORT +ps_nbest_t *ps_nbest(ps_decoder_t *ps); + +/** + * Move an N-best list iterator forward. + * + * @param nbest N-best iterator. + * @return Updated N-best iterator, or NULL if no more hypotheses are + * available (iterator is freed ni this case). + */ +POCKETSPHINX_EXPORT +ps_nbest_t *ps_nbest_next(ps_nbest_t *nbest); + +/** + * Get the hypothesis string from an N-best list iterator. + * + * @param nbest N-best iterator. + * @param out_score Output: Path score for this hypothesis. + * @return String containing next best hypothesis. Note that this + * pointer is only valid for the current iteration. + */ +POCKETSPHINX_EXPORT +char const *ps_nbest_hyp(ps_nbest_t *nbest, int32 *out_score); + +/** + * Get the word segmentation from an N-best list iterator. + * + * @param nbest N-best iterator. + * @return Iterator over the next best hypothesis. + */ +POCKETSPHINX_EXPORT +ps_seg_t *ps_nbest_seg(ps_nbest_t *nbest); + +/** + * Finish N-best search early, releasing resources. + * + * @param nbest N-best iterator. + */ +POCKETSPHINX_EXPORT +void ps_nbest_free(ps_nbest_t *nbest); + +/** + * Get performance information for the current utterance. + * + * @param ps Decoder. + * @param out_nspeech Output: Number of seconds of speech. + * @param out_ncpu Output: Number of seconds of CPU time used. + * @param out_nwall Output: Number of seconds of wall time used. + */ +POCKETSPHINX_EXPORT +void ps_get_utt_time(ps_decoder_t *ps, double *out_nspeech, + double *out_ncpu, double *out_nwall); + +/** + * Get overall performance information. + * + * @param ps Decoder. + * @param out_nspeech Output: Number of seconds of speech. + * @param out_ncpu Output: Number of seconds of CPU time used. + * @param out_nwall Output: Number of seconds of wall time used. + */ +POCKETSPHINX_EXPORT +void ps_get_all_time(ps_decoder_t *ps, double *out_nspeech, + double *out_ncpu, double *out_nwall); + +/** + * @mainpage PocketSphinx Documentation + * @author David Huggins-Daines + * @version 5.0.0 + * @date July, 2022 + * + * @section intro_sec Introduction + * + * This is the documentation for the PocketSphinx speech recognition + * engine. The main API calls are documented in . + * + * @section install_sec Installation + * + * To install from source, you will need a C compiler and a recent + * version of CMake. If you wish to use an integrated development + * environment, Visual Studio Code will automate most of this process + * for you once you have installed C++ and CMake support as described + * at https://code.visualstudio.com/docs/languages/cpp + * + * @subsection python_install Python module install + * + * The easiest way to program PocketSphinx is with the Python module. + * This can be installed in a + * [VirtualEnv](https://docs.python.org/3/library/venv.html) or + * [Conda](https://docs.conda.io/projects/conda/en/latest/user-guide/concepts/environments.html) + * environment without affecting the rest of your system. For + * example, from the *top-level source directory*: + * + * python3 -m venv ~/ve_pocketsphinx + * . ~/ve_pocketsphinx/bin/activate + * pip install . + * + * There is no need to create a separate build directory as `pip` will + * do this for you. + * + * @subsection unix_install Unix-like systems + * + * From the Unix command line, you will create a separate directory in + * which to build the source code, then run `cmake` with the top-level + * source directory as argument to generate the build files: + * + * mkdir build + * cmake .. + * + * Now you can compile and run the tests, and install the code: + * + * make all test + * make install + * + * By default CMake will try to install things in `/usr/local`, which + * you might not have access to. If you want to install somewhere + * else you need to set `CMAKE_INSTALL_PREFIX` *when running cmake*: + * + * cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/.local + * + * In this case you may also need to set the `LD_LIBRARY_PATH` + * environment variable so that the PocketSphinx library can be found: + * + * export LD_LIBRARY_PATH=$HOME/local/lib + * + * @subsection windows_install Windows + * + * On Windows, the process is similar, but you will need to tell CMake + * what build tool you are using with the `-g` option, and there are + * many of them. The build is known to work with `nmake` but it is + * easiest just to use Visual Studio Code. Once built, you will find + * the DLL and EXE files in `build\Debug` or `build\Release` depending + * on your build type. If the EXE files do not run, you need to + * ensure that `pocketsphinx.dll` is located in the same directory as + * them. + * + * @section faq_sec Frequently Asked Questions + * + * @subsection faq_faq Why are there no frequently asked questions? + * + * I'm glad you asked! There will be some soon. + * + * @section thanks_sec Acknowledgements + * + * PocketSphinx is largely based on the previous Sphinx-II and + * Sphinx-III systems, developed by a large number of contributors at + * Carnegie Mellon University. For some time afterwards, it was + * maintained by Nickolay Shmyrev and others at Alpha Cephei, Inc. + * See the `AUTHORS` file for a list of contributors. + */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __POCKETSPHINX_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h new file mode 100644 index 0000000..1237d1f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h @@ -0,0 +1,388 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* cmdln_macro.h - Command line definitions for PocketSphinx */ + +#ifndef __PS_CMDLN_MACRO_H__ +#define __PS_CMDLN_MACRO_H__ + +#include +#include +#include + +/** Minimal set of command-line options for PocketSphinx. */ +#define POCKETSPHINX_OPTIONS \ + waveform_to_cepstral_command_line_macro(), \ + cepstral_to_feature_command_line_macro(), \ + POCKETSPHINX_ACMOD_OPTIONS, \ + POCKETSPHINX_BEAM_OPTIONS, \ + POCKETSPHINX_SEARCH_OPTIONS, \ + POCKETSPHINX_DICT_OPTIONS, \ + POCKETSPHINX_NGRAM_OPTIONS, \ + POCKETSPHINX_FSG_OPTIONS, \ + POCKETSPHINX_KWS_OPTIONS, \ + POCKETSPHINX_DEBUG_OPTIONS + +/** Options for debugging and logging. */ +#define POCKETSPHINX_DEBUG_OPTIONS \ + { "-logfn", \ + ARG_STRING, \ + NULL, \ + "File to write log messages in" }, \ + { "-loglevel", \ + ARG_STRING, \ + "WARN", \ + "Minimum level of log messages (DEBUG, INFO, WARN, ERROR)" },\ + { "-mfclogdir", \ + ARG_STRING, \ + NULL, \ + "Directory to log feature files to" \ + }, \ + { "-rawlogdir", \ + ARG_STRING, \ + NULL, \ + "Directory to log raw audio files to" }, \ + { "-senlogdir", \ + ARG_STRING, \ + NULL, \ + "Directory to log senone score files to" \ + } + +/** Options defining beam width parameters for tuning the search. */ +#define POCKETSPHINX_BEAM_OPTIONS \ +{ "-beam", \ + ARG_FLOATING, \ + "1e-48", \ + "Beam width applied to every frame in Viterbi search (smaller values mean wider beam)" }, \ +{ "-wbeam", \ + ARG_FLOATING, \ + "7e-29", \ + "Beam width applied to word exits" }, \ +{ "-pbeam", \ + ARG_FLOATING, \ + "1e-48", \ + "Beam width applied to phone transitions" }, \ +{ "-lpbeam", \ + ARG_FLOATING, \ + "1e-40", \ + "Beam width applied to last phone in words" }, \ +{ "-lponlybeam", \ + ARG_FLOATING, \ + "7e-29", \ + "Beam width applied to last phone in single-phone words" }, \ +{ "-fwdflatbeam", \ + ARG_FLOATING, \ + "1e-64", \ + "Beam width applied to every frame in second-pass flat search" }, \ +{ "-fwdflatwbeam", \ + ARG_FLOATING, \ + "7e-29", \ + "Beam width applied to word exits in second-pass flat search" }, \ +{ "-pl_window", \ + ARG_INTEGER, \ + "5", \ + "Phoneme lookahead window size, in frames" }, \ +{ "-pl_beam", \ + ARG_FLOATING, \ + "1e-10", \ + "Beam width applied to phone loop search for lookahead" }, \ +{ "-pl_pbeam", \ + ARG_FLOATING, \ + "1e-10", \ + "Beam width applied to phone loop transitions for lookahead" }, \ +{ "-pl_pip", \ + ARG_FLOATING, \ + "1.0", \ + "Phone insertion penalty for phone loop" }, \ +{ "-pl_weight", \ + ARG_FLOATING, \ + "3.0", \ + "Weight for phoneme lookahead penalties" } \ + +/** Options defining other parameters for tuning the search. */ +#define POCKETSPHINX_SEARCH_OPTIONS \ +{ "-compallsen", \ + ARG_BOOLEAN, \ + "no", \ + "Compute all senone scores in every frame (can be faster when there are many senones)" }, \ +{ "-fwdtree", \ + ARG_BOOLEAN, \ + "yes", \ + "Run forward lexicon-tree search (1st pass)" }, \ +{ "-fwdflat", \ + ARG_BOOLEAN, \ + "yes", \ + "Run forward flat-lexicon search over word lattice (2nd pass)" }, \ +{ "-bestpath", \ + ARG_BOOLEAN, \ + "yes", \ + "Run bestpath (Dijkstra) search over word lattice (3rd pass)" }, \ +{ "-backtrace", \ + ARG_BOOLEAN, \ + "no", \ + "Print results and backtraces to log." }, \ +{ "-latsize", \ + ARG_INTEGER, \ + "5000", \ + "Initial backpointer table size" }, \ +{ "-maxwpf", \ + ARG_INTEGER, \ + "-1", \ + "Maximum number of distinct word exits at each frame (or -1 for no pruning)" }, \ +{ "-maxhmmpf", \ + ARG_INTEGER, \ + "30000", \ + "Maximum number of active HMMs to maintain at each frame (or -1 for no pruning)" }, \ +{ "-min_endfr", \ + ARG_INTEGER, \ + "0", \ + "Nodes ignored in lattice construction if they persist for fewer than N frames" }, \ +{ "-fwdflatefwid", \ + ARG_INTEGER, \ + "4", \ + "Minimum number of end frames for a word to be searched in fwdflat search" }, \ +{ "-fwdflatsfwin", \ + ARG_INTEGER, \ + "25", \ + "Window of frames in lattice to search for successor words in fwdflat search " } + +/** Command-line options for keyphrase spotting */ +#define POCKETSPHINX_KWS_OPTIONS \ +{ "-keyphrase", \ + ARG_STRING, \ + NULL, \ + "Keyphrase to spot"}, \ +{ "-kws", \ + ARG_STRING, \ + NULL, \ + "A file with keyphrases to spot, one per line"}, \ +{ "-kws_plp", \ + ARG_FLOATING, \ + "1e-1", \ + "Phone loop probability for keyphrase spotting" }, \ +{ "-kws_delay", \ + ARG_INTEGER, \ + "10", \ + "Delay to wait for best detection score" }, \ +{ "-kws_threshold", \ + ARG_FLOATING, \ + "1e-30", \ + "Threshold for p(hyp)/p(alternatives) ratio" } + +/** Command-line options for finite state grammars. */ +#define POCKETSPHINX_FSG_OPTIONS \ + { "-fsg", \ + ARG_STRING, \ + NULL, \ + "Sphinx format finite state grammar file"}, \ +{ "-jsgf", \ + ARG_STRING, \ + NULL, \ + "JSGF grammar file" }, \ +{ "-toprule", \ + ARG_STRING, \ + NULL, \ + "Start rule for JSGF (first public rule is default)" }, \ +{ "-fsgusealtpron", \ + ARG_BOOLEAN, \ + "yes", \ + "Add alternate pronunciations to FSG"}, \ +{ "-fsgusefiller", \ + ARG_BOOLEAN, \ + "yes", \ + "Insert filler words at each state."} + +/** Command-line options for statistical language models. */ +#define POCKETSPHINX_NGRAM_OPTIONS \ +{ "-allphone", \ + ARG_STRING, \ + NULL, \ + "Perform phoneme decoding with phonetic lm (given here)" }, \ +{ "-allphone_ci", \ + ARG_BOOLEAN, \ + "yes", \ + "Perform phoneme decoding with phonetic lm and context-independent units only" }, \ +{ "-lm", \ + ARG_STRING, \ + NULL, \ + "Word trigram language model input file" }, \ +{ "-lmctl", \ + ARG_STRING, \ + NULL, \ + "Specify a set of language model"}, \ +{ "-lmname", \ + ARG_STRING, \ + NULL, \ + "Which language model in -lmctl to use by default"}, \ +{ "-lw", \ + ARG_FLOATING, \ + "6.5", \ + "Language model probability weight" }, \ +{ "-fwdflatlw", \ + ARG_FLOATING, \ + "8.5", \ + "Language model probability weight for flat lexicon (2nd pass) decoding" }, \ +{ "-bestpathlw", \ + ARG_FLOATING, \ + "9.5", \ + "Language model probability weight for bestpath search" }, \ +{ "-ascale", \ + ARG_FLOATING, \ + "20.0", \ + "Inverse of acoustic model scale for confidence score calculation" }, \ +{ "-wip", \ + ARG_FLOATING, \ + "0.65", \ + "Word insertion penalty" }, \ +{ "-nwpen", \ + ARG_FLOATING, \ + "1.0", \ + "New word transition penalty" }, \ +{ "-pip", \ + ARG_FLOATING, \ + "1.0", \ + "Phone insertion penalty" }, \ +{ "-uw", \ + ARG_FLOATING, \ + "1.0", \ + "Unigram weight" }, \ +{ "-silprob", \ + ARG_FLOATING, \ + "0.005", \ + "Silence word transition probability" }, \ +{ "-fillprob", \ + ARG_FLOATING, \ + "1e-8", \ + "Filler word transition probability" } \ + +/** Command-line options for dictionaries. */ +#define POCKETSPHINX_DICT_OPTIONS \ + { "-dict", \ + ARG_STRING, \ + NULL, \ + "Main pronunciation dictionary (lexicon) input file" }, \ + { "-fdict", \ + ARG_STRING, \ + NULL, \ + "Noise word pronunciation dictionary input file" }, \ + { "-dictcase", \ + ARG_BOOLEAN, \ + "no", \ + "Dictionary is case sensitive (NOTE: case insensitivity applies to ASCII characters only)" } \ + +/** Command-line options for acoustic modeling */ +#define POCKETSPHINX_ACMOD_OPTIONS \ +{ "-hmm", \ + REQARG_STRING, \ + NULL, \ + "Directory containing acoustic model files."}, \ +{ "-featparams", \ + ARG_STRING, \ + NULL, \ + "File containing feature extraction parameters."}, \ +{ "-mdef", \ + ARG_STRING, \ + NULL, \ + "Model definition input file" }, \ +{ "-senmgau", \ + ARG_STRING, \ + NULL, \ + "Senone to codebook mapping input file (usually not needed)" }, \ +{ "-tmat", \ + ARG_STRING, \ + NULL, \ + "HMM state transition matrix input file" }, \ +{ "-tmatfloor", \ + ARG_FLOATING, \ + "0.0001", \ + "HMM state transition probability floor (applied to -tmat file)" }, \ +{ "-mean", \ + ARG_STRING, \ + NULL, \ + "Mixture gaussian means input file" }, \ +{ "-var", \ + ARG_STRING, \ + NULL, \ + "Mixture gaussian variances input file" }, \ +{ "-varfloor", \ + ARG_FLOATING, \ + "0.0001", \ + "Mixture gaussian variance floor (applied to data from -var file)" }, \ +{ "-mixw", \ + ARG_STRING, \ + NULL, \ + "Senone mixture weights input file (uncompressed)" }, \ +{ "-mixwfloor", \ + ARG_FLOATING, \ + "0.0000001", \ + "Senone mixture weights floor (applied to data from -mixw file)" }, \ +{ "-aw", \ + ARG_INTEGER, \ + "1", \ + "Inverse weight applied to acoustic scores." }, \ +{ "-sendump", \ + ARG_STRING, \ + NULL, \ + "Senone dump (compressed mixture weights) input file" }, \ +{ "-mllr", \ + ARG_STRING, \ + NULL, \ + "MLLR transformation to apply to means and variances" }, \ +{ "-mmap", \ + ARG_BOOLEAN, \ + "yes", \ + "Use memory-mapped I/O (if possible) for model files" }, \ +{ "-ds", \ + ARG_INTEGER, \ + "1", \ + "Frame GMM computation downsampling ratio" }, \ +{ "-topn", \ + ARG_INTEGER, \ + "4", \ + "Maximum number of top Gaussians to use in scoring." }, \ +{ "-topn_beam", \ + ARG_STRING, \ + "0", \ + "Beam width used to determine top-N Gaussians (or a list, per-feature)" },\ +{ "-logbase", \ + ARG_FLOATING, \ + "1.0001", \ + "Base in which all log-likelihoods calculated" } + +#define CMDLN_EMPTY_OPTION { NULL, 0, NULL, NULL } + +#endif /* __PS_CMDLN_MACRO_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h new file mode 100644 index 0000000..4d8fa0f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h @@ -0,0 +1,15 @@ +#ifndef __POCKETSPHINX_EXPORT_H__ +#define __POCKETSPHINX_EXPORT_H__ + +/* Win32 DLL gunk */ +#if defined(_WIN32) && defined(SPHINX_DLL) +#if defined(POCKETSPHINX_EXPORTS) /* DLL itself */ +#define POCKETSPHINX_EXPORT __declspec(dllexport) +#else +#define POCKETSPHINX_EXPORT __declspec(dllimport) +#endif +#else /* No DLL things*/ +#define POCKETSPHINX_EXPORT +#endif + +#endif /* __POCKETSPHINX_EXPORT_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h new file mode 100644 index 0000000..39eaf9c --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h @@ -0,0 +1,456 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ps_lattice.h Word graph search + */ + +#ifndef __PS_LATTICE_H__ +#define __PS_LATTICE_H__ + +/* SphinxBase headers. */ +#include +#include + +/* PocketSphinx headers. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Word graph structure used in bestpath/nbest search. + */ +typedef struct ps_lattice_s ps_lattice_t; + +/** + * DAG nodes. + * + * A node corresponds to a number of hypothesized instances of a word + * which all share the same starting point. + */ +typedef struct ps_latnode_s ps_latnode_t; + +/** + * Iterator over DAG nodes. + */ +typedef struct ps_latnode_s ps_latnode_iter_t; /* pay no attention to the man behind the curtain */ + +/** + * Links between DAG nodes. + * + * A link corresponds to a single hypothesized instance of a word with + * a given start and end point. + */ +typedef struct ps_latlink_s ps_latlink_t; + +/** + * Iterator over DAG links. + */ +typedef struct latlink_list_s ps_latlink_iter_t; + +/* Forward declaration needed to avoid circular includes */ +struct ps_decoder_s; + +/** + * Read a lattice from a file on disk. + * + * @param ps Decoder to use for processing this lattice, or NULL. + * @param file Path to lattice file. + * @return Newly created lattice, or NULL for failure. + */ +POCKETSPHINX_EXPORT +ps_lattice_t *ps_lattice_read(struct ps_decoder_s *ps, + char const *file); + +/** + * Retain a lattice. + * + * This function retains ownership of a lattice for the caller, + * preventing it from being freed automatically. You must call + * ps_lattice_free() to free it after having called this function. + * + * @return pointer to the retained lattice. + */ +POCKETSPHINX_EXPORT +ps_lattice_t *ps_lattice_retain(ps_lattice_t *dag); + +/** + * Free a lattice. + * + * @return new reference count (0 if dag was freed) + */ +POCKETSPHINX_EXPORT +int ps_lattice_free(ps_lattice_t *dag); + +/** + * Write a lattice to disk. + * + * @return 0 for success, <0 on failure. + */ +POCKETSPHINX_EXPORT +int ps_lattice_write(ps_lattice_t *dag, char const *filename); + +/** + * Write a lattice to disk in HTK format + * + * @return 0 for success, <0 on failure. + */ +POCKETSPHINX_EXPORT +int ps_lattice_write_htk(ps_lattice_t *dag, char const *filename); + +/** + * Get the log-math computation object for this lattice + * + * @return The log-math object for this lattice. The lattice retains + * ownership of this pointer, so you should not attempt to + * free it manually. Use logmath_retain() if you wish to + * reuse it elsewhere. + */ +POCKETSPHINX_EXPORT +logmath_t *ps_lattice_get_logmath(ps_lattice_t *dag); + + +/** + * Start iterating over nodes in the lattice. + * + * @note No particular order of traversal is guaranteed, and you + * should not depend on this. + * + * @param dag Lattice to iterate over. + * @return Iterator over lattice nodes. + */ +POCKETSPHINX_EXPORT +ps_latnode_iter_t *ps_latnode_iter(ps_lattice_t *dag); + +/** + * Move to next node in iteration. + * @param itor Node iterator. + * @return Updated node iterator, or NULL if finished + */ +POCKETSPHINX_EXPORT +ps_latnode_iter_t *ps_latnode_iter_next(ps_latnode_iter_t *itor); + +/** + * Stop iterating over nodes. + * @param itor Node iterator. + */ +POCKETSPHINX_EXPORT +void ps_latnode_iter_free(ps_latnode_iter_t *itor); + +/** + * Get node from iterator. + */ +POCKETSPHINX_EXPORT +ps_latnode_t *ps_latnode_iter_node(ps_latnode_iter_t *itor); + +/** + * Get start and end time range for a node. + * + * @param node Node inquired about. + * @param out_fef Output: End frame of first exit from this node. + * @param out_lef Output: End frame of last exit from this node. + * @return Start frame for all edges exiting this node. + */ +POCKETSPHINX_EXPORT +int ps_latnode_times(ps_latnode_t *node, int16 *out_fef, int16 *out_lef); + +/** + * Get word string for this node. + * + * @param dag Lattice to which node belongs. + * @param node Node inquired about. + * @return Word string for this node (possibly a pronunciation variant). + */ +POCKETSPHINX_EXPORT +char const *ps_latnode_word(ps_lattice_t *dag, ps_latnode_t *node); + +/** + * Get base word string for this node. + * + * @param dag Lattice to which node belongs. + * @param node Node inquired about. + * @return Base word string for this node. + */ +POCKETSPHINX_EXPORT +char const *ps_latnode_baseword(ps_lattice_t *dag, ps_latnode_t *node); + +/** + * Iterate over exits from this node. + * + * @param node Node inquired about. + * @return Iterator over exit links from this node. + */ +POCKETSPHINX_EXPORT +ps_latlink_iter_t *ps_latnode_exits(ps_latnode_t *node); + +/** + * Iterate over entries to this node. + * + * @param node Node inquired about. + * @return Iterator over entry links to this node. + */ +POCKETSPHINX_EXPORT +ps_latlink_iter_t *ps_latnode_entries(ps_latnode_t *node); + +/** + * Get best posterior probability and associated acoustic score from a lattice node. + * + * @param dag Lattice to which node belongs. + * @param node Node inquired about. + * @param out_link Output: exit link with highest posterior probability + * @return Posterior probability of the best link exiting this node. + * Log is expressed in the log-base used in the decoder. To + * convert to linear floating-point, use + * logmath_exp(ps_lattice_get_logmath(), pprob). + */ +POCKETSPHINX_EXPORT +int32 ps_latnode_prob(ps_lattice_t *dag, ps_latnode_t *node, + ps_latlink_t **out_link); + +/** + * Get next link from a lattice link iterator. + * + * @param itor Iterator. + * @return Updated iterator, or NULL if finished. + */ +POCKETSPHINX_EXPORT +ps_latlink_iter_t *ps_latlink_iter_next(ps_latlink_iter_t *itor); + +/** + * Stop iterating over links. + * @param itor Link iterator. + */ +POCKETSPHINX_EXPORT +void ps_latlink_iter_free(ps_latlink_iter_t *itor); + +/** + * Get link from iterator. + */ +POCKETSPHINX_EXPORT +ps_latlink_t *ps_latlink_iter_link(ps_latlink_iter_t *itor); + +/** + * Get start and end times from a lattice link. + * + * @note these are inclusive - i.e. the last frame of + * this word is ef, not ef-1. + * + * @param link Link inquired about. + * @param out_sf Output: (optional) start frame of this link. + * @return End frame of this link. + */ +POCKETSPHINX_EXPORT +int ps_latlink_times(ps_latlink_t *link, int16 *out_sf); + +/** + * Get destination and source nodes from a lattice link + * + * @param link Link inquired about + * @param out_src Output: (optional) source node. + * @return destination node + */ +POCKETSPHINX_EXPORT +ps_latnode_t *ps_latlink_nodes(ps_latlink_t *link, ps_latnode_t **out_src); + +/** + * Get word string from a lattice link. + * + * @param dag Lattice to which node belongs. + * @param link Link inquired about + * @return Word string for this link (possibly a pronunciation variant). + */ +POCKETSPHINX_EXPORT +char const *ps_latlink_word(ps_lattice_t *dag, ps_latlink_t *link); + +/** + * Get base word string from a lattice link. + * + * @param dag Lattice to which node belongs. + * @param link Link inquired about + * @return Base word string for this link + */ +POCKETSPHINX_EXPORT +char const *ps_latlink_baseword(ps_lattice_t *dag, ps_latlink_t *link); + +/** + * Get predecessor link in best path. + * + * @param link Link inquired about + * @return Best previous link from bestpath search, if any. Otherwise NULL + */ +POCKETSPHINX_EXPORT +ps_latlink_t *ps_latlink_pred(ps_latlink_t *link); + +/** + * Get acoustic score and posterior probability from a lattice link. + * + * @param dag Lattice to which node belongs. + * @param link Link inquired about + * @param out_ascr Output: (optional) acoustic score. + * @return Posterior probability for this link. Log is expressed in + * the log-base used in the decoder. To convert to linear + * floating-point, use logmath_exp(ps_lattice_get_logmath(), pprob). + */ +POCKETSPHINX_EXPORT +int32 ps_latlink_prob(ps_lattice_t *dag, ps_latlink_t *link, int32 *out_ascr); + +/** + * Create a directed link between "from" and "to" nodes, but if a link already exists, + * choose one with the best link_scr. + */ +POCKETSPHINX_EXPORT +void ps_lattice_link(ps_lattice_t *dag, ps_latnode_t *from, ps_latnode_t *to, + int32 score, int32 ef); + +/** + * Start a forward traversal of edges in a word graph. + * + * @note A keen eye will notice an inconsistency in this API versus + * other types of iterators in PocketSphinx. The reason for this is + * that the traversal algorithm is much more efficient when it is able + * to modify the lattice structure. Therefore, to avoid giving the + * impression that multiple traversals are possible at once, no + * separate iterator structure is provided. + * + * @param dag Lattice to be traversed. + * @param start Start node (source) of traversal. + * @param end End node (goal) of traversal. + * @return First link in traversal. + */ +POCKETSPHINX_EXPORT +ps_latlink_t *ps_lattice_traverse_edges(ps_lattice_t *dag, ps_latnode_t *start, ps_latnode_t *end); + +/** + * Get the next link in forward traversal. + * + * @param dag Lattice to be traversed. + * @param end End node (goal) of traversal. + * @return Next link in traversal. + */ +POCKETSPHINX_EXPORT +ps_latlink_t *ps_lattice_traverse_next(ps_lattice_t *dag, ps_latnode_t *end); + +/** + * Start a reverse traversal of edges in a word graph. + * + * @note See ps_lattice_traverse_edges() for why this API is the way it is. + * + * @param dag Lattice to be traversed. + * @param start Start node (goal) of traversal. + * @param end End node (source) of traversal. + * @return First link in traversal. + */ +POCKETSPHINX_EXPORT +ps_latlink_t *ps_lattice_reverse_edges(ps_lattice_t *dag, ps_latnode_t *start, ps_latnode_t *end); + +/** + * Get the next link in reverse traversal. + * + * @param dag Lattice to be traversed. + * @param start Start node (goal) of traversal. + * @return Next link in traversal. + */ +POCKETSPHINX_EXPORT +ps_latlink_t *ps_lattice_reverse_next(ps_lattice_t *dag, ps_latnode_t *start); + +/** + * Do N-Gram based best-path search on a word graph. + * + * This function calculates both the best path as well as the forward + * probability used in confidence estimation. + * + * @return Final link in best path, NULL on error. + */ +POCKETSPHINX_EXPORT +ps_latlink_t *ps_lattice_bestpath(ps_lattice_t *dag, ngram_model_t *lmset, + float32 lwf, float32 ascale); + +/** + * Calculate link posterior probabilities on a word graph. + * + * This function assumes that bestpath search has already been done. + * + * @return Posterior probability of the utterance as a whole. + */ +POCKETSPHINX_EXPORT +int32 ps_lattice_posterior(ps_lattice_t *dag, ngram_model_t *lmset, + float32 ascale); + +/** + * Prune all links (and associated nodes) below a certain posterior probability. + * + * This function assumes that ps_lattice_posterior() has already been called. + * + * @param beam Minimum posterior probability for links. This is + * expressed in the log-base used in the decoder. To convert + * from linear floating-point, use + * logmath_log(ps_lattice_get_logmath(), prob). + * @return number of arcs removed. + */ +POCKETSPHINX_EXPORT +int32 ps_lattice_posterior_prune(ps_lattice_t *dag, int32 beam); + +#ifdef NOT_IMPLEMENTED_YET +/** + * Expand lattice using an N-gram language model. + * + * This function expands the lattice such that each node represents a + * unique N-gram history, and adds language model scores to the links. + */ +POCKETSPHINX_EXPORT +int32 ps_lattice_ngram_expand(ps_lattice_t *dag, ngram_model_t *lm); +#endif + +/** + * Get the number of frames in the lattice. + * + * @param dag The lattice in question. + * @return Number of frames in this lattice. + */ +POCKETSPHINX_EXPORT +int ps_lattice_n_frames(ps_lattice_t *dag); + +#ifdef __cplusplus +} +#endif + +#endif /* __PS_LATTICE_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h new file mode 100644 index 0000000..81d5a46 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h @@ -0,0 +1,86 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ps_mllr.h Model-space linear transforms for speaker adaptation + */ + +#ifndef __PS_MLLR_H__ +#define __PS_MLLR_H__ + +/* SphinxBase headers. */ +#include +#include + +/* PocketSphinx headers. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Feature space linear transform object. + */ +typedef struct ps_mllr_s ps_mllr_t; + +/** + * Read a speaker-adaptive linear transform from a file. + */ +POCKETSPHINX_EXPORT +ps_mllr_t *ps_mllr_read(char const *file); + +/** + * Retain a pointer to a linear transform. + */ +POCKETSPHINX_EXPORT +ps_mllr_t *ps_mllr_retain(ps_mllr_t *mllr); + +/** + * Release a pointer to a linear transform. + */ +POCKETSPHINX_EXPORT +int ps_mllr_free(ps_mllr_t *mllr); + +#ifdef __cplusplus +} +#endif + +#endif /* __PS_MLLR_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h new file mode 100644 index 0000000..23109a6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h @@ -0,0 +1,319 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2014 Alpha Cephei Inc.. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY ALPHA CEPHEI INC. ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ps_search.h User can configure several "search" objects with + * different grammars and language models and switch them in runtime to + * provide interactive experience for the user. + * + * There are different possible search modes: + * + *
    + *
  • keyphrase - efficiently looks for keyphrase and ignores other speech. allows to configure detection threshold.
  • + *
  • grammar - recognizes speech according to JSGF grammar. Unlike keyphrase grammar search doesn't ignore words which are not in grammar but tries to recognize them.
  • + *
  • ngram/lm - recognizes natural speech with a language model.
  • + *
  • allphone - recognizes phonemes with a phonetic language model.
  • + *
  • align - creates time alignments for a fixed word sequence.
  • + *
+ * + * Each search has a name and can be referenced by a name, names are + * application-specific. The function ps_set_search allows to activate + * the search previously added by a name. Only single search can be + * activated at time. + * + * To add the search one needs to point to the grammar/language model + * describing the search. The location of the grammar is specific to the + * application. + * + * The exact design of a searches depends on your application. For + * example, you might want to listen for activation keyphrase first and once + * keyphrase is recognized switch to ngram search to recognize actual + * command. Once you recognized the command you can switch to grammar + * search to recognize the confirmation and then switch back to keyphrase listening + * mode to wait for another command. + * + * If only a simple recognition is required it is sufficient to add a single search or + * just configure the required mode with configuration options. + */ + +#ifndef __PS_SEARCH_H__ +#define __PS_SEARCH_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * PocketSphinx search iterator. + */ +typedef struct ps_search_iter_s ps_search_iter_t; + + +/** + * Actives search with the provided name. + * + * Activates search with the provided name. The search must be added before + * using either ps_set_fsg(), ps_set_lm() or ps_set_kws(). + * + * @return 0 on success, -1 on failure + */ +POCKETSPHINX_EXPORT +int ps_set_search(ps_decoder_t *ps, const char *name); + +/** + * Returns name of current search in decoder + * + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +const char* ps_get_search(ps_decoder_t *ps); + +/** + * Unsets the search and releases related resources. + * + * Unsets the search previously added with + * using either ps_set_fsg(), ps_set_lm() or ps_set_kws(). + * + * @see ps_set_fsg + * @see ps_set_lm + * @see ps_set_kws + */ +POCKETSPHINX_EXPORT +int ps_unset_search(ps_decoder_t *ps, const char *name); + +/** + * Returns iterator over current searches + * + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +ps_search_iter_t *ps_search_iter(ps_decoder_t *ps); + +/** + * Updates search iterator to point to the next position. + * + * This function automatically frees the iterator object upon reaching + * the final entry. + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +ps_search_iter_t *ps_search_iter_next(ps_search_iter_t *itor); + +/** + * Retrieves the name of the search the iterator points to. + * + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +const char* ps_search_iter_val(ps_search_iter_t *itor); + +/** + * Delete an unfinished search iterator + * + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +void ps_search_iter_free(ps_search_iter_t *itor); + +/** + * Updates search iterator to point to the next position. + * + * This function automatically frees the iterator object upon reaching + * the final entry. + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +const char* ps_search_iter_val(ps_search_iter_t *itor); + + +/** + * Get the language model set object for this decoder. + * + * If N-Gram decoding is not enabled, this will return NULL. You will + * need to enable it using ps_set_lmset(). + * + * @return The language model set object for this decoder. The + * decoder retains ownership of this pointer, so you should + * not attempt to free it manually. Use ngram_model_retain() + * if you wish to reuse it elsewhere. + */ +POCKETSPHINX_EXPORT +ngram_model_t *ps_get_lm(ps_decoder_t *ps, const char *name); + +/** + * Adds new search based on N-gram language model. + * + * Associates N-gram search with the provided name. The search can be activated + * using ps_set_search(). + * + * @see ps_set_search. + */ +POCKETSPHINX_EXPORT +int ps_set_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm); + +/** + * Adds new search based on N-gram language model. + * + * Convenient method to load N-gram model and create a search. + * + * @see ps_set_lm + */ +POCKETSPHINX_EXPORT +int ps_set_lm_file(ps_decoder_t *ps, const char *name, const char *path); + +/** + * Get the finite-state grammar set object for this decoder. + * + * If FSG decoding is not enabled, this returns NULL. Call + * ps_set_fsgset() to enable it. + * + * @return The current FSG set object for this decoder, or + * NULL if none is available. + */ +POCKETSPHINX_EXPORT +fsg_model_t *ps_get_fsg(ps_decoder_t *ps, const char *name); + +/** + * Adds new search based on finite state grammar. + * + * Associates FSG search with the provided name. The search can be activated + * using ps_set_search(). + * + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +int ps_set_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg); + +/** + * Adds new search using JSGF model. + * + * Convenient method to load JSGF model and create a search. + * + * @see ps_set_fsg + */ +POCKETSPHINX_EXPORT +int ps_set_jsgf_file(ps_decoder_t *ps, const char *name, const char *path); + +/** + * Adds new search using JSGF model. + * + * Convenience method to parse JSGF model from string and create a search. + * + * @see ps_set_fsg + */ +POCKETSPHINX_EXPORT +int ps_set_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string); + +/** + * Get the current Key phrase to spot + * + * If KWS is not enabled, this returns NULL. Call + * ps_update_kws() to enable it. + * + * @return The current keyphrase to spot + */ +POCKETSPHINX_EXPORT +const char* ps_get_kws(ps_decoder_t *ps, const char *name); + +/** + * Adds keyphrases from a file to spotting + * + * Associates KWS search with the provided name. The search can be activated + * using ps_set_search(). + * + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +int ps_set_kws(ps_decoder_t *ps, const char *name, const char *keyfile); + +/** + * Adds new keyphrase to spot + * + * Associates KWS search with the provided name. The search can be activated + * using ps_set_search(). + * + * @see ps_set_search + */ +POCKETSPHINX_EXPORT +int ps_set_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase); + +/** + * Adds new search based on phone N-gram language model. + * + * Associates N-gram search with the provided name. The search can be activated + * using ps_set_search(). + * + * @see ps_set_search. + */ +POCKETSPHINX_EXPORT +int ps_set_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm); + +/** + * Adds new search based on phone N-gram language model. + * + * Convenient method to load N-gram model and create a search. + * + * @see ps_set_allphone + */ +POCKETSPHINX_EXPORT +int ps_set_allphone_file(ps_decoder_t *ps, const char *name, const char *path); + +/** + * Adds new search based on forced alignment. + * + * Convenient method to and create a forced aligner for a piece of + * text. Note that this is currently less than useful, as it depends + * on the word sequence exactly matching the input, including + * alternate pronunciations and silences. + * + * @param ps Decoder + * @param name Name for this search (could be anything, such as an utterance + * label or the name of the input file) + * @param words String containing whitespace-separated words for alignment. + * These words are assumed to exist in the current dictionary. + * + */ +POCKETSPHINX_EXPORT +int ps_set_align(ps_decoder_t *ps, const char *name, const char *words); + +#ifdef __cplusplus +} +#endif + +#endif /* __PS_SEARCH_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h new file mode 100644 index 0000000..67d74f6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h @@ -0,0 +1,202 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * agc.h -- Various forms of automatic gain control (AGC) + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.1 2006/04/05 20:27:30 dhdfu + * A Great Reorganzation of header files and executables + * + * Revision 1.8 2005/06/21 19:25:41 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.4 2005/06/13 04:02:56 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Copied from previous version. + */ + + +#ifndef _S3_AGC_H_ +#define _S3_AGC_H_ + +/* Win32/WinCE DLL gunk */ +#include + +#include +#include + +/** \file agc.h + * \brief routine that implements automatic gain control + * + * \warning This function may not be fully compatible with + * SphinxTrain's family of AGC. + * + * This implements AGC. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Types of acoustic gain control to apply to the features. + */ +typedef enum agc_type_e { + AGC_NONE = 0, + AGC_MAX, + AGC_EMAX, + AGC_NOISE +} agc_type_t; + +/** Convert string representation (from command-line) to agc_type_t */ +SPHINXBASE_EXPORT +agc_type_t agc_type_from_str(const char *str); + +/** String representations of agc_type_t values. */ +SPHINXBASE_EXPORT +extern const char *agc_type_str[]; + +/** + * Structure holding data for doing AGC. + **/ +typedef struct agc_s { + mfcc_t max; /**< Estimated max for current utterance (for AGC_EMAX) */ + mfcc_t obs_max; /**< Observed max in current utterance */ + int32 obs_frame; /**< Whether any data was observed after prev update */ + int32 obs_utt; /**< Whether any utterances have been observed */ + mfcc_t obs_max_sum; + mfcc_t noise_thresh; /**< Noise threshold (for AGC_NOISE only) */ +} agc_t; + +/** + * Initialize AGC structure with default values. + */ +SPHINXBASE_EXPORT +agc_t *agc_init(void); + +/** + * Free AGC structure. + */ +SPHINXBASE_EXPORT +void agc_free(agc_t *agc); + +/** + * Apply AGC to the given mfc vectors (normalize all C0 mfc coefficients in the given + * input such that the max C0 value is 0, by subtracting the input max C0 from all). + * This function operates on an entire utterance at a time. Hence, the entire utterance + * must be available beforehand (batchmode). + */ +SPHINXBASE_EXPORT +void agc_max(agc_t *agc, /**< In: AGC structure (not used) */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Apply AGC to the given block of MFC vectors. + * Unlike agc_max() this does not require the entire utterance to be + * available. Call agc_emax_update() at the end of each utterance to + * update the AGC parameters. */ +SPHINXBASE_EXPORT +void agc_emax(agc_t *agc, /**< In: AGC structure */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Update AGC parameters for next utterance. + **/ +SPHINXBASE_EXPORT +void agc_emax_update(agc_t *agc /**< In: AGC structure */ + ); + +/** + * Get the current AGC maximum estimate. + **/ +SPHINXBASE_EXPORT +float32 agc_emax_get(agc_t *agc); + +/** + * Set the current AGC maximum estimate. + **/ +SPHINXBASE_EXPORT +void agc_emax_set(agc_t *agc, float32 m); + +/** + * Apply AGC using noise threshold to the given block of MFC vectors. + **/ +SPHINXBASE_EXPORT +void agc_noise(agc_t *agc, /**< In: AGC structure */ + mfcc_t **mfc, /**< In/Out: mfc[f] = cepstrum vector in frame f */ + int32 n_frame /**< In: number of frames of cepstrum vectors supplied */ + ); + +/** + * Get the current AGC noise threshold. + **/ +SPHINXBASE_EXPORT +float32 agc_get_threshold(agc_t *agc); + +/** + * Set the current AGC noise threshold. + **/ +SPHINXBASE_EXPORT +void agc_set_threshold(agc_t *agc, float32 threshold); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h new file mode 100644 index 0000000..3436177 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h @@ -0,0 +1,316 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bio.h -- Sphinx-3 binary file I/O functions. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: bio.h,v $ + * Revision 1.8 2005/06/21 20:40:46 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add the $ keyword. + * + * Revision 1.5 2005/06/13 04:02:57 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.4 2005/05/10 21:21:52 archan + * Three functionalities added but not tested. Code on 1) addition/deletion of LM in mode 4. 2) reading text-based LM 3) Converting txt-based LM to dmp-based LM. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +#ifndef _S3_BIO_H_ +#define _S3_BIO_H_ + +#include +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include + +/** \file bio.h + * \brief Cross platform binary IO to process files in sphinx3 format. + * + * + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define BYTE_ORDER_MAGIC (0x11223344) + +/** "reversed senses" SWAP, ARCHAN: This is still incorporated in + Sphinx 3 because lm3g2dmp used it. Don't think that I am very + happy with it. */ + +#if (__BIG_ENDIAN__) +#define REVERSE_SENSE_SWAP_INT16(x) x = ( (((x)<<8)&0x0000ff00) | (((x)>>8)&0x00ff) ) +#define REVERSE_SENSE_SWAP_INT32(x) x = ( (((x)<<24)&0xff000000) | (((x)<<8)&0x00ff0000) | \ + (((x)>>8)&0x0000ff00) | (((x)>>24)&0x000000ff) ) +#else +#define REVERSE_SENSE_SWAP_INT16(x) +#define REVERSE_SENSE_SWAP_INT32(x) + +#endif + + + +/** + * Read binary file format header: has the following format + *
+ *     s3
+ *      
+ *      
+ *     ...
+ *     endhdr
+ *     4-byte byte-order word used to find file byte ordering relative to host machine.
+ * 
+ * Lines beginning with # are ignored. + * Memory for name and val allocated by this function; use bio_hdrarg_free to free them. + * @return 0 if successful, -1 otherwise. + */ +SPHINXBASE_EXPORT +int32 bio_readhdr (FILE *fp, /**< In: File to read */ + char ***name, /**< Out: array of argument name strings read */ + char ***val, /**< Out: corresponding value strings read */ + int32 *swap /**< Out: file needs byteswapping iff (*swap) */ + ); +/** + * Write a simple binary file header, containing only the version string. Also write + * the byte order magic word. + * @return 0 if successful, -1 otherwise. + */ +SPHINXBASE_EXPORT +int32 bio_writehdr_version (FILE *fp, /**< Output: File to write */ + char *version /**< Input: A string of version */ + ); + + +/** + * Write a simple binary file header with only byte order magic word. + * @return 0 if successful, -1 otherwise. + */ +SPHINXBASE_EXPORT +int32 bio_writehdr(FILE *fp, ...); + +/** + * Free name and value strings previously allocated and returned by bio_readhdr. + */ +SPHINXBASE_EXPORT +void bio_hdrarg_free (char **name, /**< In: Array previously returned by bio_readhdr */ + char **val /**< In: Array previously returned by bio_readhdr */ + ); + +/** + * Like fread but perform byteswapping and accumulate checksum (the 2 extra arguments). + * + * @return unlike fread, returns -1 if required number of elements (n_el) not read; also, + * no byteswapping or checksum accumulation is performed in that case. + */ +SPHINXBASE_EXPORT +int32 bio_fread (void *buf, /**< In: buffer to write */ + int32 el_sz, /**< In: element size */ + int32 n_el, /**< In: number of elements */ + FILE *fp, /**< In: An input file pointer */ + int32 swap, /**< In: Byteswap iff (swap != 0) */ + uint32 *chksum /**< In/Out: Accumulated checksum */ + ); + +/** + * Like fwrite but perform byteswapping and accumulate checksum (the 2 extra arguments). + * + * @return the number of elemens written (like fwrite). + */ +SPHINXBASE_EXPORT +int32 bio_fwrite(const void *buf, /**< In: buffer to write */ + int32 el_sz, /**< In: element size */ + int32 n_el, /**< In: number of elements */ + FILE *fp, /**< In: An input file pointer */ + int32 swap, /**< In: Byteswap iff (swap != 0) */ + uint32 *chksum /**< In/Out: Accumulated checksum */ + ); + +/** + * Read a 1-d array (fashioned after fread): + * + * - 4-byte array size (returned in n_el) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +SPHINXBASE_EXPORT +int32 bio_fread_1d (void **buf, /**< Out: contains array data; allocated by this + function; can be freed using ckd_free */ + size_t el_sz, /**< In: Array element size */ + uint32 *n_el, /**< Out: Number of array elements allocated/read */ + FILE *fp, /**< In: File to read */ + int32 sw, /**< In: Byteswap iff (swap != 0) */ + uint32 *ck /**< In/Out: Accumulated checksum */ + ); + +/** + * Read a 2-d matrix: + * + * - 4-byte # rows, # columns (returned in d1, d2, d3) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +SPHINXBASE_EXPORT +int32 bio_fread_2d(void ***arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + FILE *fp, + uint32 swap, + uint32 *chksum); + +/** + * Read a 3-d array (set of matrices) + * + * - 4-byte # matrices, # rows, # columns (returned in d1, d2, d3) + * - memory allocated for the array and read (returned in buf) + * + * Byteswapping and checksum accumulation performed as necessary. + * Fails fatally if expected data not read. + * @return number of array elements allocated and read; -1 if error. + */ +SPHINXBASE_EXPORT +int32 bio_fread_3d(void ****arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum); + +int +bio_fread_intv_3d(void ****arr, + size_t e_sz, + uint32 s, + uint32 e, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum); + +/** + * Read and verify checksum at the end of binary file. Fails fatally if there is + * a mismatch. + */ +SPHINXBASE_EXPORT +void bio_verify_chksum (FILE *fp, /**< In: File to read */ + int32 byteswap, /**< In: Byteswap iff (swap != 0) */ + uint32 chksum /**< In: Value to compare with checksum in file */ + ); + + + +/** + * Write a 1-d array. + * Checksum accumulation performed as necessary. + * + * @return number of array elements successfully written or -1 if error. + */ +SPHINXBASE_EXPORT +int bio_fwrite_1d(void *arr, /**< In: Data to write */ + size_t e_sz, /**< In: Size of the elements in bytes */ + uint32 d1, /**< In: First dimension */ + FILE *fp, /**< In: File to write to */ + uint32 *chksum /**< In/Out: Checksum accumulator */ + ); + +/** + * Write a 3-d array (set of matrices). + * Checksum accumulation performed as necessary. + * + * @return number of array elements successfully written or -1 if error. + */ +SPHINXBASE_EXPORT +int bio_fwrite_3d(void ***arr, /**< In: Data to write */ + size_t e_sz, /**< In: Size of the elements in bytes */ + uint32 d1, /**< In: First dimension */ + uint32 d2, /**< In: Second dimension */ + uint32 d3, /**< In: Third dimension */ + FILE *fp, /**< In: File to write to */ + uint32 *chksum /**< In/Out: Checksum accumulator */ + ); + +/** + * Read raw data from the wav file. + * + * @return pointer to the data. + */ +SPHINXBASE_EXPORT +int16* bio_read_wavfile(char const *directory, /**< In: the folder where the file is located */ + char const *filename, /**< In: the name of the file */ + char const *extension, /**< In: file extension */ + int32 header, /**< In: the size of the header to skip usually 44 bytes */ + int32 endian, /**< In: endian of the data */ + size_t *nsamps /**< Out: number of samples read */ + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h new file mode 100644 index 0000000..029544e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h @@ -0,0 +1,152 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBUTIL_BITARR_H_ +#define _LIBUTIL_BITARR_H_ + +#include + +#include +/* Win32/WinCE DLL gunk */ +#include + +/** + * @file bitarr.h + * @brief An implementation bit array - memory + * efficient storage for digit int and float data. (FIXME: NO) + * + * Implementation of basic operations of read/write digits consuming + * as little space as possible. + * + * I HAVE QUESTIONS. Why 25 and 57 bits? What are the other 7 bits + * *doing*?!? Why didn't you stop to think about architectures with + * big-endian byte ordering or strictly aligned memory access when you + * wrote this? Does it really store floats BECAUSE NO IT DOESN'T + * + * Note that because of the problems noted above data is canonically + * stored in little-endian order in memory. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Structure that specifies bits required to efficiently store certain data + */ +typedef struct bitarr_mask_s { + uint8 bits; + uint32 mask; +} bitarr_mask_t; + +/** + * Structure that stores address of certain value in bit array + */ +typedef struct bitarr_address_s { + void *base; + uint32 offset; +} bitarr_address_t; + +/** + * Read uint64 value from bit array. + * Assumes mask == (1 << length) - 1 where length <= 57 + * @param address to read from + * @param length number of bits for value + * @param mask of read value + * @return uint64 value that was read + */ +SPHINXBASE_EXPORT +uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask); + +/** + * Write specified value into bit array. + * Assumes value < (1 << length) and length <= 57. + * Assumes the memory is zero initially. + * @param address to write to + * @param length amount of active bytes in value to write + * @param value integer to write + */ +SPHINXBASE_EXPORT +void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value); + +/** + * Read uint32 value from bit array. + * Assumes mask == (1 << length) - 1 where length <= 25 + * @param address to read from + * @param length number of bits for value + * @param mask of read value + * @return uint32 value that was read + */ +SPHINXBASE_EXPORT +uint32 bitarr_read_int25(bitarr_address_t address, uint8 length, uint32 mask); + +/** + * Write specified value into bit array. + * Assumes value < (1 << length) and length <= 25. + * Assumes the memory is zero initially. + * @param address in bit array ti write to + * @param length amount of active bytes in value to write + * @param value integer to write + */ +SPHINXBASE_EXPORT +void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value); + +/** + * Fills mask for certain int range according to provided max value + * @param bit_mask mask that is filled + * @param max_value bigest integer that is going to be stored using this mask + */ +SPHINXBASE_EXPORT +void bitarr_mask_from_max(bitarr_mask_t *bit_mask, uint32 max_value); + +/** + * Computes amount of bits required ti store integers upto value provided. + * @param max_value bigest integer that going to be stored using this amount of bits + * @return amount of bits required to store integers from range with maximum provided + */ +SPHINXBASE_EXPORT +uint8 bitarr_required_bits(uint32 max_value); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBUTIL_BITARR_H_ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h new file mode 100644 index 0000000..d5644df --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h @@ -0,0 +1,155 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBUTIL_BITVEC_H_ +#define _LIBUTIL_BITVEC_H_ + +#include + +/* Win32/WinCE DLL gunk */ +#include + +#include +#include + +/** + * @file bitvec.h + * @brief An implementation of bit vectors. + * + * Implementation of basic operations of bit vectors. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define BITVEC_BITS 32 +typedef uint32 bitvec_t; + +/** + * Number of bitvec_t in a bit vector + */ +#define bitvec_size(n) (((n)+BITVEC_BITS-1)/BITVEC_BITS) + +/** + * Allocate a bit vector, all bits are clear + */ +#define bitvec_alloc(n) ckd_calloc(bitvec_size(n), sizeof(bitvec_t)) + +/** + * Resize a bit vector, clear the remaining bits + */ +SPHINXBASE_EXPORT +bitvec_t *bitvec_realloc(bitvec_t *vec, /* In: Bit vector to search */ + size_t old_len, /* In: Old length */ + size_t new_len); /* In: New lenght of above bit vector */ +/** + * Free a bit vector. + */ +#define bitvec_free(v) ckd_free(v) + +/** + * Set the b-th bit of bit vector v + * @param v is a vector + * @param b is the bit which will be set + */ + +#define bitvec_set(v,b) (v[(b)/BITVEC_BITS] |= (1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Set all n bits in bit vector v + * @param v is a vector + * @param n is the number of bits + */ + +#define bitvec_set_all(v,n) memset(v, (bitvec_t)-1, \ + (((n)+BITVEC_BITS-1)/BITVEC_BITS) * \ + sizeof(bitvec_t)) +/** + * Clear the b-th bit of bit vector v + * @param v is a vector + * @param b is the bit which will be set + */ + +#define bitvec_clear(v,b) (v[(b)/BITVEC_BITS] &= ~(1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Clear all n bits in bit vector v + * @param v is a vector + * @param n is the number of bits + */ + +#define bitvec_clear_all(v,n) memset(v, 0, (((n)+BITVEC_BITS-1)/BITVEC_BITS) * \ + sizeof(bitvec_t)) + +/** + * Check whether the b-th bit is set in vector v + * @param v is a vector + * @param b is the bit which will be checked + */ + +#define bitvec_is_set(v,b) (v[(b)/BITVEC_BITS] & (1UL << ((b) & (BITVEC_BITS-1)))) + +/** + * Check whether the b-th bit is cleared in vector v + * @param v is a vector + * @param b is the bit which will be checked + */ + +#define bitvec_is_clear(v,b) (! (bitvec_is_set(v,b))) + + +/** + * Return the number of bits set in the given bitvector. + * + * @param vec is the bit vector + * @param len is the length of bit vector vec + * @return the number of bits being set in vector vec + */ +SPHINXBASE_EXPORT +size_t bitvec_count_set(bitvec_t *vec, /* In: Bit vector to search */ + size_t len); /* In: Lenght of above bit vector */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h new file mode 100644 index 0000000..692ce60 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h @@ -0,0 +1,98 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * byteorder.h -- Byte swapping ordering macros. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * $Log: byteorder.h,v $ + * Revision 1.8 2005/09/01 21:09:54 dhdfu + * Really, actually, truly consolidate byteswapping operations into + * byteorder.h. Where unconditional byteswapping is needed, SWAP_INT32() + * and SWAP_INT16() are to be used. The WORDS_BIGENDIAN macro from + * autoconf controls the functioning of the conditional swap macros + * (SWAP_?[LW]) whose names and semantics have been regularized. + * Private, adhoc macros have been removed. + * + */ + +#ifndef __S2_BYTEORDER_H__ +#define __S2_BYTEORDER_H__ 1 + +/* Macro to byteswap an int16 variable. x = ptr to variable */ +#define SWAP_INT16(x) *(x) = ((0x00ff & (*(x))>>8) | (0xff00 & (*(x))<<8)) + +/* Macro to byteswap an int32 variable. x = ptr to variable */ +#define SWAP_INT32(x) *(x) = ((0x000000ff & (*(x))>>24) | \ + (0x0000ff00 & (*(x))>>8) | \ + (0x00ff0000 & (*(x))<<8) | \ + (0xff000000 & (*(x))<<24)) + +/* Macro to byteswap a float32 variable. x = ptr to variable */ +#define SWAP_FLOAT32(x) SWAP_INT32((int32 *) x) + +/* Macro to byteswap a float64 variable. x = ptr to variable */ +#define SWAP_FLOAT64(x) { int *low = (int *) (x), *high = (int *) (x) + 1,\ + temp;\ + SWAP_INT32(low); SWAP_INT32(high);\ + temp = *low; *low = *high; *high = temp;} + +#ifdef WORDS_BIGENDIAN +#define SWAP_BE_64(x) +#define SWAP_BE_32(x) +#define SWAP_BE_16(x) +#define SWAP_LE_64(x) SWAP_FLOAT64(x) +#define SWAP_LE_32(x) SWAP_INT32(x) +#define SWAP_LE_16(x) SWAP_INT16(x) +#else +#define SWAP_LE_64(x) +#define SWAP_LE_32(x) +#define SWAP_LE_16(x) +#define SWAP_BE_64(x) SWAP_FLOAT64(x) +#define SWAP_BE_32(x) SWAP_INT32(x) +#define SWAP_BE_16(x) SWAP_INT16(x) +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h new file mode 100644 index 0000000..bd1f62e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h @@ -0,0 +1,135 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * case.h -- Upper/lower case conversion routines + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: case.h,v $ + * Revision 1.7 2005/06/22 02:58:54 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added strcmp_nocase, UPPER_CASE and LOWER_CASE definitions. + * + * 16-Feb-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +/** + * @file case.h + * @brief Locale-independent implementation of case swapping operation. + * + * This function implements ASCII-only case switching and comparison + * related operations, which do not depend on the locale and are + * guaranteed to exist on all versions of Windows. + */ + +#ifndef _LIBUTIL_CASE_H_ +#define _LIBUTIL_CASE_H_ + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + + /** + * Return upper case form for c + */ +#define UPPER_CASE(c) ((((c) >= 'a') && ((c) <= 'z')) ? (c-32) : c) + + /** + * Return lower case form for c + */ +#define LOWER_CASE(c) ((((c) >= 'A') && ((c) <= 'Z')) ? (c+32) : c) + + + /** + * Convert str to all upper case. + * @param str is a string. + */ +SPHINXBASE_EXPORT +void ucase(char *str); + + /** + * Convert str to all lower case + * @param str is a string. + */ +SPHINXBASE_EXPORT +void lcase(char *str); + + /** + * (FIXME! The implementation is incorrect!) + * Case insensitive string compare. Return the usual -1, 0, +1, depending on + * str1 <, =, > str2 (case insensitive, of course). + * @param str1 is the first string. + * @param str2 is the second string. + */ +SPHINXBASE_EXPORT +int32 strcmp_nocase(const char *str1, const char *str2); + +/** + * Like strcmp_nocase() but with a maximum length. + */ +SPHINXBASE_EXPORT +int32 strncmp_nocase(const char *str1, const char *str2, size_t len); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h new file mode 100644 index 0000000..5bb60d4 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h @@ -0,0 +1,311 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * ckd_alloc.h -- Memory allocation package. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: ckd_alloc.h,v $ + * Revision 1.10 2005/06/22 02:59:25 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Removed file,line arguments from free functions. + * + * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/********************************************************************* + * + * $Header: /cvsroot/cmusphinx/sphinx3/src/libutil/ckd_alloc.h,v 1.10 2005/06/22 02:59:25 arthchan2003 Exp $ + * + * Carnegie Mellon ARPA Speech Group + * + * Copyright (c) 1994 Carnegie Mellon University. + * All rights reserved. + * + ********************************************************************* + * + * file: ckd_alloc.h + * + * traceability: + * + * description: + * + * author: + * + *********************************************************************/ + + +#ifndef _LIBUTIL_CKD_ALLOC_H_ +#define _LIBUTIL_CKD_ALLOC_H_ + +#include +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** \file ckd_alloc.h + *\brief Sphinx's memory allocation/deallocation routines. + * + *Implementation of efficient memory allocation deallocation for + *multiple dimensional arrays. + * + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Control behaviour of the program when allocation fails. + * + * Although your program is probably toast when memory allocation + * fails, it is also probably a good idea to be able to catch these + * errors and alert the user in some way. Either that, or you might + * want the program to call abort() so that you can debug the failed + * code. This function allows you to control that behaviour. + * + * @param env Pointer to a jmp_buf initialized with + * setjmp(), or NULL to remove a previously set jump target. + * @param abort If non-zero, the program will call abort() when + * allocation fails rather than exiting or calling longjmp(). + * @return Pointer to a previously set jmp_buf, if any. + */ +SPHINXBASE_EXPORT +jmp_buf *ckd_set_jump(jmp_buf *env, int abort); + +/** + * Fail (with a message) according to behaviour specified by ckd_set_jump(). + */ +void ckd_fail(char *format, ...); + +/* + * The following functions are similar to the malloc family, except + * that they have two additional parameters, caller_file and + * caller_line, for error reporting. All functions print a diagnostic + * message if any error occurs, with any other behaviour determined by + * ckd_set_jump(), above. + */ + +SPHINXBASE_EXPORT +void *__ckd_calloc__(size_t n_elem, size_t elem_size, + const char *caller_file, int caller_line); + +SPHINXBASE_EXPORT +void *__ckd_malloc__(size_t size, + const char *caller_file, int caller_line); + +SPHINXBASE_EXPORT +void *__ckd_realloc__(void *ptr, size_t new_size, + const char *caller_file, int caller_line); + +/** + * Like strdup, except that if an error occurs it prints a diagnostic message and + * exits. If origin in NULL the function also returns NULL. + */ +SPHINXBASE_EXPORT +char *__ckd_salloc__(const char *origstr, + const char *caller_file, int caller_line); + +/** + * Allocate a 2-D array and return ptr to it (ie, ptr to vector of ptrs). + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +SPHINXBASE_EXPORT +void *__ckd_calloc_2d__(size_t d1, size_t d2, /* In: #elements in the 2 dimensions */ + size_t elemsize, /* In: Size (#bytes) of each element */ + const char *caller_file, int caller_line); /* In */ + +/** + * Allocate a 3-D array and return ptr to it. + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +SPHINXBASE_EXPORT +void *__ckd_calloc_3d__(size_t d1, size_t d2, size_t d3, /* In: #elems in the dims */ + size_t elemsize, /* In: Size (#bytes) per element */ + const char *caller_file, int caller_line); /* In */ + +/** + * Allocate a 34D array and return ptr to it. + * The data area is allocated in one block so it can also be treated as a 1-D array. + */ +SPHINXBASE_EXPORT +void ****__ckd_calloc_4d__(size_t d1, + size_t d2, + size_t d3, + size_t d4, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Overlay a 3-D array over a previously allocated storage area. + **/ +SPHINXBASE_EXPORT +void * __ckd_alloc_3d_ptr(size_t d1, + size_t d2, + size_t d3, + void *store, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Overlay a s-D array over a previously allocated storage area. + **/ +SPHINXBASE_EXPORT +void *__ckd_alloc_2d_ptr(size_t d1, + size_t d2, + void *store, + size_t elem_size, + char *caller_file, + int caller_line); + +/** + * Test and free a 1-D array + */ +SPHINXBASE_EXPORT +void ckd_free(void *ptr); + +/** + * Free a 2-D array (ptr) previously allocated by ckd_calloc_2d + */ +SPHINXBASE_EXPORT +void ckd_free_2d(void *ptr); + +/** + * Free a 3-D array (ptr) previously allocated by ckd_calloc_3d + */ +SPHINXBASE_EXPORT +void ckd_free_3d(void *ptr); + +/** + * Free a 4-D array (ptr) previously allocated by ckd_calloc_4d + */ +SPHINXBASE_EXPORT +void ckd_free_4d(void *ptr); + +/** + * Macros to simplify the use of above functions. + * One should use these, rather than target functions directly. + */ + +/** + * Macro for __ckd_calloc__ + */ +#define ckd_calloc(n,sz) __ckd_calloc__((n),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_malloc__ + */ +#define ckd_malloc(sz) __ckd_malloc__((sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_realloc__ + */ +#define ckd_realloc(ptr,sz) __ckd_realloc__(ptr,(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_salloc__ + */ + +#define ckd_salloc(ptr) __ckd_salloc__(ptr,__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_2d__ + */ + +#define ckd_calloc_2d(d1,d2,sz) __ckd_calloc_2d__((d1),(d2),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_3d__ + */ + +#define ckd_calloc_3d(d1,d2,d3,sz) __ckd_calloc_3d__((d1),(d2),(d3),(sz),__FILE__,__LINE__) + +/** + * Macro for __ckd_calloc_4d__ + */ +#define ckd_calloc_4d(d1, d2, d3, d4, s) __ckd_calloc_4d__((d1), (d2), (d3), (d4), (s), __FILE__, __LINE__) + +/** + * Macro for __ckd_alloc_2d_ptr__ + */ + +#define ckd_alloc_2d_ptr(d1, d2, bf, sz) __ckd_alloc_2d_ptr((d1), (d2), (bf), (sz), __FILE__, __LINE__) + +/** + * Free only the pointer arrays allocated with ckd_alloc_2d_ptr(). + */ +#define ckd_free_2d_ptr(bf) ckd_free(bf) + +/** + * Macro for __ckd_alloc_3d_ptr__ + */ + +#define ckd_alloc_3d_ptr(d1, d2, d3, bf, sz) __ckd_alloc_3d_ptr((d1), (d2), (d3), (bf), (sz), __FILE__, __LINE__) + +/** + * Free only the pointer arrays allocated with ckd_alloc_3d_ptr(). + */ +#define ckd_free_3d_ptr(bf) ckd_free_2d(bf) + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h new file mode 100644 index 0000000..0f5a1f4 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h @@ -0,0 +1,36 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +#ifndef __CLAPACK_LITE_H +#define __CLAPACK_LITE_H + +#include "f2c.h" + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* Subroutine */ int sgemm_(char *transa, char *transb, integer *m, integer * + n, integer *k, real *alpha, real *a, integer *lda, real *b, integer * + ldb, real *beta, real *c__, integer *ldc); +/* Subroutine */ int sgemv_(char *trans, integer *m, integer *n, real *alpha, + real *a, integer *lda, real *x, integer *incx, real *beta, real *y, + integer *incy); +/* Subroutine */ int ssymm_(char *side, char *uplo, integer *m, integer *n, + real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, + real *c__, integer *ldc); + +/* Subroutine */ int sposv_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info); +/* Subroutine */ int spotrf_(char *uplo, integer *n, real *a, integer *lda, + integer *info); + +#ifdef __cplusplus +} +#endif + + +#endif /* __CLAPACK_LITE_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h new file mode 100644 index 0000000..cb371c5 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h @@ -0,0 +1,447 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmd_ln.h -- Command line argument parsing. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 15-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added required arguments types. + * + * 07-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created, based on Eric's implementation. Basically, combined several + * functions into one, eliminated validation, and simplified the interface. + */ + + +#ifndef _LIBUTIL_CMD_LN_H_ +#define _LIBUTIL_CMD_LN_H_ + +#include +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include + +/** + * @file cmd_ln.h + * @brief Command-line and other configurationparsing and handling. + * + * Configuration parameters, optionally parsed from the command line. + */ + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * @struct arg_t + * Argument definition structure. + */ +typedef struct arg_s { + char const *name; /**< Name of the command line switch */ + int type; /**< Type of the argument in question */ + char const *deflt; /**< Default value (as a character string), or NULL if none */ + char const *doc; /**< Documentation/description string */ +} arg_t; + +/** + * @struct cmd_ln_val_t + * Configuration parameter structure. + */ +typedef struct cmd_ln_val_s { + anytype_t val; + int type; + char *name; +} cmd_ln_val_t; + +/** + * @name Values for arg_t::type + */ +/* @{ */ +/** + * Bit indicating a required argument. + */ +#define ARG_REQUIRED (1<<0) +/** + * Integer argument (optional). + */ +#define ARG_INTEGER (1<<1) +/** + * Floating point argument (optional). + */ +#define ARG_FLOATING (1<<2) +/** + * String argument (optional). + */ +#define ARG_STRING (1<<3) +/** + * Boolean (true/false) argument (optional). + */ +#define ARG_BOOLEAN (1<<4) +/** + * String array argument (optional). + */ +#define ARG_STRING_LIST (1<<5) + +/** + * Required integer argument. + */ +#define REQARG_INTEGER (ARG_INTEGER | ARG_REQUIRED) +/** + * Required floating point argument. + */ +#define REQARG_FLOATING (ARG_FLOATING | ARG_REQUIRED) +/** + * Required string argument. + */ +#define REQARG_STRING (ARG_STRING | ARG_REQUIRED) +/** + * Required boolean argument. + */ +#define REQARG_BOOLEAN (ARG_BOOLEAN | ARG_REQUIRED) + +/* @} */ + + +/** + * Helper macro to stringify enums and other non-string values for + * default arguments. + **/ +#define ARG_STRINGIFY(s) ARG_STRINGIFY1(s) +#define ARG_STRINGIFY1(s) #s + +/** + * @struct cmd_ln_t + * Structure (no longer opaque) used to hold the results of command-line parsing. + */ +typedef struct cmd_ln_s { + int refcount; + hash_table_t *ht; + char **f_argv; + uint32 f_argc; + arg_t const *defn; +} cmd_ln_t; + +/** + * Create a cmd_ln_t from NULL-terminated list of arguments. + * + * This function creates a cmd_ln_t from a NULL-terminated list of + * argument strings. For example, to create the equivalent of passing + * "-hmm foodir -dsratio 2 -lm bar.lm" on the command-line: + * + * config = cmd_ln_init(NULL, defs, TRUE, "-hmm", "foodir", "-dsratio", "2", + * "-lm", "bar.lm", NULL); + * + * Note that for simplicity, all arguments are passed + * as strings, regardless of the actual underlying type. + * + * @param inout_cmdln Previous command-line to update, or NULL to create a new one. + * @param defn Array of argument name definitions, or NULL to allow any arguments. + * @param strict Whether to fail on duplicate or unknown arguments. + * @return A cmd_ln_t* containing the results of command line parsing, or NULL on failure. + */ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_init(cmd_ln_t *inout_cmdln, arg_t const *defn, int32 strict, ...); + +/** + * Retain ownership of a command-line argument set. + * + * @return pointer to retained command-line argument set. + */ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_retain(cmd_ln_t *cmdln); + +/** + * Release a command-line argument set and all associated strings. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int cmd_ln_free_r(cmd_ln_t *cmdln); + +/** + * Parse a list of strings into argumetns. + * + * Parse the given list of arguments (name-value pairs) according to + * the given definitions. Argument values can be retrieved in future + * using cmd_ln_access(). argv[0] is assumed to be the program name + * and skipped. Any unknown argument name causes a fatal error. The + * routine also prints the prevailing argument values (to stderr) + * after parsing. + * + * @note It is currently assumed that the strings in argv are + * allocated statically, or at least that they will be valid as + * long as the cmd_ln_t returned from this function. + * Unpredictable behaviour will result if they are freed or + * otherwise become invalidated. + * + * @return A cmd_ln_t containing the results of command line parsing, + * or NULL on failure. + **/ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_parse_r(cmd_ln_t *inout_cmdln, /**< In/Out: Previous command-line to update, + or NULL to create a new one. */ + arg_t const *defn, /**< In: Array of argument name definitions */ + int32 argc, /**< In: Number of actual arguments */ + char *argv[], /**< In: Actual arguments */ + int32 strict /**< In: Fail on duplicate or unknown + arguments, or no arguments? */ + ); + +/** + * Parse an arguments file by deliminating on " \r\t\n" and putting each tokens + * into an argv[] for cmd_ln_parse(). + * + * @return A cmd_ln_t containing the results of command line parsing, or NULL on failure. + */ +SPHINXBASE_EXPORT +cmd_ln_t *cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, /**< In/Out: Previous command-line to update, + or NULL to create a new one. */ + arg_t const *defn, /**< In: Array of argument name definitions*/ + char const *filename,/**< In: A file that contains all + the arguments */ + int32 strict /**< In: Fail on duplicate or unknown + arguments, or no arguments? */ + ); + +/** + * Access the value and metadata for a configuration parameter. + * + * This structure is owned by the cmd_ln_t, assume that you must copy + * anything inside it, including strings, if you wish to retain it, + * and should never free it manually. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the value and metadata associated with name, or + * NULL if name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately NULL and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +cmd_ln_val_t *cmd_ln_access_r(cmd_ln_t *cmdln, char const *name); + +/** + * Access the type of a configuration parameter. + * + * This function is provided as a convenience for dynamically typed + * language bindings. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the type of the parameter (as a combination of the ARG_* + * bits), or 0 if no such parameter exists. + */ +SPHINXBASE_EXPORT +int cmd_ln_type_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve a string from a command-line object. + * + * The command-line object retains ownership of this string, so you + * should not attempt to free it manually. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the string value associated with name, or NULL if + * name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately NULL and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +char const *cmd_ln_str_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve an array of strings from a command-line object. + * + * The command-line object retains ownership of this array, so you + * should not attempt to free it manually. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the array of strings associated with name, or NULL if + * name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately NULL and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +char const **cmd_ln_str_list_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve an integer from a command-line object. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the integer value associated with name, or 0 if + * name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately zero and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +long cmd_ln_int_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve a floating-point number from a command-line object. + * + * @param cmdln Command-line object. + * @param name the command-line flag to retrieve. + * @return the float value associated with name, or 0.0 if + * name does not exist. You must use + * cmd_ln_exists_r() to distinguish between cases where a + * value is legitimately zero and where the corresponding flag + * is unknown. + */ +SPHINXBASE_EXPORT +double cmd_ln_float_r(cmd_ln_t *cmdln, char const *name); + +/** + * Retrieve a boolean value from a command-line object. + */ +#define cmd_ln_boolean_r(c,n) (cmd_ln_int_r(c,n) != 0) + +/** + * Set a string in a command-line object. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param str String value to set. The command-line object does not + * retain ownership of this pointer. + */ +SPHINXBASE_EXPORT +void cmd_ln_set_str_r(cmd_ln_t *cmdln, char const *name, char const *str); + +/** + * Set a string in a command-line object even if it is not present in argument + * description. Useful for setting extra values computed from configuration, propagated + * to other parts. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param str String value to set. The command-line object does not + * retain ownership of this pointer. + */ +SPHINXBASE_EXPORT +void cmd_ln_set_str_extra_r(cmd_ln_t *cmdln, char const *name, char const *str); + +/** + * Set an integer in a command-line object. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param iv Integer value to set. + */ +SPHINXBASE_EXPORT +void cmd_ln_set_int_r(cmd_ln_t *cmdln, char const *name, long iv); + +/** + * Set a floating-point number in a command-line object. + * + * @param cmdln Command-line object. + * @param name The command-line flag to set. + * @param fv Integer value to set. + */ +SPHINXBASE_EXPORT +void cmd_ln_set_float_r(cmd_ln_t *cmdln, char const *name, double fv); + +/** + * Set a boolean value in a command-line object. + */ +#define cmd_ln_set_boolean_r(c,n,b) (cmd_ln_set_int_r(c,n,(b)!=0)) + +/* + * Compatibility macros + */ +#define cmd_ln_int32_r(c,n) (int32)cmd_ln_int_r(c,n) +#define cmd_ln_float32_r(c,n) (float32)cmd_ln_float_r(c,n) +#define cmd_ln_float64_r(c,n) (float64)cmd_ln_float_r(c,n) +#define cmd_ln_set_int32_r(c,n,i) cmd_ln_set_int_r(c,n,i) +#define cmd_ln_set_float32_r(c,n,f) cmd_ln_set_float_r(c,n,(double)f) +#define cmd_ln_set_float64_r(c,n,f) cmd_ln_set_float_r(c,n,(double)f) + +/** + * Re-entrant version of cmd_ln_exists(). + * + * @return True if the command line argument exists (i.e. it + * was one of the arguments defined in the call to cmd_ln_parse_r(). + */ +SPHINXBASE_EXPORT +int cmd_ln_exists_r(cmd_ln_t *cmdln, char const *name); + +/** + * Print a help message listing the valid argument names, and the associated + * attributes as given in defn. + * + * @param cmdln command-line object + * @param defn array of argument name definitions. + */ +SPHINXBASE_EXPORT +void cmd_ln_log_help_r (cmd_ln_t *cmdln, const arg_t *defn); + +/** + * Print current configuration values and defaults. + * + * @param cmdln command-line object + * @param defn array of argument name definitions. + */ +SPHINXBASE_EXPORT +void cmd_ln_log_values_r (cmd_ln_t *cmdln, const arg_t *defn); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h new file mode 100644 index 0000000..9dae459 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h @@ -0,0 +1,185 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmn.h -- Various forms of cepstral mean normalization + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.1 2006/04/05 20:27:30 dhdfu + * A Great Reorganzation of header files and executables + * + * Revision 1.13 2006/02/23 03:48:27 arthchan2003 + * Resolved conflict in cmn.h + * + * + * Revision 1.12 2006/02/22 23:43:55 arthchan2003 + * Merged from the branch SPHINX3_5_2_RCI_IRII_BRANCH: Put data structure into the cmn_t structure. + * + * Revision 1.11.4.2 2005/10/17 04:45:57 arthchan2003 + * Free stuffs in cmn and feat corectly. + * + * Revision 1.11.4.1 2005/07/05 06:25:08 arthchan2003 + * Fixed dox-doc. + * + * Revision 1.11 2005/06/21 19:28:00 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.4 2005/06/13 04:02:56 archan + * Fixed most doxygen-style documentation under libs3decoder. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 20.Apr.2001 RAH (rhoughton@mediasite.com, ricky.houghton@cs.cmu.edu) + * Added cmn_free() and moved *mean and *var out global space and named them cmn_mean and cmn_var + * + * 28-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Copied from previous version. + */ + + +#ifndef _S3_CMN_H_ +#define _S3_CMN_H_ + +/* Win32/WinCE DLL gunk */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** \file cmn.h + * \brief Apply Cepstral Mean Normalization (CMN) to the set of input mfc frames. + * + * By subtractingthe mean of the input from each frame. C0 is also included in this process. + * This function operates on an entire utterance at a time. Hence, the entire utterance + * must be available beforehand (batchmode). + */ + +/** + * Types of cepstral mean normalization to apply to the features. + */ +typedef enum cmn_type_e { + CMN_NONE = 0, + CMN_BATCH, + CMN_LIVE +} cmn_type_t; + +/** String representations of cmn_type_t values. */ +SPHINXBASE_EXPORT +extern const char *cmn_type_str[]; + +/** Convert string representation (from command-line) to cmn_type_t */ +SPHINXBASE_EXPORT +cmn_type_t cmn_type_from_str(const char *str); + +/** \struct cmn_t + * \brief wrapper of operation of the cepstral mean normalization. + */ + +typedef struct { + mfcc_t *cmn_mean; /**< Current means */ + mfcc_t *cmn_var; /**< Stored cmn variance */ + mfcc_t *sum; /**< Accumulated cepstra for computing mean */ + int32 nframe; /**< Number of frames */ + int32 veclen; /**< Length of cepstral vector */ +} cmn_t; + +SPHINXBASE_EXPORT +cmn_t* cmn_init(int32 veclen); + +/** + * CMN for the whole sentence +*/ +SPHINXBASE_EXPORT +void cmn (cmn_t *cmn, /**< In/Out: cmn normalization, which contains the cmn_mean and cmn_var) */ + mfcc_t **mfc, /**< In/Out: mfc[f] = mfc vector in frame f */ + int32 varnorm,/**< In: if not FALSE, variance normalize the input vectors + to have unit variance (along each dimension independently); + Irrelevant if no cmn is performed */ + int32 n_frame /**< In: Number of frames of mfc vectors */ + ); + +#define CMN_WIN_HWM 800 /* #frames after which window shifted */ +#define CMN_WIN 500 + +/** + * CMN for one block of data, using live mean + */ +SPHINXBASE_EXPORT +void cmn_live(cmn_t *cmn, /**< In/Out: cmn normalization, which contains + the cmn_mean and cmn_var) */ + mfcc_t **incep, /**< In/Out: mfc[f] = mfc vector in frame f*/ + int32 varnorm, /**< This flag should always be 0 for live */ + int32 nfr /**< Number of incoming frames */ + ); + +/** + * Update live mean based on observed data + */ +SPHINXBASE_EXPORT +void cmn_live_update(cmn_t *cmn); + +/** + * Set the live mean. + */ +SPHINXBASE_EXPORT +void cmn_live_set(cmn_t *cmn, mfcc_t const *vec); + +/* RAH, free previously allocated memory */ +SPHINXBASE_EXPORT +void cmn_free (cmn_t *cmn); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h new file mode 100644 index 0000000..9fd0efc --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h @@ -0,0 +1,221 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBUTIL_ERR_H_ +#define _LIBUTIL_ERR_H_ + +#include +#include +#include +#include + +/* Win32/WinCE DLL gunk */ +#include + +/** + * @file err.h + * @brief Implementation of logging routines. + * + * Logging, warning, debug and error message output funtionality is provided in this file. + * Sphinxbase defines several level of logging messages - INFO, WARNING, ERROR, FATAL. By + * default output goes to standard error output. + * + * Logging is implemented through macros. They take same arguments as printf: format string and + * values. By default source file name and source line are prepended to the message. Log output + * could be redirected to any file using err_set_logfp() and err_set_logfile() functions. To disable + * logging in your application, call err_set_logfp(NULL). + * + * It's possible to log multiline info messages, to do that you need to start message with + * E_INFO and output other lines with E_INFOCONT. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define E_SYSCALL(stmt, ...) if (stmt) E_FATAL_SYSTEM(__VA_ARGS__); + +#define FILELINE __FILE__ , __LINE__ + +/** + * Exit with non-zero status after error message + */ +#define E_FATAL(...) \ + do { \ + err_msg(ERR_FATAL, FILELINE, __VA_ARGS__); \ + exit(EXIT_FAILURE); \ + } while (0) + +/** + * Print error text; Call perror(""); exit(errno); + */ +#define E_FATAL_SYSTEM(...) \ + do { \ + err_msg_system(ERR_FATAL, FILELINE, __VA_ARGS__); \ + exit(EXIT_FAILURE); \ + } while (0) + +/** + * Print error text; Call perror(""); + */ +#define E_ERROR_SYSTEM(...) err_msg_system(ERR_ERROR, FILELINE, __VA_ARGS__) + +/** + * Print error message to error log + */ +#define E_ERROR(...) err_msg(ERR_ERROR, FILELINE, __VA_ARGS__) + +/** + * Print warning message to error log + */ +#define E_WARN(...) err_msg(ERR_WARN, FILELINE, __VA_ARGS__) + +/** + * Print logging information to standard error stream + */ +#define E_INFO(...) err_msg(ERR_INFO, FILELINE, __VA_ARGS__) + +/** + * Continue printing the information to standard error stream + */ +#define E_INFOCONT(...) err_msg(ERR_INFO, NULL, 0, __VA_ARGS__) + +/** + * Print logging information without filename. + */ +#define E_INFO_NOFN(...) err_msg(ERR_INFO, NULL, 0, __VA_ARGS__) + +/** + * Debug is disabled by default + */ +#ifdef SPHINX_DEBUG +#define E_DEBUG(...) err_msg(ERR_DEBUG, NULL, 0, __VA_ARGS__) +#else +#define E_DEBUG(...) +#endif + +typedef enum err_e { + ERR_DEBUG, + ERR_INFO, + ERR_WARN, + ERR_ERROR, + ERR_FATAL, + ERR_MAX +} err_lvl_t; + +SPHINXBASE_EXPORT void +err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...); + +SPHINXBASE_EXPORT void +err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...); + +SPHINXBASE_EXPORT void +err_logfp_cb(void * user_data, err_lvl_t level, const char *fmt, ...); + +typedef void (*err_cb_f)(void* user_data, err_lvl_t, const char *, ...); + +/** + * Set minimum logging level. + * + * @param lvl Level below which messages will not be logged (note + * ERR_DEBUG messages are not logged unless compiled in debugging + * mode) + * @return previous log level. + */ +SPHINXBASE_EXPORT +int err_set_loglevel(err_lvl_t lvl); + +/** + * Set minimum logging levelfrom a string + * + * @param lvl Level below which messages will not be logged (note + * ERR_DEBUG messages are not logged unless compiled in debugging + * mode). A string corresponding to the names in enum err_e, but + * without the leading "ERR_" prefix. + * @return previous log level string, or NULL for invalid argument. + */ +SPHINXBASE_EXPORT +const char *err_set_loglevel_str(const char *lvl); + +/** + * Sets function to output error messages. Use it to redirect the logging + * to your application. By default the handler which dumps messages to + * stderr is set. + * + * @param callback callback to pass messages too + * @param user_data data to pass to callback + */ +SPHINXBASE_EXPORT +void err_set_callback(err_cb_f callback, void *user_data); + +/** + * Direct all logging to a given filehandle if default logfp callback is set. + * + * @param stream Filehandle to send log messages to, or NULL to disable logging. + */ +SPHINXBASE_EXPORT +void err_set_logfp(FILE *stream); + +/** + * Get the current logging filehandle. + * + * @return Current logging filehandle, NULL if logging is disabled. Initially + * it returns stderr + */ +SPHINXBASE_EXPORT +FILE *err_get_logfp(void); + +/** + * Append all log messages to a given file. + * + * Previous logging filehandle is closed (unless it was stdout or stderr). + * + * @param path File path to send log messages to + * @return 0 for success, <0 for failure (e.g. if file does not exist) + */ +SPHINXBASE_EXPORT +int err_set_logfile(const char *path); + +#ifdef __cplusplus +} +#endif + +#endif /* !_ERR_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h new file mode 100644 index 0000000..a50d1c7 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h @@ -0,0 +1,218 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* f2c.h -- Standard Fortran to C header file */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef int integer; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef int logical; +typedef short int shortlogical; +typedef char logical1; +typedef char integer1; + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef int flag; +typedef int ftnlen; +typedef int ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + shortint h; + integer i; + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +typedef long Long; /* No longer used; formerly in Namelist */ + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + ftnlen *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#ifndef abs +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#endif +#define dabs(x) (doublereal)abs(x) +#ifndef min +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#endif +#ifndef max +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#endif +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(void); +typedef shortint (*J_fp)(void); +typedef integer (*I_fp)(void); +typedef real (*R_fp)(void); +typedef doublereal (*D_fp)(void), (*E_fp)(void); +typedef /* Complex */ VOID (*C_fp)(void); +typedef /* Double Complex */ VOID (*Z_fp)(void); +typedef logical (*L_fp)(void); +typedef shortlogical (*K_fp)(void); +typedef /* Character */ VOID (*H_fp)(void); +typedef /* Subroutine */ int (*S_fp)(void); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h new file mode 100644 index 0000000..ca03cef --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h @@ -0,0 +1,561 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * fe.h + * + * $Log: fe.h,v $ + * Revision 1.11 2005/02/05 02:15:02 egouvea + * Removed fe_process(), never used + * + * Revision 1.10 2004/12/10 16:48:55 rkm + * Added continuous density acoustic model handling + * + * + */ + +#if defined(_WIN32) && !defined(GNUWINCE) +#define srand48(x) srand(x) +#define lrand48() rand() +#endif + +#ifndef _NEW_FE_H_ +#define _NEW_FE_H_ + +/* Win32/WinCE DLL gunk */ +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#ifdef WORDS_BIGENDIAN +#define NATIVE_ENDIAN "big" +#else +#define NATIVE_ENDIAN "little" +#endif + +/** Default number of samples per second. */ +#define DEFAULT_SAMPLING_RATE 16000 +/** Default number of frames per second. */ +#define DEFAULT_FRAME_RATE 100 +/** Default spacing between frame starts (equal to + * DEFAULT_SAMPLING_RATE/DEFAULT_FRAME_RATE) */ +#define DEFAULT_FRAME_SHIFT 160 +/** Default size of each frame (410 samples @ 16000Hz). */ +#define DEFAULT_WINDOW_LENGTH 0.025625 +/** Default number of FFT points. */ +#define DEFAULT_FFT_SIZE 512 +/** Default number of MFCC coefficients in output. */ +#define DEFAULT_NUM_CEPSTRA 13 +/** Default number of filter bands used to generate MFCCs. */ +#define DEFAULT_NUM_FILTERS 40 + +/** Default prespeech length */ +#define DEFAULT_PRE_SPEECH 20 +/** Default postspeech length */ +#define DEFAULT_POST_SPEECH 50 +/** Default postspeech length */ +#define DEFAULT_START_SPEECH 10 + +/** Default lower edge of mel filter bank. */ +#define DEFAULT_LOWER_FILT_FREQ 133.33334 +/** Default upper edge of mel filter bank. */ +#define DEFAULT_UPPER_FILT_FREQ 6855.4976 +/** Default pre-emphasis filter coefficient. */ +#define DEFAULT_PRE_EMPHASIS_ALPHA 0.97 +/** Default type of frequency warping to use for VTLN. */ +#define DEFAULT_WARP_TYPE "inverse_linear" +/** Default random number seed to use for dithering. */ +#define SEED -1 + +#define waveform_to_cepstral_command_line_macro() \ + { "-logspec", \ + ARG_BOOLEAN, \ + "no", \ + "Write out logspectral files instead of cepstra" }, \ + \ + { "-smoothspec", \ + ARG_BOOLEAN, \ + "no", \ + "Write out cepstral-smoothed logspectral files" }, \ + \ + { "-transform", \ + ARG_STRING, \ + "legacy", \ + "Which type of transform to use to calculate cepstra (legacy, dct, or htk)" }, \ + \ + { "-alpha", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_PRE_EMPHASIS_ALPHA), \ + "Preemphasis parameter" }, \ + \ + { "-samprate", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_SAMPLING_RATE), \ + "Sampling rate" }, \ + \ + { "-frate", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_FRAME_RATE), \ + "Frame rate" }, \ + \ + { "-wlen", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_WINDOW_LENGTH), \ + "Hamming window length" }, \ + \ + { "-nfft", \ + ARG_INTEGER, \ + "0", \ + "Size of FFT, or 0 to set automatically (recommended)" }, \ + \ + { "-nfilt", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_NUM_FILTERS), \ + "Number of filter banks" }, \ + \ + { "-lowerf", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_LOWER_FILT_FREQ), \ + "Lower edge of filters" }, \ + \ + { "-upperf", \ + ARG_FLOATING, \ + ARG_STRINGIFY(DEFAULT_UPPER_FILT_FREQ), \ + "Upper edge of filters" }, \ + \ + { "-unit_area", \ + ARG_BOOLEAN, \ + "yes", \ + "Normalize mel filters to unit area" }, \ + \ + { "-round_filters", \ + ARG_BOOLEAN, \ + "yes", \ + "Round mel filter frequencies to DFT points" }, \ + \ + { "-ncep", \ + ARG_INTEGER, \ + ARG_STRINGIFY(DEFAULT_NUM_CEPSTRA), \ + "Number of cep coefficients" }, \ + \ + { "-doublebw", \ + ARG_BOOLEAN, \ + "no", \ + "Use double bandwidth filters (same center freq)" }, \ + \ + { "-lifter", \ + ARG_INTEGER, \ + "0", \ + "Length of sin-curve for liftering, or 0 for no liftering." }, \ + \ + { "-input_endian", \ + ARG_STRING, \ + NATIVE_ENDIAN, \ + "Endianness of input data, big or little, ignored if NIST or MS Wav" }, \ + \ + { "-warp_type", \ + ARG_STRING, \ + DEFAULT_WARP_TYPE, \ + "Warping function type (or shape)" }, \ + \ + { "-warp_params", \ + ARG_STRING, \ + NULL, \ + "Parameters defining the warping function" }, \ + \ + { "-dither", \ + ARG_BOOLEAN, \ + "no", \ + "Add 1/2-bit noise" }, \ + \ + { "-seed", \ + ARG_INTEGER, \ + ARG_STRINGIFY(SEED), \ + "Seed for random number generator; if less than zero, pick our own" }, \ + \ + { "-remove_dc", \ + ARG_BOOLEAN, \ + "no", \ + "Remove DC offset from each frame" }, \ + { "-remove_noise", \ + ARG_BOOLEAN, \ + "no", \ + "Remove noise using spectral subtraction" }, \ + { "-verbose", \ + ARG_BOOLEAN, \ + "no", \ + "Show input filenames" } + + +#ifdef FIXED_POINT +/** MFCC computation type. */ +typedef fixed32 mfcc_t; + +/** Convert a floating-point value to mfcc_t. */ +#define FLOAT2MFCC(x) FLOAT2FIX(x) +/** Convert a mfcc_t value to floating-point. */ +#define MFCC2FLOAT(x) FIX2FLOAT(x) +/** Multiply two mfcc_t values. */ +#define MFCCMUL(a,b) FIXMUL(a,b) +#define MFCCLN(x,in,out) FIXLN_ANY(x,in,out) +#else /* !FIXED_POINT */ + +/** MFCC computation type. */ +typedef float32 mfcc_t; +/** Convert a floating-point value to mfcc_t. */ +#define FLOAT2MFCC(x) (x) +/** Convert a mfcc_t value to floating-point. */ +#define MFCC2FLOAT(x) (x) +/** Multiply two mfcc_t values. */ +#define MFCCMUL(a,b) ((a)*(b)) +#define MFCCLN(x,in,out) log(x) +#endif /* !FIXED_POINT */ + +/** + * Structure for the front-end computation. + */ +typedef struct fe_s fe_t; + +/** + * Error codes returned by stuff. + */ +enum fe_error_e { + FE_SUCCESS = 0, + FE_OUTPUT_FILE_SUCCESS = 0, + FE_CONTROL_FILE_ERROR = -1, + FE_START_ERROR = -2, + FE_UNKNOWN_SINGLE_OR_BATCH = -3, + FE_INPUT_FILE_OPEN_ERROR = -4, + FE_INPUT_FILE_READ_ERROR = -5, + FE_MEM_ALLOC_ERROR = -6, + FE_OUTPUT_FILE_WRITE_ERROR = -7, + FE_OUTPUT_FILE_OPEN_ERROR = -8, + FE_ZERO_ENERGY_ERROR = -9, + FE_INVALID_PARAM_ERROR = -10 +}; + +/** + * Get the default set of arguments for fe_init_auto_r(). + * + * @return Pointer to an argument structure which can be passed to + * cmd_ln_init() in friends to create argument structures for + * fe_init_auto_r(). + */ +SPHINXBASE_EXPORT +arg_t const *fe_get_args(void); + +/** + * Initialize a front-end object from a command-line parse. + * + * @param config Command-line object, as returned by cmd_ln_parse_r() + * or cmd_ln_parse_file(). Ownership is retained by the + * fe_t, so you may free this if you no longer need it. + * @return Newly created front-end object. + */ +SPHINXBASE_EXPORT +fe_t *fe_init_auto_r(cmd_ln_t *config); + +/** + * Retrieve the command-line object used to initialize this front-end. + * + * @return command-line object for this front-end. This pointer is + * owned by the fe_t, so you should not attempt to free it + * manually. + */ +SPHINXBASE_EXPORT +cmd_ln_t *fe_get_config(fe_t *fe); + +/** + * Start processing an utterance. + * @return 0 for success, <0 for error (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_start_utt(fe_t *fe); + +/** + * Get the dimensionality of the output of this front-end object. + * + * This is guaranteed to be the number of values in one frame of + * output from fe_end_utt(), fe_process_frame(), and + * fe_process_frames(). It is usually the number of MFCC + * coefficients, but it might be the number of log-spectrum bins, if + * the -logspec or -smoothspec options to + * fe_init_auto_r() were true. + * + * @param fe Front-end object + * @return Dimensionality of front-end output. + */ +SPHINXBASE_EXPORT +int fe_get_output_size(fe_t *fe); + +/** + * Get the dimensionality of the input to this front-end object. + * + * This function retrieves the number of input samples consumed by one + * frame of processing. To obtain one frame of output, you must have + * at least *out_frame_size samples. To obtain N + * frames of output, you must have at least (N-1) * + * *out_frame_shift + *out_frame_size input samples. + * + * @param fe Front-end object + * @param out_frame_shift Output: Number of samples between each frame start. + * @param out_frame_size Output: Number of samples in each frame. + */ +SPHINXBASE_EXPORT +void fe_get_input_size(fe_t *fe, int *out_frame_shift, + int *out_frame_size); + +/** + * Finish processing an utterance. + * + * This function also collects any remaining samples and calculates a + * final cepstral vector. If there are overflow samples remaining, it + * will pad with zeros to make a complete frame. + * + * @param fe Front-end object. + * @param out_cepvector Buffer to hold a residual cepstral vector, or NULL + * if you wish to ignore it. Must be large enough + * @param out_nframes Number of frames of residual cepstra created + * (either 0 or 1). + * @return 0 for success, <0 for error (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_end_utt(fe_t *fe, mfcc_t *out_cepvector, int32 *out_nframes); + +/** + * Retain ownership of a front end object. + * + * @return pointer to the retained front end. + */ +SPHINXBASE_EXPORT +fe_t *fe_retain(fe_t *fe); + +/** + * Free the front end. + * + * Releases resources associated with the front-end object. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int fe_free(fe_t *fe); + +/** + * Process one frame of samples. + * + * @param spch Speech samples (signed 16-bit linear PCM) + * @param nsamps Number of samples in spch + * @param buf_cep Buffer which will receive one frame of features. + * @return 0 for success, <0 for error (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_process_frame(fe_t *fe, int16 const *spch, + int32 nsamps, mfcc_t *out_cep); + +/** + * Process a block of samples. + * + * This function generates up to *inout_nframes of + * features, or as many as can be generated from + * *inout_nsamps samples. + * + * On exit, the inout_spch, inout_nsamps, + * and inout_nframes parameters are updated to point to + * the remaining sample data, the number of remaining samples, and the + * number of frames processed, respectively. This allows you to call + * this repeatedly to process a large block of audio in small (say, + * 5-frame) chunks: + * + * int16 *bigbuf, *p; + * mfcc_t **cepstra; + * int32 nsamps; + * int32 nframes = 5; + * + * cepstra = (mfcc_t **) + * ckd_calloc_2d(nframes, fe_get_output_size(fe), sizeof(**cepstra)); + * p = bigbuf; + * while (nsamps) { + * nframes = 5; + * fe_process_frames(fe, &p, &nsamps, cepstra, &nframes); + * // Now do something with these frames... + * if (nframes) + * do_some_stuff(cepstra, nframes); + * } + * + * @param inout_spch Input: Pointer to pointer to speech samples + * (signed 16-bit linear PCM). + * Output: Pointer to remaining samples. + * @param inout_nsamps Input: Pointer to maximum number of samples to + * process. + * Output: Number of samples remaining in input buffer. + * @param buf_cep Two-dimensional buffer (allocated with + * ckd_calloc_2d()) which will receive frames of output + * data. If NULL, no actual processing will be done, + * and the maximum number of output frames which would + * be generated is returned in + * *inout_nframes. + * @param inout_nframes Input: Pointer to maximum number of frames to + * generate. + * Output: Number of frames actually generated. + * @return 0 for success, <0 for failure (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_process_frames(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes); + +/** + * Process a block of samples, returning as many frames as possible. + * + * This function processes all the samples in a block of data and + * returns a newly allocated block of feature vectors. This block + * needs to be freed with fe_free_2d() after use. + * + * It is possible for there to be some left-over data which could not + * fit in a complete frame. This data can be processed with + * fe_end_utt(). + * + * This function is deprecated in favor of fe_process_frames(). + * + * @return 0 for success, <0 for failure (see enum fe_error_e) + */ +SPHINXBASE_EXPORT +int fe_process_utt(fe_t *fe, /**< A front end object */ + int16 const *spch, /**< The speech samples */ + size_t nsamps, /**< number of samples*/ + mfcc_t ***cep_block, /**< Output pointer to cepstra */ + int32 *nframes /**< Number of frames processed */ + ); + +/** + * Free the output pointer returned by fe_process_utt(). + **/ +SPHINXBASE_EXPORT +void fe_free_2d(void *arr); + +/** + * Convert a block of mfcc_t to float32 (can be done in-place) + **/ +SPHINXBASE_EXPORT +int fe_mfcc_to_float(fe_t *fe, + mfcc_t **input, + float32 **output, + int32 nframes); + +/** + * Convert a block of float32 to mfcc_t (can be done in-place) + **/ +SPHINXBASE_EXPORT +int fe_float_to_mfcc(fe_t *fe, + float32 **input, + mfcc_t **output, + int32 nframes); + +/** + * Process one frame of log spectra into MFCC using discrete cosine + * transform. + * + * This uses a variant of the DCT-II where the first frequency bin is + * scaled by 0.5. Unless somebody misunderstood the DCT-III equations + * and thought that's what they were implementing here, this is + * ostensibly done to account for the symmetry properties of the + * DCT-II versus the DFT - the first coefficient of the input is + * assumed to be repeated in the negative frequencies, which is not + * the case for the DFT. (This begs the question, why not just use + * the DCT-I, since it has the appropriate symmetry properties...) + * Moreover, this is bogus since the mel-frequency bins on which we + * are doing the DCT don't extend to the edge of the DFT anyway. + * + * This also means that the matrix used in computing this DCT can not + * be made orthogonal, and thus inverting the transform is difficult. + * Therefore if you want to do cepstral smoothing or have some other + * reason to invert your MFCCs, use fe_logspec_dct2() and its inverse + * fe_logspec_dct3() instead. + * + * Also, it normalizes by 1/nfilt rather than 2/nfilt, for some reason. + **/ +SPHINXBASE_EXPORT +int fe_logspec_to_mfcc(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_spec, /**< One frame of spectrum */ + mfcc_t *fr_cep /**< One frame of cepstrum */ + ); + +/** + * Convert log spectra to MFCC using DCT-II. + * + * This uses the "unitary" form of the DCT-II, i.e. with a scaling + * factor of sqrt(2/N) and a "beta" factor of sqrt(1/2) applied to the + * cos(0) basis vector (i.e. the one corresponding to the DC + * coefficient in the output). + **/ +SPHINXBASE_EXPORT +int fe_logspec_dct2(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_spec, /**< One frame of spectrum */ + mfcc_t *fr_cep /**< One frame of cepstrum */ + ); + +/** + * Convert MFCC to log spectra using DCT-III. + * + * This uses the "unitary" form of the DCT-III, i.e. with a scaling + * factor of sqrt(2/N) and a "beta" factor of sqrt(1/2) applied to the + * cos(0) basis vector (i.e. the one corresponding to the DC + * coefficient in the input). + **/ +SPHINXBASE_EXPORT +int fe_mfcc_dct3(fe_t *fe, /**< A fe structure */ + const mfcc_t *fr_cep, /**< One frame of cepstrum */ + mfcc_t *fr_spec /**< One frame of spectrum */ + ); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h new file mode 100644 index 0000000..421852d --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h @@ -0,0 +1,469 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * feat.h -- Cepstral features computation. + */ + +#ifndef _S3_FEAT_H_ +#define _S3_FEAT_H_ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** \file feat.h + * \brief compute the dynamic coefficients from the cepstral vector. + */ +#define LIVEBUFBLOCKSIZE 256 /** Blocks of 256 vectors allocated + for livemode decoder */ +#define S3_MAX_FRAMES 15000 /* RAH, I believe this is still too large, but better than before */ + +#define cepstral_to_feature_command_line_macro() \ +{ "-feat", \ + ARG_STRING, \ + "1s_c_d_dd", \ + "Feature stream type, depends on the acoustic model" }, \ +{ "-ceplen", \ + ARG_INTEGER, \ + "13", \ + "Number of components in the input feature vector" }, \ +{ "-cmn", \ + ARG_STRING, \ + "live", \ + "Cepstral mean normalization scheme ('live', 'batch', or 'none')" }, \ +{ "-cmninit", \ + ARG_STRING, \ + "40,3,-1", \ + "Initial values (comma-separated) for cepstral mean when 'live' is used" }, \ +{ "-varnorm", \ + ARG_BOOLEAN, \ + "no", \ + "Variance normalize each utterance (only if CMN == current)" }, \ +{ "-agc", \ + ARG_STRING, \ + "none", \ + "Automatic gain control for c0 ('max', 'emax', 'noise', or 'none')" }, \ +{ "-agcthresh", \ + ARG_FLOATING, \ + "2.0", \ + "Initial threshold for automatic gain control" }, \ +{ "-lda", \ + ARG_STRING, \ + NULL, \ + "File containing transformation matrix to be applied to features (single-stream features only)" }, \ +{ "-ldadim", \ + ARG_INTEGER, \ + "0", \ + "Dimensionality of output of feature transformation (0 to use entire matrix)" }, \ +{"-svspec", \ + ARG_STRING, \ + NULL, \ + "Subvector specification (e.g., 24,0-11/25,12-23/26-38 or 0-12/13-25/26-38)"} + +/** + * \struct feat_t + * \brief Structure for describing a speech feature type + * Structure for describing a speech feature type (no. of streams and stream widths), + * as well as the computation for converting the input speech (e.g., Sphinx-II format + * MFC cepstra) into this type of feature vectors. + */ +typedef struct feat_s { + int refcount; /**< Reference count. */ + char *name; /**< Printable name for this feature type */ + int32 cepsize; /**< Size of input speech vector (typically, a cepstrum vector) */ + int32 n_stream; /**< Number of feature streams; e.g., 4 in Sphinx-II */ + uint32 *stream_len; /**< Vector length of each feature stream */ + int32 window_size; /**< Number of extra frames around given input frame needed to compute + corresponding output feature (so total = window_size*2 + 1) */ + int32 n_sv; /**< Number of subvectors */ + uint32 *sv_len; /**< Vector length of each subvector */ + int32 **subvecs; /**< Subvector specification (or NULL for none) */ + mfcc_t *sv_buf; /**< Temporary copy buffer for subvector projection */ + int32 sv_dim; /**< Total dimensionality of subvector (length of sv_buf) */ + + cmn_type_t cmn; /**< Type of CMN to be performed on each utterance */ + int32 varnorm; /**< Whether variance normalization is to be performed on each utt; + Irrelevant if no CMN is performed */ + agc_type_t agc; /**< Type of AGC to be performed on each utterance */ + + /** + * Feature computation function. + * @param fcb the feat_t describing this feature type + * @param input pointer into the input cepstra + * @param feat a 2-d array of output features (n_stream x stream_len) + * @return 0 if successful, -ve otherwise. + * + * Function for converting window of input speech vector + * (input[-window_size..window_size]) to output feature vector + * (feat[stream][]). If NULL, no conversion available, the + * speech input must be feature vector itself. + **/ + void (*compute_feat)(struct feat_s *fcb, mfcc_t **input, mfcc_t **feat); + cmn_t *cmn_struct; /**< Structure that stores the temporary variables for cepstral + means normalization*/ + agc_t *agc_struct; /**< Structure that stores the temporary variables for acoustic + gain control*/ + + mfcc_t **cepbuf; /**< Circular buffer of MFCC frames for live feature computation. */ + mfcc_t **tmpcepbuf; /**< Array of pointers into cepbuf to handle border cases. */ + int32 bufpos; /**< Write index in cepbuf. */ + int32 curpos; /**< Read index in cepbuf. */ + + mfcc_t ***lda; /**< Array of linear transformations (for LDA, MLLT, or whatever) */ + uint32 n_lda; /**< Number of linear transformations in lda. */ + uint32 out_dim; /**< Output dimensionality */ +} feat_t; + +/** + * Name of feature type. + */ +#define feat_name(f) ((f)->name) +/** + * Input dimensionality of feature. + */ +#define feat_cepsize(f) ((f)->cepsize) +/** + * Size of dynamic feature window. + */ +#define feat_window_size(f) ((f)->window_size) +/** + * Number of feature streams. + * + * @deprecated Do not use this, use feat_dimension1() instead. + */ +#define feat_n_stream(f) ((f)->n_stream) +/** + * Length of feature stream i. + * + * @deprecated Do not use this, use feat_dimension2() instead. + */ +#define feat_stream_len(f,i) ((f)->stream_len[i]) +/** + * Number of streams or subvectors in feature output. + */ +#define feat_dimension1(f) ((f)->n_sv ? (f)->n_sv : f->n_stream) +/** + * Dimensionality of stream/subvector i in feature output. + */ +#define feat_dimension2(f,i) ((f)->lda ? (f)->out_dim : ((f)->sv_len ? (f)->sv_len[i] : f->stream_len[i])) +/** + * Total dimensionality of feature output. + */ +#define feat_dimension(f) ((f)->out_dim) +/** + * Array with stream/subvector lengths + */ +#define feat_stream_lengths(f) ((f)->lda ? (&(f)->out_dim) : (f)->sv_len ? (f)->sv_len : f->stream_len) + +/** + * Parse subvector specification string. + * + * Format of specification: + * \li '/' separated list of subvectors + * \li each subvector is a ',' separated list of subranges + * \li each subrange is a single \verbatim \endverbatim or + * \verbatim - \endverbatim (inclusive), where + * \verbatim \endverbatim is a feature vector dimension + * specifier. + * + * E.g., "24,0-11/25,12-23/26,27-38" has: + * \li 3 subvectors + * \li the 1st subvector has feature dims: 24, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, and 11. + * \li etc. + * + * @param str subvector specification string. + * @return allocated 2-D array of subvector specs (free with + * subvecs_free()). If there are N subvectors specified, subvec[N] = + * NULL; and each subvec[0]..subvec[N-1] is -1 terminated vector of + * feature dims. + */ +SPHINXBASE_EXPORT +int32 **parse_subvecs(char const *str); + +/** + * Free array of subvector specs. + */ +SPHINXBASE_EXPORT +void subvecs_free(int32 **subvecs); + + +/** + * Allocate an array to hold several frames worth of feature vectors. The returned value + * is the mfcc_t ***data array, organized as follows: + * + * - data[0][0] = frame 0 stream 0 vector, data[0][1] = frame 0 stream 1 vector, ... + * - data[1][0] = frame 1 stream 0 vector, data[0][1] = frame 1 stream 1 vector, ... + * - data[2][0] = frame 2 stream 0 vector, data[0][1] = frame 2 stream 1 vector, ... + * - ... + * + * NOTE: For I/O convenience, the entire data area is allocated as one contiguous block. + * @return pointer to the allocated space if successful, NULL if any error. + */ +SPHINXBASE_EXPORT +mfcc_t ***feat_array_alloc(feat_t *fcb, /**< In: Descriptor from feat_init(), used + to obtain number of streams and stream sizes */ + int32 nfr /**< In: Number of frames for which to allocate */ + ); + +/** + * Realloate the array of features. Requires us to know the old size + */ +SPHINXBASE_EXPORT +mfcc_t ***feat_array_realloc(feat_t *fcb, /**< In: Descriptor from feat_init(), used + to obtain number of streams and stream sizes */ + mfcc_t ***old_feat, /**< Feature array. Freed */ + int32 ofr, /**< In: Previous number of frames */ + int32 nfr /**< In: Number of frames for which to allocate */ + ); + +/** + * Free a buffer allocated with feat_array_alloc() + */ +SPHINXBASE_EXPORT +void feat_array_free(mfcc_t ***feat); + + +/** + * Initialize feature module to use the selected type of feature stream. + * One-time only initialization at the beginning of the program. Input type + * is a string defining the kind of input->feature conversion desired: + * + * - "s2_4x": s2mfc->Sphinx-II 4-feature stream, + * - "1s_c_d_dd": s2mfc->Sphinx 3.x single feature stream, + * - "s3_1x39": s2mfc->Sphinx 3.0 single feature stream, + * - "n1,n2,n3,...": Explicit feature vector layout spec. with comma-separated + * feature stream lengths. In this case, the input data is already in the + * feature format and there is no conversion necessary. + * + * @return (feat_t *) descriptor if successful, NULL if error. Caller + * must not directly modify the contents of the returned value. + */ +SPHINXBASE_EXPORT +feat_t *feat_init(char const *type,/**< In: Type of feature stream */ + cmn_type_t cmn, /**< In: Type of cepstram mean normalization to + be done before feature computation; can be + CMN_NONE (for none) */ + int32 varnorm, /**< In: (boolean) Whether variance + normalization done on each utt; only + applicable if CMN also done */ + agc_type_t agc, /**< In: Type of automatic gain control to be + done before feature computation */ + int32 breport, /**< In: Whether to show a report for feat_t */ + int32 cepsize /**< Number of components in the input vector + (or 0 for the default for this feature type, + which is usually 13) */ + ); + +/** + * Add an LDA transformation to the feature module from a file. + * @return 0 for success or -1 if reading the LDA file failed. + **/ +SPHINXBASE_EXPORT +int32 feat_read_lda(feat_t *feat, /**< In: Descriptor from feat_init() */ + const char *ldafile, /**< In: File to read the LDA matrix from. */ + int32 dim /**< In: Dimensionality of LDA output. */ + ); + +/** + * Transform a block of features using the feature module's LDA transform. + **/ +SPHINXBASE_EXPORT +void feat_lda_transform(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t ***inout_feat, /**< Feature block to transform. */ + uint32 nfr /**< In: Number of frames in inout_feat. */ + ); + +/** + * Add a subvector specification to the feature module. + * + * The subvector splitting will be performed after dynamic feature + * computation, CMN, AGC, and any LDA transformation. The number of + * streams in the dynamic feature type must be one, as with LDA. + * + * After adding a subvector specification, the output of feature + * computation will be split into multiple subvectors, and + * feat_array_alloc() will allocate pointers accordingly. The number + * of streams will remain the + * + * @param fcb the feature descriptor. + * @param subvecs subvector specification. This pointer is retained + * by the feat_t and should not be freed manually. + * @return 0 for success or -1 if the subvector specification was + * invalid. + */ +SPHINXBASE_EXPORT +int feat_set_subvecs(feat_t *fcb, int32 **subvecs); + +/** + * Print the given block of feature vectors to the given FILE. + */ +SPHINXBASE_EXPORT +void feat_print(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t ***feat, /**< In: Feature data to be printed */ + int32 nfr, /**< In: Number of frames of feature data above */ + FILE *fp /**< In: Output file pointer */ + ); + + +/** + * Read a specified MFC file (or given segment within it), perform + * CMN/AGC as indicated by fcb, and compute feature + * vectors. Feature vectors are computed for the entire segment + * specified, by including additional surrounding or padding frames to + * accommodate the feature windows. + * + * @return Number of frames of feature vectors computed if successful; + * -1 if any error. If feat is NULL, then no actual + * computation will be done, and the number of frames which must be + * allocated will be returned. + * + * A note on how the file path is constructed: If the control file + * already specifies extension or absolute path, then these are not + * applied. The default extension is defined by the application. + */ +SPHINXBASE_EXPORT +int32 feat_s2mfc2feat(feat_t *fcb, /**< In: Descriptor from feat_init() */ + const char *file, /**< In: File to be read */ + const char *dir, /**< In: Directory prefix for file, + if needed; can be NULL */ + const char *cepext,/**< In: Extension of the + cepstrum file.It cannot be + NULL */ + int32 sf, int32 ef, /* Start/End frames + within file to be read. Use + 0,-1 to process entire + file */ + mfcc_t ***feat, /**< Out: Computed feature vectors; + caller must allocate this space */ + int32 maxfr /**< In: Available space (number of frames) in + above feat array; it must be + sufficient to hold the result. + Pass -1 for no limit. */ + ); + + +/** + * Feature computation routine for live mode decoder. + * + * This function computes features for blocks of incoming data. It + * retains an internal buffer for computing deltas, which means that + * the number of output frames will not necessarily equal the number + * of input frames. + * + * It is very important to realize that the number of + * output frames can be greater than the number of + * input frames, specifically when endutt is true. It is + * guaranteed to never exceed *inout_ncep + + * feat_window_size(fcb). You MUST have + * allocated at least that many frames in ofeat, or you + * will experience a buffer overflow. + * + * If beginutt and endutt are both true, CMN_CURRENT and AGC_MAX will + * be done. Otherwise only CMN_PRIOR and AGC_EMAX will be done. + * + * If beginutt is false, endutt is true, and the number of input + * frames exceeds the input size, then end-of-utterance processing + * won't actually be done. This condition can easily be checked, + * because *inout_ncep will equal the return value on + * exit, and will also be smaller than the value of + * *inout_ncep on entry. + * + * @return The number of output frames actually computed. + **/ +SPHINXBASE_EXPORT +int32 feat_s2mfc2feat_live(feat_t *fcb, /**< In: Descriptor from feat_init() */ + mfcc_t **uttcep, /**< In: Incoming cepstral buffer */ + int32 *inout_ncep,/**< In: Size of incoming buffer. + Out: Number of incoming frames consumed. */ + int32 beginutt, /**< In: Begining of utterance flag */ + int32 endutt, /**< In: End of utterance flag */ + mfcc_t ***ofeat /**< In: Output feature buffer. See + VERY IMPORTANT note + about the size of this buffer above. */ + ); + + +/** + * Update the normalization stats, possibly in the end of utterance + * + */ +SPHINXBASE_EXPORT +void feat_update_stats(feat_t *fcb); + + +/** + * Retain ownership of feat_t. + * + * @return pointer to retained feat_t. + */ +SPHINXBASE_EXPORT +feat_t *feat_retain(feat_t *f); + +/** + * Release resource associated with feat_t + * + * @return new reference count (0 if freed) + */ +SPHINXBASE_EXPORT +int feat_free(feat_t *f /**< In: feat_t */ + ); + +/** + * Report the feat_t data structure + */ +SPHINXBASE_EXPORT +void feat_report(feat_t *f /**< In: feat_t */ + ); +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h new file mode 100644 index 0000000..b69dcde --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h @@ -0,0 +1,112 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * filename.h -- File and path name operations. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: filename.h,v $ + * Revision 1.7 2005/06/22 03:01:07 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 30-Oct-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Started. + */ + + +#ifndef _LIBUTIL_FILENAME_H_ +#define _LIBUTIL_FILENAME_H_ + +/* Win32/WinCE DLL gunk */ +#include +#include + +/**\file filename.h + *\brief File names related operation + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Returns the last part of the path, without modifying anything in memory. + */ +SPHINXBASE_EXPORT +const char *path2basename(const char *path); + +/** + * Strip off filename from the given path and copy the directory name into dir + * Caller must have allocated dir (hint: it's always shorter than path). + */ +SPHINXBASE_EXPORT +void path2dirname(const char *path, char *dir); + + +/** + * Strip off the smallest trailing file-extension suffix and copy + * the rest into the given root argument. Caller must have + * allocated root. + */ +SPHINXBASE_EXPORT +void strip_fileext(const char *file, char *root); + +/** + * Test whether a pathname is absolute for the current OS. + */ +SPHINXBASE_EXPORT +int path_is_absolute(const char *file); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h new file mode 100644 index 0000000..8f8f0ad --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h @@ -0,0 +1,145 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== */ + +/* Fixed-point arithmetic macros. + * + * Author: David Huggins-Daines + */ + +#ifndef _FIXPOINT_H_ +#define _FIXPOINT_H_ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#ifndef DEFAULT_RADIX +#define DEFAULT_RADIX 12 +#endif + +/** Fixed-point computation type. */ +typedef int32 fixed32; + +/** Convert floating point to fixed point. */ +#define FLOAT2FIX_ANY(x,radix) \ + (((x)<0.0) ? \ + ((fixed32)((x)*(float32)(1<<(radix)) - 0.5)) \ + : ((fixed32)((x)*(float32)(1<<(radix)) + 0.5))) +#define FLOAT2FIX(x) FLOAT2FIX_ANY(x,DEFAULT_RADIX) +/** Convert fixed point to floating point. */ +#define FIX2FLOAT_ANY(x,radix) ((float32)(x)/(1<<(radix))) +#define FIX2FLOAT(x) FIX2FLOAT_ANY(x,DEFAULT_RADIX) + +/** + * Multiply two fixed point numbers with an arbitrary radix point. + * + * A veritable multiplicity of implementations exist, starting with + * the fastest ones... + */ + +#if defined(__arm__) && !defined(__thumb__) +/* + * This works on most modern ARMs but *only* in ARM mode (for obvious + * reasons), so don't use it in Thumb mode (but why are you building + * signal processing code in Thumb mode?!) + */ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,r) ({ \ + int cl, ch, _a = a, _b = b; \ + __asm__ ("smull %0, %1, %2, %3\n" \ + "mov %0, %0, lsr %4\n" \ + "orr %0, %0, %1, lsl %5\n" \ + : "=&r" (cl), "=&r" (ch) \ + : "r" (_a), "r" (_b), "i" (r), "i" (32-(r)));\ + cl; }) + +#elif defined(_MSC_VER) || (defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8) +/* Standard systems*/ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,radix) ((fixed32)(((int64)(a)*(b))>>(radix))) + +#else +/* Most general case where 'long long' doesn't exist or is slow. */ +#define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX) +#define FIXMUL_ANY(a,b,radix) ({ \ + int32 _ah, _bh; \ + uint32 _al, _bl, _t, c; \ + _ah = ((int32)(a)) >> 16; \ + _bh = ((int32)(b)) >> 16; \ + _al = ((uint32)(a)) & 0xffff; \ + _bl = ((uint32)(b)) & 0xffff; \ + _t = _ah * _bl + _al * _bh; \ + c = (fixed32)(((_al * _bl) >> (radix)) \ + + ((_ah * _bh) << (32 - (radix))) \ + + ((radix) > 16 ? (_t >> (radix - 16)) : (_t << (16 - radix)))); \ + c;}) +#endif + +/* Various fixed-point logarithmic functions that we need. */ +/** Minimum value representable in log format. */ +#define MIN_FIXLOG -2829416 /* log(1e-300) * (1< +#include + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* + * A single transition in the FSG. + */ +typedef struct fsg_link_s { + int32 from_state; + int32 to_state; + int32 logs2prob; /**< log(transition probability)*lw */ + int32 wid; /**< Word-ID; <0 if epsilon or null transition */ +} fsg_link_t; + +/* Access macros */ +#define fsg_link_from_state(l) ((l)->from_state) +#define fsg_link_to_state(l) ((l)->to_state) +#define fsg_link_wid(l) ((l)->wid) +#define fsg_link_logs2prob(l) ((l)->logs2prob) + +/** + * Adjacency list (opaque) for a state in an FSG. + */ +typedef struct trans_list_s trans_list_t; + +/** + * Word level FSG definition. + * States are simply integers 0..n_state-1. + * A transition emits a word and has a given probability of being taken. + * There can also be null or epsilon transitions, with no associated emitted + * word. + */ +typedef struct fsg_model_s { + int refcount; /**< Reference count. */ + char *name; /**< A unique string identifier for this FSG */ + int32 n_word; /**< Number of unique words in this FSG */ + int32 n_word_alloc; /**< Number of words allocated in vocab */ + char **vocab; /**< Vocabulary for this FSG. */ + bitvec_t *silwords; /**< Indicates which words are silence/fillers. */ + bitvec_t *altwords; /**< Indicates which words are pronunciation alternates. */ + logmath_t *lmath; /**< Pointer to log math computation object. */ + int32 n_state; /**< number of states in FSG */ + int32 start_state; /**< Must be in the range [0..n_state-1] */ + int32 final_state; /**< Must be in the range [0..n_state-1] */ + float32 lw; /**< Language weight that's been applied to transition + logprobs */ + trans_list_t *trans; /**< Transitions out of each state, if any. */ + listelem_alloc_t *link_alloc; /**< Allocator for FSG links. */ +} fsg_model_t; + +/* Access macros */ +#define fsg_model_name(f) ((f)->name) +#define fsg_model_n_state(f) ((f)->n_state) +#define fsg_model_start_state(f) ((f)->start_state) +#define fsg_model_final_state(f) ((f)->final_state) +#define fsg_model_log(f,p) logmath_log((f)->lmath, p) +#define fsg_model_lw(f) ((f)->lw) +#define fsg_model_n_word(f) ((f)->n_word) +#define fsg_model_word_str(f,wid) (wid == -1 ? "(NULL)" : (f)->vocab[wid]) + +/** + * Iterator over arcs. + */ +typedef struct fsg_arciter_s fsg_arciter_t; + +/** + * Have silence transitions been added? + */ +#define fsg_model_has_sil(f) ((f)->silwords != NULL) + +/** + * Have alternate word transitions been added? + */ +#define fsg_model_has_alt(f) ((f)->altwords != NULL) + +#define fsg_model_is_filler(f,wid) \ + (fsg_model_has_sil(f) ? bitvec_is_set((f)->silwords, wid) : FALSE) +#define fsg_model_is_alt(f,wid) \ + (fsg_model_has_alt(f) ? bitvec_is_set((f)->altwords, wid) : FALSE) + +/** + * Create a new FSG. + */ +SPHINXBASE_EXPORT +fsg_model_t *fsg_model_init(char const *name, logmath_t *lmath, + float32 lw, int32 n_state); + +/** + * Read a word FSG from the given file and return a pointer to the structure + * created. Return NULL if any error occurred. + * + * File format: + * + *
+ *   Any number of comment lines; ignored
+ *   FSG_BEGIN []
+ *   N <#states>
+ *   S 
+ *   F 
+ *   T    []
+ *   T ...
+ *   ... (any number of state transitions)
+ *   FSG_END
+ *   Any number of comment lines; ignored
+ * 
+ * + * The FSG spec begins with the line containing the keyword FSG_BEGIN. + * It has an optional fsg name string. If not present, the FSG has the empty + * string as its name. + * + * Following the FSG_BEGIN declaration is the number of states, the start + * state, and the final state, each on a separate line. States are numbered + * in the range [0 .. -1]. + * + * These are followed by all the state transitions, each on a separate line, + * and terminated by the FSG_END line. A state transition has the given + * probability of being taken, and emits the given word. The word emission + * is optional; if word-string omitted, it is an epsilon or null transition. + * + * Comments can also be embedded within the FSG body proper (i.e. between + * FSG_BEGIN and FSG_END): any line with a # character in col 1 is treated + * as a comment line. + * + * Return value: a new fsg_model_t structure if the file is successfully + * read, NULL otherwise. + */ +SPHINXBASE_EXPORT +fsg_model_t *fsg_model_readfile(const char *file, logmath_t *lmath, float32 lw); + +/** + * Like fsg_model_readfile(), but from an already open stream. + */ +SPHINXBASE_EXPORT +fsg_model_t *fsg_model_read(FILE *fp, logmath_t *lmath, float32 lw); + +/** + * Retain ownership of an FSG. + * + * @return Pointer to retained FSG. + */ +SPHINXBASE_EXPORT +fsg_model_t *fsg_model_retain(fsg_model_t *fsg); + +/** + * Free the given word FSG. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int fsg_model_free(fsg_model_t *fsg); + +/** + * Add a word to the FSG vocabulary. + * + * @return Word ID for this new word. + */ +SPHINXBASE_EXPORT +int fsg_model_word_add(fsg_model_t *fsg, char const *word); + +/** + * Look up a word in the FSG vocabulary. + * + * @return Word ID for this word + */ +SPHINXBASE_EXPORT +int fsg_model_word_id(fsg_model_t *fsg, char const *word); + +/** + * Add the given transition to the FSG transition matrix. + * + * Duplicates (i.e., two transitions between the same states, with the + * same word label) are flagged and only the highest prob retained. + */ +SPHINXBASE_EXPORT +void fsg_model_trans_add(fsg_model_t * fsg, + int32 from, int32 to, int32 logp, int32 wid); + +/** + * Add a null transition between the given states. + * + * There can be at most one null transition between the given states; + * duplicates are flagged and only the best prob retained. Transition + * probs must be <= 1 (i.e., logprob <= 0). + * + * @return 1 if a new transition was added, 0 if the prob of an existing + * transition was upgraded; -1 if nothing was changed. + */ +SPHINXBASE_EXPORT +int32 fsg_model_null_trans_add(fsg_model_t * fsg, int32 from, int32 to, int32 logp); + +/** + * Add a "tag" transition between the given states. + * + * A "tag" transition is a null transition with a non-null word ID, + * which corresponds to a semantic tag or other symbol to be output + * when this transition is taken. + * + * As above, there can be at most one null or tag transition between + * the given states; duplicates are flagged and only the best prob + * retained. Transition probs must be <= 1 (i.e., logprob <= 0). + * + * @return 1 if a new transition was added, 0 if the prob of an existing + * transition was upgraded; -1 if nothing was changed. + */ +SPHINXBASE_EXPORT +int32 fsg_model_tag_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp, int32 wid); + +/** + * Obtain transitive closure of null transitions in the given FSG. + * + * @param nulls List of null transitions, or NULL to find them automatically. + * @return Updated list of null transitions. + */ +SPHINXBASE_EXPORT +glist_t fsg_model_null_trans_closure(fsg_model_t * fsg, glist_t nulls); + +/** + * Get the list of transitions (if any) from state i to j. + */ +SPHINXBASE_EXPORT +glist_t fsg_model_trans(fsg_model_t *fsg, int32 i, int32 j); + +/** + * Get an iterator over the outgoing transitions from state i. + */ +SPHINXBASE_EXPORT +fsg_arciter_t *fsg_model_arcs(fsg_model_t *fsg, int32 i); + +/** + * Get the current arc from the arc iterator. + */ +SPHINXBASE_EXPORT +fsg_link_t *fsg_arciter_get(fsg_arciter_t *itor); + +/** + * Move the arc iterator forward. + */ +SPHINXBASE_EXPORT +fsg_arciter_t *fsg_arciter_next(fsg_arciter_t *itor); + +/** + * Free the arc iterator (early termination) + */ +SPHINXBASE_EXPORT +void fsg_arciter_free(fsg_arciter_t *itor); +/** + * Get the null transition (if any) from state i to j. + */ +SPHINXBASE_EXPORT +fsg_link_t *fsg_model_null_trans(fsg_model_t *fsg, int32 i, int32 j); + +/** + * Add silence word transitions to each state in given FSG. + * + * @param state state to add a self-loop to, or -1 for all states. + * @param silprob probability of silence transition. + */ +SPHINXBASE_EXPORT +int fsg_model_add_silence(fsg_model_t * fsg, char const *silword, + int state, float32 silprob); + +/** + * Add alternate pronunciation transitions for a word in given FSG. + */ +SPHINXBASE_EXPORT +int fsg_model_add_alt(fsg_model_t * fsg, char const *baseword, + char const *altword); + +/** + * Write FSG to a file. + */ +SPHINXBASE_EXPORT +void fsg_model_write(fsg_model_t *fsg, FILE *fp); + +/** + * Write FSG to a file. + */ +SPHINXBASE_EXPORT +void fsg_model_writefile(fsg_model_t *fsg, char const *file); + +/** + * Write FSG to a file in AT&T FSM format. + */ +SPHINXBASE_EXPORT +void fsg_model_write_fsm(fsg_model_t *fsg, FILE *fp); + +/** + * Write FSG to a file in AT&T FSM format. + */ +SPHINXBASE_EXPORT +void fsg_model_writefile_fsm(fsg_model_t *fsg, char const *file); + +/** + * Write FSG symbol table to a file (for AT&T FSM) + */ +SPHINXBASE_EXPORT +void fsg_model_write_symtab(fsg_model_t *fsg, FILE *file); + +/** + * Write FSG symbol table to a file (for AT&T FSM) + */ +SPHINXBASE_EXPORT +void fsg_model_writefile_symtab(fsg_model_t *fsg, char const *file); + +#ifdef __cplusplus +} +#endif + +#endif /* __FSG_MODEL_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h new file mode 100644 index 0000000..5123c95 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h @@ -0,0 +1,177 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright +` notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp +*/ + +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * randgen.c : a portable random generator + * + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: genrand.h,v $ + * Revision 1.3 2005/06/22 03:01:50 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Nov-04 ARCHAN (archan@cs.cmu.edu) at Carnegie Mellon University + * First incorporated from the Mersenne Twister Random + * Number Generator package. It was chosen because it is + * in BSD-license and its performance is quite + * reasonable. Of course if you look at the inventors's + * page. This random generator can actually gives + * 19937-bits period. This is already far from we need. + * This will possibly good enough for the next 10 years. + * + * I also downgrade the code a little bit to avoid Sphinx's + * developers misused it. + */ + +#ifndef _LIBUTIL_GENRAND_H_ +#define _LIBUTIL_GENRAND_H_ + +#define S3_RAND_MAX_INT32 0x7fffffff +#include + +/* Win32/WinCE DLL gunk */ +#include + +/** \file genrand.h + *\brief High performance prortable random generator created by Takuji + *Nishimura and Makoto Matsumoto. + * + * A high performance which applied Mersene twister primes to generate + * random number. If probably seeded, the random generator can achieve + * 19937-bits period. For technical detail. Please take a look at + * (FIXME! Need to search for the web site.) http://www. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Macros to simplify calling of random generator function. + * + */ +#define s3_rand_seed(s) genrand_seed(s); +#define s3_rand_int31() genrand_int31() +#define s3_rand_real() genrand_real3() +#define s3_rand_res53() genrand_res53() + +/** + *Initialize the seed of the random generator. + */ +SPHINXBASE_EXPORT +void genrand_seed(unsigned long s); + +/** + *generates a random number on [0,0x7fffffff]-interval + */ +SPHINXBASE_EXPORT +long genrand_int31(void); + +/** + *generates a random number on (0,1)-real-interval + */ +SPHINXBASE_EXPORT +double genrand_real3(void); + +/** + *generates a random number on [0,1) with 53-bit resolution + */ +SPHINXBASE_EXPORT +double genrand_res53(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_LIBUTIL_GENRAND_H_*/ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h new file mode 100644 index 0000000..cdb18be --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h @@ -0,0 +1,242 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * glist.h -- Module for maintaining a generic, linear linked-list structure. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: glist.h,v $ + * Revision 1.9 2005/06/22 03:02:51 arthchan2003 + * 1, Fixed doxygen documentation, 2, add keyword. + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 09-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added glist_chkdup_*(). + * + * 13-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier version. + */ + + +/** + * \file glist.h + * \brief Generic linked-lists maintenance. + * + * Only insert at the head of the list. A convenient little + * linked-list package, but a double-edged sword: the user must keep + * track of the data type within the linked list elements. When it + * was first written, there was no selective deletions except to + * destroy the entire list. This is modified in later version. + * + * + * (C++ would be good for this, but that's a double-edged sword as well.) + */ + + +#ifndef _LIBUTIL_GLIST_H_ +#define _LIBUTIL_GLIST_H_ + +#include +/* Win32/WinCE DLL gunk */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** A node in a generic list + */ +typedef struct gnode_s { + anytype_t data; /** See prim_type.h */ + struct gnode_s *next; /** Next node in list */ +} gnode_t; +typedef gnode_t *glist_t; /** Head of a list of gnodes */ + + +/** Access macros, for convenience + */ +#define gnode_ptr(g) ((g)->data.ptr) +#define gnode_int32(g) ((g)->data.i) +#define gnode_uint32(g) ((g)->data.ui) +#define gnode_float32(g) ((float32)(g)->data.fl) +#define gnode_float64(g) ((g)->data.fl) +#define gnode_next(g) ((g)->next) + + +/** + * Create and prepend a new list node, with the given user-defined data, at the HEAD + * of the given generic list. Return the new list thus formed. + * g may be NULL to indicate an initially empty list. + */ +SPHINXBASE_EXPORT +glist_t glist_add_ptr (glist_t g, /**< a link list */ + void *ptr /**< a pointer */ + ); + +/** + * Create and prepend a new list node containing an integer. + */ +SPHINXBASE_EXPORT +glist_t glist_add_int32 (glist_t g, /**< a link list */ + int32 val /**< an integer value */ + ); +/** + * Create and prepend a new list node containing an unsigned integer. + */ +SPHINXBASE_EXPORT +glist_t glist_add_uint32 (glist_t g, /**< a link list */ + uint32 val /**< an unsigned integer value */ + ); +/** + * Create and prepend a new list node containing a single-precision float. + */ +SPHINXBASE_EXPORT +glist_t glist_add_float32 (glist_t g, /**< a link list */ + float32 val /**< a float32 vlaue */ + ); +/** + * Create and prepend a new list node containing a double-precision float. + */ +SPHINXBASE_EXPORT +glist_t glist_add_float64 (glist_t g, /**< a link list */ + float64 val /**< a float64 vlaue */ + ); + + + +/** + * Create and insert a new list node, with the given user-defined data, after + * the given generic node gn. gn cannot be NULL. + * Return ptr to the newly created gnode_t. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_ptr (gnode_t *gn, /**< a generic node which ptr will be inserted after it*/ + void *ptr /**< pointer inserted */ + ); +/** + * Create and insert a new list node containing an integer. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_int32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + int32 val /**< int32 inserted */ + ); +/** + * Create and insert a new list node containing an unsigned integer. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_uint32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + uint32 val /**< uint32 inserted */ + ); +/** + * Create and insert a new list node containing a single-precision float. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_float32 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + float32 val /**< float32 inserted */ + ); +/** + * Create and insert a new list node containing a double-precision float. + */ +SPHINXBASE_EXPORT +gnode_t *glist_insert_float64 (gnode_t *gn, /**< a generic node which a value will be inserted after it*/ + float64 val /**< float64 inserted */ + ); + +/** + * Reverse the order of the given glist. (glist_add() adds to the head; one might + * ultimately want the reverse of that.) + * NOTE: The list is reversed "in place"; i.e., no new memory is allocated. + * @return: The head of the new list. + */ +SPHINXBASE_EXPORT +glist_t glist_reverse (glist_t g /**< input link list */ + ); + + +/** + Count the number of element in a given link list + @return the number of elements in the given glist_t +*/ +SPHINXBASE_EXPORT +int32 glist_count (glist_t g /**< input link list */ + ); + +/** + * Free the given generic list; user-defined data contained within is not + * automatically freed. The caller must have done that already. + */ +SPHINXBASE_EXPORT +void glist_free (glist_t g); + + +/** + * Free the given node, gn, of a glist, pred being its predecessor in the list. + * Return ptr to the next node in the list after the freed node. + */ +SPHINXBASE_EXPORT +gnode_t *gnode_free(gnode_t *gn, + gnode_t *pred + ); + +/** + * Return the last node in the given list. + */ +SPHINXBASE_EXPORT +gnode_t *glist_tail (glist_t g); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h new file mode 100644 index 0000000..945628f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h @@ -0,0 +1,443 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * hash.h -- Hash table module. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: hash.h,v $ + * Revision 1.7 2005/06/22 03:04:01 arthchan2003 + * 1, Implemented hash_delete and hash_display, 2, Fixed doxygen documentation, 3, Added keyword. + * + * Revision 1.8 2005/05/24 01:10:54 archan + * Fix a bug when the value only appear in the hash but there is no chain. Also make sure that prev was initialized to NULL. All success cases were tested, but not tested with the deletion is tested. + * + * Revision 1.7 2005/05/24 00:12:31 archan + * Also add function prototype for hash_display in hash.h + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-May-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Removed hash_key2hash(). Added hash_enter_bkey() and hash_lookup_bkey(), + * and len attribute to hash_entry_t. + * + * 30-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added hash_key2hash(). + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Included case sensitive/insensitive option. + * + * 08-31-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +/** + * @file hash_table.h + * @brief Hash table implementation + * + * This hash tables are intended for associating a pointer/integer + * "value" with a char string "key", (e.g., an ID with a word string). + * Subsequently, one can retrieve the value by providing the string + * key. (The reverse functionality--obtaining the string given the + * value--is not provided with the hash table module.) + */ + +/** + * A note by ARCHAN at 20050510: Technically what we use is so-called + * "hash table with buckets" which is very nice way to deal with + * external hashing. There are definitely better ways to do internal + * hashing (i.e. when everything is stored in the memory.) In Sphinx + * 3, this is a reasonable practice because hash table is only used in + * lookup in initialization or in lookups which is not critical for + * speed. + */ + +/** + * Another note by ARCHAN at 20050703: To use this data structure + * properly, it is very important to realize that the users are + * required to handle memory allocation of the C-style keys. The hash + * table will not make a copy of the memory allocated for any of the + * C-style key. It will not allocate memory for it. It will not delete + * memory for it. As a result, the following code sniplet will cause + * memory leak. + * + * while (1){ + * str=(char*)ckd_calloc(str_length,sizeof(char*)) + * if(hash_enter(ht,str,id)!=id){ printf("fail to add key str %s with val id %d\n",str,id)} + * } + * + */ + +/** + * A note by dhuggins on 20061010: Changed this to use void * instead + * of int32 as the value type, so that arbitrary objects can be + * inserted into a hash table (in a way that won't crash on 64-bit + * machines ;) + */ + +#ifndef _LIBUTIL_HASH_H_ +#define _LIBUTIL_HASH_H_ + +/* Win32/WinCE DLL gunk */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * The hash table structures. + * Each hash table is identified by a hash_table_t structure. hash_table_t.table is + * pre-allocated for a user-controlled max size, and is initially empty. As new + * entries are created (using hash_enter()), the empty entries get filled. If multiple + * keys hash to the same entry, new entries are allocated and linked together in a + * linear list. + */ + +typedef struct hash_entry_s { + const char *key; /** Key string, NULL if this is an empty slot. + NOTE that the key must not be changed once the entry + has been made. */ + size_t len; /** Key-length; the key string does not have to be a C-style NULL + terminated string; it can have arbitrary binary bytes */ + void *val; /** Value associated with above key */ + struct hash_entry_s *next; /** For collision resolution */ +} hash_entry_t; + +typedef struct hash_table_s { + hash_entry_t *table; /**Primary hash table, excluding entries that collide */ + int32 size; /** Primary hash table size, (is a prime#); NOTE: This is the + number of primary entries ALLOCATED, NOT the number of valid + entries in the table */ + int32 inuse; /** Number of valid entries in the table. */ + int32 nocase; /** Whether case insensitive for key comparisons */ +} hash_table_t; + +typedef struct hash_iter_s { + hash_table_t *ht; /**< Hash table we are iterating over. */ + hash_entry_t *ent; /**< Current entry in that table. */ + size_t idx; /**< Index of next bucket to search. */ +} hash_iter_t; + +/** Access macros */ +#define hash_entry_val(e) ((e)->val) +#define hash_entry_key(e) ((e)->key) +#define hash_entry_len(e) ((e)->len) +#define hash_table_inuse(h) ((h)->inuse) +#define hash_table_size(h) ((h)->size) + + +/** + * Allocate a new hash table for a given expected size. + * + * @note Case sensitivity of hash keys applies to 7-bit ASCII + * characters only, and is not locale-dependent. + * + * @return handle to allocated hash table. + */ +SPHINXBASE_EXPORT +hash_table_t * hash_table_new(int32 size, /**< In: Expected number of entries in the table */ + int32 casearg /**< In: Whether case insensitive for key + comparisons. When 1, case is insentitive, + 0, case is sensitive. */ + ); + +#define HASH_CASE_YES 0 +#define HASH_CASE_NO 1 + +/** + * Free the specified hash table; the caller is responsible for freeing the key strings + * pointed to by the table entries. + */ +SPHINXBASE_EXPORT +void hash_table_free(hash_table_t *h /**< In: Handle of hash table to free */ + ); + + +/** + * Try to add a new entry with given key and associated value to hash table h. If key doesn't + * already exist in hash table, the addition is successful, and the return value is val. But + * if key already exists, return its existing associated value. (The hash table is unchanged; + * it is up to the caller to resolve the conflict.) + */ +SPHINXBASE_EXPORT +void *hash_table_enter(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: C-style NULL-terminated key string + for the new entry */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Add a 32-bit integer value to a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_enter_int32(h,k,v) \ + ((int32)(long)hash_table_enter((h),(k),(void *)(long)(v))) + +/** + * Add a new entry with given key and value to hash table h. If the + * key already exists, its value is replaced with the given value, and + * the previous value is returned, otherwise val is returned. + * + * A very important but subtle point: The key pointer in the hash + * table is replaced with the pointer passed to this function. + * In general you should always pass a pointer to hash_table_enter() + * whose lifetime matches or exceeds that of the hash table. In some + * rare cases it is convenient to initially enter a value with a + * short-lived key, then later replace that with a long-lived one. + * This behaviour allows this to happen. + */ +SPHINXBASE_EXPORT +void *hash_table_replace(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: C-style NULL-terminated key string + for the new entry */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Replace a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_replace_int32(h,k,v) \ + ((int32)(long)hash_table_replace((h),(k),(void *)(long)(v))) + +/** + * Delete an entry with given key and associated value to hash table + * h. Return the value associated with the key (NULL if it did not exist) + */ + +SPHINXBASE_EXPORT +void *hash_table_delete(hash_table_t *h, /**< In: Handle of hash table in + which a key will be deleted */ + const char *key /**< In: C-style NULL-terminated + key string for the new entry */ + ); + +/** + * Like hash_table_delete, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +SPHINXBASE_EXPORT +void *hash_table_delete_bkey(hash_table_t *h, /**< In: Handle of hash table in + which a key will be deleted */ + const char *key, /**< In: C-style NULL-terminated + key string for the new entry */ + size_t len + ); + +/** + * Delete all entries from a hash_table. + */ +SPHINXBASE_EXPORT +void hash_table_empty(hash_table_t *h /**< In: Handle of hash table */ + ); + +/** + * Like hash_table_enter, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +SPHINXBASE_EXPORT +void *hash_table_enter_bkey(hash_table_t *h, /**< In: Handle of hash table + in which to create entry */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Enter a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_enter_bkey_int32(h,k,l,v) \ + ((int32)(long)hash_table_enter_bkey((h),(k),(l),(void *)(long)(v))) + +/** + * Like hash_table_replace, but with an explicitly specified key length, + * instead of a NULL-terminated, C-style key string. So the key + * string is a binary key (or bkey). Hash tables containing such keys + * should be created with the HASH_CASE_YES option. Otherwise, the + * results are unpredictable. + */ +SPHINXBASE_EXPORT +void *hash_table_replace_bkey(hash_table_t *h, /**< In: Handle of hash table in which to create entry */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void *val /**< In: Value to be associated with above key */ + ); + +/** + * Replace a 32-bit integer value in a hash table. + * + * This macro is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +#define hash_table_replace_bkey_int32(h,k,l,v) \ + ((int32)(long)hash_table_replace_bkey((h),(k),(l),(void *)(long)(v))) + +/** + * Look up a key in a hash table and optionally return the associated + * value. + * @return 0 if key found in hash table, else -1. + */ +SPHINXBASE_EXPORT +int32 hash_table_lookup(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: C-style NULL-terminated string whose value is sought */ + void **val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Look up a 32-bit integer value in a hash table. + * + * This function is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +SPHINXBASE_EXPORT +int32 hash_table_lookup_int32(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: C-style NULL-terminated string whose value is sought */ + int32 *val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Like hash_lookup, but with an explicitly specified key length, instead of a NULL-terminated, + * C-style key string. So the key string is a binary key (or bkey). Hash tables containing + * such keys should be created with the HASH_CASE_YES option. Otherwise, the results are + * unpredictable. + */ +SPHINXBASE_EXPORT +int32 hash_table_lookup_bkey(hash_table_t *h, /**< In: Handle of hash table being searched */ + const char *key, /**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + void **val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Look up a 32-bit integer value in a hash table. + * + * This function is the clean way to do this and avoid compiler warnings + * on 64-bit platforms. + */ +SPHINXBASE_EXPORT +int32 hash_table_lookup_bkey_int32(hash_table_t *h,/**< In: Handle of hash table being searched */ + const char *key,/**< In: Key buffer */ + size_t len, /**< In: Length of above key buffer */ + int32 *val /**< Out: *val = value associated with key. + If this is NULL, no value will be returned. */ + ); + +/** + * Start iterating over key-value pairs in a hash table. + */ +SPHINXBASE_EXPORT +hash_iter_t *hash_table_iter(hash_table_t *h); + +/** + * Get the next key-value pair in iteration. + * + * This function automatically frees the iterator object upon reaching + * the final entry. + * + * @return the next entry in the hash table, or NULL if done. + */ +SPHINXBASE_EXPORT +hash_iter_t *hash_table_iter_next(hash_iter_t *itor); + +/** + * Delete an unfinished iterator. + */ +SPHINXBASE_EXPORT +void hash_table_iter_free(hash_iter_t *itor); + +/** + * Build a glist of valid hash_entry_t pointers from the given hash table. Return the list. + */ +SPHINXBASE_EXPORT +glist_t hash_table_tolist(hash_table_t *h, /**< In: Hash table from which list is to be generated */ + int32 *count /**< Out: Number of entries in the list. + If this is NULL, no count will be returned. */ + + ); + +/** + * Display a hash-with-chaining representation on the screen. + * Currently, it will only works for situation where hash_enter was + * used to enter the keys. + */ +SPHINXBASE_EXPORT +void hash_table_display(hash_table_t *h, /**< In: Hash table to display */ + int32 showkey /**< In: Show the string or not, + Use 0 if hash_enter_bkey was + used. */ + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h new file mode 100644 index 0000000..ad3756a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h @@ -0,0 +1,153 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * heap.h -- Generic heap structure for inserting in any and popping in sorted + * order. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: heap.h,v $ + * Revision 1.7 2005/06/22 03:05:49 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add keyword. + * + * Revision 1.4 2005/06/15 04:21:46 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 23-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#ifndef _LIBUTIL_HEAP_H_ +#define _LIBUTIL_HEAP_H_ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + + /** \file heap.h + * \brief Heap Implementation. + * + * General Comment: Sorted heap structure with three main operations: + * + * 1. Insert a data item (with two attributes: an application supplied pointer and an + * integer value; the heap is maintained in ascending order of the integer value). + * 2. Return the currently topmost item (i.e., item with smallest associated value). + * 3. Return the currently topmost item and pop it off the heap. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + + +typedef struct heap_s heap_t; + + +/** + * Allocate a new heap and return handle to it. + */ +SPHINXBASE_EXPORT +heap_t *heap_new(void); + + +/** + * Insert a new item into the given heap. + * Return value: 0 if successful, -1 otherwise. + */ +SPHINXBASE_EXPORT +int heap_insert(heap_t *heap, /**< In: Heap into which item is to be inserted */ + void *data, /**< In: Application-determined data pointer */ + int32 val /**< In: According to item entered in sorted heap */ + ); +/** + * Return the topmost item in the heap. + * Return value: 1 if heap is not empty and the topmost value is returned; + * 0 if heap is empty; -1 if some error occurred. + */ +SPHINXBASE_EXPORT +int heap_top(heap_t *heap, /**< In: Heap whose topmost item is to be returned */ + void **data, /**< Out: Data pointer associated with the topmost item */ + int32 *val /**< Out: Value associated with the topmost item */ + ); +/** + * Like heap_top but also pop the top item off the heap. + */ +SPHINXBASE_EXPORT +int heap_pop(heap_t *heap, void **data, int32 *val); + +/** + * Remove an item from the heap. + */ +SPHINXBASE_EXPORT +int heap_remove(heap_t *heap, void *data); + +/** + * Return the number of items in the heap. + */ +SPHINXBASE_EXPORT +size_t heap_size(heap_t *heap); + +/** + * Destroy the given heap; free the heap nodes. NOTE: Data pointers in the nodes are NOT freed. + * Return value: 0 if successful, -1 otherwise. + */ + +SPHINXBASE_EXPORT +int heap_destroy(heap_t *heap); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h new file mode 100644 index 0000000..3c3de1d --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h @@ -0,0 +1,209 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __JSGF_H__ +#define __JSGF_H__ + +/** + * @file jsgf.h JSGF grammar compiler + * + * This file defines the data structures for parsing JSGF grammars + * into Sphinx finite-state grammars. + **/ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +typedef struct jsgf_s jsgf_t; +typedef struct jsgf_rule_s jsgf_rule_t; + +/** + * Create a new JSGF grammar. + * + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +SPHINXBASE_EXPORT +jsgf_t *jsgf_grammar_new(jsgf_t *parent); + +/** + * Parse a JSGF grammar from a file. + * + * @param filename the name of the file to parse. + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +SPHINXBASE_EXPORT +jsgf_t *jsgf_parse_file(const char *filename, jsgf_t *parent); + +/** + * Parse a JSGF grammar from a string. + * + * @param 0-terminated string with grammar. + * @param parent optional parent grammar for this one (NULL, usually). + * @return new JSGF grammar object, or NULL on failure. + */ +SPHINXBASE_EXPORT +jsgf_t *jsgf_parse_string(const char *string, jsgf_t *parent); + +/** + * Get the grammar name from the file. + */ +SPHINXBASE_EXPORT +char const *jsgf_grammar_name(jsgf_t *jsgf); + +/** + * Free a JSGF grammar. + */ +SPHINXBASE_EXPORT +void jsgf_grammar_free(jsgf_t *jsgf); + +/** + * Iterator over rules in a grammar. + */ +typedef hash_iter_t jsgf_rule_iter_t; + +/** + * Get an iterator over all rules in a grammar. + */ +SPHINXBASE_EXPORT +jsgf_rule_iter_t *jsgf_rule_iter(jsgf_t *grammar); + +/** + * Advance an iterator to the next rule in the grammar. + */ +#define jsgf_rule_iter_next(itor) hash_table_iter_next(itor) + +/** + * Get the current rule in a rule iterator. + */ +#define jsgf_rule_iter_rule(itor) ((jsgf_rule_t *)(itor)->ent->val) + +/** + * Free a rule iterator (if the end hasn't been reached). + */ +#define jsgf_rule_iter_free(itor) hash_table_iter_free(itor) + +/** + * Get a rule by name from a grammar. Name should not contain brackets. + */ +SPHINXBASE_EXPORT +jsgf_rule_t *jsgf_get_rule(jsgf_t *grammar, const char *name); + +/** + * Returns the first public rule of the grammar + */ +SPHINXBASE_EXPORT +jsgf_rule_t *jsgf_get_public_rule(jsgf_t *grammar); + +/** + * Get the rule name from a rule. + */ +SPHINXBASE_EXPORT +char const *jsgf_rule_name(jsgf_rule_t *rule); + +/** + * Test if a rule is public or not. + */ +SPHINXBASE_EXPORT +int jsgf_rule_public(jsgf_rule_t *rule); + +/** + * Build a Sphinx FSG object from a JSGF rule. + */ +SPHINXBASE_EXPORT +fsg_model_t *jsgf_build_fsg(jsgf_t *grammar, jsgf_rule_t *rule, + logmath_t *lmath, float32 lw); + +/** + * Build a Sphinx FSG object from a JSGF rule. + * + * This differs from jsgf_build_fsg() in that it does not do closure + * on epsilon transitions or any other postprocessing. For the time + * being this is necessary in order to write it to a file - the FSG + * code will be fixed soon. + */ +SPHINXBASE_EXPORT +fsg_model_t *jsgf_build_fsg_raw(jsgf_t *grammar, jsgf_rule_t *rule, + logmath_t *lmath, float32 lw); + + +/** + * Read JSGF from file and return FSG object from it. + * + * This function looks for a first public rule in jsgf and constructs JSGF from it. + */ +SPHINXBASE_EXPORT +fsg_model_t *jsgf_read_file(const char *file, logmath_t * lmath, float32 lw); + +/** + * Read JSGF from string and return FSG object from it. + * + * This function looks for a first public rule in jsgf and constructs JSGF from it. + */ +SPHINXBASE_EXPORT +fsg_model_t *jsgf_read_string(const char *string, logmath_t * lmath, float32 lw); + + +/** + * Convert a JSGF rule to Sphinx FSG text form. + * + * This does a direct conversion without doing transitive closure on + * null transitions and so forth. + */ +SPHINXBASE_EXPORT +int jsgf_write_fsg(jsgf_t *grammar, jsgf_rule_t *rule, FILE *outfh); + +#ifdef __cplusplus +} +#endif + + +#endif /* __JSGF_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h new file mode 100644 index 0000000..91b21d1 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h @@ -0,0 +1,125 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __LISTELEM_ALLOC_H__ +#define __LISTELEM_ALLOC_H__ + +/** @file listelem_alloc.h + * @brief Fast memory allocator for uniformly sized objects + * @author M K Ravishankar + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#include +#ifdef S60 +#include +#endif + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** + * List element allocator object. + */ +typedef struct listelem_alloc_s listelem_alloc_t; + +/** + * Initialize and return a list element allocator. + */ +SPHINXBASE_EXPORT +listelem_alloc_t * listelem_alloc_init(size_t elemsize); + +/** + * Finalize and release all memory associated with a list element allocator. + */ +SPHINXBASE_EXPORT +void listelem_alloc_free(listelem_alloc_t *le); + + +SPHINXBASE_EXPORT +void *__listelem_malloc__(listelem_alloc_t *le, char *file, int line); + +/** + * Allocate a list element and return pointer to it. + */ +#define listelem_malloc(le) __listelem_malloc__((le),__FILE__,__LINE__) + +SPHINXBASE_EXPORT +void *__listelem_malloc_id__(listelem_alloc_t *le, char *file, int line, + int32 *out_id); + +/** + * Allocate a list element, returning a unique identifier. + */ +#define listelem_malloc_id(le, oid) __listelem_malloc_id__((le),__FILE__,__LINE__,(oid)) + +/** + * Retrieve a list element by its identifier. + */ +SPHINXBASE_EXPORT +void *listelem_get_item(listelem_alloc_t *le, int32 id); + +/** + * Free list element of given size + */ +SPHINXBASE_EXPORT +void __listelem_free__(listelem_alloc_t *le, void *elem, char *file, int line); + +/** + * Macro of __listelem_free__ + */ +#define listelem_free(le,el) __listelem_free__((le),(el),__FILE__,__LINE__) + +/** + Print number of allocation, numer of free operation stats +*/ +SPHINXBASE_EXPORT +void listelem_stats(listelem_alloc_t *le); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h new file mode 100644 index 0000000..1e555c2 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h @@ -0,0 +1,249 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file logmath.h + * @brief Fast integer logarithmic addition operations. + * + * In evaluating HMM models, probability values are often kept in log + * domain, to avoid overflow. To enable these logprob values to be + * held in int32 variables without significant loss of precision, a + * logbase of (1+epsilon) (where epsilon < 0.01 or so) is used. This + * module maintains this logbase (B). + * + * However, maintaining probabilities in log domain creates a problem + * when adding two probability values. This problem can be solved by + * table lookup. Note that: + * + * - \f$ b^z = b^x + b^y \f$ + * - \f$ b^z = b^x(1 + b^{y-x}) = b^y(1 + e^{x-y}) \f$ + * - \f$ z = x + log_b(1 + b^{y-x}) = y + log_b(1 + b^{x-y}) \f$ + * + * So: + * + * - when \f$ y > x, z = y + logadd\_table[-(x-y)] \f$ + * - when \f$ x > y, z = x + logadd\_table[-(y-x)] \f$ + * - where \f$ logadd\_table[n] = log_b(1 + b^{-n}) \f$ + * + * The first entry in logadd_table is + * simply \f$ log_b(2.0) \f$, for + * the case where \f$ y = x \f$ and thus + * \f$ z = log_b(2x) = log_b(2) + x \f$. The last entry is zero, + * where \f$ log_b(x+y) = x = y \f$ due to loss of precision. + * + * Since this table can be quite large particularly for small + * logbases, an option is provided to compress it by dropping the + * least significant bits of the table. + */ + +#ifndef __LOGMATH_H__ +#define __LOGMATH_H__ + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Integer log math computation table. + * + * This is exposed here to allow log-add computations to be inlined. + */ +typedef struct logadd_s logadd_t; +struct logadd_s { + /** Table, in unsigned integers of (width) bytes. */ + void *table; + /** Number of elements in (table). This is never smaller than 256 (important!) */ + uint32 table_size; + /** Width of elements of (table). */ + uint8 width; + /** Right shift applied to elements in (table). */ + int8 shift; +}; + +/** + * Integer log math computation class. + */ +typedef struct logmath_s logmath_t; + +/** + * Obtain the log-add table from a logmath_t * + */ +#define LOGMATH_TABLE(lm) ((logadd_t *)lm) + +/** + * Initialize a log math computation table. + * @param base The base B in which computation is to be done. + * @param shift Log values are shifted right by this many bits. + * @param use_table Whether to use an add table or not + * @return The newly created log math table. + */ +SPHINXBASE_EXPORT +logmath_t *logmath_init(float64 base, int shift, int use_table); + +/** + * Memory-map (or read) a log table from a file. + */ +SPHINXBASE_EXPORT +logmath_t *logmath_read(const char *filename); + +/** + * Write a log table to a file. + */ +SPHINXBASE_EXPORT +int32 logmath_write(logmath_t *lmath, const char *filename); + +/** + * Get the log table size and dimensions. + */ +SPHINXBASE_EXPORT +int32 logmath_get_table_shape(logmath_t *lmath, uint32 *out_size, + uint32 *out_width, uint32 *out_shift); + +/** + * Get the log base. + */ +SPHINXBASE_EXPORT +float64 logmath_get_base(logmath_t *lmath); + +/** + * Get the smallest possible value represented in this base. + */ +SPHINXBASE_EXPORT +int logmath_get_zero(logmath_t *lmath); + +/** + * Get the width of the values in a log table. + */ +SPHINXBASE_EXPORT +int logmath_get_width(logmath_t *lmath); + +/** + * Get the shift of the values in a log table. + */ +SPHINXBASE_EXPORT +int logmath_get_shift(logmath_t *lmath); + +/** + * Retain ownership of a log table. + * + * @return pointer to retained log table. + */ +SPHINXBASE_EXPORT +logmath_t *logmath_retain(logmath_t *lmath); + +/** + * Free a log table. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int logmath_free(logmath_t *lmath); + +/** + * Add two values in log space exactly and slowly (without using add table). + */ +SPHINXBASE_EXPORT +int logmath_add_exact(logmath_t *lmath, int logb_p, int logb_q); + +/** + * Add two values in log space (i.e. return log(exp(p)+exp(q))) + */ +SPHINXBASE_EXPORT +int logmath_add(logmath_t *lmath, int logb_p, int logb_q); + +/** + * Convert linear floating point number to integer log in base B. + */ +SPHINXBASE_EXPORT +int logmath_log(logmath_t *lmath, float64 p); + +/** + * Convert integer log in base B to linear floating point. + */ +SPHINXBASE_EXPORT +float64 logmath_exp(logmath_t *lmath, int logb_p); + +/** + * Convert natural log (in floating point) to integer log in base B. + */ +SPHINXBASE_EXPORT +int logmath_ln_to_log(logmath_t *lmath, float64 log_p); + +/** + * Convert integer log in base B to natural log (in floating point). + */ +SPHINXBASE_EXPORT +float64 logmath_log_to_ln(logmath_t *lmath, int logb_p); + +/** + * Convert base 10 log (in floating point) to integer log in base B. + */ +SPHINXBASE_EXPORT +int logmath_log10_to_log(logmath_t *lmath, float64 log_p); + +/** + * Convert base 10 log (in floating point) to float log in base B. + */ +SPHINXBASE_EXPORT +float logmath_log10_to_log_float(logmath_t *lmath, float64 log_p); + +/** + * Convert integer log in base B to base 10 log (in floating point). + */ +SPHINXBASE_EXPORT +float64 logmath_log_to_log10(logmath_t *lmath, int logb_p); + +/** + * Convert float log in base B to base 10 log. + */ +SPHINXBASE_EXPORT +float64 logmath_log_float_to_log10(logmath_t *lmath, float log_p); + +#ifdef __cplusplus +} +#endif + + +#endif /* __LOGMATH_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h new file mode 100644 index 0000000..b77cab1 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h @@ -0,0 +1,214 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1997-2000 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: matrix.h + * + * Description: Matrix and linear algebra functions + * + * Author: + * + *********************************************************************/ + +#ifndef MATRIX_H +#define MATRIX_H + +/** \file matrix.h + * \brief Matrix and linear algebra functions. + * + * This file contains some basic matrix and linear algebra operations. + * In general these operate on positive definite matrices ONLY, + * because all matrices we're likely to encounter are either + * covariance matrices or are derived from them, and therefore a + * non-positive-definite matrix indicates some kind of pathological + * condition. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* Win32/WinCE DLL gunk */ +#include +#include + + +/** + * Norm an array + * @param arr array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + **/ +SPHINXBASE_EXPORT void norm_3d(float32 ***arr, uint32 d1, uint32 d2, uint32 d3); + +/** + * Floor 3-d array + * @param out output array + * @param in input array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + **/ +SPHINXBASE_EXPORT void +accum_3d(float32 ***out, float32 ***in, uint32 d1, uint32 d2, uint32 d3); + +/** Ensures that non-zero values x such that -band < x < band, band > 0 are set to -band if x < 0 and band if x > 0. + * @param v array + * @param d1 array size + * @param band band value + */ +SPHINXBASE_EXPORT void band_nz_1d(float32 *v, uint32 d1, float32 band); + +/** + * Floor 3-d array + * @param m array + * @param d1 dimension + * @param d2 dimension + * @param d3 dimension + * @param floor floor value + **/ +SPHINXBASE_EXPORT void floor_nz_3d(float32 ***m, uint32 d1, uint32 d2, uint32 d3, float32 floor); + +/** + * Floor 1-d array + * @param v array + * @param d1 dimension + * @param floor floor value + **/ +SPHINXBASE_EXPORT void floor_nz_1d(float32 *v, uint32 d1, float32 floor); + +/** + * Calculate the determinant of a positive definite matrix. + * @param a The input matrix, must be positive definite. + * @param len The dimension of the input matrix. + * @return The determinant of the input matrix, or -1.0 if the matrix is + * not positive definite. + * + * \note These can be vanishingly small hence the float64 return type. + * Also note that only the upper triangular portion of a is + * considered, therefore the check for positive-definiteness is not + * reliable. + **/ +SPHINXBASE_EXPORT +float64 determinant(float32 **a, int32 len); + +/** + * Invert (if possible) a positive definite matrix with QR + * algorithm. + * + * @param out_ainv The inverse of a will be stored here. + * @param a The input matrix, must be positive definite. + * @param len The dimension of the input matrix. + * @return 0 for success or -1 for a non-positive-definite matrix. + * + * \note Only the upper triangular portion of a is considered, + * therefore the check for positive-definiteness is not reliable. + * + * \note The inversion can be done in-place, so you can use the same matrix + * if you do not need to keep a. + **/ +SPHINXBASE_EXPORT +int32 invert(float32 **out_ainv, float32 **a, int32 len); + +/** + * Solve (if possible) a positive-definite system of linear equations AX=B for X. + * @param a The A matrix on the left-hand side of the equation, must be positive-definite. + * @param b The B vector on the right-hand side of the equation. + * @param out_x The X vector will be stored here. + * @param n The dimension of the A matrix (n by n) and the B and X vectors. + * @return 0 for success or -1 for a non-positive-definite matrix. + * + * \note Only the upper triangular portion of a is considered, + * therefore the check for positive-definiteness is not reliable. + **/ +SPHINXBASE_EXPORT +int32 solve(float32 **a, float32 *b, + float32 *out_x, int32 n); + +/** + * Calculate the outer product of two vectors. + * @param out_a A (pre-allocated) len x len array. The outer product + * will be stored here. + * @param x A vector of length len. + * @param y A vector of length len. + * @param len The length of the input vectors. + **/ +SPHINXBASE_EXPORT +void outerproduct(float32 **out_a, float32 *x, float32 *y, int32 len); + +/** + * Multiply C=AB where A and B are symmetric matrices. + * @param out_c The output matrix C. + * @param a The input matrix A. + * @param b The input matrix B. + * @param n Dimensionality of A and B. + **/ +SPHINXBASE_EXPORT +void matrixmultiply(float32 **out_c, /* = */ + float32 **a, /* * */ float32 **b, + int32 n); + +/** + * Multiply a symmetric matrix by a constant in-place. + * @param inout_a The matrix to multiply. + * @param x The constant to multiply it by. + * @param n dimension of a. + **/ +SPHINXBASE_EXPORT +void scalarmultiply(float32 **inout_a, float32 x, int32 n); + +/** + * Add A += B. + * @param inout_a The A matrix to add. + * @param b The B matrix to add to A. + * @param n dimension of a and b. + **/ +SPHINXBASE_EXPORT +void matrixadd(float32 **inout_a, float32 **b, int32 n); + +#if 0 +{ /* Fool indent. */ +#endif +#ifdef __cplusplus +} +#endif + +#endif /* MATRIX_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h new file mode 100644 index 0000000..fcae74d --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h @@ -0,0 +1,85 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file mmio.h + * @brief Memory-mapped I/O wrappers for files. + * @author David Huggins-Daines + **/ + +#ifndef __MMIO_H__ +#define __MMIO_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Abstract structure representing a memory-mapped file. + **/ +typedef struct mmio_file_s mmio_file_t; + +/** + * Memory-map a file for reading. + * @return a mmio_file_t * or NULL for failure. + **/ +SPHINXBASE_EXPORT +mmio_file_t *mmio_file_read(const char *filename); + +/** + * Get a pointer to the memory mapped for a file. + **/ +SPHINXBASE_EXPORT +void *mmio_file_ptr(mmio_file_t *mf); + +/** + * Unmap a file, releasing memory associated with it. + **/ +SPHINXBASE_EXPORT +void mmio_file_unmap(mmio_file_t *mf); + +#ifdef __cplusplus +} +#endif + + +#endif /* __MMIO_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h new file mode 100644 index 0000000..5be6d5e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h @@ -0,0 +1,703 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ngram_model.h + * @brief N-Gram language models + * @author David Huggins-Daines + */ + +#ifndef __NGRAM_MODEL_H__ +#define __NGRAM_MODEL_H__ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Abstract type representing an N-Gram based language model. + */ +typedef struct ngram_model_s ngram_model_t; + +/** + * Abstract type representing a word class in an N-Gram model. + */ +typedef struct ngram_class_s ngram_class_t; + +/** + * File types for N-Gram files + */ +typedef enum ngram_file_type_e { + NGRAM_INVALID = -1, /**< Not a valid file type. */ + NGRAM_AUTO, /**< Determine file type automatically. */ + NGRAM_ARPA, /**< ARPABO text format (the standard). */ + NGRAM_BIN /**< Sphinx .DMP format. */ +} ngram_file_type_t; + +#define NGRAM_INVALID_WID -1 /**< Impossible word ID */ + +/** + * Read an N-Gram model from a file on disk. + * + * @param config Optional pointer to a set of command-line arguments. + * Recognized arguments are: + * + * - -mmap (boolean) whether to use memory-mapped I/O + * - -lw (float32) language weight to apply to the model + * - -wip (float32) word insertion penalty to apply to the model + * + * @param file_name path to the file to read. + * @param file_type type of the file, or NGRAM_AUTO to determine automatically. + * @param lmath Log-math parameters to use for probability + * calculations. Ownership of this object is assumed by + * the newly created ngram_model_t, and you should not + * attempt to free it manually. If you wish to reuse it + * elsewhere, you must retain it with logmath_retain(). + * @return newly created ngram_model_t. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_read(cmd_ln_t *config, + const char *file_name, + ngram_file_type_t file_type, + logmath_t *lmath); + +/** + * Write an N-Gram model to disk. + * + * @return 0 for success, <0 on error + */ +SPHINXBASE_EXPORT +int ngram_model_write(ngram_model_t *model, const char *file_name, + ngram_file_type_t format); + +/** + * Guess the file type for an N-Gram model from the filename. + * + * @return the guessed file type, or NGRAM_INVALID if none could be guessed. + */ +SPHINXBASE_EXPORT +ngram_file_type_t ngram_file_name_to_type(const char *file_name); + +/** + * Get the N-Gram file type from a string. + * + * @return file type, or NGRAM_INVALID if no such file type exists. + */ +SPHINXBASE_EXPORT +ngram_file_type_t ngram_str_to_type(const char *str_name); + +/** + * Get the canonical name for an N-Gram file type. + * + * @return read-only string with the name for this file type, or NULL + * if no such type exists. + */ +SPHINXBASE_EXPORT +char const *ngram_type_to_str(int type); + +/** + * Retain ownership of an N-Gram model. + * + * @return Pointer to retained model. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_retain(ngram_model_t *model); + +/** + * Release memory associated with an N-Gram model. + * + * @return new reference count (0 if freed completely) + */ +SPHINXBASE_EXPORT +int ngram_model_free(ngram_model_t *model); + +/** + * Constants for case folding. + */ +typedef enum ngram_case_e { + NGRAM_UPPER, + NGRAM_LOWER +} ngram_case_t; + +/** + * Case-fold word strings in an N-Gram model. + * + * WARNING: This is not Unicode aware, so any non-ASCII characters + * will not be converted. + */ +SPHINXBASE_EXPORT +int ngram_model_casefold(ngram_model_t *model, int kase); + +/** + * Apply a language weight, insertion penalty, and unigram weight to a + * language model. + * + * This will change the values output by ngram_score() and friends. + * This is done for efficiency since in decoding, these are the only + * values we actually need. Call ngram_prob() if you want the "raw" + * N-Gram probability estimate. + * + * To remove all weighting, call ngram_apply_weights(model, 1.0, 1.0). + */ +SPHINXBASE_EXPORT +int ngram_model_apply_weights(ngram_model_t *model, + float32 lw, float32 wip); + +/** + * Get the current weights from a language model. + * + * @param model The model in question. + * @param out_log_wip Output: (optional) logarithm of word insertion penalty. + * @return language weight. + */ +SPHINXBASE_EXPORT +float32 ngram_model_get_weights(ngram_model_t *model, int32 *out_log_wip); + +/** + * Get the score (scaled, interpolated log-probability) for a general + * N-Gram. + * + * The argument list consists of the history words (as null-terminated + * strings) of the N-Gram, in reverse order, followed by NULL. + * Therefore, if you wanted to get the N-Gram score for "a whole joy", + * you would call: + * + *
+ *  score = ngram_score(model, "joy", "whole", "a", NULL);
+ * 
+ * + * This is not the function to use in decoding, because it has some + * overhead for looking up words. Use ngram_ng_score(), + * ngram_tg_score(), or ngram_bg_score() instead. In the future there + * will probably be a version that takes a general language model + * state object, to support suffix-array LM and things like that. + * + * If one of the words is not in the LM's vocabulary, the result will + * depend on whether this is an open or closed vocabulary language + * model. For an open-vocabulary model, unknown words are all mapped + * to the unigram <UNK> which has a non-zero probability and also + * participates in higher-order N-Grams. Therefore, you will get a + * score of some sort in this case. + * + * For a closed-vocabulary model, unknown words are impossible and + * thus have zero probability. Therefore, if word is + * unknown, this function will return a "zero" log-probability, i.e. a + * large negative number. To obtain this number for comparison, call + * ngram_zero(). + */ +SPHINXBASE_EXPORT +int32 ngram_score(ngram_model_t *model, const char *word, ...); + +/** + * Quick trigram score lookup. + */ +SPHINXBASE_EXPORT +int32 ngram_tg_score(ngram_model_t *model, + int32 w3, int32 w2, int32 w1, + int32 *n_used); + +/** + * Quick bigram score lookup. + */ +SPHINXBASE_EXPORT +int32 ngram_bg_score(ngram_model_t *model, + int32 w2, int32 w1, + int32 *n_used); + +/** + * Quick general N-Gram score lookup. + */ +SPHINXBASE_EXPORT +int32 ngram_ng_score(ngram_model_t *model, int32 wid, int32 *history, + int32 n_hist, int32 *n_used); + +/** + * Get the "raw" log-probability for a general N-Gram. + * + * This returns the log-probability of an N-Gram, as defined in the + * language model file, before any language weighting, interpolation, + * or insertion penalty has been applied. + * + * @note When backing off to a unigram from a bigram or trigram, the + * unigram weight (interpolation with uniform) is not removed. + */ +SPHINXBASE_EXPORT +int32 ngram_probv(ngram_model_t *model, const char *word, ...); + +/** + * Get the "raw" log-probability for a general N-Gram. + * + * This returns the log-probability of an N-Gram, as defined in the + * language model file, before any language weighting, interpolation, + * or insertion penalty has been applied. + * + * @note When backing off to a unigram from a bigram or trigram, the + * unigram weight (interpolation with uniform) is not removed. + */ +SPHINXBASE_EXPORT +int32 ngram_prob(ngram_model_t *model, const char* const *words, int32 n); + +/** + * Quick "raw" probability lookup for a general N-Gram. + * + * See documentation for ngram_ng_score() and ngram_apply_weights() + * for an explanation of this. + */ +SPHINXBASE_EXPORT +int32 ngram_ng_prob(ngram_model_t *model, int32 wid, int32 *history, + int32 n_hist, int32 *n_used); + +/** + * Convert score to "raw" log-probability. + * + * @note The unigram weight (interpolation with uniform) is not + * removed, since there is no way to know which order of N-Gram + * generated score. + * + * @param model The N-Gram model from which score was obtained. + * @param score The N-Gram score to convert + * @return The raw log-probability value. + */ +SPHINXBASE_EXPORT +int32 ngram_score_to_prob(ngram_model_t *model, int32 score); + +/** + * Look up numerical word ID. + */ +SPHINXBASE_EXPORT +int32 ngram_wid(ngram_model_t *model, const char *word); + +/** + * Look up word string for numerical word ID. + */ +SPHINXBASE_EXPORT +const char *ngram_word(ngram_model_t *model, int32 wid); + +/** + * Get the unknown word ID for a language model. + * + * Language models can be either "open vocabulary" or "closed + * vocabulary". The difference is that the former assigns a fixed + * non-zero unigram probability to unknown words, while the latter + * does not allow unknown words (or, equivalently, it assigns them + * zero probability). If this is a closed vocabulary model, this + * function will return NGRAM_INVALID_WID. + * + * @return The ID for the unknown word, or NGRAM_INVALID_WID if none + * exists. + */ +SPHINXBASE_EXPORT +int32 ngram_unknown_wid(ngram_model_t *model); + +/** + * Get the "zero" log-probability value for a language model. + */ +SPHINXBASE_EXPORT +int32 ngram_zero(ngram_model_t *model); + +/** + * Get the order of the N-gram model (i.e. the "N" in "N-gram") + */ +SPHINXBASE_EXPORT +int32 ngram_model_get_size(ngram_model_t *model); + +/** + * Get the counts of the various N-grams in the model. + */ +SPHINXBASE_EXPORT +uint32 const *ngram_model_get_counts(ngram_model_t *model); + +/** + * M-gram iterator object. + */ +typedef struct ngram_iter_s ngram_iter_t; + +/** + * Iterate over all M-grams. + * + * @param model Language model to query. + * @param m Order of the M-Grams requested minus one (i.e. order of the history) + * @return An iterator over the requested M, or NULL if no N-grams of + * order M+1 exist. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_model_mgrams(ngram_model_t *model, int m); + +/** + * Get an iterator over M-grams pointing to the specified M-gram. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_iter(ngram_model_t *model, const char *word, ...); + +/** + * Get an iterator over M-grams pointing to the specified M-gram. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_ng_iter(ngram_model_t *model, int32 wid, int32 *history, int32 n_hist); + +/** + * Get information from the current M-gram in an iterator. + * + * @param out_score Output: Score for this M-gram (including any word + * penalty and language weight). + * @param out_bowt Output: Backoff weight for this M-gram. + * @return read-only array of word IDs. + */ +SPHINXBASE_EXPORT +int32 const *ngram_iter_get(ngram_iter_t *itor, + int32 *out_score, + int32 *out_bowt); + +/** + * Iterate over all M-gram successors of an M-1-gram. + * + * @param itor Iterator pointing to the M-1-gram to get successors of. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_iter_successors(ngram_iter_t *itor); + +/** + * Advance an M-gram iterator. + */ +SPHINXBASE_EXPORT +ngram_iter_t *ngram_iter_next(ngram_iter_t *itor); + +/** + * Terminate an M-gram iterator. + */ +SPHINXBASE_EXPORT +void ngram_iter_free(ngram_iter_t *itor); + +/** + * Add a word (unigram) to the language model. + * + * @note The semantics of this are not particularly well-defined for + * model sets, and may be subject to change. Currently this will add + * the word to all of the submodels + * + * @param model The model to add a word to. + * @param word Text of the word to add. + * @param weight Weight of this word relative to the uniform distribution. + * @return The word ID for the new word. + */ +SPHINXBASE_EXPORT +int32 ngram_model_add_word(ngram_model_t *model, + const char *word, float32 weight); + +/** + * Read a class definition file and add classes to a language model. + * + * This function assumes that the class tags have already been defined + * as unigrams in the language model. All words in the class + * definition will be added to the vocabulary as special in-class words. + * For this reason is is necessary that they not have the same names + * as any words in the general unigram distribution. The convention + * is to suffix them with ":class_tag", where class_tag is the class + * tag minus the enclosing square brackets. + * + * @return 0 for success, <0 for error + */ +SPHINXBASE_EXPORT +int32 ngram_model_read_classdef(ngram_model_t *model, + const char *file_name); + +/** + * Add a new class to a language model. + * + * If classname already exists in the unigram set for + * model, then it will be converted to a class tag, and + * classweight will be ignored. Otherwise, a new unigram + * will be created as in ngram_model_add_word(). + */ +SPHINXBASE_EXPORT +int32 ngram_model_add_class(ngram_model_t *model, + const char *classname, + float32 classweight, + char **words, + const float32 *weights, + int32 n_words); + +/** + * Add a word to a class in a language model. + * + * @param model The model to add a word to. + * @param classname Name of the class to add this word to. + * @param word Text of the word to add. + * @param weight Weight of this word relative to the within-class uniform distribution. + * @return The word ID for the new word. + */ +SPHINXBASE_EXPORT +int32 ngram_model_add_class_word(ngram_model_t *model, + const char *classname, + const char *word, + float32 weight); + +/** + * Create a set of language models sharing a common space of word IDs. + * + * This function creates a meta-language model which groups together a + * set of language models, synchronizing word IDs between them. To + * use this language model, you can either select a submodel to use + * exclusively using ngram_model_set_select(), or interpolate + * between scores from all models. To do the latter, you can either + * pass a non-NULL value of the weights parameter, or + * re-activate interpolation later on by calling + * ngram_model_set_interp(). + * + * In order to make this efficient, there are some restrictions on the + * models that can be grouped together. The most important (and + * currently the only) one is that they must all + * share the same log-math parameters. + * + * @param config Any configuration parameters to be shared between models. + * @param models Array of pointers to previously created language models. + * @param names Array of strings to use as unique identifiers for LMs. + * @param weights Array of weights to use in interpolating LMs, or NULL + * for no interpolation. + * @param n_models Number of elements in the arrays passed to this function. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_init(cmd_ln_t *config, + ngram_model_t **models, + char **names, + const float32 *weights, + int32 n_models); + +/** + * Read a set of language models from a control file. + * + * This file creates a language model set from a "control file" of + * the type used in Sphinx-II and Sphinx-III. + * File format (optional stuff is indicated by enclosing in []): + * + *
+ *   [{ LMClassFileName LMClassFilename ... }]
+ *   TrigramLMFileName LMName [{ LMClassName LMClassName ... }]
+ *   TrigramLMFileName LMName [{ LMClassName LMClassName ... }]
+ *   ...
+ * (There should be whitespace around the { and } delimiters.)
+ * 
+ * + * This is an extension of the older format that had only TrigramLMFilenName + * and LMName pairs. The new format allows a set of LMClass files to be read + * in and referred to by the trigram LMs. + * + * No "comments" allowed in this file. + * + * @param config Configuration parameters. + * @param lmctlfile Path to the language model control file. + * @param lmath Log-math parameters to use for probability + * calculations. Ownership of this object is assumed by + * the newly created ngram_model_t, and you should not + * attempt to free it manually. If you wish to reuse it + * elsewhere, you must retain it with logmath_retain(). + * @return newly created language model set. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_read(cmd_ln_t *config, + const char *lmctlfile, + logmath_t *lmath); + +/** + * Returns the number of language models in a set. + */ +SPHINXBASE_EXPORT +int32 ngram_model_set_count(ngram_model_t *set); + +/** + * Iterator over language models in a set. + */ +typedef struct ngram_model_set_iter_s ngram_model_set_iter_t; + +/** + * Begin iterating over language models in a set. + * + * @return iterator pointing to the first language model, or NULL if no models remain. + */ +SPHINXBASE_EXPORT +ngram_model_set_iter_t *ngram_model_set_iter(ngram_model_t *set); + +/** + * Move to the next language model in a set. + * + * @return iterator pointing to the next language model, or NULL if no models remain. + */ +SPHINXBASE_EXPORT +ngram_model_set_iter_t *ngram_model_set_iter_next(ngram_model_set_iter_t *itor); + +/** + * Finish iteration over a langauge model set. + */ +SPHINXBASE_EXPORT +void ngram_model_set_iter_free(ngram_model_set_iter_t *itor); + +/** + * Get language model and associated name from an iterator. + * + * @param itor the iterator + * @param lmname Output: string name associated with this language model. + * @return Language model pointed to by this iterator. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_iter_model(ngram_model_set_iter_t *itor, + char const **lmname); + +/** + * Select a single language model from a set for scoring. + * + * @return the newly selected language model, or NULL if no language + * model by that name exists. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_select(ngram_model_t *set, + const char *name); + +/** + * Look up a language model by name from a set. + * + * @return language model corresponding to name, or NULL + * if no language model by that name exists. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_lookup(ngram_model_t *set, + const char *name); + +/** + * Get the current language model name, if any. + */ +SPHINXBASE_EXPORT +const char *ngram_model_set_current(ngram_model_t *set); + +/** + * Set interpolation weights for a set and enables interpolation. + * + * If weights is NULL, any previously initialized set of + * weights will be used. If no weights were specified to + * ngram_model_set_init(), then a uniform distribution will be used. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_interp(ngram_model_t *set, + const char **names, + const float32 *weights); + +/** + * Add a language model to a set. + * + * @param set The language model set to add to. + * @param model The language model to add. + * @param name The name to associate with this model. + * @param weight Interpolation weight for this model, relative to the + * uniform distribution. 1.0 is a safe value. + * @param reuse_widmap Reuse the existing word-ID mapping in + * set. Any new words present in model + * will not be added to the word-ID mapping in this case. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_add(ngram_model_t *set, + ngram_model_t *model, + const char *name, + float32 weight, + int reuse_widmap); + +/** + * Remove a language model from a set. + * + * @param set The language model set to remove from. + * @param name The name associated with the model to remove. + * @param reuse_widmap Reuse the existing word-ID mapping in + * set. + */ +SPHINXBASE_EXPORT +ngram_model_t *ngram_model_set_remove(ngram_model_t *set, + const char *name, + int reuse_widmap); + +/** + * Set the word-to-ID mapping for this model set. + */ +SPHINXBASE_EXPORT +void ngram_model_set_map_words(ngram_model_t *set, + const char **words, + int32 n_words); + +/** + * Query the word-ID mapping for the current language model. + * + * @return the local word ID in the current language model, or + * NGRAM_INVALID_WID if set_wid is invalid or + * interpolation is enabled. + */ +SPHINXBASE_EXPORT +int32 ngram_model_set_current_wid(ngram_model_t *set, + int32 set_wid); + +/** + * Test whether a word ID corresponds to a known word in the current + * state of the language model set. + * + * @return If there is a current language model, returns non-zero if + * set_wid corresponds to a known word in that language + * model. Otherwise, returns non-zero if set_wid + * corresponds to a known word in any language model. + */ +SPHINXBASE_EXPORT +int32 ngram_model_set_known_wid(ngram_model_t *set, int32 set_wid); + +/** + * Flush any cached N-Gram information + */ +SPHINXBASE_EXPORT +void ngram_model_flush(ngram_model_t *lm); + +#ifdef __cplusplus +} +#endif + + +#endif /* __NGRAM_MODEL_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h new file mode 100644 index 0000000..b9a658a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h @@ -0,0 +1,308 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * pio.h -- Packaged I/O routines. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: pio.h,v $ + * Revision 1.3 2005/06/22 08:00:09 arthchan2003 + * Completed all doxygen documentation on file description for libs3decoder/libutil/libs3audio and programs. + * + * Revision 1.2 2005/06/22 03:09:52 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.2 2005/06/16 00:14:08 archan + * Added const keyword to file argument for file_open + * + * Revision 1.1 2005/06/15 06:11:03 archan + * sphinx3 to s3.generic: change io.[ch] to pio.[ch] + * + * Revision 1.5 2005/06/15 04:21:46 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.4 2005/04/20 03:49:32 archan + * Add const to string argument of myfopen. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 08-Dec-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added stat_mtime(). + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added _myfopen() and myfopen macro. + * + * 05-Sep-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#ifndef _LIBUTIL_IO_H_ +#define _LIBUTIL_IO_H_ + +#include +#if !defined(_WIN32_WCE) && !(defined(__ADSPBLACKFIN__) && !defined(__linux__)) +#include +#endif + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** \file pio.h + * \brief file IO related operations. + * + * Custom fopen with error checking is implemented. fopen_comp can + * open a file with .z, .Z, .gz or .GZ extension + * + * WARNING: Usage of stat_retry will results in 100s of waiting time + * if the file doesn't exist. +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Like fopen, but use popen and zcat if it is determined that "file" is compressed + * (i.e., has a .z, .Z, .gz, or .GZ extension). + */ +SPHINXBASE_EXPORT +FILE *fopen_comp (const char *file, /**< In: File to be opened */ + const char *mode, /**< In: "r" or "w", as with normal fopen */ + int32 *ispipe /**< Out: On return *ispipe is TRUE iff file + was opened via a pipe */ + ); + +/** + * Close a file opened using fopen_comp. + */ +SPHINXBASE_EXPORT +void fclose_comp (FILE *fp, /**< In: File pointer to be closed */ + int32 ispipe /**< In: ispipe argument that was returned by the + corresponding fopen_comp() call */ + ); + +/** + * Open a file for reading, but if file not present try to open compressed version (if + * file is uncompressed, and vice versa). + */ +SPHINXBASE_EXPORT +FILE *fopen_compchk (const char *file, /**< In: File to be opened */ + int32 *ispipe /**< Out: On return *ispipe is TRUE iff file + was opened via a pipe */ + ); + +/** + * Wrapper around fopen to check for failure and E_FATAL if failed. + */ +SPHINXBASE_EXPORT +FILE *_myfopen(const char *file, const char *mode, + const char *pgm, int32 line); /* In: __FILE__, __LINE__ from where called */ +#define myfopen(file,mode) _myfopen((file),(mode),__FILE__,__LINE__) + + +/** + * NFS file reads seem to fail now and then. Use the following functions in place of + * the regular fread. It retries failed freads several times and quits only if all of + * them fail. Be aware, however, that even normal failures such as attempting to read + * beyond EOF will trigger such retries, wasting about a minute in retries. + * Arguments identical to regular fread. + */ +SPHINXBASE_EXPORT +int32 fread_retry(void *pointer, int32 size, int32 num_items, FILE *stream); + +/** + * Read a line of arbitrary length from a file and return it as a + * newly allocated string. + * + * @deprecated Use line iterators instead. + * + * @param stream The file handle to read from. + * @param out_len Output: if not NULL, length of the string read. + * @return allocated string containing the line, or NULL on error or EOF. + */ +SPHINXBASE_EXPORT +char *fread_line(FILE *stream, size_t *out_len); + +/** + * Line iterator for files. + */ +typedef struct lineiter_t { + char *buf; + FILE *fh; + int32 bsiz; + int32 len; + int32 clean; + int32 lineno; +} lineiter_t; + +/** + * Start reading lines from a file. + */ +SPHINXBASE_EXPORT +lineiter_t *lineiter_start(FILE *fh); + +/** + * Start reading lines from a file, skip comments and trim lines. + */ +SPHINXBASE_EXPORT +lineiter_t *lineiter_start_clean(FILE *fh); + +/** + * Move to the next line in the file. + */ +SPHINXBASE_EXPORT +lineiter_t *lineiter_next(lineiter_t *li); + +/** + * Stop reading lines from a file. + */ +SPHINXBASE_EXPORT +void lineiter_free(lineiter_t *li); + +/** + * Returns current line number. + */ +SPHINXBASE_EXPORT +int lineiter_lineno(lineiter_t *li); + + +#ifdef _WIN32_WCE +/* Fake this for WinCE which has no stat() */ +#include +struct stat { + DWORD st_mtime; + DWORD st_size; +}; +#endif /* _WIN32_WCE */ + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) +struct stat { + int32 st_mtime; + int32 st_size; +}; + +#endif + +/** + * Bitstream encoder - for writing compressed files. + */ +typedef struct bit_encode_s bit_encode_t; + +/** + * Attach bitstream encoder to a file. + */ +SPHINXBASE_EXPORT +bit_encode_t *bit_encode_attach(FILE *outfh); + +/** + * Retain pointer to a bit encoder. + */ +SPHINXBASE_EXPORT +bit_encode_t *bit_encode_retain(bit_encode_t *be); + +/** + * Release pointer to a bit encoder. + * + * Note that this does NOT flush any leftover bits. + */ +SPHINXBASE_EXPORT +int bit_encode_free(bit_encode_t *be); + +/** + * Write bits to encoder. + */ +SPHINXBASE_EXPORT +int bit_encode_write(bit_encode_t *be, unsigned char const *bits, int nbits); + +/** + * Write lowest-order bits of codeword to encoder. + */ +SPHINXBASE_EXPORT +int bit_encode_write_cw(bit_encode_t *be, uint32 codeword, int nbits); + +/** + * Flush any unwritten bits, zero-padding if necessary. + */ +SPHINXBASE_EXPORT +int bit_encode_flush(bit_encode_t *be); + +/** + * There is no bitstream decoder, because a stream abstraction is too + * slow. Instead we read blocks of bits and treat them as bitvectors. + */ + +/** + * Like fread_retry, but for stat. Arguments identical to regular stat. + * Return value: 0 if successful, -1 if stat failed several attempts. + */ +SPHINXBASE_EXPORT +int32 stat_retry (const char *file, struct stat *statbuf); + +/** + * Return time of last modification for the given file, or -1 if stat fails. + */ + +SPHINXBASE_EXPORT +int32 stat_mtime (const char *file); + +/** + * Create a directory and all of its parent directories, as needed. + * + * @return 0 on success, <0 on failure. + */ +SPHINXBASE_EXPORT +int build_directory(const char *path); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h new file mode 100644 index 0000000..4351257 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h @@ -0,0 +1,195 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * prim_type.h -- Primitive types; more machine-independent. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: prim_type.h,v $ + * Revision 1.12 2005/10/05 00:31:14 dhdfu + * Make int8 be explicitly signed (signedness of 'char' is + * architecture-dependent). Then make a bunch of things use uint8 where + * signedness is unimportant, because on the architecture where 'char' is + * unsigned, it is that way for a reason (signed chars are slower). + * + * Revision 1.11 2005/06/22 03:10:23 arthchan2003 + * Added keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 12-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added arraysize_t, point_t, fpoint_t. + * + * 01-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added anytype_t. + * + * 08-31-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#ifndef _LIBUTIL_PRIM_TYPE_H_ +#define _LIBUTIL_PRIM_TYPE_H_ + +/** + * @file prim_type.h + * @brief Basic type definitions used in Sphinx. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs into not indenting things. */ +#endif + +#include + +/* Define some things for VisualDSP++ */ +#if defined(__ADSPBLACKFIN__) && !defined(__GNUC__) +# ifndef HAVE_LONG_LONG +# define HAVE_LONG_LONG +# endif +# ifndef ssize_t +typedef signed int ssize_t; +# endif +# define SIZEOF_LONG_LONG 8 +# define __BIGSTACKVARIABLE__ static +#else /* Not VisualDSP++ */ +# define __BIGSTACKVARIABLE__ +#endif + +/** + * Union of basic types. + */ +typedef union anytype_s { + void *ptr; + long i; + unsigned long ui; + double fl; +} anytype_t; + +/* Use C99 types if available */ +#if defined(HAVE_STDINT_H) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) +#include +typedef int32_t int32; +typedef int16_t int16; +typedef int8_t int8; +typedef uint32_t uint32; +typedef uint16_t uint16; +typedef uint8_t uint8; +typedef int64_t int64; +typedef uint64_t uint64; +/* Take a wild guess otherwise */ +#else +typedef int int32; +typedef short int16; +typedef signed char int8; +typedef unsigned int uint32; +typedef unsigned short uint16; +typedef unsigned char uint8; +# if defined(_MSC_VER) +typedef __int64 int64; +typedef unsigned __int64 uint64; +# else +typedef long long int64; +typedef unsigned long long uint64; +# endif +#endif /* not C99 or POSIX */ + +/* We should maybe stop using these as there isn't any good way to + know their exact size, but it's 99% certain they are 32 and 64 + bits. */ +typedef float float32; +typedef double float64; + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void *)0 +#endif + +/* These really ought to come from , but not everybody has that. */ +/* Useful constants */ +#define MAX_INT32 ((int32) 0x7fffffff) +#define MAX_INT16 ((int16) 0x00007fff) +#define MAX_INT8 ((int8) 0x0000007f) + +#define MAX_NEG_INT32 ((int32) 0x80000000) +#define MAX_NEG_INT16 ((int16) 0xffff8000) +#define MAX_NEG_INT8 ((int8) 0xffffff80) + +#define MAX_UINT32 ((uint32) 0xffffffff) +#define MAX_UINT16 ((uint16) 0x0000ffff) +#define MAX_UINT8 ((uint8) 0x000000ff) + +/* The following are approximate; IEEE floating point standards might quibble! */ +#define MAX_POS_FLOAT32 3.4e+38f +#define MIN_POS_FLOAT32 1.2e-38f /* But not 0 */ +#define MAX_POS_FLOAT64 1.8e+307 +#define MIN_POS_FLOAT64 2.2e-308 + +#define MAX_IEEE_NORM_POS_FLOAT32 3.4e+38f +#define MIN_IEEE_NORM_POS_FLOAT32 1.2e-38f +#define MIN_IEEE_NORM_NEG_FLOAT32 -3.4e+38f +#define MAX_IEEE_NORM_POS_FLOAT64 1.8e+307 +#define MIN_IEEE_NORM_POS_FLOAT64 2.2e-308 +#define MIN_IEEE_NORM_NEG_FLOAT64 -1.8e+307 + +/* Will the following really work?? */ +#define MIN_NEG_FLOAT32 ((float32) (-MIN_POS_FLOAT32)) +#define MIN_NEG_FLOAT64 ((float64) (-MIN_POS_FLOAT64)) + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h new file mode 100644 index 0000000..335bcda --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h @@ -0,0 +1,45 @@ +#ifndef __PRIORITY_QUEUE_H__ +#define __PRIORITY_QUEUE_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Priority queue for max element tracking. + * The one expects heap here, but for current application + * (sorting of ngram entries one per order, i.e. maximum 10) + * i'll put just and array here, so each operation takes linear time. + * I swear to rework it some day! + * TODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODO!!!!! + */ + +typedef struct priority_queue_s priority_queue_t; + +SPHINXBASE_EXPORT +priority_queue_t* priority_queue_create(size_t len, int (*compare)(const void *a, const void *b)); + +SPHINXBASE_EXPORT +void* priority_queue_poll(priority_queue_t *queue); + +SPHINXBASE_EXPORT +void priority_queue_add(priority_queue_t *queue, void *element); + +SPHINXBASE_EXPORT +size_t priority_queue_size(priority_queue_t *queue); + +SPHINXBASE_EXPORT +void priority_queue_free(priority_queue_t *queue, void (*free_ptr)(void *a)); + +#ifdef __cplusplus +} +#endif + +#endif /* __PRIORITY_QUEUE_H__ */ \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h new file mode 100644 index 0000000..ddecfb6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h @@ -0,0 +1,231 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * profile.h -- For timing and event counting. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: profile.h,v $ + * Revision 1.10 2005/06/22 03:10:59 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.5 2005/06/15 04:21:47 archan + * 1, Fixed doxygen-documentation, 2, Add keyword such that changes will be logged into a file. + * + * Revision 1.4 2005/04/25 19:22:48 archan + * Refactor out the code of rescoring from lexical tree. Potentially we want to turn off the rescoring if we need. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added ptmr_init(). + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier Sphinx-3 version. + */ + + +#ifndef _LIBUTIL_PROFILE_H_ +#define _LIBUTIL_PROFILE_H_ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs into not indenting things. */ +#endif + +/** \file profile.h + * \brief Implementation of profiling, include counting , timing, cpu clock checking + * + * Currently, function host_endian is also in this function. It is + * not documented. + */ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + + +/** + * \struct pctr_t + * + * Generic event counter for profiling. User is responsible for allocating an array + * of the desired number. There should be a sentinel with name = NULL. + */ +typedef struct { + char *name; /**< Counter print name; NULL + terminates array of counters + Used by pctr_print_all */ + int32 count; /**< Counter value */ +} pctr_t; + +/** + * operations of pctr_t + */ + +/** + * Initialize a counter + * @return an initialized counter + */ +SPHINXBASE_EXPORT +pctr_t* pctr_new ( + char *name /**< The name of the counter */ + ); + +/** + * Reset a counter + */ + +SPHINXBASE_EXPORT +void pctr_reset (pctr_t *ctr /**< A pointer of a counter */ + ); + +/** + * Print a counter + */ +SPHINXBASE_EXPORT +void pctr_print(FILE *fp, /**< A file pointer */ + pctr_t *ctr /**< A pointer of a counter */ + ); + +/** + * Increment a counter + */ +SPHINXBASE_EXPORT +void pctr_increment (pctr_t *ctr, /**< A pointer of a counter */ + int32 inc /**< The increment of the counter */ + ); + +/** + Free the counter +*/ +SPHINXBASE_EXPORT +void pctr_free(pctr_t* ctr /**< A pointer of a counter */ + ); + + +/** + * \struct ptmr_t + * Generic timer structures and functions for coarse-grained performance measurements + * using standard system calls. + */ +typedef struct { + const char *name; /**< Timer print name; NULL terminates an array of timers. + Used by ptmr_print_all */ + float64 t_cpu; /**< CPU time accumulated since most recent reset op */ + float64 t_elapsed; /**< Elapsed time accumulated since most recent reset */ + float64 t_tot_cpu; /**< Total CPU time since creation */ + float64 t_tot_elapsed; /**< Total elapsed time since creation */ + float64 start_cpu; /**< ---- FOR INTERNAL USE ONLY ---- */ + float64 start_elapsed; /**< ---- FOR INTERNAL USE ONLY ---- */ +} ptmr_t; + + + +/** Start timing using tmr */ +SPHINXBASE_EXPORT +void ptmr_start (ptmr_t *tmr /**< The timer*/ + ); + +/** Stop timing and accumulate tmr->{t_cpu, t_elapsed, t_tot_cpu, t_tot_elapsed} */ +SPHINXBASE_EXPORT +void ptmr_stop (ptmr_t *tmr /**< The timer*/ + ); + +/** Reset tmr->{t_cpu, t_elapsed} to 0.0 */ +SPHINXBASE_EXPORT +void ptmr_reset (ptmr_t *tmr /**< The timer*/ + ); + +/** Reset tmr->{t_cpu, t_elapsed, t_tot_cpu, t_tot_elapsed} to 0.0 + */ +SPHINXBASE_EXPORT +void ptmr_init (ptmr_t *tmr /**< The timer*/ + ); + + +/** + * Reset t_cpu, t_elapsed of all timer modules in array tmr[] to 0.0. + * The array should be terminated with a sentinel with .name = NULL. + */ +SPHINXBASE_EXPORT +void ptmr_reset_all (ptmr_t *tmr /**< The timer*/ + ); + +/** + * Print t_cpu for all timer modules in tmr[], normalized by norm (i.e., t_cpu/norm). + * The array should be terminated with a sentinel with .name = NULL. + */ +SPHINXBASE_EXPORT +void ptmr_print_all (FILE *fp, /**< The file pointer */ + ptmr_t *tmr, /**< The timer*/ + float64 norm + ); + + +/** + * Return the processor clock speed (in MHz); only available on some machines (Alphas). + * The dummy argument can be any integer value. + */ +SPHINXBASE_EXPORT +int32 host_pclk (int32 dummy); + + +/* + * Check the native byte-ordering of the machine by writing a magic + * number to a temporary file and reading it back. * Return value: + * 0 if BIG-ENDIAN, 1 if LITTLE-ENDIAN, -1 if error. + */ +SPHINXBASE_EXPORT +int32 host_endian ( void ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h new file mode 100644 index 0000000..f5a3b66 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h @@ -0,0 +1,220 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file sbthread.h + * @brief Simple portable thread functions. + * @author David Huggins-Daines + **/ + +#ifndef __SBTHREAD_H__ +#define __SBTHREAD_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Thread object. + */ +typedef struct sbthread_s sbthread_t; + +/** + * Asynchronous message queue object. + */ +typedef struct sbmsgq_s sbmsgq_t; + +/** + * Mutex (critical section) object. + */ +typedef struct sbmtx_s sbmtx_t; + +/** + * Event object. + */ +typedef struct sbevent_s sbevent_t; + +/** + * Entry point for a thread. + */ +typedef int (*sbthread_main)(sbthread_t *th); + +/** + * Start a new thread. + */ +SPHINXBASE_EXPORT +sbthread_t *sbthread_start(cmd_ln_t *config, sbthread_main func, void *arg); + +/** + * Wait for a thread to complete. + */ +SPHINXBASE_EXPORT +int sbthread_wait(sbthread_t *th); + +/** + * Free a thread object. + */ +SPHINXBASE_EXPORT +void sbthread_free(sbthread_t *th); + +/** + * Get configuration object from a thread. + */ +SPHINXBASE_EXPORT +cmd_ln_t *sbthread_config(sbthread_t *th); + +/** + * Get argument pointer from a thread. + */ +SPHINXBASE_EXPORT +void *sbthread_arg(sbthread_t *th); + +/** + * Get message queue from a thread. + */ +SPHINXBASE_EXPORT +sbmsgq_t *sbthread_msgq(sbthread_t *th); + +/** + * Wait for a thread to complete. + */ +SPHINXBASE_EXPORT +int sbthread_wait(sbthread_t *th); + +/** + * Send an asynchronous message to a thread. + * + * Each thread gets a message queue by default, so this is just a + * wrapper around sbmsgq_send(). + */ +SPHINXBASE_EXPORT +int sbthread_send(sbthread_t *th, size_t len, void const *data); + +/** + * Create a message queue. + * + * @param depth Depth of the queue. + */ +SPHINXBASE_EXPORT +sbmsgq_t *sbmsgq_init(size_t depth); + +/** + * Free a message queue. + */ +SPHINXBASE_EXPORT +void sbmsgq_free(sbmsgq_t *q); + +/** + * Post a message to a queue. + */ +SPHINXBASE_EXPORT +int sbmsgq_send(sbmsgq_t *q, size_t len, void const *data); + +/** + * Wait for a message from a queue. + */ +SPHINXBASE_EXPORT +void *sbmsgq_wait(sbmsgq_t *q, size_t *out_len, int sec, int nsec); + +/** + * Create a mutex. + */ +SPHINXBASE_EXPORT +sbmtx_t *sbmtx_init(void); + +/** + * Try to acquire a mutex. + */ +SPHINXBASE_EXPORT +int sbmtx_trylock(sbmtx_t *mtx); + +/** + * Acquire a mutex. + */ +SPHINXBASE_EXPORT +int sbmtx_lock(sbmtx_t *mtx); + +/** + * Release a mutex. + */ +SPHINXBASE_EXPORT +int sbmtx_unlock(sbmtx_t *mtx); + +/** + * Dispose of a mutex. + */ +SPHINXBASE_EXPORT +void sbmtx_free(sbmtx_t *mtx); + +/** + * Initialize an event. + */ +SPHINXBASE_EXPORT +sbevent_t *sbevent_init(void); + +/** + * Free an event. + */ +SPHINXBASE_EXPORT +void sbevent_free(sbevent_t *evt); + +/** + * Signal an event. + */ +SPHINXBASE_EXPORT +int sbevent_signal(sbevent_t *evt); + +/** + * Wait for an event to be signalled. + */ +SPHINXBASE_EXPORT +int sbevent_wait(sbevent_t *evt, int sec, int nsec); + + +#ifdef __cplusplus +} +#endif + + +#endif /* __SBTHREAD_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h new file mode 100644 index 0000000..205289a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h @@ -0,0 +1,17 @@ +/* include/sphinx_config.h. Generated from sphinx_config.h.in by configure. */ +/* sphinx_config.h: Externally visible configuration parameters */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h new file mode 100644 index 0000000..4022ed7 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h @@ -0,0 +1,15 @@ +#ifndef __SPHINXBASE_EXPORT_H__ +#define __SPHINXBASE_EXPORT_H__ + +/* Win32 DLL gunk */ +#if defined(_WIN32) && defined(SPHINX_DLL) +#if defined(SPHINXBASE_EXPORTS) /* DLL itself */ +#define SPHINXBASE_EXPORT __declspec(dllexport) +#else +#define SPHINXBASE_EXPORT __declspec(dllimport) +#endif +#else /* No DLL things*/ +#define SPHINXBASE_EXPORT +#endif + +#endif /* __SPHINXBASE_EXPORT_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h new file mode 100644 index 0000000..392f1ca --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h @@ -0,0 +1,158 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1995-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file strfuncs.h + * @brief Miscellaneous useful string functions + */ + +#ifndef __SB_STRFUNCS_H__ +#define __SB_STRFUNCS_H__ + +#include + +/* Win32/WinCE DLL gunk */ +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/** + * Concatenate a NULL-terminated argument list of strings, returning a + * newly allocated string. + **/ +SPHINXBASE_EXPORT +char *string_join(const char *base, ...); + +/** + * Which end of a string to operate on for string_trim(). + */ +enum string_edge_e { + STRING_START, /**< Beginning of string. */ + STRING_END, /**< End of string. */ + STRING_BOTH /**< Both ends of string. */ +}; + +/** + * Remove whitespace from a string, modifying it in-place. + * + * @param string string to trim, contents will be modified. + * @param which one of STRING_START, STRING_END, or STRING_BOTH. + */ +SPHINXBASE_EXPORT +char *string_trim(char *string, enum string_edge_e which); + +/** + * Locale independent version of atof(). + * + * This function behaves like atof() in the "C" locale. Switching + * locale in a threaded program is extremely uncool, therefore we need + * this since we pass floats as strings in 1000 different places. + */ +SPHINXBASE_EXPORT +double atof_c(char const *str); + +/* FIXME: Both of these string splitting functions basically suck. I + have attempted to fix them as best I can. (dhuggins@cs, 20070808) */ + +/** + * Convert a line to an array of "words", based on whitespace separators. A word + * is a string with no whitespace chars in it. + * Note that the string line is modified as a result: NULL chars are placed after + * every word in the line. + * Return value: No. of words found; -1 if no. of words in line exceeds n_wptr. + */ +SPHINXBASE_EXPORT +int32 str2words (char *line, /**< In/Out: line to be parsed. This + string will be modified! (NUL + characters inserted at word + boundaries) */ + char **wptr, /**< In/Out: Array of pointers to + words found in line. The array + must be allocated by the caller. + It may be NULL in which case the + number of words will be counted. + This allows you to allcate it to + the proper size, e.g.: + + n = str2words(line, NULL, 0); + wptr = ckd_calloc(n, sizeof(*wptr)); + str2words(line, wptr, n); + */ + int32 n_wptr /**< In: Size of wptr array, ignored + if wptr == NULL */ + ); + +/** + * Yet another attempt at a clean "next-word-in-string" function. See arguments below. + * @return Length of word returned, or -1 if nothing found. + * This allows you to scan through a line: + * + *
+ * while ((n = nextword(line, delim, &word, &delimfound)) >= 0) {
+ *     ... do something with word ..
+ *     word[n] = delimfound;
+ *     line = word + n;
+ * }
+ * 
+ */ +SPHINXBASE_EXPORT +int32 nextword (char *line, /**< Input: String being searched for next word. + Will be modified by this function (NUL characters inserted) */ + const char *delim, /**< Input: A word, if found, must be delimited at either + end by a character from this string (or at the end + by the NULL char) */ + char **word,/**< Output: *word = ptr within line to beginning of first + word, if found. Delimiter at the end of word replaced + with the NULL char. */ + char *delimfound /**< Output: *delimfound = original delimiter found at the end + of the word. (This way, the caller can restore the + delimiter, preserving the original string.) */ + ); + +#ifdef __cplusplus +} +#endif + + +#endif /* __SB_STRFUNCS_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h new file mode 100644 index 0000000..b1e5639 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h @@ -0,0 +1,116 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + * Copyright (c) 2008 Beyond Access, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY BEYOND ACCESS, INC. ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEYOND ACCESS, INC. NOR + * ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file yin.h + * @brief Implementation of pitch estimation + * @author David Huggins-Daines + * + * This implements part of the YIN algorithm: + * + * "YIN, a fundamental frequency estimator for speech and music". + * Alain de Cheveigné and Hideki Kawahara. Journal of the Acoustical + * Society of America, 111 (4), April 2002. + */ + +#ifndef __YIN_H__ +#define __YIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} /* Fool Emacs. */ +#endif + +/* Win32/WinCE DLL gunk */ +#include +#include + +/** + * Frame-based moving-window pitch estimator. + */ +typedef struct yin_s yin_t; + +/** + * Initialize moving-window pitch estimation. + */ +SPHINXBASE_EXPORT +yin_t *yin_init(int frame_size, float search_threshold, + float search_range, int smooth_window); + +/** + * Free a moving-window pitch estimator. + */ +SPHINXBASE_EXPORT +void yin_free(yin_t *pe); + +/** + * Start processing an utterance. + */ +SPHINXBASE_EXPORT +void yin_start(yin_t *pe); + +/** + * Mark the end of an utterance. + */ +SPHINXBASE_EXPORT +void yin_end(yin_t *pe); + +/** + * Feed a frame of data to the pitch estimator. + * + * @param pe Pitch estimator. + * @param frame Frame of frame_size (see + * yin_init()) samples of audio data. + */ +SPHINXBASE_EXPORT +void yin_write(yin_t *pe, int16 const *frame); + +/** + * Read a raw estimated pitch value from the pitch estimator. + * + * @param pe Pitch estimator. + * @param out_period Output: an estimate of the period (*not* the pitch) + * of the signal in samples. + * @param out_bestdiff Output: the minimum normalized difference value + * associated with *out_pitch, in Q15 + * format (i.e. scaled by 32768). This can be + * interpreted as one minus the probability of voicing. + * @return Non-zero if enough data was avaliable to return a pitch + * estimate, zero otherwise. + */ +SPHINXBASE_EXPORT +int yin_read(yin_t *pe, uint16 *out_period, uint16 *out_bestdiff); + +#ifdef __cplusplus +} +#endif + +#endif /* __YIN_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h new file mode 100644 index 0000000..0266542 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h @@ -0,0 +1,31 @@ +/* include/sphinx_config.h, defaults for Win32 */ +/* sphinx_config.h: Externally visible configuration parameters for + * SphinxBase. + */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Enable thread safety */ +#define ENABLE_THREADS + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* Enable matrix algebra with LAPACK */ +#define WITH_LAPACK 1 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* We don't have popen, but we do have _popen */ +/* #define HAVE_POPEN 1 */ + +/* We do have perror */ +#define HAVE_PERROR 1 + +/* We have sys/stat.h */ +#define HAVE_SYS_STAT_H 1 + +/* Extension for executables */ +#define EXEEXT ".exe" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h new file mode 100644 index 0000000..730a14a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h @@ -0,0 +1,13 @@ +/* include/sphinx_config.h, defaults for Win32 */ +/* sphinx_config.h: Externally visible configuration parameters for + * SphinxBase. + */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Use fixed-point computation */ +/* #undef FIXED_POINT */ + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h new file mode 100644 index 0000000..0a03589 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h @@ -0,0 +1,6 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* A bogus for WinCE which sometimes doesn't have it. */ +#ifndef __ASSERT_H__ +#define __ASSERT_H__ +#define assert(x) if (!(x)) (*(int *)0=0); +#endif /* __ASSERT_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h new file mode 100644 index 0000000..777b967 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h @@ -0,0 +1,3 @@ +/* Keep only one configuration file */ + +#include "sphinx_config.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h new file mode 100644 index 0000000..3a06b15 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h @@ -0,0 +1,94 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== +/********************************************************************* + * + * File: errno.h + * + * Description: functions and variables missing from Windows CE standard + * library + * + * Author: Silvio Moioli + * + *********************************************************************/ + +#ifndef __ERRNO_H__ +#define __ERRNO_H__ + +#ifdef __cplusplus +extern "C" extern int errno; +#else +extern int errno; +#endif + +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EDEADLK 36 +#define ENAMETOOLONG 38 +#define ENOLCK 39 +#define ENOSYS 40 +#define ENOTEMPTY 41 +#define EILSEQ 42 + +#endif /* __ERRNO_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h new file mode 100644 index 0000000..181baf5 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h @@ -0,0 +1,16 @@ +/* include/sphinx_config.h, defaults for Windows CE. */ +/* sphinx_config.h: Externally visible configuration parameters for + * SphinxBase. + */ + +/* Default radix point for fixed-point */ +/* #undef DEFAULT_RADIX */ + +/* Use fixed-point computation */ +/* #define FIXED_POINT 1 */ + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* Extension for executables */ +#define EXEEXT ".exe" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt new file mode 100644 index 0000000..2b45676 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt @@ -0,0 +1,109 @@ +add_library(pocketsphinx + tmat.c + fsg_history.c + allphone_search.c + s2_semi_mgau.c + ps_alignment.c + ms_gauden.c + state_align_search.c + mdef.c + blkarray_list.c + dict2pid.c + vector.c + ms_senone.c + ptm_mgau.c + ngram_search_fwdflat.c + kws_detections.c + hmm.c + bin_mdef.c + phone_loop_search.c + ngram_search.c + ngram_search_fwdtree.c + ms_mgau.c + fsg_search.c + ps_lattice.c + fsg_lextree.c + ps_mllr.c + pocketsphinx.c + kws_search.c + acmod.c + dict.c + fe/fe_sigproc.c + fe/fixlog.c + fe/fe_warp_inverse_linear.c + fe/fe_warp.c + fe/fe_interface.c + fe/fe_noise.c + fe/fe_warp_affine.c + fe/fe_warp_piecewise_linear.c + fe/yin.c + feat/cmn.c + feat/agc.c + feat/cmn_live.c + feat/feat.c + feat/lda.c + lm/lm_trie_quant.c + lm/ngram_model_trie.c + lm/fsg_model.c + lm/jsgf.c + lm/ngram_model_set.c + lm/ngrams_raw.c + lm/jsgf_scanner.c + lm/ngram_model.c + lm/lm_trie.c + lm/jsgf_parser.c + util/strfuncs.c + util/dtoa.c + util/case.c + util/filename.c + util/slamch.c + util/cmd_ln.c + util/blas_lite.c + util/mmio.c + util/hash_table.c + util/err.c + util/ckd_alloc.c + util/slapack_lite.c + util/matrix.c + util/sbthread.c + util/bio.c + util/heap.c + util/priority_queue.c + util/bitvec.c + util/profile.c + util/errno.c + util/logmath.c + util/glist.c + util/f2c_lite.c + util/listelem_alloc.c + util/bitarr.c + util/pio.c + util/genrand.c + ) +target_include_directories( + pocketsphinx PRIVATE ${CMAKE_BINARY_DIR} # config.h + pocketsphinx PRIVATE ${CMAKE_SOURCE_DIR}/include/pocketsphinx + pocketsphinx PUBLIC ${CMAKE_SOURCE_DIR}/include + pocketsphinx PUBLIC ${CMAKE_BINARY_DIR}/include + pocketsphinx INTERFACE ${CMAKE_SOURCE_DIR}/include + ) +if(APPLE) + # Things we might need are here + target_link_directories(pocketsphinx PUBLIC /usr/local/lib) +endif() +find_library(MATH_LIBRARY m) +if(MATH_LIBRARY) + target_link_libraries(pocketsphinx PUBLIC ${MATH_LIBRARY}) +endif() +find_package(Threads) +target_link_libraries(pocketsphinx PUBLIC Threads::Threads) +# Shared library version != package version, but we will make it the +# same for now to avoid confusion +set_target_properties(pocketsphinx PROPERTIES + VERSION 5.0.0 + SOVERSION 5 + ) +# No idea why this can't just go in the above list but oh well +set_property(TARGET pocketsphinx PROPERTY + COMPILE_DEFINITIONS POCKETSPHINX_EXPORTS;SPHINXBASE_EXPORTS +) diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c new file mode 100644 index 0000000..5986159 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c @@ -0,0 +1,1331 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + + +/** + * @file acmod.c Acoustic model structures for PocketSphinx. + * @author David Huggins-Daines + */ + +/* System headers. */ +#include +#include +#include + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include +#include +#include + +/* Local headers. */ +#include "cmdln_macro.h" +#include "acmod.h" +#include "s2_semi_mgau.h" +#include "ptm_mgau.h" +#include "ms_mgau.h" + +static int32 acmod_process_mfcbuf(acmod_t *acmod); +static const char *acmod_update_cmninit(acmod_t *acmod); + +static int +acmod_init_am(acmod_t *acmod) +{ + char const *mdeffn, *tmatfn, *mllrfn, *hmmdir; + + /* Read model definition. */ + if ((mdeffn = cmd_ln_str_r(acmod->config, "_mdef")) == NULL) { + if ((hmmdir = cmd_ln_str_r(acmod->config, "-hmm")) == NULL) + E_ERROR("Acoustic model definition is not specified either " + "with -mdef option or with -hmm\n"); + else + E_ERROR("Folder '%s' does not contain acoustic model " + "definition 'mdef'\n", hmmdir); + + return -1; + } + + if ((acmod->mdef = bin_mdef_read(acmod->config, mdeffn)) == NULL) { + E_ERROR("Failed to read acoustic model definition from %s\n", mdeffn); + return -1; + } + + /* Read transition matrices. */ + if ((tmatfn = cmd_ln_str_r(acmod->config, "_tmat")) == NULL) { + E_ERROR("No tmat file specified\n"); + return -1; + } + acmod->tmat = tmat_init(tmatfn, acmod->lmath, + cmd_ln_float32_r(acmod->config, "-tmatfloor"), + TRUE); + + /* Read the acoustic models. */ + if ((cmd_ln_str_r(acmod->config, "_mean") == NULL) + || (cmd_ln_str_r(acmod->config, "_var") == NULL) + || (cmd_ln_str_r(acmod->config, "_tmat") == NULL)) { + E_ERROR("No mean/var/tmat files specified\n"); + return -1; + } + + if (cmd_ln_str_r(acmod->config, "_senmgau")) { + E_INFO("Using general multi-stream GMM computation\n"); + acmod->mgau = ms_mgau_init(acmod, acmod->lmath, acmod->mdef); + if (acmod->mgau == NULL) + return -1; + } + else { + E_INFO("Attempting to use PTM computation module\n"); + if ((acmod->mgau = ptm_mgau_init(acmod, acmod->mdef)) == NULL) { + E_INFO("Attempting to use semi-continuous computation module\n"); + if ((acmod->mgau = s2_semi_mgau_init(acmod)) == NULL) { + E_INFO("Falling back to general multi-stream GMM computation\n"); + acmod->mgau = ms_mgau_init(acmod, acmod->lmath, acmod->mdef); + if (acmod->mgau == NULL) { + E_ERROR("Failed to read acoustic model\n"); + return -1; + } + } + } + } + + /* If there is an MLLR transform, apply it. */ + if ((mllrfn = cmd_ln_str_r(acmod->config, "-mllr"))) { + ps_mllr_t *mllr = ps_mllr_read(mllrfn); + if (mllr == NULL) + return -1; + acmod_update_mllr(acmod, mllr); + } + + return 0; +} + +int +acmod_reinit_feat(acmod_t *acmod, fe_t *fe, feat_t *fcb) +{ + if (fe) + fe = fe_retain(fe); + else { + fe = fe_init_auto_r(acmod->config); + if (fe == NULL) + return -1; + } + if (acmod_fe_mismatch(acmod, fe)) { + fe_free(fe); + return -1; + } + if (acmod->fe) + fe_free(acmod->fe); + acmod->fe = fe; + + if (fcb) + fcb = feat_retain(fcb); + else { + fcb = + feat_init(cmd_ln_str_r(acmod->config, "-feat"), + cmn_type_from_str(cmd_ln_str_r(acmod->config,"-cmn")), + cmd_ln_boolean_r(acmod->config, "-varnorm"), + agc_type_from_str(cmd_ln_str_r(acmod->config, "-agc")), + 1, cmd_ln_int32_r(acmod->config, "-ceplen")); + if (fcb == NULL) + return -1; + + if (cmd_ln_str_r(acmod->config, "_lda")) { + E_INFO("Reading linear feature transformation from %s\n", + cmd_ln_str_r(acmod->config, "_lda")); + if (feat_read_lda(fcb, + cmd_ln_str_r(acmod->config, "_lda"), + cmd_ln_int32_r(acmod->config, "-ldadim")) < 0) + return -1; + } + + if (cmd_ln_str_r(acmod->config, "-svspec")) { + int32 **subvecs; + E_INFO("Using subvector specification %s\n", + cmd_ln_str_r(acmod->config, "-svspec")); + if ((subvecs = parse_subvecs(cmd_ln_str_r(acmod->config, "-svspec"))) == NULL) + return -1; + if ((feat_set_subvecs(fcb, subvecs)) < 0) + return -1; + } + + if (cmd_ln_exists_r(acmod->config, "-agcthresh") + && 0 != strcmp(cmd_ln_str_r(acmod->config, "-agc"), "none")) { + agc_set_threshold(fcb->agc_struct, + cmd_ln_float32_r(acmod->config, "-agcthresh")); + } + + if (fcb->cmn_struct + && cmd_ln_exists_r(acmod->config, "-cmninit") + && cmd_ln_str_r(acmod->config, "-cmninit")) { + char *c, *cc, *vallist; + int32 nvals; + + vallist = ckd_salloc(cmd_ln_str_r(acmod->config, "-cmninit")); + c = vallist; + nvals = 0; + while (nvals < fcb->cmn_struct->veclen + && (cc = strchr(c, ',')) != NULL) { + *cc = '\0'; + fcb->cmn_struct->cmn_mean[nvals] = FLOAT2MFCC(atof_c(c)); + c = cc + 1; + ++nvals; + } + if (nvals < fcb->cmn_struct->veclen && *c != '\0') { + fcb->cmn_struct->cmn_mean[nvals] = FLOAT2MFCC(atof_c(c)); + } + ckd_free(vallist); + } + } + if (acmod_feat_mismatch(acmod, fcb)) { + feat_free(fcb); + return -1; + } + if (acmod->fcb) + feat_free(acmod->fcb); + acmod->fcb = fcb; + + /* The MFCC buffer needs to be at least as large as the dynamic + * feature window. */ + acmod->n_mfc_alloc = acmod->fcb->window_size * 2 + 1; + if (acmod->mfc_buf) + ckd_free_2d(acmod->mfc_buf); + acmod->mfc_buf = (mfcc_t **) + ckd_calloc_2d(acmod->n_mfc_alloc, acmod->fcb->cepsize, + sizeof(**acmod->mfc_buf)); + + /* Feature buffer has to be at least as large as MFCC buffer. */ + acmod->n_feat_alloc = acmod->n_mfc_alloc + cmd_ln_int32_r(acmod->config, "-pl_window"); + if (acmod->feat_buf) + feat_array_free(acmod->feat_buf); + acmod->feat_buf = feat_array_alloc(acmod->fcb, acmod->n_feat_alloc); + if (acmod->framepos) + ckd_free(acmod->framepos); + acmod->framepos = ckd_calloc(acmod->n_feat_alloc, sizeof(*acmod->framepos)); + + return 0; +} + +int +acmod_fe_mismatch(acmod_t *acmod, fe_t *fe) +{ + /* Output vector dimension needs to be the same. */ + if (cmd_ln_int32_r(acmod->config, "-ceplen") != fe_get_output_size(fe)) { + E_ERROR("Configured feature length %d doesn't match feature " + "extraction output size %d\n", + cmd_ln_int32_r(acmod->config, "-ceplen"), + fe_get_output_size(fe)); + return TRUE; + } + /* Feature parameters need to be the same. */ + /* ... */ + return FALSE; +} + +int +acmod_feat_mismatch(acmod_t *acmod, feat_t *fcb) +{ + /* Feature type needs to be the same. */ + if (0 != strcmp(cmd_ln_str_r(acmod->config, "-feat"), feat_name(fcb))) + return TRUE; + /* Input vector dimension needs to be the same. */ + if (cmd_ln_int32_r(acmod->config, "-ceplen") != feat_cepsize(fcb)) + return TRUE; + /* FIXME: Need to check LDA and stuff too. */ + return FALSE; +} + +acmod_t * +acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb) +{ + acmod_t *acmod; + + acmod = ckd_calloc(1, sizeof(*acmod)); + acmod->config = cmd_ln_retain(config); + acmod->lmath = logmath_retain(lmath); + acmod->state = ACMOD_IDLE; + + /* Initialize or retain fe and fcb. */ + if (acmod_reinit_feat(acmod, fe, fcb) < 0) + goto error_out; + + /* Load acoustic model parameters. */ + if (acmod_init_am(acmod) < 0) + goto error_out; + + /* Senone computation stuff. */ + acmod->senone_scores = ckd_calloc(bin_mdef_n_sen(acmod->mdef), + sizeof(*acmod->senone_scores)); + acmod->senone_active_vec = bitvec_alloc(bin_mdef_n_sen(acmod->mdef)); + acmod->senone_active = ckd_calloc(bin_mdef_n_sen(acmod->mdef), + sizeof(*acmod->senone_active)); + acmod->log_zero = logmath_get_zero(acmod->lmath); + acmod->compallsen = cmd_ln_boolean_r(config, "-compallsen"); + return acmod; + +error_out: + acmod_free(acmod); + return NULL; +} + +void +acmod_free(acmod_t *acmod) +{ + if (acmod == NULL) + return; + + feat_free(acmod->fcb); + fe_free(acmod->fe); + cmd_ln_free_r(acmod->config); + + if (acmod->mfc_buf) + ckd_free_2d((void **)acmod->mfc_buf); + if (acmod->feat_buf) + feat_array_free(acmod->feat_buf); + + if (acmod->mfcfh) + fclose(acmod->mfcfh); + if (acmod->rawfh) + fclose(acmod->rawfh); + if (acmod->senfh) + fclose(acmod->senfh); + + ckd_free(acmod->framepos); + ckd_free(acmod->senone_scores); + ckd_free(acmod->senone_active_vec); + ckd_free(acmod->senone_active); + + if (acmod->mdef) + bin_mdef_free(acmod->mdef); + if (acmod->tmat) + tmat_free(acmod->tmat); + if (acmod->mgau) + ps_mgau_free(acmod->mgau); + if (acmod->mllr) + ps_mllr_free(acmod->mllr); + logmath_free(acmod->lmath); + + ckd_free(acmod); +} + +ps_mllr_t * +acmod_update_mllr(acmod_t *acmod, ps_mllr_t *mllr) +{ + if (acmod->mllr) + ps_mllr_free(acmod->mllr); + acmod->mllr = ps_mllr_retain(mllr); + ps_mgau_transform(acmod->mgau, mllr); + + return mllr; +} + +int +acmod_write_senfh_header(acmod_t *acmod, FILE *logfh) +{ + char nsenstr[64], logbasestr[64]; + + sprintf(nsenstr, "%d", bin_mdef_n_sen(acmod->mdef)); + sprintf(logbasestr, "%f", logmath_get_base(acmod->lmath)); + return bio_writehdr(logfh, + "version", "0.1", + "mdef_file", cmd_ln_str_r(acmod->config, "_mdef"), + "n_sen", nsenstr, + "logbase", logbasestr, NULL); +} + +int +acmod_set_senfh(acmod_t *acmod, FILE *logfh) +{ + if (acmod->senfh) + fclose(acmod->senfh); + acmod->senfh = logfh; + if (logfh == NULL) + return 0; + return acmod_write_senfh_header(acmod, logfh); +} + +int +acmod_set_mfcfh(acmod_t *acmod, FILE *logfh) +{ + int rv = 0; + + if (acmod->mfcfh) + fclose(acmod->mfcfh); + acmod->mfcfh = logfh; + fwrite(&rv, 4, 1, acmod->mfcfh); + return rv; +} + +int +acmod_set_rawfh(acmod_t *acmod, FILE *logfh) +{ + if (acmod->rawfh) + fclose(acmod->rawfh); + acmod->rawfh = logfh; + return 0; +} + +void +acmod_grow_feat_buf(acmod_t *acmod, int nfr) +{ + if (nfr > MAX_N_FRAMES) + E_FATAL("Decoder can not process more than %d frames at once, " + "requested %d\n", MAX_N_FRAMES, nfr); + + acmod->feat_buf = feat_array_realloc(acmod->fcb, acmod->feat_buf, + acmod->n_feat_alloc, nfr); + acmod->framepos = ckd_realloc(acmod->framepos, + nfr * sizeof(*acmod->framepos)); + acmod->n_feat_alloc = nfr; +} + +int +acmod_set_grow(acmod_t *acmod, int grow_feat) +{ + int tmp = acmod->grow_feat; + acmod->grow_feat = grow_feat; + + /* Expand feat_buf to a reasonable size to start with. */ + if (grow_feat && acmod->n_feat_alloc < 128) + acmod_grow_feat_buf(acmod, 128); + + return tmp; +} + +int +acmod_start_utt(acmod_t *acmod) +{ + fe_start_utt(acmod->fe); + acmod->state = ACMOD_STARTED; + acmod->n_mfc_frame = 0; + acmod->n_feat_frame = 0; + acmod->mfc_outidx = 0; + acmod->feat_outidx = 0; + acmod->output_frame = 0; + acmod->senscr_frame = -1; + acmod->n_senone_active = 0; + acmod->mgau->frame_idx = 0; + return 0; +} + +int +acmod_end_utt(acmod_t *acmod) +{ + int32 nfr = 0; + + acmod->state = ACMOD_ENDED; + if (acmod->n_mfc_frame < acmod->n_mfc_alloc) { + int inptr; + /* Where to start writing them (circular buffer) */ + inptr = (acmod->mfc_outidx + acmod->n_mfc_frame) % acmod->n_mfc_alloc; + /* nfr is always either zero or one. */ + fe_end_utt(acmod->fe, acmod->mfc_buf[inptr], &nfr); + acmod->n_mfc_frame += nfr; + /* Process whatever's left, and any leadout. */ + if (nfr) + nfr = acmod_process_mfcbuf(acmod); + } + if (acmod->mfcfh) { + int32 outlen, rv; + outlen = (ftell(acmod->mfcfh) - 4) / 4; + SWAP_BE_32(&outlen); + /* Try to seek and write */ + if ((rv = fseek(acmod->mfcfh, 0, SEEK_SET)) == 0) { + fwrite(&outlen, 4, 1, acmod->mfcfh); + } + fclose(acmod->mfcfh); + acmod->mfcfh = NULL; + } + if (acmod->rawfh) { + fclose(acmod->rawfh); + acmod->rawfh = NULL; + } + + if (acmod->senfh) { + fclose(acmod->senfh); + acmod->senfh = NULL; + } + + acmod_update_cmninit(acmod); + + return nfr; +} + +static const char * +acmod_update_cmninit(acmod_t *acmod) +{ + char *cmninit, *ptr; + cmn_t *cmn; + int i, len; + + if (acmod->fcb == NULL) + return NULL; + if ((cmn = acmod->fcb->cmn_struct) == NULL) + return NULL; + len = 0; + for (i = 0; i < cmn->veclen; ++i) { + int nbytes = snprintf(NULL, 0, "%g,", cmn->cmn_mean[i]); + if (nbytes <= 0) { + E_ERROR_SYSTEM("Failed to format %g for cmninit", cmn->cmn_mean[i]); + return NULL; + } + len += nbytes; + } + len++; + ptr = cmninit = ckd_malloc(len); + if (ptr == NULL) { + E_ERROR_SYSTEM("Failed to allocate %d bytes for cmninit", len); + return NULL; + } + for (i = 0; i < cmn->veclen; ++i) + ptr += snprintf(ptr, cmninit + len - ptr, "%g,", cmn->cmn_mean[i]); + *--ptr = '\0'; + cmd_ln_set_str_r(acmod->config, "-cmninit", cmninit); + ckd_free(cmninit); + return cmd_ln_str_r(acmod->config, "-cmninit"); +} + +static int +acmod_log_mfc(acmod_t *acmod, + mfcc_t **cep, int n_frames) +{ + size_t i, n; + int32 *ptr = (int32 *)cep[0]; + + n = n_frames * feat_cepsize(acmod->fcb); + /* Swap bytes. */ +#if !WORDS_BIGENDIAN + for (i = 0; i < (n * sizeof(mfcc_t) / sizeof(int32)); ++i) { + SWAP_INT32(ptr + i); + } +#endif + /* Write features. */ + if (fwrite(cep[0], sizeof(mfcc_t), n, acmod->mfcfh) != n) { + E_ERROR_SYSTEM("Failed to write %d values to log file", n); + } + + /* Swap them back. */ +#if !WORDS_BIGENDIAN + for (i = 0; i < (n * sizeof(mfcc_t) / sizeof(int32)); ++i) { + SWAP_INT32(ptr + i); + } +#endif + return 0; +} + +static int +acmod_process_full_cep(acmod_t *acmod, + mfcc_t ***inout_cep, + int *inout_n_frames) +{ + int32 nfr; + + /* Write to log file. */ + if (acmod->mfcfh) + acmod_log_mfc(acmod, *inout_cep, *inout_n_frames); + + /* Resize feat_buf to fit. */ + if (acmod->n_feat_alloc < *inout_n_frames) { + + if (*inout_n_frames > MAX_N_FRAMES) + E_FATAL("Batch processing can not process more than %d frames " + "at once, requested %d\n", MAX_N_FRAMES, *inout_n_frames); + + feat_array_free(acmod->feat_buf); + acmod->feat_buf = feat_array_alloc(acmod->fcb, *inout_n_frames); + acmod->n_feat_alloc = *inout_n_frames; + acmod->n_feat_frame = 0; + acmod->feat_outidx = 0; + } + /* Make dynamic features. */ + nfr = feat_s2mfc2feat_live(acmod->fcb, *inout_cep, inout_n_frames, + TRUE, TRUE, acmod->feat_buf); + acmod->n_feat_frame = nfr; + assert(acmod->n_feat_frame <= acmod->n_feat_alloc); + *inout_cep += *inout_n_frames; + *inout_n_frames = 0; + return nfr; +} + +static int +acmod_process_full_raw(acmod_t *acmod, + int16 const **inout_raw, + size_t *inout_n_samps) +{ + int32 nfr, ntail; + mfcc_t **cepptr; + + /* Write to logging file if any. */ + if (acmod->rawfh) + fwrite(*inout_raw, 2, *inout_n_samps, acmod->rawfh); + /* Resize mfc_buf to fit. */ + if (fe_process_frames(acmod->fe, NULL, inout_n_samps, NULL, &nfr) < 0) + return -1; + if (acmod->n_mfc_alloc < nfr + 1) { + ckd_free_2d(acmod->mfc_buf); + acmod->mfc_buf = ckd_calloc_2d(nfr + 1, fe_get_output_size(acmod->fe), + sizeof(**acmod->mfc_buf)); + acmod->n_mfc_alloc = nfr + 1; + } + acmod->n_mfc_frame = 0; + acmod->mfc_outidx = 0; + fe_start_utt(acmod->fe); + if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, + acmod->mfc_buf, &nfr) < 0) + return -1; + fe_end_utt(acmod->fe, acmod->mfc_buf[nfr], &ntail); + nfr += ntail; + + cepptr = acmod->mfc_buf; + nfr = acmod_process_full_cep(acmod, &cepptr, &nfr); + acmod->n_mfc_frame = 0; + return nfr; +} + +/** + * Process MFCCs that are in the internal buffer into features. + */ +static int32 +acmod_process_mfcbuf(acmod_t *acmod) +{ + mfcc_t **mfcptr; + int32 ncep; + + ncep = acmod->n_mfc_frame; + /* Also do this in two parts because of the circular mfc_buf. */ + if (acmod->mfc_outidx + ncep > acmod->n_mfc_alloc) { + int32 ncep1 = acmod->n_mfc_alloc - acmod->mfc_outidx; + int saved_state = acmod->state; + + /* Make sure we don't end the utterance here. */ + if (acmod->state == ACMOD_ENDED) + acmod->state = ACMOD_PROCESSING; + mfcptr = acmod->mfc_buf + acmod->mfc_outidx; + ncep1 = acmod_process_cep(acmod, &mfcptr, &ncep1, FALSE); + /* It's possible that not all available frames were filled. */ + ncep -= ncep1; + acmod->n_mfc_frame -= ncep1; + acmod->mfc_outidx += ncep1; + acmod->mfc_outidx %= acmod->n_mfc_alloc; + /* Restore original state (could this really be the end) */ + acmod->state = saved_state; + } + mfcptr = acmod->mfc_buf + acmod->mfc_outidx; + ncep = acmod_process_cep(acmod, &mfcptr, &ncep, FALSE); + acmod->n_mfc_frame -= ncep; + acmod->mfc_outidx += ncep; + acmod->mfc_outidx %= acmod->n_mfc_alloc; + return ncep; +} + +int +acmod_process_raw(acmod_t *acmod, + int16 const **inout_raw, + size_t *inout_n_samps, + int full_utt) +{ + int32 ncep; + + /* If this is a full utterance, process it all at once. */ + if (full_utt) + return acmod_process_full_raw(acmod, inout_raw, inout_n_samps); + + /* Append MFCCs to the end of any that are previously in there + * (in practice, there will probably be none) */ + if (inout_n_samps && *inout_n_samps) { + int16 const *prev_audio_inptr = *inout_raw; + int inptr; + + /* Total number of frames available. */ + ncep = acmod->n_mfc_alloc - acmod->n_mfc_frame; + /* Where to start writing them (circular buffer) */ + inptr = (acmod->mfc_outidx + acmod->n_mfc_frame) % acmod->n_mfc_alloc; + + /* Write them in two (or more) parts if there is wraparound. */ + while (inptr + ncep > acmod->n_mfc_alloc) { + int32 ncep1 = acmod->n_mfc_alloc - inptr; + if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, + acmod->mfc_buf + inptr, &ncep1) < 0) + return -1; + /* Write to logging file if any. */ + if (acmod->rawfh) { + fwrite(prev_audio_inptr, 2, + *inout_raw - prev_audio_inptr, + acmod->rawfh); + prev_audio_inptr = *inout_raw; + } + /* ncep1 now contains the number of frames actually + * processed. This is a good thing, but it means we + * actually still might have some room left at the end of + * the buffer, hence the while loop. Unfortunately it + * also means that in the case where we are really + * actually done, we need to get out totally, hence the + * goto. */ + acmod->n_mfc_frame += ncep1; + ncep -= ncep1; + inptr += ncep1; + inptr %= acmod->n_mfc_alloc; + if (ncep1 == 0) + goto alldone; + } + assert(inptr + ncep <= acmod->n_mfc_alloc); + if (fe_process_frames(acmod->fe, inout_raw, inout_n_samps, + acmod->mfc_buf + inptr, &ncep) < 0) + return -1; + /* Write to logging file if any. */ + if (acmod->rawfh) { + fwrite(prev_audio_inptr, 2, + *inout_raw - prev_audio_inptr, acmod->rawfh); + prev_audio_inptr = *inout_raw; + } + acmod->n_mfc_frame += ncep; + alldone: + ; + } + + /* Hand things off to acmod_process_cep. */ + return acmod_process_mfcbuf(acmod); +} + +int +acmod_process_cep(acmod_t *acmod, + mfcc_t ***inout_cep, + int *inout_n_frames, + int full_utt) +{ + int32 nfeat, ncep, inptr; + int orig_n_frames; + + /* If this is a full utterance, process it all at once. */ + if (full_utt) + return acmod_process_full_cep(acmod, inout_cep, inout_n_frames); + + /* Write to log file. */ + if (acmod->mfcfh) + acmod_log_mfc(acmod, *inout_cep, *inout_n_frames); + + /* Maximum number of frames we're going to generate. */ + orig_n_frames = ncep = nfeat = *inout_n_frames; + + /* FIXME: This behaviour isn't guaranteed... */ + if (acmod->state == ACMOD_ENDED) + nfeat += feat_window_size(acmod->fcb); + else if (acmod->state == ACMOD_STARTED) + nfeat -= feat_window_size(acmod->fcb); + + /* Clamp number of features to fit available space. */ + if (nfeat > acmod->n_feat_alloc - acmod->n_feat_frame) { + /* Grow it as needed - we have to grow it at the end of an + * utterance because we can't return a short read there. */ + if (acmod->grow_feat || acmod->state == ACMOD_ENDED) + acmod_grow_feat_buf(acmod, acmod->n_feat_alloc + nfeat); + else + ncep -= (nfeat - (acmod->n_feat_alloc - acmod->n_feat_frame)); + } + + /* Where to start writing in the feature buffer. */ + if (acmod->grow_feat) { + /* Grow to avoid wraparound if grow_feat == TRUE. */ + inptr = acmod->feat_outidx + acmod->n_feat_frame; + while (inptr + nfeat >= acmod->n_feat_alloc) + acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); + } + else { + inptr = (acmod->feat_outidx + acmod->n_feat_frame) % acmod->n_feat_alloc; + } + + + /* FIXME: we can't split the last frame drop properly to be on the bounary, so just return */ + if (inptr + nfeat > acmod->n_feat_alloc && acmod->state == ACMOD_ENDED) { + *inout_n_frames -= ncep; + *inout_cep += ncep; + return 0; + } + + /* Write them in two parts if there is wraparound. */ + if (inptr + nfeat > acmod->n_feat_alloc) { + int32 ncep1 = acmod->n_feat_alloc - inptr; + + /* Make sure we don't end the utterance here. */ + nfeat = feat_s2mfc2feat_live(acmod->fcb, *inout_cep, + &ncep1, + (acmod->state == ACMOD_STARTED), + FALSE, + acmod->feat_buf + inptr); + if (nfeat < 0) + return -1; + /* Move the output feature pointer forward. */ + acmod->n_feat_frame += nfeat; + assert(acmod->n_feat_frame <= acmod->n_feat_alloc); + inptr += nfeat; + inptr %= acmod->n_feat_alloc; + /* Move the input feature pointers forward. */ + *inout_n_frames -= ncep1; + *inout_cep += ncep1; + ncep -= ncep1; + } + + nfeat = feat_s2mfc2feat_live(acmod->fcb, *inout_cep, + &ncep, + (acmod->state == ACMOD_STARTED), + (acmod->state == ACMOD_ENDED), + acmod->feat_buf + inptr); + if (nfeat < 0) + return -1; + acmod->n_feat_frame += nfeat; + assert(acmod->n_feat_frame <= acmod->n_feat_alloc); + /* Move the input feature pointers forward. */ + *inout_n_frames -= ncep; + *inout_cep += ncep; + if (acmod->state == ACMOD_STARTED) + acmod->state = ACMOD_PROCESSING; + return orig_n_frames - *inout_n_frames; +} + +int +acmod_process_feat(acmod_t *acmod, + mfcc_t **feat) +{ + int i, inptr; + + if (acmod->n_feat_frame == acmod->n_feat_alloc) { + if (acmod->grow_feat) + acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); + else + return 0; + } + + if (acmod->grow_feat) { + /* Grow to avoid wraparound if grow_feat == TRUE. */ + inptr = acmod->feat_outidx + acmod->n_feat_frame; + while (inptr + 1 >= acmod->n_feat_alloc) + acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); + } + else { + inptr = (acmod->feat_outidx + acmod->n_feat_frame) % acmod->n_feat_alloc; + } + for (i = 0; i < feat_dimension1(acmod->fcb); ++i) + memcpy(acmod->feat_buf[inptr][i], + feat[i], feat_dimension2(acmod->fcb, i) * sizeof(**feat)); + ++acmod->n_feat_frame; + assert(acmod->n_feat_frame <= acmod->n_feat_alloc); + + return 1; +} + +static int +acmod_read_senfh_header(acmod_t *acmod) +{ + char **name, **val; + int32 swap; + int i; + + if (bio_readhdr(acmod->insenfh, &name, &val, &swap) < 0) + goto error_out; + for (i = 0; name[i] != NULL; ++i) { + if (!strcmp(name[i], "n_sen")) { + if (atoi(val[i]) != bin_mdef_n_sen(acmod->mdef)) { + E_ERROR("Number of senones in senone file (%d) does not " + "match mdef (%d)\n", atoi(val[i]), + bin_mdef_n_sen(acmod->mdef)); + goto error_out; + } + } + + if (!strcmp(name[i], "logbase")) { + if (fabs(atof_c(val[i]) - logmath_get_base(acmod->lmath)) > 0.001) { + E_ERROR("Logbase in senone file (%f) does not match acmod " + "(%f)\n", atof_c(val[i]), + logmath_get_base(acmod->lmath)); + goto error_out; + } + } + } + acmod->insen_swap = swap; + bio_hdrarg_free(name, val); + return 0; +error_out: + bio_hdrarg_free(name, val); + return -1; +} + +int +acmod_set_insenfh(acmod_t *acmod, FILE *senfh) +{ + acmod->insenfh = senfh; + if (senfh == NULL) { + acmod->n_feat_frame = 0; + acmod->compallsen = cmd_ln_boolean_r(acmod->config, "-compallsen"); + return 0; + } + acmod->compallsen = TRUE; + return acmod_read_senfh_header(acmod); +} + +int +acmod_rewind(acmod_t *acmod) +{ + /* If the feature buffer is circular, this is not possible. */ + if (acmod->output_frame > acmod->n_feat_alloc) { + E_ERROR("Circular feature buffer cannot be rewound (output frame %d, " + "alloc %d)\n", acmod->output_frame, acmod->n_feat_alloc); + return -1; + } + + /* Frames consumed + frames available */ + acmod->n_feat_frame = acmod->output_frame + acmod->n_feat_frame; + + /* Reset output pointers. */ + acmod->feat_outidx = 0; + acmod->output_frame = 0; + acmod->senscr_frame = -1; + acmod->mgau->frame_idx = 0; + + return 0; +} + +int +acmod_advance(acmod_t *acmod) +{ + /* Advance the output pointers. */ + if (++acmod->feat_outidx == acmod->n_feat_alloc) + acmod->feat_outidx = 0; + --acmod->n_feat_frame; + ++acmod->mgau->frame_idx; + + return ++acmod->output_frame; +} + +int +acmod_write_scores(acmod_t *acmod, int n_active, uint8 const *active, + int16 const *senscr, FILE *senfh) +{ + int16 n_active2; + + /* Uncompressed frame format: + * + * (2 bytes) n_active: Number of active senones + * If all senones active: + * (n_active * 2 bytes) scores of active senones + * + * Otherwise: + * (2 bytes) n_active: Number of active senones + * (n_active bytes) deltas to active senones + * (n_active * 2 bytes) scores of active senones + */ + n_active2 = n_active; + if (fwrite(&n_active2, 2, 1, senfh) != 1) + goto error_out; + if (n_active == bin_mdef_n_sen(acmod->mdef)) { + if (fwrite(senscr, 2, n_active, senfh) != (size_t) n_active) + goto error_out; + } + else { + int i, n; + if (fwrite(active, 1, n_active, senfh) != (size_t) n_active) + goto error_out; + for (i = n = 0; i < n_active; ++i) { + n += active[i]; + if (fwrite(senscr + n, 2, 1, senfh) != 1) + goto error_out; + } + } + return 0; +error_out: + E_ERROR_SYSTEM("Failed to write frame to senone file"); + return -1; +} + +/** + * Internal version, used for reading previous frames in acmod_score() + */ +static int +acmod_read_scores_internal(acmod_t *acmod) +{ + FILE *senfh = acmod->insenfh; + int16 n_active; + size_t rv; + + if (acmod->n_feat_frame == acmod->n_feat_alloc) { + if (acmod->grow_feat) + acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); + else + return 0; + } + + if (senfh == NULL) + return -1; + + if ((rv = fread(&n_active, 2, 1, senfh)) != 1) + goto error_out; + + acmod->n_senone_active = n_active; + if (acmod->n_senone_active == bin_mdef_n_sen(acmod->mdef)) { + if ((rv = fread(acmod->senone_scores, 2, + acmod->n_senone_active, senfh)) + != (size_t) acmod->n_senone_active) + goto error_out; + } + else { + int i, n; + + if ((rv = fread(acmod->senone_active, 1, + acmod->n_senone_active, senfh)) + != (size_t) acmod->n_senone_active) + goto error_out; + + for (i = 0, n = 0; i < acmod->n_senone_active; ++i) { + int j, sen = n + acmod->senone_active[i]; + for (j = n + 1; j < sen; ++j) + acmod->senone_scores[j] = SENSCR_DUMMY; + + if ((rv = fread(acmod->senone_scores + sen, 2, 1, senfh)) != 1) + goto error_out; + + n = sen; + } + + n++; + while (n < bin_mdef_n_sen(acmod->mdef)) + acmod->senone_scores[n++] = SENSCR_DUMMY; + } + return 1; + +error_out: + if (ferror(senfh)) { + E_ERROR_SYSTEM("Failed to read frame from senone file"); + return -1; + } + return 0; +} + +int +acmod_read_scores(acmod_t *acmod) +{ + int inptr, rv; + + if (acmod->grow_feat) { + /* Grow to avoid wraparound if grow_feat == TRUE. */ + inptr = acmod->feat_outidx + acmod->n_feat_frame; + /* Has to be +1, otherwise, next time acmod_advance() is + * called, this will wrap around. */ + while (inptr + 1 >= acmod->n_feat_alloc) + acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); + } + else { + inptr = (acmod->feat_outidx + acmod->n_feat_frame) % + acmod->n_feat_alloc; + } + + if ((rv = acmod_read_scores_internal(acmod)) != 1) + return rv; + + /* Set acmod->senscr_frame appropriately so that these scores + get reused below in acmod_score(). */ + acmod->senscr_frame = acmod->output_frame + acmod->n_feat_frame; + + E_DEBUG("Frame %d has %d active states\n", + acmod->senscr_frame, acmod->n_senone_active); + + /* Increment the "feature frame counter" and record the file + * position for the relevant frame in the (possibly circular) + * buffer. */ + ++acmod->n_feat_frame; + acmod->framepos[inptr] = ftell(acmod->insenfh); + + return 1; +} + +static int +calc_frame_idx(acmod_t *acmod, int *inout_frame_idx) +{ + int frame_idx; + + /* Calculate the absolute frame index to be scored. */ + if (inout_frame_idx == NULL) + frame_idx = acmod->output_frame; + else if (*inout_frame_idx < 0) + frame_idx = acmod->output_frame + 1 + *inout_frame_idx; + else + frame_idx = *inout_frame_idx; + + return frame_idx; +} + +static int +calc_feat_idx(acmod_t *acmod, int frame_idx) +{ + int n_backfr, feat_idx; + + n_backfr = acmod->n_feat_alloc - acmod->n_feat_frame; + if (frame_idx < 0 || acmod->output_frame - frame_idx > n_backfr) { + E_ERROR("Frame %d outside queue of %d frames, %d alloc (%d > %d), " + "cannot score\n", frame_idx, acmod->n_feat_frame, + acmod->n_feat_alloc, acmod->output_frame - frame_idx, + n_backfr); + return -1; + } + + /* Get the index in feat_buf/framepos of the frame to be scored. */ + feat_idx = (acmod->feat_outidx + frame_idx - acmod->output_frame) % + acmod->n_feat_alloc; + if (feat_idx < 0) + feat_idx += acmod->n_feat_alloc; + + return feat_idx; +} + +mfcc_t ** +acmod_get_frame(acmod_t *acmod, int *inout_frame_idx) +{ + int frame_idx, feat_idx; + + /* Calculate the absolute frame index requested. */ + frame_idx = calc_frame_idx(acmod, inout_frame_idx); + + /* Calculate position of requested frame in circular buffer. */ + if ((feat_idx = calc_feat_idx(acmod, frame_idx)) < 0) + return NULL; + + if (inout_frame_idx) + *inout_frame_idx = frame_idx; + + return acmod->feat_buf[feat_idx]; +} + +int16 const * +acmod_score(acmod_t *acmod, int *inout_frame_idx) +{ + int frame_idx, feat_idx; + + /* Calculate the absolute frame index to be scored. */ + frame_idx = calc_frame_idx(acmod, inout_frame_idx); + + /* If all senones are being computed, or we are using a senone file, + then we can reuse existing scores. */ + if ((acmod->compallsen || acmod->insenfh) + && frame_idx == acmod->senscr_frame) { + if (inout_frame_idx) + *inout_frame_idx = frame_idx; + return acmod->senone_scores; + } + + /* Calculate position of requested frame in circular buffer. */ + if ((feat_idx = calc_feat_idx(acmod, frame_idx)) < 0) + return NULL; + + /* If there is an input senone file locate the appropriate frame and read it. */ + if (acmod->insenfh) { + fseek(acmod->insenfh, acmod->framepos[feat_idx], SEEK_SET); + if (acmod_read_scores_internal(acmod) < 0) + return NULL; + } + else { + /* Build active senone list. */ + acmod_flags2list(acmod); + + /* Generate scores for the next available frame */ + ps_mgau_frame_eval(acmod->mgau, + acmod->senone_scores, + acmod->senone_active, + acmod->n_senone_active, + acmod->feat_buf[feat_idx], + frame_idx, + acmod->compallsen); + } + + if (inout_frame_idx) + *inout_frame_idx = frame_idx; + acmod->senscr_frame = frame_idx; + + /* Dump scores to the senone dump file if one exists. */ + if (acmod->senfh) { + if (acmod_write_scores(acmod, acmod->n_senone_active, + acmod->senone_active, + acmod->senone_scores, + acmod->senfh) < 0) + return NULL; + E_DEBUG("Frame %d has %d active states\n", frame_idx, + acmod->n_senone_active); + } + + return acmod->senone_scores; +} + +int +acmod_best_score(acmod_t *acmod, int *out_best_senid) +{ + int i, best; + + best = SENSCR_DUMMY; + if (acmod->compallsen) { + for (i = 0; i < bin_mdef_n_sen(acmod->mdef); ++i) { + if (acmod->senone_scores[i] < best) { + best = acmod->senone_scores[i]; + *out_best_senid = i; + } + } + } + else { + int16 *senscr; + senscr = acmod->senone_scores; + for (i = 0; i < acmod->n_senone_active; ++i) { + senscr += acmod->senone_active[i]; + if (*senscr < best) { + best = *senscr; + *out_best_senid = i; + } + } + } + return best; +} + + +void +acmod_clear_active(acmod_t *acmod) +{ + if (acmod->compallsen) + return; + bitvec_clear_all(acmod->senone_active_vec, bin_mdef_n_sen(acmod->mdef)); + acmod->n_senone_active = 0; +} + +#define MPX_BITVEC_SET(a,h,i) \ + if (hmm_mpx_ssid(h,i) != BAD_SSID) \ + bitvec_set((a)->senone_active_vec, hmm_mpx_senid(h,i)) +#define NONMPX_BITVEC_SET(a,h,i) \ + bitvec_set((a)->senone_active_vec, \ + hmm_nonmpx_senid(h,i)) + +void +acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm) +{ + int i; + + if (acmod->compallsen) + return; + if (hmm_is_mpx(hmm)) { + switch (hmm_n_emit_state(hmm)) { + case 5: + MPX_BITVEC_SET(acmod, hmm, 4); + MPX_BITVEC_SET(acmod, hmm, 3); + /* FALLTHRU */ + case 3: + MPX_BITVEC_SET(acmod, hmm, 2); + MPX_BITVEC_SET(acmod, hmm, 1); + MPX_BITVEC_SET(acmod, hmm, 0); + break; + default: + for (i = 0; i < hmm_n_emit_state(hmm); ++i) { + MPX_BITVEC_SET(acmod, hmm, i); + } + } + } + else { + switch (hmm_n_emit_state(hmm)) { + case 5: + NONMPX_BITVEC_SET(acmod, hmm, 4); + NONMPX_BITVEC_SET(acmod, hmm, 3); + /* FALLTHRU */ + case 3: + NONMPX_BITVEC_SET(acmod, hmm, 2); + NONMPX_BITVEC_SET(acmod, hmm, 1); + NONMPX_BITVEC_SET(acmod, hmm, 0); + break; + default: + for (i = 0; i < hmm_n_emit_state(hmm); ++i) { + NONMPX_BITVEC_SET(acmod, hmm, i); + } + } + } +} + +int32 +acmod_flags2list(acmod_t *acmod) +{ + int32 w, l, n, b, total_dists, total_words, extra_bits; + bitvec_t *flagptr; + + total_dists = bin_mdef_n_sen(acmod->mdef); + if (acmod->compallsen) { + acmod->n_senone_active = total_dists; + return total_dists; + } + total_words = total_dists / BITVEC_BITS; + extra_bits = total_dists % BITVEC_BITS; + w = n = l = 0; + for (flagptr = acmod->senone_active_vec; w < total_words; ++w, ++flagptr) { + if (*flagptr == 0) + continue; + for (b = 0; b < BITVEC_BITS; ++b) { + if (*flagptr & (1UL << b)) { + int32 sen = w * BITVEC_BITS + b; + int32 delta = sen - l; + /* Handle excessive deltas "lossily" by adding a few + extra senones to bridge the gap. */ + while (delta > 255) { + acmod->senone_active[n++] = 255; + delta -= 255; + } + acmod->senone_active[n++] = delta; + l = sen; + } + } + } + + for (b = 0; b < extra_bits; ++b) { + if (*flagptr & (1UL << b)) { + int32 sen = w * BITVEC_BITS + b; + int32 delta = sen - l; + /* Handle excessive deltas "lossily" by adding a few + extra senones to bridge the gap. */ + while (delta > 255) { + acmod->senone_active[n++] = 255; + delta -= 255; + } + acmod->senone_active[n++] = delta; + l = sen; + } + } + + acmod->n_senone_active = n; + E_DEBUG("acmod_flags2list: %d active in frame %d\n", + acmod->n_senone_active, acmod->output_frame); + return n; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h new file mode 100644 index 0000000..00067f3 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h @@ -0,0 +1,500 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file acmod.h Acoustic model structures for PocketSphinx. + * @author David Huggins-Daines + */ + +#ifndef __ACMOD_H__ +#define __ACMOD_H__ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include +#include +#include + +/* Local headers. */ +#include +#include +#include "bin_mdef.h" +#include "tmat.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * States in utterance processing. + */ +typedef enum acmod_state_e { + ACMOD_IDLE, /**< Not in an utterance. */ + ACMOD_STARTED, /**< Utterance started, no data yet. */ + ACMOD_PROCESSING, /**< Utterance in progress. */ + ACMOD_ENDED /**< Utterance ended, still buffering. */ +} acmod_state_t; + +/** + * Dummy senone score value for unintentionally active states. + */ +#define SENSCR_DUMMY 0x7fff + +/** + * Feature space linear transform structure. + */ +struct ps_mllr_s { + int refcnt; /**< Reference count. */ + int n_class; /**< Number of MLLR classes. */ + int n_feat; /**< Number of feature streams. */ + int *veclen; /**< Length of input vectors for each stream. */ + float32 ****A; /**< Rotation part of mean transformations. */ + float32 ***b; /**< Bias part of mean transformations. */ + float32 ***h; /**< Diagonal transformation of variances. */ + int32 *cb2mllr; /**< Mapping from codebooks to transformations. */ +}; + +/** + * Acoustic model parameter structure. + */ +typedef struct ps_mgau_s ps_mgau_t; + +typedef struct ps_mgaufuncs_s { + char const *name; + + int (*frame_eval)(ps_mgau_t *mgau, + int16 *senscr, + uint8 *senone_active, + int32 n_senone_active, + mfcc_t ** feat, + int32 frame, + int32 compallsen); + int (*transform)(ps_mgau_t *mgau, + ps_mllr_t *mllr); + void (*free)(ps_mgau_t *mgau); +} ps_mgaufuncs_t; + +struct ps_mgau_s { + ps_mgaufuncs_t *vt; /**< vtable of mgau functions. */ + int frame_idx; /**< frame counter. */ +}; + +#define ps_mgau_base(mg) ((ps_mgau_t *)(mg)) +#define ps_mgau_frame_eval(mg,senscr,senone_active,n_senone_active,feat,frame,compallsen) \ + (*ps_mgau_base(mg)->vt->frame_eval) \ + (mg, senscr, senone_active, n_senone_active, feat, frame, compallsen) +#define ps_mgau_transform(mg, mllr) \ + (*ps_mgau_base(mg)->vt->transform)(mg, mllr) +#define ps_mgau_free(mg) \ + (*ps_mgau_base(mg)->vt->free)(mg) + +/** + * Acoustic model structure. + * + * This object encapsulates all stages of acoustic processing, from + * raw audio input to acoustic score output. The reason for grouping + * all of these modules together is that they all have to "agree" in + * their parameterizations, and the configuration of the acoustic and + * dynamic feature computation is completely dependent on the + * parameters used to build the original acoustic model (which should + * by now always be specified in a feat.params file). + * + * Because there is not a one-to-one correspondence from blocks of + * input audio or frames of input features to frames of acoustic + * scores (due to dynamic feature calculation), results may not be + * immediately available after input, and the output results will not + * correspond to the last piece of data input. + * + * TODO: In addition, this structure serves the purpose of queueing + * frames of features (and potentially also scores in the future) for + * asynchronous passes of recognition operating in parallel. + */ +struct acmod_s { + /* Global objects, not retained. */ + cmd_ln_t *config; /**< Configuration. */ + logmath_t *lmath; /**< Log-math computation. */ + glist_t strings; /**< Temporary acoustic model filenames. */ + + /* Feature computation: */ + fe_t *fe; /**< Acoustic feature computation. */ + feat_t *fcb; /**< Dynamic feature computation. */ + + /* Model parameters: */ + bin_mdef_t *mdef; /**< Model definition. */ + tmat_t *tmat; /**< Transition matrices. */ + ps_mgau_t *mgau; /**< Model parameters. */ + ps_mllr_t *mllr; /**< Speaker transformation. */ + + /* Senone scoring: */ + int16 *senone_scores; /**< GMM scores for current frame. */ + bitvec_t *senone_active_vec; /**< Active GMMs in current frame. */ + uint8 *senone_active; /**< Array of deltas to active GMMs. */ + int senscr_frame; /**< Frame index for senone_scores. */ + int n_senone_active; /**< Number of active GMMs. */ + int log_zero; /**< Zero log-probability value. */ + + /* Utterance processing: */ + mfcc_t **mfc_buf; /**< Temporary buffer of acoustic features. */ + mfcc_t ***feat_buf; /**< Temporary buffer of dynamic features. */ + FILE *rawfh; /**< File for writing raw audio data. */ + FILE *mfcfh; /**< File for writing acoustic feature data. */ + FILE *senfh; /**< File for writing senone score data. */ + FILE *insenfh; /**< Input senone score file. */ + long *framepos; /**< File positions of recent frames in senone file. */ + + /* A whole bunch of flags and counters: */ + uint8 state; /**< State of utterance processing. */ + uint8 compallsen; /**< Compute all senones? */ + uint8 grow_feat; /**< Whether to grow feat_buf. */ + uint8 insen_swap; /**< Whether to swap input senone score. */ + + frame_idx_t output_frame; /**< Index of next frame of dynamic features. */ + frame_idx_t n_mfc_alloc; /**< Number of frames allocated in mfc_buf */ + frame_idx_t n_mfc_frame; /**< Number of frames active in mfc_buf */ + frame_idx_t mfc_outidx; /**< Start of active frames in mfc_buf */ + frame_idx_t n_feat_alloc; /**< Number of frames allocated in feat_buf */ + frame_idx_t n_feat_frame; /**< Number of frames active in feat_buf */ + frame_idx_t feat_outidx; /**< Start of active frames in feat_buf */ +}; +typedef struct acmod_s acmod_t; + +/** + * Initialize an acoustic model. + * + * @param config a command-line object containing parameters. + * Ownership of this pointer is retained by this object, + * so you may free it if you no longer need it. + * @param lmath global log-math parameters. + * @param fe a previously-initialized acoustic feature module to use, + * or NULL to create one automatically. If this is supplied + * and its parameters do not match those in the acoustic + * model, this function will fail. This pointer is retained. + * @param fcb a previously-initialized dynamic feature module to use, + * or NULL to create one automatically. If this is supplied + * and its parameters do not match those in the acoustic + * model, this function will fail. This pointer is retained. + * @return a newly initialized acmod_t, or NULL on failure. + */ +POCKETSPHINX_EXPORT +acmod_t *acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb); + +/** + * Reinitialize feature computation modules. + */ +POCKETSPHINX_EXPORT +int acmod_reinit_feat(acmod_t *acmod, fe_t *fe, feat_t *fcb); + +/** + * Verify that feature extraction parameters are compatible with + * acoustic model. + * + * @param fe acoustic feature extraction module to verify. + * @return TRUE if compatible, FALSE otherwise + */ +POCKETSPHINX_EXPORT +int acmod_fe_mismatch(acmod_t *acmod, fe_t *fe); + +/** + * Verify that dynamic feature computation parameters are compatible + * with acoustic model. + * + * @param fcb dynamic feature computation module to verify. + * @return TRUE if compatible, FALSE otherwise + */ +POCKETSPHINX_EXPORT +int acmod_feat_mismatch(acmod_t *acmod, feat_t *fcb); + +/** + * Adapt acoustic model using a linear transform. + * + * @param mllr The new transform to use, or NULL to update the + * existing transform. The decoder retains ownership of + * this pointer, so you may free it if you no longer need + * it. + * @return The updated transform object for this decoder, or + * NULL on failure. + */ +POCKETSPHINX_EXPORT +ps_mllr_t *acmod_update_mllr(acmod_t *acmod, ps_mllr_t *mllr); + +/** + * Start logging senone scores to a filehandle. + * + * @param acmod Acoustic model object. + * @param logfh Filehandle to log to. + * @return 0 for success, <0 on error. + */ +POCKETSPHINX_EXPORT +int acmod_set_senfh(acmod_t *acmod, FILE *senfh); + +/** + * Start logging MFCCs to a filehandle. + * + * @param acmod Acoustic model object. + * @param logfh Filehandle to log to. + * @return 0 for success, <0 on error. + */ +POCKETSPHINX_EXPORT +int acmod_set_mfcfh(acmod_t *acmod, FILE *logfh); + +/** + * Start logging raw audio to a filehandle. + * + * @param acmod Acoustic model object. + * @param logfh Filehandle to log to. + * @return 0 for success, <0 on error. + */ +POCKETSPHINX_EXPORT +int acmod_set_rawfh(acmod_t *acmod, FILE *logfh); + +/** + * Finalize an acoustic model. + */ +POCKETSPHINX_EXPORT +void acmod_free(acmod_t *acmod); + +/** + * Mark the start of an utterance. + */ +POCKETSPHINX_EXPORT +int acmod_start_utt(acmod_t *acmod); + +/** + * Mark the end of an utterance. + */ +POCKETSPHINX_EXPORT +int acmod_end_utt(acmod_t *acmod); + +/** + * Rewind the current utterance, allowing it to be rescored. + * + * After calling this function, the internal frame index is reset, and + * acmod_score() will return scores starting at the first frame of the + * current utterance. Currently, acmod_set_grow() must have been + * called to enable growing the feature buffer in order for this to + * work. In the future, senone scores may be cached instead. + * + * @return 0 for success, <0 for failure (if the utterance can't be + * rewound due to no feature or score data available) + */ +POCKETSPHINX_EXPORT +int acmod_rewind(acmod_t *acmod); + +/** + * Advance the frame index. + * + * This function moves to the next frame of input data. Subsequent + * calls to acmod_score() will return scores for that frame, until the + * next call to acmod_advance(). + * + * @return New frame index. + */ +POCKETSPHINX_EXPORT +int acmod_advance(acmod_t *acmod); + +/** + * Set memory allocation policy for utterance processing. + * + * @param grow_feat If non-zero, the internal dynamic feature buffer + * will expand as necessary to encompass any amount of data fed to the + * model. + * @return previous allocation policy. + */ +POCKETSPHINX_EXPORT +int acmod_set_grow(acmod_t *acmod, int grow_feat); + +/** + * TODO: Set queue length for utterance processing. + * + * This function allows multiple concurrent passes of search to + * operate on different parts of the utterance. + */ + +/** + * Feed raw audio data to the acoustic model for scoring. + * + * @param inout_raw In: Pointer to buffer of raw samples + * Out: Pointer to next sample to be read + * @param inout_n_samps In: Number of samples available + * Out: Number of samples remaining + * @param full_utt If non-zero, this block represents a full + * utterance and should be processed as such. + * @return Number of frames of data processed. + */ +POCKETSPHINX_EXPORT +int acmod_process_raw(acmod_t *acmod, + int16 const **inout_raw, + size_t *inout_n_samps, + int full_utt); + + +/** + * Feed acoustic feature data into the acoustic model for scoring. + * + * @param inout_cep In: Pointer to buffer of features + * Out: Pointer to next frame to be read + * @param inout_n_frames In: Number of frames available + * Out: Number of frames remaining + * @param full_utt If non-zero, this block represents a full + * utterance and should be processed as such. + * @return Number of frames of data processed. + */ +POCKETSPHINX_EXPORT +int acmod_process_cep(acmod_t *acmod, + mfcc_t ***inout_cep, + int *inout_n_frames, + int full_utt); + +/** + * Feed dynamic feature data into the acoustic model for scoring. + * + * Unlike acmod_process_raw() and acmod_process_cep(), this function + * accepts a single frame at a time. This is because there is no need + * to do buffering when using dynamic features as input. However, if + * the dynamic feature buffer is full, this function will fail, so you + * should either always check the return value, or always pair a call + * to it with a call to acmod_score(). + * + * @param feat Pointer to one frame of dynamic features. + * @return Number of frames processed (either 0 or 1). + */ +POCKETSPHINX_EXPORT +int acmod_process_feat(acmod_t *acmod, + mfcc_t **feat); + +/** + * Set up a senone score dump file for input. + * + * @param insenfh File handle of dump file + * @return 0 for success, <0 for failure + */ +POCKETSPHINX_EXPORT +int acmod_set_insenfh(acmod_t *acmod, FILE *insenfh); + +/** + * Read one frame of scores from senone score dump file. + * + * @return Number of frames read or <0 on error. + */ +POCKETSPHINX_EXPORT +int acmod_read_scores(acmod_t *acmod); + +/** + * Get a frame of dynamic feature data. + * + * @param inout_frame_idx Input: frame index to get, or NULL + * to obtain features for the most recent frame. + * Output: frame index corresponding to this + * set of features. + * @return Feature array, or NULL if requested frame is not available. + */ +POCKETSPHINX_EXPORT +mfcc_t **acmod_get_frame(acmod_t *acmod, int *inout_frame_idx); + +/** + * Score one frame of data. + * + * @param inout_frame_idx Input: frame index to score, or NULL + * to obtain scores for the most recent frame. + * Output: frame index corresponding to this + * set of scores. + * @return Array of senone scores for this frame, or NULL if no frame + * is available for scoring (such as if a frame index is + * requested that is not yet or no longer available). The + * data pointed to persists only until the next call to + * acmod_score() or acmod_advance(). + */ +POCKETSPHINX_EXPORT +int16 const *acmod_score(acmod_t *acmod, + int *inout_frame_idx); + +/** + * Write senone dump file header. + */ +POCKETSPHINX_EXPORT +int acmod_write_senfh_header(acmod_t *acmod, FILE *logfh); + +/** + * Write a frame of senone scores to a dump file. + */ +POCKETSPHINX_EXPORT +int acmod_write_scores(acmod_t *acmod, int n_active, uint8 const *active, + int16 const *senscr, FILE *senfh); + + +/** + * Get best score and senone index for current frame. + */ +POCKETSPHINX_EXPORT +int acmod_best_score(acmod_t *acmod, int *out_best_senid); + +/** + * Clear set of active senones. + */ +void acmod_clear_active(acmod_t *acmod); + +/** + * Activate senones associated with an HMM. + */ +void acmod_activate_hmm(acmod_t *acmod, hmm_t *hmm); + +/** + * Activate a single senone. + */ +#define acmod_activate_sen(acmod, sen) bitvec_set((acmod)->senone_active_vec, sen) + +/** + * Build active list. + */ +POCKETSPHINX_EXPORT +int32 acmod_flags2list(acmod_t *acmod); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __ACMOD_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c new file mode 100644 index 0000000..3ee9ea1 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c @@ -0,0 +1,915 @@ +/* -*- c-basic-offset: 4 -*- */ +/* ==================================================================== + * Copyright (c) 2014 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* +* allphone_search.c -- Search for phonetic decoding. +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "pocketsphinx_internal.h" +#include "allphone_search.h" + +static ps_lattice_t * +allphone_search_lattice(ps_search_t * search) +{ + (void) search; + return NULL; +} + +static int +allphone_search_prob(ps_search_t * search) +{ + (void) search; + return 0; +} + +static void +allphone_backtrace(allphone_search_t * allphs, int32 f, int32 *out_score); +static void +allphone_clear_segments(allphone_search_t * allphs); + +static void +allphone_search_seg_free(ps_seg_t * seg) +{ + ckd_free(seg); +} + +static void +allphone_search_fill_iter(ps_seg_t *seg, phseg_t *phseg) +{ + seg->sf = phseg->sf; + seg->ef = phseg->ef; + seg->ascr = phseg->score; + seg->lscr = phseg->tscore; + seg->word = bin_mdef_ciphone_str(ps_search_acmod(seg->search)->mdef, phseg->ci); +} + +static ps_seg_t * +allphone_search_seg_next(ps_seg_t * seg) +{ + phseg_iter_t *itor = (phseg_iter_t *) seg; + phseg_t *phseg; + + itor->seg = itor->seg->next; + + if (itor->seg == NULL) { + allphone_search_seg_free(seg); + return NULL; + } + phseg = gnode_ptr(itor->seg); + allphone_search_fill_iter(seg, phseg); + + return seg; +} + +static ps_segfuncs_t fsg_segfuncs = { + /* seg_next */ allphone_search_seg_next, + /* seg_free */ allphone_search_seg_free +}; + + +static ps_seg_t * +allphone_search_seg_iter(ps_search_t * search) +{ + allphone_search_t *allphs = (allphone_search_t *) search; + phseg_iter_t *iter; + + allphone_backtrace(allphs, allphs->frame - 1, NULL); + if (allphs->segments == NULL) + return NULL; + + iter = ckd_calloc(1, sizeof(phseg_iter_t)); + + iter->base.vt = &fsg_segfuncs; + iter->base.search = search; + iter->seg = allphs->segments; + allphone_search_fill_iter((ps_seg_t *)iter, gnode_ptr(iter->seg)); + + return (ps_seg_t *) iter; +} + +static ps_searchfuncs_t allphone_funcs = { + /* start: */ allphone_search_start, + /* step: */ allphone_search_step, + /* finish: */ allphone_search_finish, + /* reinit: */ allphone_search_reinit, + /* free: */ allphone_search_free, + /* lattice: */ allphone_search_lattice, + /* hyp: */ allphone_search_hyp, + /* prob: */ allphone_search_prob, + /* seg_iter: */ allphone_search_seg_iter, +}; + +/** + * Find PHMM node with same senone sequence and tmat id as the given triphone. + * Return ptr to PHMM node if found, NULL otherwise. + */ +static phmm_t * +phmm_lookup(allphone_search_t * allphs, s3pid_t pid) +{ + phmm_t *p; + bin_mdef_t *mdef; + phmm_t **ci_phmm; + + mdef = ((ps_search_t *) allphs)->acmod->mdef; + ci_phmm = allphs->ci_phmm; + + for (p = ci_phmm[bin_mdef_pid2ci(mdef, pid)]; p; p = p->next) { + if (mdef_pid2tmatid(mdef, p->pid) == mdef_pid2tmatid(mdef, pid)) + if (mdef_pid2ssid(mdef, p->pid) == mdef_pid2ssid(mdef, pid)) + return p; + } + + return NULL; +} + +static int32 +phmm_link(allphone_search_t * allphs) +{ + s3cipid_t ci, rc; + phmm_t *p, *p2; + int32 *rclist; + int32 i, n_link; + plink_t *l; + bin_mdef_t *mdef; + phmm_t **ci_phmm; + + mdef = ((ps_search_t *) allphs)->acmod->mdef; + ci_phmm = allphs->ci_phmm; + + rclist = (int32 *) ckd_calloc(mdef->n_ciphone + 1, sizeof(int32)); + + /* Create successor links between PHMM nodes */ + n_link = 0; + for (ci = 0; ci < mdef->n_ciphone; ci++) { + for (p = ci_phmm[ci]; p; p = p->next) { + /* Build rclist for p */ + i = 0; + for (rc = 0; rc < mdef->n_ciphone; rc++) { + if (bitvec_is_set(p->rc, rc)) + rclist[i++] = rc; + } + rclist[i] = BAD_S3CIPID; + + /* For each rc in rclist, transition to PHMMs for rc if left context = ci */ + for (i = 0; IS_S3CIPID(rclist[i]); i++) { + for (p2 = ci_phmm[rclist[i]]; p2; p2 = p2->next) { + if (bitvec_is_set(p2->lc, ci)) { + /* transition from p to p2 */ + l = (plink_t *) ckd_calloc(1, sizeof(*l)); + l->phmm = p2; + l->next = p->succlist; + p->succlist = l; + + n_link++; + } + } + } + } + } + + ckd_free(rclist); + + return n_link; +} + +/** + * Build net from phone HMMs + */ +static int +phmm_build(allphone_search_t * allphs) +{ + phmm_t *p, **pid2phmm; + bin_mdef_t *mdef; + int32 lrc_size; + uint32 *lc, *rc; + s3pid_t pid; + s3cipid_t ci; + s3cipid_t *filler; + int n_phmm, n_link; + int i, nphone; + + mdef = ((ps_search_t *) allphs)->acmod->mdef; + allphs->ci_phmm = + (phmm_t **) ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(phmm_t *)); + pid2phmm = + (phmm_t **) ckd_calloc(bin_mdef_n_phone(mdef), sizeof(phmm_t *)); + + /* For each unique ciphone/triphone entry in mdef, create a PHMM node */ + n_phmm = 0; + nphone = allphs->ci_only ? bin_mdef_n_ciphone(mdef) : bin_mdef_n_phone(mdef); + E_INFO("Building PHMM net of %d phones\n", nphone); + for (pid = 0; pid < nphone; pid++) { + if ((p = phmm_lookup(allphs, pid)) == NULL) { + /* not found, should be created */ + p = (phmm_t *) ckd_calloc(1, sizeof(*p)); + hmm_init(allphs->hmmctx, &(p->hmm), FALSE, + mdef_pid2ssid(mdef, pid), mdef->phone[pid].tmat); + p->pid = pid; + p->ci = bin_mdef_pid2ci(mdef, pid); + p->succlist = NULL; + p->next = allphs->ci_phmm[p->ci]; + allphs->ci_phmm[p->ci] = p; + n_phmm++; + } + pid2phmm[pid] = p; + } + + /* Fill out bitvecs of each PHMM node, alloc continuous memory chunk for context bitvectors */ + lrc_size = bitvec_size(bin_mdef_n_ciphone(mdef)); + lc = ckd_calloc(n_phmm * 2 * lrc_size, sizeof(bitvec_t)); + rc = lc + (n_phmm * lrc_size); + for (ci = 0; ci < mdef->n_ciphone; ci++) { + for (p = allphs->ci_phmm[ci]; p; p = p->next) { + p->lc = lc; + lc += lrc_size; + p->rc = rc; + rc += lrc_size; + } + } + + /* Fill out lc and rc bitmaps (remember to map all fillers to each other!!) */ + filler = + (s3cipid_t *) ckd_calloc(bin_mdef_n_ciphone(mdef) + 1, + sizeof(s3cipid_t)); + + /* Connect fillers */ + i = 0; + for (ci = 0; ci < bin_mdef_n_ciphone(mdef); ci++) { + p = pid2phmm[ci]; + bitvec_set_all(p->lc, bin_mdef_n_ciphone(mdef)); + bitvec_set_all(p->rc, bin_mdef_n_ciphone(mdef)); + if (mdef->phone[ci].info.ci.filler) { + filler[i++] = ci; + } + } + filler[i] = BAD_S3CIPID; + + + /* Loop over cdphones only if ci_only is not set */ + for (pid = bin_mdef_n_ciphone(mdef); pid < nphone; + pid++) { + p = pid2phmm[pid]; + + if (mdef->phone[mdef->phone[pid].info.cd.ctx[1]].info.ci.filler) { + for (i = 0; IS_S3CIPID(filler[i]); i++) + bitvec_set(p->lc, filler[i]); + } + else + bitvec_set(p->lc, mdef->phone[pid].info.cd.ctx[1]); + + if (mdef->phone[mdef->phone[pid].info.cd.ctx[2]].info.ci.filler) { + for (i = 0; IS_S3CIPID(filler[i]); i++) + bitvec_set(p->rc, filler[i]); + } + else + bitvec_set(p->rc, mdef->phone[pid].info.cd.ctx[2]); + } + ckd_free(pid2phmm); + ckd_free(filler); + + /* Create links between PHMM nodes */ + n_link = phmm_link(allphs); + + E_INFO("%d nodes, %d links\n", n_phmm, n_link); + return 0; +} + +static void +phmm_free(allphone_search_t * allphs) +{ + s3cipid_t ci; + bin_mdef_t *mdef; + + if (!allphs->ci_phmm) + return; + ckd_free(allphs->ci_phmm[0]->lc); + mdef = ((ps_search_t *) allphs)->acmod->mdef; + for (ci = 0; ci < mdef_n_ciphone(mdef); ++ci) { + phmm_t *p, *next; + + for (p = allphs->ci_phmm[ci]; p; p = next) { + plink_t *l, *lnext; + + next = p->next; + for (l = p->succlist; l; l = lnext) { + lnext = l->next; + ckd_free(l); + } + hmm_deinit(&(p->hmm)); + ckd_free(p); + } + } + ckd_free(allphs->ci_phmm); +} + +/** Evaluate active PHMMs */ +static int32 +phmm_eval_all(allphone_search_t * allphs, const int16 * senscr) +{ + s3cipid_t ci; + phmm_t *p; + int32 best; + bin_mdef_t *mdef; + phmm_t **ci_phmm; + + mdef = ((ps_search_t *) allphs)->acmod->mdef; + ci_phmm = allphs->ci_phmm; + + best = WORST_SCORE; + + hmm_context_set_senscore(allphs->hmmctx, senscr); + for (ci = 0; ci < mdef->n_ciphone; ci++) { + for (p = ci_phmm[(unsigned) ci]; p; p = p->next) { + if (hmm_frame(&(p->hmm)) == allphs->frame) { + int32 score; + allphs->n_hmm_eval++; + score = hmm_vit_eval((hmm_t *) p); + if (score > best) + best = score; + } + } + } + + return best; +} + +static void +phmm_exit(allphone_search_t * allphs, int32 best) +{ + s3cipid_t ci; + phmm_t *p; + int32 th, nf; + history_t *h; + blkarray_list_t *history; + bin_mdef_t *mdef; + int32 curfrm; + phmm_t **ci_phmm; + int32 *ci2lmwid; + + th = best + allphs->pbeam; + + history = allphs->history; + mdef = ps_search_acmod(allphs)->mdef; + curfrm = allphs->frame; + ci_phmm = allphs->ci_phmm; + ci2lmwid = allphs->ci2lmwid; + + nf = curfrm + 1; + + for (ci = 0; ci < mdef->n_ciphone; ci++) { + for (p = ci_phmm[(unsigned) ci]; p; p = p->next) { + if (hmm_frame(&(p->hmm)) == curfrm) { + + if (hmm_bestscore(&(p->hmm)) >= th) { + + h = (history_t *) ckd_calloc(1, sizeof(*h)); + h->ef = curfrm; + h->phmm = p; + h->hist = hmm_out_history(&(p->hmm)); + h->score = hmm_out_score(&(p->hmm)); + + if (!allphs->lm) { + h->tscore = allphs->inspen; + } + else { + if (h->hist > 0) { + int32 n_used; + history_t *pred = + blkarray_list_get(history, h->hist); + + if (pred->hist > 0) { + history_t *pred_pred = + blkarray_list_get(history, + h->hist); + h->tscore = + ngram_tg_score(allphs->lm, + ci2lmwid + [pred_pred->phmm->ci], + ci2lmwid[pred-> + phmm->ci], + ci2lmwid[p->ci], + &n_used) >> + SENSCR_SHIFT; + } + else { + h->tscore = + ngram_bg_score(allphs->lm, + ci2lmwid + [pred->phmm->ci], + ci2lmwid[p->ci], + &n_used) >> + SENSCR_SHIFT; + } + } + else { + /* + * This is the beginning SIL and in srch_allphone_begin() + * it's inscore is set to 0. + */ + h->tscore = 0; + } + } + + blkarray_list_append(history, h); + + /* Mark PHMM active in next frame */ + hmm_frame(&(p->hmm)) = nf; + } + else { + /* Reset state scores */ + hmm_clear(&(p->hmm)); + } + } + } + } +} + +static void +phmm_trans(allphone_search_t * allphs, int32 best, + int32 frame_history_start) +{ + history_t *h; + phmm_t *from, *to; + plink_t *l; + int32 newscore, nf, curfrm; + int32 *ci2lmwid; + int32 hist_idx; + + curfrm = allphs->frame; + nf = curfrm + 1; + ci2lmwid = allphs->ci2lmwid; + + /* Transition from exited nodes to initial states of HMMs */ + for (hist_idx = frame_history_start; + hist_idx < blkarray_list_n_valid(allphs->history); hist_idx++) { + h = blkarray_list_get(allphs->history, hist_idx); + from = h->phmm; + for (l = from->succlist; l; l = l->next) { + int32 tscore; + to = l->phmm; + + /* No LM, just use uniform (insertion penalty). */ + if (!allphs->lm) + tscore = allphs->inspen; + else { + int32 n_used; + if (h->hist > 0) { + history_t *pred = + blkarray_list_get(allphs->history, h->hist); + tscore = + ngram_tg_score(allphs->lm, + ci2lmwid[pred->phmm->ci], + ci2lmwid[from->ci], + ci2lmwid[to->ci], + &n_used) >> SENSCR_SHIFT; + } + else { + tscore = ngram_bg_score(allphs->lm, + ci2lmwid[from->ci], + ci2lmwid[to->ci], + &n_used) >> SENSCR_SHIFT; + } + } + + newscore = h->score + tscore; + if ((newscore > best + allphs->beam) + && (newscore > hmm_in_score(&(to->hmm)))) { + hmm_enter(&(to->hmm), newscore, hist_idx, nf); + } + } + } +} + +ps_search_t * +allphone_search_init(const char *name, + ngram_model_t * lm, + cmd_ln_t * config, + acmod_t * acmod, dict_t * dict, dict2pid_t * d2p) +{ + int i; + bin_mdef_t *mdef; + allphone_search_t *allphs; + + allphs = (allphone_search_t *) ckd_calloc(1, sizeof(*allphs)); + ps_search_init(ps_search_base(allphs), &allphone_funcs, PS_SEARCH_TYPE_ALLPHONE, name, config, acmod, + dict, d2p); + mdef = acmod->mdef; + + allphs->hmmctx = hmm_context_init(bin_mdef_n_emit_state(mdef), + acmod->tmat->tp, NULL, mdef->sseq); + if (allphs->hmmctx == NULL) { + ps_search_free(ps_search_base(allphs)); + return NULL; + } + + allphs->ci_only = cmd_ln_boolean_r(config, "-allphone_ci"); + allphs->lw = cmd_ln_float32_r(config, "-lw"); + + phmm_build(allphs); + + if (lm) { + int32 silwid; + + allphs->lm = ngram_model_retain(lm); + + silwid = ngram_wid(allphs->lm, bin_mdef_ciphone_str(mdef, + mdef_silphone + (mdef))); + if (silwid == ngram_unknown_wid(allphs->lm)) { + E_ERROR("Phonetic LM does not have SIL phone in vocabulary\n"); + allphone_search_free((ps_search_t *) allphs); + return NULL; + } + + allphs->ci2lmwid = + (int32 *) ckd_calloc(mdef->n_ciphone, + sizeof(*allphs->ci2lmwid)); + for (i = 0; i < mdef->n_ciphone; i++) { + allphs->ci2lmwid[i] = + ngram_wid(allphs->lm, + (char *) bin_mdef_ciphone_str(mdef, i)); + /* Map filler phones and other missing phones to silence if not found */ + if (allphs->ci2lmwid[i] == ngram_unknown_wid(allphs->lm)) + allphs->ci2lmwid[i] = silwid; + } + } + else { + E_WARN + ("Failed to load language model specified in -allphone, doing unconstrained phone-loop decoding\n"); + allphs->inspen = + (int32) (logmath_log + (acmod->lmath, cmd_ln_float32_r(config, "-pip")) + * allphs->lw) >> SENSCR_SHIFT; + } + + allphs->n_tot_frame = 0; + allphs->frame = -1; + allphs->segments = NULL; + + /* Get search pruning parameters */ + allphs->beam + = + (int32) logmath_log(acmod->lmath, + cmd_ln_float64_r(config, "-beam")) + >> SENSCR_SHIFT; + allphs->pbeam + = + (int32) logmath_log(acmod->lmath, + cmd_ln_float64_r(config, "-pbeam")) + >> SENSCR_SHIFT; + + /* LM related weights/penalties */ + allphs->history = blkarray_list_init(); + + /* Acoustic score scale for posterior probabilities. */ + allphs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); + + E_INFO("Allphone(beam: %d, pbeam: %d)\n", allphs->beam, allphs->pbeam); + + ptmr_init(&allphs->perf); + + return (ps_search_t *) allphs; +} + +int +allphone_search_reinit(ps_search_t * search, dict_t * dict, + dict2pid_t * d2p) +{ + allphone_search_t *allphs = (allphone_search_t *) search; + + /* Free old dict2pid, dict */ + ps_search_base_reinit(search, dict, d2p); + + if (!allphs->lm) { + E_WARN + ("-lm argument missing; doing unconstrained phone-loop decoding\n"); + allphs->inspen = + (int32) (logmath_log + (search->acmod->lmath, + cmd_ln_float32_r(search->config, + "-pip")) * + allphs->lw) >> SENSCR_SHIFT; + } + + return 0; +} + +void +allphone_search_free(ps_search_t * search) +{ + allphone_search_t *allphs = (allphone_search_t *) search; + + + double n_speech = (double)allphs->n_tot_frame + / cmd_ln_int32_r(ps_search_config(allphs), "-frate"); + + E_INFO("TOTAL allphone %.2f CPU %.3f xRT\n", + allphs->perf.t_tot_cpu, + allphs->perf.t_tot_cpu / n_speech); + E_INFO("TOTAL allphone %.2f wall %.3f xRT\n", + allphs->perf.t_tot_elapsed, + allphs->perf.t_tot_elapsed / n_speech); + + ps_search_base_free(search); + + allphone_clear_segments(allphs); + hmm_context_free(allphs->hmmctx); + phmm_free(allphs); + if (allphs->lm) + ngram_model_free(allphs->lm); + if (allphs->ci2lmwid) + ckd_free(allphs->ci2lmwid); + if (allphs->history) + blkarray_list_free(allphs->history); + + ckd_free(allphs); +} + +int +allphone_search_start(ps_search_t * search) +{ + allphone_search_t *allphs; + bin_mdef_t *mdef; + s3cipid_t ci; + phmm_t *p; + + allphs = (allphone_search_t *) search; + mdef = search->acmod->mdef; + + /* Reset all HMMs. */ + for (ci = 0; ci < bin_mdef_n_ciphone(mdef); ci++) { + for (p = allphs->ci_phmm[(unsigned) ci]; p; p = p->next) { + hmm_clear(&(p->hmm)); + } + } + + allphs->n_hmm_eval = 0; + allphs->n_sen_eval = 0; + + /* Free history nodes, if any */ + blkarray_list_reset(allphs->history); + + /* Initialize start state of the SILENCE PHMM */ + allphs->frame = 0; + ci = bin_mdef_silphone(mdef); + if (NOT_S3CIPID(ci)) + E_FATAL("Cannot find CI-phone %s\n", S3_SILENCE_CIPHONE); + for (p = allphs->ci_phmm[ci]; p && (p->pid != ci); p = p->next); + if (!p) + E_FATAL("Cannot find HMM for %s\n", S3_SILENCE_CIPHONE); + hmm_enter(&(p->hmm), 0, 0, allphs->frame); + + ptmr_reset(&allphs->perf); + ptmr_start(&allphs->perf); + + return 0; +} + +static void +allphone_search_sen_active(allphone_search_t * allphs) +{ + acmod_t *acmod; + bin_mdef_t *mdef; + phmm_t *p; + int32 ci; + + acmod = ps_search_acmod(allphs); + mdef = acmod->mdef; + + acmod_clear_active(acmod); + for (ci = 0; ci < bin_mdef_n_ciphone(mdef); ci++) + for (p = allphs->ci_phmm[ci]; p; p = p->next) + if (hmm_frame(&(p->hmm)) == allphs->frame) + acmod_activate_hmm(acmod, &(p->hmm)); +} + +int +allphone_search_step(ps_search_t * search, int frame_idx) +{ + int32 bestscr, frame_history_start; + const int16 *senscr; + allphone_search_t *allphs = (allphone_search_t *) search; + acmod_t *acmod = search->acmod; + + if (!acmod->compallsen) + allphone_search_sen_active(allphs); + senscr = acmod_score(acmod, &frame_idx); + allphs->n_sen_eval += acmod->n_senone_active; + bestscr = phmm_eval_all(allphs, senscr); + + frame_history_start = blkarray_list_n_valid(allphs->history); + phmm_exit(allphs, bestscr); + phmm_trans(allphs, bestscr, frame_history_start); + + allphs->frame++; + + return 0; +} + +static int32 +ascore(allphone_search_t * allphs, history_t * h) +{ + int32 score = h->score; + + if (h->hist > 0) { + history_t *pred = blkarray_list_get(allphs->history, h->hist); + score -= pred->score; + } + + return score - h->tscore; +} + +static void +allphone_clear_segments(allphone_search_t * allphs) +{ + gnode_t *gn; + for (gn = allphs->segments; gn; gn = gn->next) { + ckd_free(gnode_ptr(gn)); + } + glist_free(allphs->segments); + allphs->segments = NULL; +} + +static void +allphone_backtrace(allphone_search_t * allphs, int32 f, int32 *out_score) +{ + int32 best, hist_idx, best_idx; + int32 frm, last_frm; + history_t *h; + phseg_t *s; + + /* Clear old list */ + allphone_clear_segments(allphs); + + frm = last_frm = f; + /* Find the first history entry for the requested frame */ + hist_idx = blkarray_list_n_valid(allphs->history) - 1; + while (hist_idx > 0) { + h = blkarray_list_get(allphs->history, hist_idx); + if (h->ef <= f) { + frm = last_frm = h->ef; + break; + } + hist_idx--; + } + + if (hist_idx < 0) + return; + + /* Find bestscore */ + best = (int32) 0x80000000; + best_idx = -1; + while (frm == last_frm && hist_idx > 0) { + h = blkarray_list_get(allphs->history, hist_idx); + frm = h->ef; + if (h->score > best && frm == last_frm) { + best = h->score; + best_idx = hist_idx; + } + hist_idx--; + } + + if (best_idx < 0) + return; + + if (out_score) + *out_score = best; + + /* Backtrace */ + while (best_idx > 0) { + h = blkarray_list_get(allphs->history, best_idx); + s = (phseg_t *) ckd_calloc(1, sizeof(phseg_t)); + s->ci = h->phmm->ci; + s->sf = + (h->hist > + 0) ? ((history_t *) blkarray_list_get(allphs->history, + h->hist))->ef + 1 : 0; + s->ef = h->ef; + s->score = ascore(allphs, h); + s->tscore = h->tscore; + allphs->segments = glist_add_ptr(allphs->segments, s); + + best_idx = h->hist; + } + + return; +} + +int +allphone_search_finish(ps_search_t * search) +{ + allphone_search_t *allphs; + int32 cf, n_hist; + + allphs = (allphone_search_t *) search; + + allphs->n_tot_frame += allphs->frame; + n_hist = blkarray_list_n_valid(allphs->history); + E_INFO + ("%d frames, %d HMMs (%d/fr), %d senones (%d/fr), %d history entries (%d/fr)\n", + allphs->frame, allphs->n_hmm_eval, + (allphs->frame > 0) ? allphs->n_hmm_eval / allphs->frame : 0, + allphs->n_sen_eval, + (allphs->frame > 0) ? allphs->n_sen_eval / allphs->frame : 0, + n_hist, (allphs->frame > 0) ? n_hist / allphs->frame : 0); + + /* Now backtrace. */ + allphone_backtrace(allphs, allphs->frame - 1, NULL); + + /* Print out some statistics. */ + ptmr_stop(&allphs->perf); + /* This is the number of frames processed. */ + cf = ps_search_acmod(allphs)->output_frame; + if (cf > 0) { + double n_speech = (double) (cf + 1) + / cmd_ln_int32_r(ps_search_config(allphs), "-frate"); + E_INFO("allphone %.2f CPU %.3f xRT\n", + allphs->perf.t_cpu, allphs->perf.t_cpu / n_speech); + E_INFO("allphone %.2f wall %.3f xRT\n", + allphs->perf.t_elapsed, allphs->perf.t_elapsed / n_speech); + } + + + return 0; +} + +char const * +allphone_search_hyp(ps_search_t * search, int32 * out_score) +{ + allphone_search_t *allphs; + phseg_t *p; + gnode_t *gn; + const char *phone_str; + bin_mdef_t *mdef; + int len, hyp_idx, phone_idx; + + allphs = (allphone_search_t *) search; + mdef = search->acmod->mdef; + + /* Create hypothesis */ + if (search->hyp_str) + ckd_free(search->hyp_str); + search->hyp_str = NULL; + + allphone_backtrace(allphs, allphs->frame - 1, out_score); + if (allphs->segments == NULL) { + return NULL; + } + + len = glist_count(allphs->segments) * 10; /* maximum length of one phone with spacebar */ + + search->hyp_str = (char *) ckd_calloc(len, sizeof(*search->hyp_str)); + hyp_idx = 0; + for (gn = allphs->segments; gn; gn = gn->next) { + p = gnode_ptr(gn); + phone_str = bin_mdef_ciphone_str(mdef, p->ci); + phone_idx = 0; + while (phone_str[phone_idx] != '\0') + search->hyp_str[hyp_idx++] = phone_str[phone_idx++]; + search->hyp_str[hyp_idx++] = ' '; + } + search->hyp_str[--hyp_idx] = '\0'; + E_INFO("Hyp: %s\n", search->hyp_str); + return search->hyp_str; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h new file mode 100644 index 0000000..5097db7 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h @@ -0,0 +1,190 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2014 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * allphone_search.h -- Search structures for phoneme decoding. + */ + + +#ifndef __ALLPHONE_SEARCH_H__ +#define __ALLPHONE_SEARCH_H__ + + +/* SphinxBase headers. */ +#include +#include +#include +#include + +/* Local headers. */ +#include "pocketsphinx_internal.h" +#include "blkarray_list.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Models a single unique pair. + * Can represent several different triphones, but all with the same parent basephone. + * (NOTE: Word-position attribute of triphone is ignored.) + */ +typedef struct phmm_s { + hmm_t hmm; /**< Base HMM structure */ + s3pid_t pid; /**< Phone id (temp. during init.) */ + s3cipid_t ci; /**< Parent basephone for this PHMM */ + bitvec_t *lc; /**< Set (bit-vector) of left context phones seen for this PHMM */ + bitvec_t *rc; /**< Set (bit-vector) of right context phones seen for this PHMM */ + struct phmm_s *next; /**< Next unique PHMM for same parent basephone */ + struct plink_s *succlist; /**< List of predecessor PHMM nodes */ +} phmm_t; + +/** + * List of links from a PHMM node to its successors; one link per successor. + */ +typedef struct plink_s { + phmm_t *phmm; /**< Successor PHMM node */ + struct plink_s *next; /**< Next link for parent PHMM node */ +} plink_t; + +/** + * History (paths) information at any point in allphone Viterbi search. + */ +typedef struct history_s { + phmm_t *phmm; /**< PHMM ending this path */ + int32 score; /**< Path score for this path */ + int32 tscore; /**< Transition score for this path */ + frame_idx_t ef; /**< End frame */ + int32 hist; /**< Previous history entry */ +} history_t; + +/** + * Phone level segmentation information + */ +typedef struct phseg_s { + s3cipid_t ci; /* CI-phone id */ + frame_idx_t sf, ef; /* Start and end frame for this phone occurrence */ + int32 score; /* Acoustic score for this segment of alignment */ + int32 tscore; /* Transition ("LM") score for this segment */ +} phseg_t; + +/** + * Segment iterator over list of phseg + */ +typedef struct phseg_iter_s { + ps_seg_t base; + glist_t seg; +} phseg_iter_t; + +/** + * Implementation of allphone search structure. + */ +typedef struct allphone_search_s { + ps_search_t base; + + hmm_context_t *hmmctx; /**< HMM context. */ + ngram_model_t *lm; /**< Ngram model set */ + int32 ci_only; /**< Use context-independent phones for decoding */ + phmm_t **ci_phmm; /**< PHMM lists (for each CI phone) */ + int32 *ci2lmwid; /**< Mapping of CI phones to LM word IDs */ + + int32 beam, pbeam; /**< Effective beams after applying beam_factor */ + int32 lw, inspen; /**< Language weights */ + + frame_idx_t frame; /**< Current frame. */ + float32 ascale; /**< Acoustic score scale for posterior probabilities. */ + + int32 n_tot_frame; /**< Total number of frames processed */ + int32 n_hmm_eval; /**< Total HMMs evaluated this utt */ + int32 n_sen_eval; /**< Total senones evaluated this utt */ + + /* Backtrace information */ + blkarray_list_t *history; /**< List of history nodes allocated in each frame */ + /* Hypothesis DAG */ + glist_t segments; + + ptmr_t perf; /**< Performance counter */ + +} allphone_search_t; + +/** + * Create, initialize and return a search module. + */ +ps_search_t *allphone_search_init(const char *name, + ngram_model_t * lm, + cmd_ln_t * config, + acmod_t * acmod, + dict_t * dict, dict2pid_t * d2p); + +/** + * Deallocate search structure. + */ +void allphone_search_free(ps_search_t * search); + +/** + * Update allphone search module. + */ +int allphone_search_reinit(ps_search_t * search, dict_t * dict, + dict2pid_t * d2p); + +/** + * Prepare the allphone search structure for beginning decoding of the next + * utterance. + */ +int allphone_search_start(ps_search_t * search); + +/** + * Step one frame forward through the Viterbi search. + */ +int allphone_search_step(ps_search_t * search, int frame_idx); + +/** + * Windup and clean the allphone search structure after utterance. + */ +int allphone_search_finish(ps_search_t * search); + +/** + * Get hypothesis string from the allphone search. + */ +char const *allphone_search_hyp(ps_search_t * search, int32 * out_score); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __ALLPHONE_SEARCH_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c new file mode 100644 index 0000000..3ea6058 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c @@ -0,0 +1,891 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: bin_mdef.c + * + * Description: + * Binary format model definition files, with support for + * heterogeneous topologies and variable-size N-phones + * + * Author: + * David Huggins-Daines + *********************************************************************/ + +/* System headers. */ +#include +#include +#include + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include + +/* Local headers. */ +#include "mdef.h" +#include "bin_mdef.h" + +bin_mdef_t * +bin_mdef_read_text(cmd_ln_t *config, const char *filename) +{ + bin_mdef_t *bmdef; + mdef_t *mdef; + int i, nodes, ci_idx, lc_idx, rc_idx; + int nchars; + + (void)config; + + if ((mdef = mdef_init((char *) filename, TRUE)) == NULL) + return NULL; + + /* Enforce some limits. */ + if (mdef->n_sen > BAD_SENID) { + E_ERROR("Number of senones exceeds limit: %d > %d\n", + mdef->n_sen, BAD_SENID); + mdef_free(mdef); + return NULL; + } + if (mdef->n_sseq > BAD_SSID) { + E_ERROR("Number of senone sequences exceeds limit: %d > %d\n", + mdef->n_sseq, BAD_SSID); + mdef_free(mdef); + return NULL; + } + /* We use uint8 for ciphones */ + if (mdef->n_ciphone > 255) { + E_ERROR("Number of phones exceeds limit: %d > %d\n", + mdef->n_ciphone, 255); + mdef_free(mdef); + return NULL; + } + + bmdef = ckd_calloc(1, sizeof(*bmdef)); + bmdef->refcnt = 1; + + /* Easy stuff. The mdef.c code has done the heavy lifting for us. */ + bmdef->n_ciphone = mdef->n_ciphone; + bmdef->n_phone = mdef->n_phone; + bmdef->n_emit_state = mdef->n_emit_state; + bmdef->n_ci_sen = mdef->n_ci_sen; + bmdef->n_sen = mdef->n_sen; + bmdef->n_tmat = mdef->n_tmat; + bmdef->n_sseq = mdef->n_sseq; + bmdef->sseq = mdef->sseq; + bmdef->cd2cisen = mdef->cd2cisen; + bmdef->sen2cimap = mdef->sen2cimap; + bmdef->n_ctx = 3; /* Triphones only. */ + bmdef->sil = mdef->sil; + mdef->sseq = NULL; /* We are taking over this one. */ + mdef->cd2cisen = NULL; /* And this one. */ + mdef->sen2cimap = NULL; /* And this one. */ + + /* Get the phone names. If they are not sorted + * ASCII-betically then we are in a world of hurt and + * therefore will simply refuse to continue. */ + bmdef->ciname = ckd_calloc(bmdef->n_ciphone, sizeof(*bmdef->ciname)); + nchars = 0; + for (i = 0; i < bmdef->n_ciphone; ++i) + nchars += strlen(mdef->ciphone[i].name) + 1; + bmdef->ciname[0] = ckd_calloc(nchars, 1); + strcpy(bmdef->ciname[0], mdef->ciphone[0].name); + for (i = 1; i < bmdef->n_ciphone; ++i) { + assert(i > 0); /* No reason to imagine it wouldn't be, but... */ + bmdef->ciname[i] = + bmdef->ciname[i - 1] + strlen(bmdef->ciname[i - 1]) + 1; + strcpy(bmdef->ciname[i], mdef->ciphone[i].name); + if (strcmp(bmdef->ciname[i - 1], bmdef->ciname[i]) > 0) { + /* FIXME: there should be a solution to this, actually. */ + E_ERROR("Phone names are not in sorted order, sorry."); + bin_mdef_free(bmdef); + mdef_free(mdef); + return NULL; + } + } + + /* Copy over phone information. */ + bmdef->phone = ckd_calloc(bmdef->n_phone, sizeof(*bmdef->phone)); + for (i = 0; i < mdef->n_phone; ++i) { + bmdef->phone[i].ssid = mdef->phone[i].ssid; + bmdef->phone[i].tmat = mdef->phone[i].tmat; + if (i < bmdef->n_ciphone) { + bmdef->phone[i].info.ci.filler = mdef->ciphone[i].filler; + } + else { + bmdef->phone[i].info.cd.wpos = mdef->phone[i].wpos; + bmdef->phone[i].info.cd.ctx[0] = mdef->phone[i].ci; + bmdef->phone[i].info.cd.ctx[1] = mdef->phone[i].lc; + bmdef->phone[i].info.cd.ctx[2] = mdef->phone[i].rc; + } + } + + /* Walk the wpos_ci_lclist once to find the total number of + * nodes and the starting locations for each level. */ + nodes = lc_idx = ci_idx = rc_idx = 0; + for (i = 0; i < N_WORD_POSN; ++i) { + int j; + for (j = 0; j < mdef->n_ciphone; ++j) { + ph_lc_t *lc; + + for (lc = mdef->wpos_ci_lclist[i][j]; lc; lc = lc->next) { + ph_rc_t *rc; + for (rc = lc->rclist; rc; rc = rc->next) { + ++nodes; /* RC node */ + } + ++nodes; /* LC node */ + ++rc_idx; /* Start of RC nodes (after LC nodes) */ + } + ++nodes; /* CI node */ + ++lc_idx; /* Start of LC nodes (after CI nodes) */ + ++rc_idx; /* Start of RC nodes (after CI and LC nodes) */ + } + ++nodes; /* wpos node */ + ++ci_idx; /* Start of CI nodes (after wpos nodes) */ + ++lc_idx; /* Start of LC nodes (after CI nodes) */ + ++rc_idx; /* STart of RC nodes (after wpos, CI, and LC nodes) */ + } + E_INFO("Allocating %d * %d bytes (%d KiB) for CD tree\n", + nodes, sizeof(*bmdef->cd_tree), + nodes * sizeof(*bmdef->cd_tree) / 1024); + bmdef->n_cd_tree = nodes; + bmdef->cd_tree = ckd_calloc(nodes, sizeof(*bmdef->cd_tree)); + for (i = 0; i < N_WORD_POSN; ++i) { + int j; + + bmdef->cd_tree[i].ctx = i; + bmdef->cd_tree[i].n_down = mdef->n_ciphone; + bmdef->cd_tree[i].c.down = ci_idx; +#if 0 + E_INFO("%d => %c (%d@%d)\n", + i, (WPOS_NAME)[i], + bmdef->cd_tree[i].n_down, bmdef->cd_tree[i].c.down); +#endif + + /* Now we can build the rest of the tree. */ + for (j = 0; j < mdef->n_ciphone; ++j) { + ph_lc_t *lc; + + bmdef->cd_tree[ci_idx].ctx = j; + bmdef->cd_tree[ci_idx].c.down = lc_idx; + for (lc = mdef->wpos_ci_lclist[i][j]; lc; lc = lc->next) { + ph_rc_t *rc; + + bmdef->cd_tree[lc_idx].ctx = lc->lc; + bmdef->cd_tree[lc_idx].c.down = rc_idx; + for (rc = lc->rclist; rc; rc = rc->next) { + bmdef->cd_tree[rc_idx].ctx = rc->rc; + bmdef->cd_tree[rc_idx].n_down = 0; + bmdef->cd_tree[rc_idx].c.pid = rc->pid; +#if 0 + E_INFO("%d => %s %s %s %c (%d@%d)\n", + rc_idx, + bmdef->ciname[j], + bmdef->ciname[lc->lc], + bmdef->ciname[rc->rc], + (WPOS_NAME)[i], + bmdef->cd_tree[rc_idx].n_down, + bmdef->cd_tree[rc_idx].c.down); +#endif + + ++bmdef->cd_tree[lc_idx].n_down; + ++rc_idx; + } + /* If there are no triphones here, + * this is considered a leafnode, so + * set the pid to -1. */ + if (bmdef->cd_tree[lc_idx].n_down == 0) + bmdef->cd_tree[lc_idx].c.pid = -1; +#if 0 + E_INFO("%d => %s %s %c (%d@%d)\n", + lc_idx, + bmdef->ciname[j], + bmdef->ciname[lc->lc], + (WPOS_NAME)[i], + bmdef->cd_tree[lc_idx].n_down, + bmdef->cd_tree[lc_idx].c.down); +#endif + + ++bmdef->cd_tree[ci_idx].n_down; + ++lc_idx; + } + + /* As above, so below. */ + if (bmdef->cd_tree[ci_idx].n_down == 0) + bmdef->cd_tree[ci_idx].c.pid = -1; +#if 0 + E_INFO("%d => %d=%s (%d@%d)\n", + ci_idx, j, bmdef->ciname[j], + bmdef->cd_tree[ci_idx].n_down, + bmdef->cd_tree[ci_idx].c.down); +#endif + + ++ci_idx; + } + } + + mdef_free(mdef); + + bmdef->alloc_mode = BIN_MDEF_FROM_TEXT; + return bmdef; +} + +bin_mdef_t * +bin_mdef_retain(bin_mdef_t *m) +{ + ++m->refcnt; + return m; +} + +int +bin_mdef_free(bin_mdef_t * m) +{ + if (m == NULL) + return 0; + if (--m->refcnt > 0) + return m->refcnt; + + switch (m->alloc_mode) { + case BIN_MDEF_FROM_TEXT: + ckd_free(m->ciname[0]); + ckd_free(m->sseq[0]); + ckd_free(m->phone); + ckd_free(m->cd_tree); + break; + case BIN_MDEF_IN_MEMORY: + ckd_free(m->ciname[0]); + break; + case BIN_MDEF_ON_DISK: + break; + } + if (m->filemap) + mmio_file_unmap(m->filemap); + ckd_free(m->cd2cisen); + ckd_free(m->sen2cimap); + ckd_free(m->ciname); + ckd_free(m->sseq); + ckd_free(m); + return 0; +} + +static const char format_desc[] = + "BEGIN FILE FORMAT DESCRIPTION\n" + "int32 n_ciphone; /**< Number of base (CI) phones */\n" + "int32 n_phone; /**< Number of base (CI) phones + (CD) triphones */\n" + "int32 n_emit_state; /**< Number of emitting states per phone (0 if heterogeneous) */\n" + "int32 n_ci_sen; /**< Number of CI senones; these are the first */\n" + "int32 n_sen; /**< Number of senones (CI+CD) */\n" + "int32 n_tmat; /**< Number of transition matrices */\n" + "int32 n_sseq; /**< Number of unique senone sequences */\n" + "int32 n_ctx; /**< Number of phones of context */\n" + "int32 n_cd_tree; /**< Number of nodes in CD tree structure */\n" + "int32 sil; /**< CI phone ID for silence */\n" + "char ciphones[][]; /**< CI phone strings (null-terminated) */\n" + "char padding[]; /**< Padding to a 4-bytes boundary */\n" + "struct { int16 ctx; int16 n_down; int32 pid/down } cd_tree[];\n" + "struct { int32 ssid; int32 tmat; int8 attr[4] } phones[];\n" + "int16 sseq[]; /**< Unique senone sequences */\n" + "int8 sseq_len[]; /**< Number of states in each sseq (none if homogeneous) */\n" + "END FILE FORMAT DESCRIPTION\n"; + +bin_mdef_t * +bin_mdef_read(cmd_ln_t *config, const char *filename) +{ + bin_mdef_t *m; + FILE *fh; + size_t tree_start; + int32 val, i, do_mmap, swap; + long pos, end; + int32 *sseq_size; + + /* Try to read it as text first. */ + if ((m = bin_mdef_read_text(config, filename)) != NULL) + return m; + + E_INFO("Reading binary model definition: %s\n", filename); + if ((fh = fopen(filename, "rb")) == NULL) + return NULL; + + if (fread(&val, 4, 1, fh) != 1) { + fclose(fh); + E_ERROR_SYSTEM("Failed to read byte-order marker from %s\n", + filename); + return NULL; + } + swap = 0; + if (val == BIN_MDEF_OTHER_ENDIAN) { + swap = 1; + E_INFO("Must byte-swap %s\n", filename); + } + if (fread(&val, 4, 1, fh) != 1) { + fclose(fh); + E_ERROR_SYSTEM("Failed to read version from %s\n", filename); + return NULL; + } + if (swap) + SWAP_INT32(&val); + if (val > BIN_MDEF_FORMAT_VERSION) { + E_ERROR("File format version %d for %s is newer than library\n", + val, filename); + fclose(fh); + return NULL; + } + if (fread(&val, 4, 1, fh) != 1) { + fclose(fh); + E_ERROR_SYSTEM("Failed to read header length from %s\n", filename); + return NULL; + } + if (swap) + SWAP_INT32(&val); + /* Skip format descriptor. */ + fseek(fh, val, SEEK_CUR); + + /* Finally allocate it. */ + m = ckd_calloc(1, sizeof(*m)); + m->refcnt = 1; + + /* Check these, to make gcc/glibc shut up. */ +#define FREAD_SWAP32_CHK(dest) \ + if (fread((dest), 4, 1, fh) != 1) { \ + fclose(fh); \ + ckd_free(m); \ + E_ERROR_SYSTEM("Failed to read %s from %s\n", #dest, filename); \ + return NULL; \ + } \ + if (swap) SWAP_INT32(dest); + + FREAD_SWAP32_CHK(&m->n_ciphone); + FREAD_SWAP32_CHK(&m->n_phone); + FREAD_SWAP32_CHK(&m->n_emit_state); + FREAD_SWAP32_CHK(&m->n_ci_sen); + FREAD_SWAP32_CHK(&m->n_sen); + FREAD_SWAP32_CHK(&m->n_tmat); + FREAD_SWAP32_CHK(&m->n_sseq); + FREAD_SWAP32_CHK(&m->n_ctx); + FREAD_SWAP32_CHK(&m->n_cd_tree); + FREAD_SWAP32_CHK(&m->sil); + + /* CI names are first in the file. */ + m->ciname = ckd_calloc(m->n_ciphone, sizeof(*m->ciname)); + + /* Decide whether to read in the whole file or mmap it. */ + do_mmap = config ? cmd_ln_boolean_r(config, "-mmap") : TRUE; + if (swap) { + E_WARN("-mmap specified, but mdef is other-endian. Will not memory-map.\n"); + do_mmap = FALSE; + } + /* Actually try to mmap it. */ + if (do_mmap) { + m->filemap = mmio_file_read(filename); + if (m->filemap == NULL) + do_mmap = FALSE; + } + pos = ftell(fh); + if (do_mmap) { + /* Get the base pointer from the memory map. */ + m->ciname[0] = (char *)mmio_file_ptr(m->filemap) + pos; + /* Success! */ + m->alloc_mode = BIN_MDEF_ON_DISK; + } + else { + /* Read everything into memory. */ + m->alloc_mode = BIN_MDEF_IN_MEMORY; + fseek(fh, 0, SEEK_END); + end = ftell(fh); + fseek(fh, pos, SEEK_SET); + m->ciname[0] = ckd_malloc(end - pos); + if (fread(m->ciname[0], 1, end - pos, fh) != (size_t)(end - pos)) + E_FATAL("Failed to read %d bytes of data from %s\n", end - pos, filename); + } + + for (i = 1; i < m->n_ciphone; ++i) + m->ciname[i] = m->ciname[i - 1] + strlen(m->ciname[i - 1]) + 1; + + /* Skip past the padding. */ + tree_start = + m->ciname[i - 1] + strlen(m->ciname[i - 1]) + 1 - m->ciname[0]; + tree_start = (tree_start + 3) & ~3; + m->cd_tree = (cd_tree_t *) (m->ciname[0] + tree_start); + if (swap) { + for (i = 0; i < m->n_cd_tree; ++i) { + SWAP_INT16(&m->cd_tree[i].ctx); + SWAP_INT16(&m->cd_tree[i].n_down); + SWAP_INT32(&m->cd_tree[i].c.down); + } + } + m->phone = (mdef_entry_t *) (m->cd_tree + m->n_cd_tree); + if (swap) { + for (i = 0; i < m->n_phone; ++i) { + SWAP_INT32(&m->phone[i].ssid); + SWAP_INT32(&m->phone[i].tmat); + } + } + sseq_size = (int32 *) (m->phone + m->n_phone); + if (swap) + SWAP_INT32(sseq_size); + m->sseq = ckd_calloc(m->n_sseq, sizeof(*m->sseq)); + m->sseq[0] = (uint16 *) (sseq_size + 1); + if (swap) { + for (i = 0; i < *sseq_size; ++i) + SWAP_INT16(m->sseq[0] + i); + } + if (m->n_emit_state) { + for (i = 1; i < m->n_sseq; ++i) + m->sseq[i] = m->sseq[0] + i * m->n_emit_state; + } + else { + m->sseq_len = (uint8 *) (m->sseq[0] + *sseq_size); + for (i = 1; i < m->n_sseq; ++i) + m->sseq[i] = m->sseq[i - 1] + m->sseq_len[i - 1]; + } + + /* Now build the CD-to-CI mappings using the senone sequences. + * This is the only really accurate way to do it, though it is + * still inaccurate in the case of heterogeneous topologies or + * cross-state tying. */ + m->cd2cisen = (int16 *) ckd_malloc(m->n_sen * sizeof(*m->cd2cisen)); + m->sen2cimap = (int16 *) ckd_malloc(m->n_sen * sizeof(*m->sen2cimap)); + + /* Default mappings (identity, none) */ + for (i = 0; i < m->n_ci_sen; ++i) + m->cd2cisen[i] = i; + for (; i < m->n_sen; ++i) + m->cd2cisen[i] = -1; + for (i = 0; i < m->n_sen; ++i) + m->sen2cimap[i] = -1; + for (i = 0; i < m->n_phone; ++i) { + int32 j, ssid = m->phone[i].ssid; + + for (j = 0; j < bin_mdef_n_emit_state_phone(m, i); ++j) { + int s = bin_mdef_sseq2sen(m, ssid, j); + int ci = bin_mdef_pid2ci(m, i); + /* Take the first one and warn if we have cross-state tying. */ + if (m->sen2cimap[s] == -1) + m->sen2cimap[s] = ci; + if (m->sen2cimap[s] != ci) + E_WARN + ("Senone %d is shared between multiple base phones\n", + s); + + if (j > bin_mdef_n_emit_state_phone(m, ci)) + E_WARN("CD phone %d has fewer states than CI phone %d\n", + i, ci); + else + m->cd2cisen[s] = + bin_mdef_sseq2sen(m, m->phone[ci].ssid, j); + } + } + + /* Set the silence phone. */ + m->sil = bin_mdef_ciphone_id(m, S3_SILENCE_CIPHONE); + + E_INFO + ("%d CI-phone, %d CD-phone, %d emitstate/phone, %d CI-sen, %d Sen, %d Sen-Seq\n", + m->n_ciphone, m->n_phone - m->n_ciphone, m->n_emit_state, + m->n_ci_sen, m->n_sen, m->n_sseq); + fclose(fh); + return m; +} + +int +bin_mdef_write(bin_mdef_t * m, const char *filename) +{ + FILE *fh; + int32 val, i; + + if ((fh = fopen(filename, "wb")) == NULL) + return -1; + + /* Byteorder marker. */ + val = BIN_MDEF_NATIVE_ENDIAN; + fwrite(&val, 1, 4, fh); + /* Version. */ + val = BIN_MDEF_FORMAT_VERSION; + fwrite(&val, 1, sizeof(val), fh); + + /* Round the format descriptor size up to a 4-byte boundary. */ + val = ((sizeof(format_desc) + 3) & ~3); + fwrite(&val, 1, sizeof(val), fh); + fwrite(format_desc, 1, sizeof(format_desc), fh); + /* Pad it with zeros. */ + i = 0; + fwrite(&i, 1, val - sizeof(format_desc), fh); + + /* Binary header things. */ + fwrite(&m->n_ciphone, 4, 1, fh); + fwrite(&m->n_phone, 4, 1, fh); + fwrite(&m->n_emit_state, 4, 1, fh); + fwrite(&m->n_ci_sen, 4, 1, fh); + fwrite(&m->n_sen, 4, 1, fh); + fwrite(&m->n_tmat, 4, 1, fh); + fwrite(&m->n_sseq, 4, 1, fh); + fwrite(&m->n_ctx, 4, 1, fh); + fwrite(&m->n_cd_tree, 4, 1, fh); + /* Write this as a 32-bit value to preserve alignment for the + * non-mmap case (we want things aligned both from the + * beginning of the file and the beginning of the phone + * strings). */ + val = m->sil; + fwrite(&val, 4, 1, fh); + + /* Phone strings. */ + for (i = 0; i < m->n_ciphone; ++i) + fwrite(m->ciname[i], 1, strlen(m->ciname[i]) + 1, fh); + /* Pad with zeros. */ + val = (ftell(fh) + 3) & ~3; + i = 0; + fwrite(&i, 1, val - ftell(fh), fh); + + /* Write CD-tree */ + fwrite(m->cd_tree, sizeof(*m->cd_tree), m->n_cd_tree, fh); + /* Write phones */ + fwrite(m->phone, sizeof(*m->phone), m->n_phone, fh); + if (m->n_emit_state) { + /* Write size of sseq */ + val = m->n_sseq * m->n_emit_state; + fwrite(&val, 4, 1, fh); + + /* Write sseq */ + fwrite(m->sseq[0], sizeof(**m->sseq), + m->n_sseq * m->n_emit_state, fh); + } + else { + int32 n; + + /* Calculate size of sseq */ + n = 0; + for (i = 0; i < m->n_sseq; ++i) + n += m->sseq_len[i]; + + /* Write size of sseq */ + fwrite(&n, 4, 1, fh); + + /* Write sseq */ + fwrite(m->sseq[0], sizeof(**m->sseq), n, fh); + + /* Write sseq_len */ + fwrite(m->sseq_len, 1, m->n_sseq, fh); + } + fclose(fh); + + return 0; +} + +int +bin_mdef_write_text(bin_mdef_t * m, const char *filename) +{ + FILE *fh; + int p, i, n_total_state; + + if (strcmp(filename, "-") == 0) + fh = stdout; + else { + if ((fh = fopen(filename, "w")) == NULL) + return -1; + } + + fprintf(fh, "0.3\n"); + fprintf(fh, "%d n_base\n", m->n_ciphone); + fprintf(fh, "%d n_tri\n", m->n_phone - m->n_ciphone); + if (m->n_emit_state) + n_total_state = m->n_phone * (m->n_emit_state + 1); + else { + n_total_state = 0; + for (i = 0; i < m->n_phone; ++i) + n_total_state += m->sseq_len[m->phone[i].ssid] + 1; + } + fprintf(fh, "%d n_state_map\n", n_total_state); + fprintf(fh, "%d n_tied_state\n", m->n_sen); + fprintf(fh, "%d n_tied_ci_state\n", m->n_ci_sen); + fprintf(fh, "%d n_tied_tmat\n", m->n_tmat); + fprintf(fh, "#\n# Columns definitions\n"); + fprintf(fh, "#%4s %3s %3s %1s %6s %4s %s\n", + "base", "lft", "rt", "p", "attrib", "tmat", + " ... state id's ..."); + + for (p = 0; p < m->n_ciphone; p++) { + int n_state; + + fprintf(fh, "%5s %3s %3s %1s", m->ciname[p], "-", "-", "-"); + + if (bin_mdef_is_fillerphone(m, p)) + fprintf(fh, " %6s", "filler"); + else + fprintf(fh, " %6s", "n/a"); + fprintf(fh, " %4d", m->phone[p].tmat); + + if (m->n_emit_state) + n_state = m->n_emit_state; + else + n_state = m->sseq_len[m->phone[p].ssid]; + for (i = 0; i < n_state; i++) { + fprintf(fh, " %6u", m->sseq[m->phone[p].ssid][i]); + } + fprintf(fh, " N\n"); + } + + + for (; p < m->n_phone; p++) { + int n_state; + + fprintf(fh, "%5s %3s %3s %c", + m->ciname[m->phone[p].info.cd.ctx[0]], + m->ciname[m->phone[p].info.cd.ctx[1]], + m->ciname[m->phone[p].info.cd.ctx[2]], + (WPOS_NAME)[m->phone[p].info.cd.wpos]); + + if (bin_mdef_is_fillerphone(m, p)) + fprintf(fh, " %6s", "filler"); + else + fprintf(fh, " %6s", "n/a"); + fprintf(fh, " %4d", m->phone[p].tmat); + + + if (m->n_emit_state) + n_state = m->n_emit_state; + else + n_state = m->sseq_len[m->phone[p].ssid]; + for (i = 0; i < n_state; i++) { + fprintf(fh, " %6u", m->sseq[m->phone[p].ssid][i]); + } + fprintf(fh, " N\n"); + } + + if (strcmp(filename, "-") != 0) + fclose(fh); + return 0; +} + +int +bin_mdef_ciphone_id(bin_mdef_t * m, const char *ciphone) +{ + int low, mid, high; + + /* Exact binary search on m->ciphone */ + low = 0; + high = m->n_ciphone; + while (low < high) { + int c; + + mid = (low + high) / 2; + c = strcmp(ciphone, m->ciname[mid]); + if (c == 0) + return mid; + else if (c > 0) + low = mid + 1; + else + high = mid; + } + return -1; +} + +int +bin_mdef_ciphone_id_nocase(bin_mdef_t * m, const char *ciphone) +{ + int low, mid, high; + + /* Exact binary search on m->ciphone */ + low = 0; + high = m->n_ciphone; + while (low < high) { + int c; + + mid = (low + high) / 2; + c = strcmp_nocase(ciphone, m->ciname[mid]); + if (c == 0) + return mid; + else if (c > 0) + low = mid + 1; + else + high = mid; + } + return -1; +} + +const char * +bin_mdef_ciphone_str(bin_mdef_t * m, int32 ci) +{ + assert(m != NULL); + assert(ci < m->n_ciphone); + return m->ciname[ci]; +} + +int +bin_mdef_phone_id(bin_mdef_t * m, int32 ci, int32 lc, int32 rc, int32 wpos) +{ + cd_tree_t *cd_tree; + int level, max; + int16 ctx[4]; + + assert(m); + + /* In the future, we might back off when context is not available, + * but for now we'll just return the CI phone. */ + if (lc < 0 || rc < 0) + return ci; + + assert((ci >= 0) && (ci < m->n_ciphone)); + assert((lc >= 0) && (lc < m->n_ciphone)); + assert((rc >= 0) && (rc < m->n_ciphone)); + assert((wpos >= 0) && (wpos < N_WORD_POSN)); + + /* Create a context list, mapping fillers to silence. */ + ctx[0] = wpos; + ctx[1] = ci; + ctx[2] = (m->sil >= 0 + && m->phone[lc].info.ci.filler) ? m->sil : lc; + ctx[3] = (m->sil >= 0 + && m->phone[rc].info.ci.filler) ? m->sil : rc; + + /* Walk down the cd_tree. */ + cd_tree = m->cd_tree; + level = 0; /* What level we are on. */ + max = N_WORD_POSN; /* Number of nodes on this level. */ + while (level < 4) { + int i; + +#if 0 + E_INFO("Looking for context %d=%s in %d at %d\n", + ctx[level], m->ciname[ctx[level]], + max, cd_tree - m->cd_tree); +#endif + for (i = 0; i < max; ++i) { +#if 0 + E_INFO("Look at context %d=%s at %d\n", + cd_tree[i].ctx, + m->ciname[cd_tree[i].ctx], cd_tree + i - m->cd_tree); +#endif + if (cd_tree[i].ctx == ctx[level]) + break; + } + if (i == max) + return -1; +#if 0 + E_INFO("Found context %d=%s at %d, n_down=%d, down=%d\n", + ctx[level], m->ciname[ctx[level]], + cd_tree + i - m->cd_tree, + cd_tree[i].n_down, cd_tree[i].c.down); +#endif + /* Leaf node, stop here. */ + if (cd_tree[i].n_down == 0) + return cd_tree[i].c.pid; + + /* Go down one level. */ + max = cd_tree[i].n_down; + cd_tree = m->cd_tree + cd_tree[i].c.down; + ++level; + } + /* We probably shouldn't get here. */ + return -1; +} + +int +bin_mdef_phone_id_nearest(bin_mdef_t * m, int32 b, int32 l, int32 r, int32 pos) +{ + int p, tmppos; + + + + /* In the future, we might back off when context is not available, + * but for now we'll just return the CI phone. */ + if (l < 0 || r < 0) + return b; + + p = bin_mdef_phone_id(m, b, l, r, pos); + if (p >= 0) + return p; + + /* Exact triphone not found; backoff to other word positions */ + for (tmppos = 0; tmppos < N_WORD_POSN; tmppos++) { + if (tmppos != pos) { + p = bin_mdef_phone_id(m, b, l, r, tmppos); + if (p >= 0) + return p; + } + } + + /* Nothing yet; backoff to silence phone if non-silence filler context */ + /* In addition, backoff to silence phone on left/right if in beginning/end position */ + if (m->sil >= 0) { + int newl = l, newr = r; + if (m->phone[(int)l].info.ci.filler + || pos == WORD_POSN_BEGIN || pos == WORD_POSN_SINGLE) + newl = m->sil; + if (m->phone[(int)r].info.ci.filler + || pos == WORD_POSN_END || pos == WORD_POSN_SINGLE) + newr = m->sil; + if ((newl != l) || (newr != r)) { + p = bin_mdef_phone_id(m, b, newl, newr, pos); + if (p >= 0) + return p; + + for (tmppos = 0; tmppos < N_WORD_POSN; tmppos++) { + if (tmppos != pos) { + p = bin_mdef_phone_id(m, b, newl, newr, tmppos); + if (p >= 0) + return p; + } + } + } + } + + /* Nothing yet; backoff to base phone */ + return b; +} + +int +bin_mdef_phone_str(bin_mdef_t * m, int pid, char *buf) +{ + char *wpos_name; + + assert(m); + assert((pid >= 0) && (pid < m->n_phone)); + wpos_name = WPOS_NAME; + + buf[0] = '\0'; + if (pid < m->n_ciphone) + sprintf(buf, "%s", bin_mdef_ciphone_str(m, pid)); + else { + sprintf(buf, "%s %s %s %c", + bin_mdef_ciphone_str(m, m->phone[pid].info.cd.ctx[0]), + bin_mdef_ciphone_str(m, m->phone[pid].info.cd.ctx[1]), + bin_mdef_ciphone_str(m, m->phone[pid].info.cd.ctx[2]), + wpos_name[m->phone[pid].info.cd.wpos]); + } + return 0; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h new file mode 100644 index 0000000..97db145 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h @@ -0,0 +1,247 @@ +/* -*- c-file-style: "linux" -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file bin_mdef.h + * + * Binary format model definition files, with support for + * heterogeneous topologies and variable-size N-phones + * + * @author David Huggins-Daines + */ +#ifndef __BIN_MDEF_H__ +#define __BIN_MDEF_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/* SphinxBase headers. */ +#include +#include +#include + +#include "mdef.h" + +#define BIN_MDEF_FORMAT_VERSION 1 +/* Little-endian machines will write "BMDF" to disk, big-endian ones "FDMB". */ +#define BIN_MDEF_NATIVE_ENDIAN 0x46444d42 /* 'BMDF' in little-endian order */ +#define BIN_MDEF_OTHER_ENDIAN 0x424d4446 /* 'BMDF' in big-endian order */ +#ifdef __GNUC__ +#define __ATTRIBUTE_PACKED __attribute__((packed)) +#else +#define __ATTRIBUTE_PACKED +#endif + +/** + * Phone entry (on-disk, 12 bytes) + */ +typedef struct mdef_entry_s mdef_entry_t; +struct mdef_entry_s { + int32 ssid; /**< Senone sequence ID */ + int32 tmat; /**< Transition matrix ID */ + /* FIXME: is any of this actually necessary? */ + union { + /**< CI phone information - attributes (just "filler" for now) */ + struct { + uint8 filler; + uint8 reserved[3]; + } ci; + /**< CD phone information - context info. */ + struct { + uint8 wpos; + uint8 ctx[3]; /**< quintphones will require hacking */ + } cd; + } info; +} __ATTRIBUTE_PACKED; + +/** + * Invalid senone sequence ID (limited to 16 bits for PocketSphinx). + */ +#define BAD_SSID 0xffff +/** + * Invalid senone ID (limited to 16 bits for PocketSphinx). + */ +#define BAD_SENID 0xffff + +/** + * Node in CD phone tree (on-disk, 8 bytes). + */ +typedef struct cd_tree_s cd_tree_t; +struct cd_tree_s { + int16 ctx; /**< Context (word position or CI phone) */ + int16 n_down; /**< Number of children (0 for leafnode) */ + union { + int32 pid; /**< Phone ID (leafnode) */ + int32 down; /**< Next level of the tree (offset from start of cd_trees) */ + } c; +}; + +/** + * Model definition structure (in-memory). + */ +typedef struct bin_mdef_s bin_mdef_t; +struct bin_mdef_s { + int refcnt; + int32 n_ciphone; /**< Number of base (CI) phones */ + int32 n_phone; /**< Number of base (CI) phones + (CD) triphones */ + int32 n_emit_state; /**< Number of emitting states per phone (0 for heterogeneous) */ + int32 n_ci_sen; /**< Number of CI senones; these are the first */ + int32 n_sen; /**< Number of senones (CI+CD) */ + int32 n_tmat; /**< Number of transition matrices */ + int32 n_sseq; /**< Number of unique senone sequences */ + int32 n_ctx; /**< Number of phones of context */ + int32 n_cd_tree; /**< Number of nodes in cd_tree (below) */ + int32 sil; /**< CI phone ID for silence */ + + mmio_file_t *filemap;/**< File map for this file (if any) */ + char **ciname; /**< CI phone names */ + cd_tree_t *cd_tree; /**< Tree mapping CD phones to phone IDs */ + mdef_entry_t *phone; /**< All phone structures */ + uint16 **sseq; /**< Unique senone sequences (2D array built at load time) */ + uint8 *sseq_len; /**< Number of states in each sseq (NULL for homogeneous) */ + + /* These two are not stored on disk, but are generated at load time. */ + int16 *cd2cisen; /**< Parent CI-senone id for each senone */ + int16 *sen2cimap; /**< Parent CI-phone for each senone (CI or CD) */ + + /** Allocation mode for this object. */ + enum { BIN_MDEF_FROM_TEXT, BIN_MDEF_IN_MEMORY, BIN_MDEF_ON_DISK } alloc_mode; +}; + +#define bin_mdef_is_fillerphone(m,p) (((p) < (m)->n_ciphone) \ + ? (m)->phone[p].info.ci.filler \ + : (m)->phone[(m)->phone[p].info.cd.ctx[0]].info.ci.filler) +#define bin_mdef_is_ciphone(m,p) ((p) < (m)->n_ciphone) +#define bin_mdef_n_ciphone(m) ((m)->n_ciphone) +#define bin_mdef_n_phone(m) ((m)->n_phone) +#define bin_mdef_n_sseq(m) ((m)->n_sseq) +#define bin_mdef_n_emit_state(m) ((m)->n_emit_state) +#define bin_mdef_n_emit_state_phone(m,p) ((m)->n_emit_state ? (m)->n_emit_state \ + : (m)->sseq_len[(m)->phone[p].ssid]) +#define bin_mdef_n_sen(m) ((m)->n_sen) +#define bin_mdef_n_tmat(m) ((m)->n_tmat) +#define bin_mdef_pid2ssid(m,p) ((m)->phone[p].ssid) +#define bin_mdef_pid2tmatid(m,p) ((m)->phone[p].tmat) +#define bin_mdef_silphone(m) ((m)->sil) +#define bin_mdef_sen2cimap(m,s) ((m)->sen2cimap[s]) +#define bin_mdef_sseq2sen(m,ss,pos) ((m)->sseq[ss][pos]) +#define bin_mdef_pid2ci(m,p) (((p) < (m)->n_ciphone) ? (p) \ + : (m)->phone[p].info.cd.ctx[0]) + +/** + * Read a binary mdef from a file. + */ +POCKETSPHINX_EXPORT +bin_mdef_t *bin_mdef_read(cmd_ln_t *config, const char *filename); +/** + * Read a text mdef from a file (creating an in-memory binary mdef). + */ +POCKETSPHINX_EXPORT +bin_mdef_t *bin_mdef_read_text(cmd_ln_t *config, const char *filename); +/** + * Write a binary mdef to a file. + */ +POCKETSPHINX_EXPORT +int bin_mdef_write(bin_mdef_t *m, const char *filename); +/** + * Write a binary mdef to a text file. + */ +POCKETSPHINX_EXPORT +int bin_mdef_write_text(bin_mdef_t *m, const char *filename); +/** + * Retain a pointer to a bin_mdef_t. + */ +POCKETSPHINX_EXPORT +bin_mdef_t *bin_mdef_retain(bin_mdef_t *m); +/** + * Release a pointer to a binary mdef. + */ +POCKETSPHINX_EXPORT +int bin_mdef_free(bin_mdef_t *m); + +/** + * Context-independent phone lookup. + * @return phone id for ciphone. + */ +POCKETSPHINX_EXPORT +int bin_mdef_ciphone_id(bin_mdef_t *m, /**< In: Model structure being queried */ + const char *ciphone); /**< In: ciphone for which id wanted */ + +/** + * Case-insensitive context-independent phone lookup. + * @return phone id for ciphone. + */ +POCKETSPHINX_EXPORT +int bin_mdef_ciphone_id_nocase(bin_mdef_t *m, /**< In: Model structure being queried */ + const char *ciphone); /**< In: ciphone for which id wanted */ + +/* Return value: READ-ONLY ciphone string name for the given ciphone id */ +POCKETSPHINX_EXPORT +const char *bin_mdef_ciphone_str(bin_mdef_t *m, /**< In: Model structure being queried */ + int32 ci); /**< In: ciphone id for which name wanted */ + +/* Return value: phone id for the given constituents if found, else -1 */ +POCKETSPHINX_EXPORT +int bin_mdef_phone_id(bin_mdef_t *m, /**< In: Model structure being queried */ + int32 b, /**< In: base ciphone id */ + int32 l, /**< In: left context ciphone id */ + int32 r, /**< In: right context ciphone id */ + int32 pos); /**< In: Word position */ + +/* Look up a phone id, backing off to other word positions. */ +POCKETSPHINX_EXPORT +int bin_mdef_phone_id_nearest(bin_mdef_t * m, int32 b, + int32 l, int32 r, int32 pos); + +/** + * Create a phone string for the given phone (base or triphone) id in the given buf. + * + * @return 0 if successful, -1 if error. + */ +POCKETSPHINX_EXPORT +int bin_mdef_phone_str(bin_mdef_t *m, /**< In: Model structure being queried */ + int pid, /**< In: phone id being queried */ + char *buf); /**< Out: On return, buf has the string */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __BIN_MDEF_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c new file mode 100644 index 0000000..4b9eb67 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c @@ -0,0 +1,172 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * blkarray_list.c -- block array-based list structure. + * + * HISTORY + * + * 18-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Started. + */ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "blkarray_list.h" + + +#define BLKARRAY_DEFAULT_MAXBLKS 16380 +#define BLKARRAY_DEFAULT_BLKSIZE 16380 + + +blkarray_list_t * +_blkarray_list_init(int32 maxblks, int32 blksize) +{ + blkarray_list_t *bl; + + if ((maxblks <= 0) || (blksize <= 0)) { + E_ERROR("Cannot allocate %dx%d blkarray\n", maxblks, blksize); + return NULL; + } + + bl = (blkarray_list_t *) ckd_calloc(1, sizeof(blkarray_list_t)); + bl->ptr = (void ***) ckd_calloc(maxblks, sizeof(void **)); + bl->maxblks = maxblks; + bl->blksize = blksize; + bl->n_valid = 0; + bl->cur_row = -1; /* No row is allocated (dummy) */ + bl->cur_row_free = blksize; /* The dummy row is full */ + + return bl; +} + + +blkarray_list_t * +blkarray_list_init(void) +{ + return _blkarray_list_init(BLKARRAY_DEFAULT_MAXBLKS, + BLKARRAY_DEFAULT_BLKSIZE); +} + +void +blkarray_list_free(blkarray_list_t *bl) +{ + blkarray_list_reset(bl); + ckd_free(bl->ptr); + ckd_free(bl); +} + + +int32 +blkarray_list_append(blkarray_list_t * bl, void *data) +{ + int32 id; + + assert(bl); + + if (bl->cur_row_free >= bl->blksize) { + /* Previous row is filled; need to allocate a new row */ + bl->cur_row++; + + if (bl->cur_row >= bl->maxblks) { + E_ERROR("Block array (%dx%d) exhausted\n", + bl->maxblks, bl->blksize); + bl->cur_row--; + return -1; + } + + /* Allocate the new row */ + assert(bl->ptr[bl->cur_row] == NULL); + bl->ptr[bl->cur_row] = (void **) ckd_malloc(bl->blksize * + sizeof(void *)); + + bl->cur_row_free = 0; + } + + bl->ptr[bl->cur_row][bl->cur_row_free] = data; + (bl->cur_row_free)++; + + id = (bl->n_valid)++; + assert(id >= 0); + + return id; +} + + +void +blkarray_list_reset(blkarray_list_t * bl) +{ + int32 i, j; + + /* Free all the allocated elements as well as the blocks */ + for (i = 0; i < bl->cur_row; i++) { + for (j = 0; j < bl->blksize; j++) + ckd_free(bl->ptr[i][j]); + + ckd_free(bl->ptr[i]); + bl->ptr[i] = NULL; + } + if (i == bl->cur_row) { /* NEED THIS! (in case cur_row < 0) */ + for (j = 0; j < bl->cur_row_free; j++) + ckd_free(bl->ptr[i][j]); + + ckd_free(bl->ptr[i]); + bl->ptr[i] = NULL; + } + + bl->n_valid = 0; + bl->cur_row = -1; + bl->cur_row_free = bl->blksize; +} + +void * +blkarray_list_get(blkarray_list_t *list, int32 n) +{ + int32 r, c; + + if (n >= blkarray_list_n_valid(list)) + return NULL; + + r = n / blkarray_list_blksize(list); + c = n - (r * blkarray_list_blksize(list)); + + return blkarray_list_ptr(list, r, c); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h new file mode 100644 index 0000000..37865c0 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h @@ -0,0 +1,149 @@ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * blkarray_list.h -- array-based list structure, for memory and access + * efficiency. + * + * HISTORY + * + * $Log: blkarray_list.h,v $ + * Revision 1.1.1.1 2006/05/23 18:45:02 dhuggins + * re-importation + * + * Revision 1.2 2004/12/10 16:48:58 rkm + * Added continuous density acoustic model handling + * + * Revision 1.1 2004/07/16 00:57:12 egouvea + * Added Ravi's implementation of FSG support. + * + * Revision 1.2 2004/05/27 14:22:57 rkm + * FSG cross-word triphones completed (but for single-phone words) + * + * Revision 1.1.1.1 2004/03/01 14:30:31 rkm + * + * + * Revision 1.1 2004/02/26 01:14:48 rkm + * *** empty log message *** + * + * + * 18-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Started. + */ + + +#ifndef __S2_BLKARRAY_LIST_H__ +#define __S2_BLKARRAY_LIST_H__ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/* + * For maintaining a (conceptual) "list" of pointers to arbitrary data. + * The application is responsible for knowing the true data type. + * Use an array instead of a true list for efficiency (both memory and + * speed). But use a blocked (2-D) array to allow dynamic resizing at a + * coarse grain. An entire block is allocated or freed, as appropriate. + */ +typedef struct blkarray_list_s { + void ***ptr; /* ptr[][] is the user-supplied ptr */ + int32 maxblks; /* size of ptr (#rows) */ + int32 blksize; /* size of ptr[] (#cols, ie, size of each row) */ + int32 n_valid; /* # entries actually stored in the list */ + int32 cur_row; /* The current row being that has empty entry */ + int32 cur_row_free; /* First entry valid within the current row */ +} blkarray_list_t; + +/* Access macros */ +#define blkarray_list_ptr(l,r,c) ((l)->ptr[r][c]) +#define blkarray_list_maxblks(l) ((l)->maxblks) +#define blkarray_list_blksize(l) ((l)->blksize) +#define blkarray_list_n_valid(l) ((l)->n_valid) +#define blkarray_list_cur_row(l) ((l)->cur_row) +#define blkarray_list_cur_row_free(l) ((l)->cur_row_free) + + +/* + * Initialize and return a new blkarray_list containing an empty list + * (i.e., 0 length). Sized for the given values of maxblks and blksize. + * NOTE: (maxblks * blksize) should not overflow int32, but this is not + * checked. + * Return the allocated entry if successful, NULL if any error. + */ +blkarray_list_t *_blkarray_list_init (int32 maxblks, int32 blksize); + + +/* + * Like _blkarray_list_init() above, but for some default values of + * maxblks and blksize. + */ +blkarray_list_t *blkarray_list_init ( void ); + +/** + * Completely finalize a blkarray_list. + */ +void blkarray_list_free(blkarray_list_t *bl); + + +/* + * Append the given new entry (data) to the end of the list. + * Return the index of the entry if successful, -1 if any error. + * The returned indices are guaranteed to be successive integers (i.e., + * 0, 1, 2...) for successive append operations, until the list is reset, + * when they resume from 0. + */ +int32 blkarray_list_append (blkarray_list_t *, void *data); + + +/* + * Free all the entries in the list (using ckd_free) and reset the + * list length to 0. + */ +void blkarray_list_reset (blkarray_list_t *); + + +/* Gets n-th element of the array list */ +void * blkarray_list_get(blkarray_list_t *, int32 n); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c new file mode 100644 index 0000000..d57aebd --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c @@ -0,0 +1,506 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include "dict.h" + + +#define DELIM " \t\n" /* Set of field separator characters */ +#define DEFAULT_NUM_PHONE (MAX_S3CIPID+1) + +#if WIN32 +#define snprintf sprintf_s +#endif + +extern const char *const cmu6_lts_phone_table[]; + +static s3cipid_t +dict_ciphone_id(dict_t * d, const char *str) +{ + if (d->nocase) + return bin_mdef_ciphone_id_nocase(d->mdef, str); + else + return bin_mdef_ciphone_id(d->mdef, str); +} + + +const char * +dict_ciphone_str(dict_t * d, s3wid_t wid, int32 pos) +{ + assert(d != NULL); + assert((wid >= 0) && (wid < d->n_word)); + assert((pos >= 0) && (pos < d->word[wid].pronlen)); + + return bin_mdef_ciphone_str(d->mdef, d->word[wid].ciphone[pos]); +} + + +s3wid_t +dict_add_word(dict_t * d, char const *word, s3cipid_t const * p, int32 np) +{ + int32 len; + dictword_t *wordp; + s3wid_t newwid; + char *wword; + + if (d->n_word >= d->max_words) { + E_INFO("Reallocating to %d KiB for word entries\n", + (d->max_words + S3DICT_INC_SZ) * sizeof(dictword_t) / 1024); + d->word = + (dictword_t *) ckd_realloc(d->word, + (d->max_words + + S3DICT_INC_SZ) * sizeof(dictword_t)); + d->max_words = d->max_words + S3DICT_INC_SZ; + } + + wordp = d->word + d->n_word; + wordp->word = (char *) ckd_salloc(word); /* Freed in dict_free */ + + /* Determine base/alt wids */ + wword = ckd_salloc(word); + if ((len = dict_word2basestr(wword)) > 0) { + int32 w; + + /* Truncated to a baseword string; find its ID */ + if (hash_table_lookup_int32(d->ht, wword, &w) < 0) { + E_ERROR("Missing base word for: %s\n", word); + ckd_free(wword); + ckd_free(wordp->word); + wordp->word = NULL; + return BAD_S3WID; + } + + /* Link into alt list */ + wordp->basewid = w; + wordp->alt = d->word[w].alt; + d->word[w].alt = d->n_word; + } else { + wordp->alt = BAD_S3WID; + wordp->basewid = d->n_word; + } + ckd_free(wword); + + /* Associate word string with d->n_word in hash table */ + if (hash_table_enter_int32(d->ht, wordp->word, d->n_word) != d->n_word) { + ckd_free(wordp->word); + wordp->word = NULL; + return BAD_S3WID; + } + + /* Fill in word entry, and set defaults */ + if (p && (np > 0)) { + wordp->ciphone = (s3cipid_t *) ckd_malloc(np * sizeof(s3cipid_t)); /* Freed in dict_free */ + memcpy(wordp->ciphone, p, np * sizeof(s3cipid_t)); + wordp->pronlen = np; + } + else { + wordp->ciphone = NULL; + wordp->pronlen = 0; + } + + newwid = d->n_word++; + + return newwid; +} + + +static int32 +dict_read(FILE * fp, dict_t * d) +{ + lineiter_t *li; + char **wptr; + s3cipid_t *p; + int32 lineno, nwd; + s3wid_t w; + int32 i, maxwd; + size_t stralloc, phnalloc; + + maxwd = 512; + p = (s3cipid_t *) ckd_calloc(maxwd + 4, sizeof(*p)); + wptr = (char **) ckd_calloc(maxwd, sizeof(char *)); /* Freed below */ + + lineno = 0; + stralloc = phnalloc = 0; + for (li = lineiter_start(fp); li; li = lineiter_next(li)) { + lineno++; + if (0 == strncmp(li->buf, "##", 2) + || 0 == strncmp(li->buf, ";;", 2)) + continue; + + if ((nwd = str2words(li->buf, wptr, maxwd)) < 0) { + /* Increase size of p, wptr. */ + nwd = str2words(li->buf, NULL, 0); + assert(nwd > maxwd); /* why else would it fail? */ + maxwd = nwd; + p = (s3cipid_t *) ckd_realloc(p, (maxwd + 4) * sizeof(*p)); + wptr = (char **) ckd_realloc(wptr, maxwd * sizeof(*wptr)); + } + + if (nwd == 0) /* Empty line */ + continue; + /* wptr[0] is the word-string and wptr[1..nwd-1] the pronunciation sequence */ + if (nwd == 1) { + E_ERROR("Line %d: No pronunciation for word '%s'; ignored\n", + lineno, wptr[0]); + continue; + } + + + /* Convert pronunciation string to CI-phone-ids */ + for (i = 1; i < nwd; i++) { + p[i - 1] = dict_ciphone_id(d, wptr[i]); + if (NOT_S3CIPID(p[i - 1])) { + E_ERROR("Line %d: Phone '%s' is missing in the acoustic model; word '%s' ignored\n", + lineno, wptr[i], wptr[0]); + break; + } + } + + if (i == nwd) { /* All CI-phones successfully converted to IDs */ + w = dict_add_word(d, wptr[0], p, nwd - 1); + if (NOT_S3WID(w)) + E_ERROR + ("Line %d: Failed to add the word '%s' (duplicate?); ignored\n", + lineno, wptr[0]); + else { + stralloc += strlen(d->word[w].word); + phnalloc += d->word[w].pronlen * sizeof(s3cipid_t); + } + } + } + E_INFO("Dictionary size %d, allocated %d KiB for strings, %d KiB for phones\n", + dict_size(d), (int)stralloc / 1024, (int)phnalloc / 1024); + ckd_free(p); + ckd_free(wptr); + + return 0; +} + +int +dict_write(dict_t *dict, char const *filename, char const *format) +{ + FILE *fh; + int i; + + (void)format; /* FIXME */ + if ((fh = fopen(filename, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open '%s'", filename); + return -1; + } + for (i = 0; i < dict->n_word; ++i) { + char *phones; + int j, phlen; + if (!dict_real_word(dict, i)) + continue; + for (phlen = j = 0; j < dict_pronlen(dict, i); ++j) + phlen += strlen(dict_ciphone_str(dict, i, j)) + 1; + phones = ckd_calloc(1, phlen); + for (j = 0; j < dict_pronlen(dict, i); ++j) { + strcat(phones, dict_ciphone_str(dict, i, j)); + if (j != dict_pronlen(dict, i) - 1) + strcat(phones, " "); + } + fprintf(fh, "%-30s %s\n", dict_wordstr(dict, i), phones); + ckd_free(phones); + } + fclose(fh); + return 0; +} + + +dict_t * +dict_init(cmd_ln_t *config, bin_mdef_t * mdef) +{ + FILE *fp, *fp2; + int32 n; + lineiter_t *li; + dict_t *d; + s3cipid_t sil; + char const *dictfile = NULL, *fillerfile = NULL; + + if (config) { + dictfile = cmd_ln_str_r(config, "-dict"); + fillerfile = cmd_ln_str_r(config, "_fdict"); + } + + /* + * First obtain #words in dictionary (for hash table allocation). + * Reason: The PC NT system doesn't like to grow memory gradually. Better to allocate + * all the required memory in one go. + */ + fp = NULL; + n = 0; + if (dictfile) { + if ((fp = fopen(dictfile, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open dictionary file '%s' for reading", dictfile); + return NULL; + } + for (li = lineiter_start(fp); li; li = lineiter_next(li)) { + if (0 != strncmp(li->buf, "##", 2) + && 0 != strncmp(li->buf, ";;", 2)) + n++; + } + fseek(fp, 0L, SEEK_SET); + } + + fp2 = NULL; + if (fillerfile) { + if ((fp2 = fopen(fillerfile, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open filler dictionary file '%s' for reading", fillerfile); + fclose(fp); + return NULL; + } + for (li = lineiter_start(fp2); li; li = lineiter_next(li)) { + if (0 != strncmp(li->buf, "##", 2) + && 0 != strncmp(li->buf, ";;", 2)) + n++; + } + fseek(fp2, 0L, SEEK_SET); + } + + /* + * Allocate dict entries. HACK!! Allow some extra entries for words not in file. + * Also check for type size restrictions. + */ + d = (dict_t *) ckd_calloc(1, sizeof(dict_t)); /* freed in dict_free() */ + d->refcnt = 1; + d->max_words = + (n + S3DICT_INC_SZ < MAX_S3WID) ? n + S3DICT_INC_SZ : MAX_S3WID; + if (n >= MAX_S3WID) { + E_ERROR("Number of words in dictionaries (%d) exceeds limit (%d)\n", n, + MAX_S3WID); + if (fp) fclose(fp); + if (fp2) fclose(fp2); + ckd_free(d); + return NULL; + } + + E_INFO("Allocating %d * %d bytes (%d KiB) for word entries\n", + d->max_words, sizeof(dictword_t), + d->max_words * sizeof(dictword_t) / 1024); + d->word = (dictword_t *) ckd_calloc(d->max_words, sizeof(dictword_t)); /* freed in dict_free() */ + d->n_word = 0; + if (mdef) + d->mdef = bin_mdef_retain(mdef); + + /* Create new hash table for word strings; case-insensitive word strings */ + if (config && cmd_ln_exists_r(config, "-dictcase")) + d->nocase = cmd_ln_boolean_r(config, "-dictcase"); + d->ht = hash_table_new(d->max_words, d->nocase); + + /* Digest main dictionary file */ + if (fp) { + E_INFO("Reading main dictionary: %s\n", dictfile); + dict_read(fp, d); + fclose(fp); + E_INFO("%d words read\n", d->n_word); + } + + if (dict_wordid(d, S3_START_WORD) != BAD_S3WID) { + E_ERROR("Remove sentence start word '' from the dictionary\n"); + dict_free(d); + return NULL; + } + if (dict_wordid(d, S3_FINISH_WORD) != BAD_S3WID) { + E_ERROR("Remove sentence start word '' from the dictionary\n"); + dict_free(d); + return NULL; + } + if (dict_wordid(d, S3_SILENCE_WORD) != BAD_S3WID) { + E_ERROR("Remove silence word '' from the dictionary\n"); + dict_free(d); + return NULL; + } + + /* Now the filler dictionary file, if it exists */ + d->filler_start = d->n_word; + if (fp2) { + E_INFO("Reading filler dictionary: %s\n", fillerfile); + dict_read(fp2, d); + fclose(fp2); + E_INFO("%d words read\n", d->n_word - d->filler_start); + } + if (mdef) + sil = bin_mdef_silphone(mdef); + else + sil = 0; + if (dict_wordid(d, S3_START_WORD) == BAD_S3WID) { + dict_add_word(d, S3_START_WORD, &sil, 1); + } + if (dict_wordid(d, S3_FINISH_WORD) == BAD_S3WID) { + dict_add_word(d, S3_FINISH_WORD, &sil, 1); + } + if (dict_wordid(d, S3_SILENCE_WORD) == BAD_S3WID) { + dict_add_word(d, S3_SILENCE_WORD, &sil, 1); + } + + d->filler_end = d->n_word - 1; + + /* Initialize distinguished word-ids */ + d->startwid = dict_wordid(d, S3_START_WORD); + d->finishwid = dict_wordid(d, S3_FINISH_WORD); + d->silwid = dict_wordid(d, S3_SILENCE_WORD); + + if ((d->filler_start > d->filler_end) + || (!dict_filler_word(d, d->silwid))) { + E_ERROR("Word '%s' must occur (only) in filler dictionary\n", + S3_SILENCE_WORD); + dict_free(d); + return NULL; + } + + /* No check that alternative pronunciations for filler words are in filler range!! */ + + return d; +} + + +s3wid_t +dict_wordid(dict_t *d, const char *word) +{ + int32 w; + + assert(d); + assert(word); + + if (hash_table_lookup_int32(d->ht, word, &w) < 0) + return (BAD_S3WID); + return w; +} + + +int +dict_filler_word(dict_t *d, s3wid_t w) +{ + assert(d); + assert((w >= 0) && (w < d->n_word)); + + w = dict_basewid(d, w); + if ((w == d->startwid) || (w == d->finishwid)) + return 0; + if ((w >= d->filler_start) && (w <= d->filler_end)) + return 1; + return 0; +} + +int +dict_real_word(dict_t *d, s3wid_t w) +{ + assert(d); + assert((w >= 0) && (w < d->n_word)); + + w = dict_basewid(d, w); + if ((w == d->startwid) || (w == d->finishwid)) + return 0; + if ((w >= d->filler_start) && (w <= d->filler_end)) + return 0; + return 1; +} + + +int32 +dict_word2basestr(char *word) +{ + int32 i, len; + + len = strlen(word); + if (word[len - 1] == ')') { + for (i = len - 2; (i > 0) && (word[i] != '('); --i); + + if (i > 0) { + /* The word is of the form (...); strip from left-paren */ + word[i] = '\0'; + return i; + } + } + + return -1; +} + +dict_t * +dict_retain(dict_t *d) +{ + ++d->refcnt; + return d; +} + +int +dict_free(dict_t * d) +{ + int i; + dictword_t *word; + + if (d == NULL) + return 0; + if (--d->refcnt > 0) + return d->refcnt; + + /* First Step, free all memory allocated for each word */ + for (i = 0; i < d->n_word; i++) { + word = (dictword_t *) & (d->word[i]); + if (word->word) + ckd_free((void *) word->word); + if (word->ciphone) + ckd_free((void *) word->ciphone); + } + + if (d->word) + ckd_free((void *) d->word); + if (d->ht) + hash_table_free(d->ht); + if (d->mdef) + bin_mdef_free(d->mdef); + ckd_free((void *) d); + + return 0; +} + +void +dict_report(dict_t * d) +{ + E_INFO_NOFN("Initialization of dict_t, report:\n"); + E_INFO_NOFN("Max word: %d\n", d->max_words); + E_INFO_NOFN("No of word: %d\n", d->n_word); + E_INFO_NOFN("\n"); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h new file mode 100644 index 0000000..804d465 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h @@ -0,0 +1,222 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _S3_DICT_H_ +#define _S3_DICT_H_ + +/** \file dict.h + * \brief Operations on dictionary. + */ + +/* SphinxBase headers. */ +#include + +/* Local headers. */ +#include "s3types.h" +#include "bin_mdef.h" +#include "pocketsphinx/export.h" + +#define S3DICT_INC_SZ 4096 + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + \struct dictword_t + \brief a structure for one dictionary word. +*/ +typedef struct dictword_s { + char *word; /**< Ascii word string */ + s3cipid_t *ciphone; /**< Pronunciation */ + int32 pronlen; /**< Pronunciation length */ + s3wid_t alt; /**< Next alternative pronunciation id, NOT_S3WID if none */ + s3wid_t basewid; /**< Base pronunciation id */ +} dictword_t; + +/** + \struct dict_t + \brief a structure for a dictionary. +*/ + +typedef struct dict_s { + int refcnt; + bin_mdef_t *mdef; /**< Model definition used for phone IDs; NULL if none used */ + dictword_t *word; /**< Array of entries in dictionary */ + hash_table_t *ht; /**< Hash table for mapping word strings to word ids */ + int32 max_words; /**< #Entries allocated in dict, including empty slots */ + int32 n_word; /**< #Occupied entries in dict; ie, excluding empty slots */ + int32 filler_start; /**< First filler word id (read from filler dict) */ + int32 filler_end; /**< Last filler word id (read from filler dict) */ + s3wid_t startwid; /**< FOR INTERNAL-USE ONLY */ + s3wid_t finishwid; /**< FOR INTERNAL-USE ONLY */ + s3wid_t silwid; /**< FOR INTERNAL-USE ONLY */ + int nocase; +} dict_t; + + +/** + * Initialize a new dictionary. + * + * If config and mdef are supplied, then the dictionary will be read + * from the files specified by the -dict and -fdict options in config, + * with case sensitivity determined by the -dictcase option. + * + * Otherwise an empty case-sensitive dictionary will be created. + * + * Return ptr to dict_t if successful, NULL otherwise. + */ +POCKETSPHINX_EXPORT +dict_t *dict_init(cmd_ln_t *config, /**< Configuration (-dict, -fdict, -dictcase) or NULL */ + bin_mdef_t *mdef /**< For looking up CI phone IDs (or NULL) */ + ); + +/** + * Write dictionary to a file. + */ +POCKETSPHINX_EXPORT +int dict_write(dict_t *dict, char const *filename, char const *format); + +/** Return word id for given word string if present. Otherwise return BAD_S3WID */ +POCKETSPHINX_EXPORT +s3wid_t dict_wordid(dict_t *d, const char *word); + +/** + * Return 1 if w is a filler word, 0 if not. A filler word is one that was read in from the + * filler dictionary; however, sentence START and FINISH words are not filler words. + */ +POCKETSPHINX_EXPORT +int dict_filler_word(dict_t *d, /**< The dictionary structure */ + s3wid_t w /**< The word ID */ + ); + +/** + * Test if w is a "real" word, i.e. neither a filler word nor START/FINISH. + */ +POCKETSPHINX_EXPORT +int dict_real_word(dict_t *d, /**< The dictionary structure */ + s3wid_t w /**< The word ID */ + ); + +/** + * Add a word with the given ciphone pronunciation list to the dictionary. + * Return value: Result word id if successful, BAD_S3WID otherwise + */ +POCKETSPHINX_EXPORT +s3wid_t dict_add_word(dict_t *d, /**< The dictionary structure. */ + char const *word, /**< The word. */ + s3cipid_t const *p, /**< The pronunciation. */ + int32 np /**< Number of phones. */ + ); + +/** + * Return value: CI phone string for the given word, phone position. + */ +POCKETSPHINX_EXPORT +const char *dict_ciphone_str(dict_t *d, /**< In: Dictionary to look up */ + s3wid_t wid, /**< In: Component word being looked up */ + int32 pos /**< In: Pronunciation phone position */ + ); + +/** Packaged macro access to dictionary members */ +#define dict_size(d) ((d)->n_word) +#define dict_num_fillers(d) (dict_filler_end(d) - dict_filler_start(d)) +/** + * Number of "real words" in the dictionary. + * + * This is the number of words that are not fillers, , or . + */ +#define dict_num_real_words(d) \ + (dict_size(d) - (dict_filler_end(d) - dict_filler_start(d)) - 2) +#define dict_basewid(d,w) ((d)->word[w].basewid) +#define dict_wordstr(d,w) ((w) < 0 ? NULL : (d)->word[w].word) +#define dict_basestr(d,w) ((d)->word[dict_basewid(d,w)].word) +#define dict_nextalt(d,w) ((d)->word[w].alt) +#define dict_pronlen(d,w) ((d)->word[w].pronlen) +#define dict_pron(d,w,p) ((d)->word[w].ciphone[p]) /**< The CI phones of the word w at position p */ +#define dict_filler_start(d) ((d)->filler_start) +#define dict_filler_end(d) ((d)->filler_end) +#define dict_startwid(d) ((d)->startwid) +#define dict_finishwid(d) ((d)->finishwid) +#define dict_silwid(d) ((d)->silwid) +#define dict_is_single_phone(d,w) ((d)->word[w].pronlen == 1) +#define dict_first_phone(d,w) ((d)->word[w].ciphone[0]) +#define dict_second_phone(d,w) ((d)->word[w].ciphone[1]) +#define dict_second_last_phone(d,w) ((d)->word[w].ciphone[(d)->word[w].pronlen - 2]) +#define dict_last_phone(d,w) ((d)->word[w].ciphone[(d)->word[w].pronlen - 1]) + +/* Hard-coded special words */ +#define S3_START_WORD "" +#define S3_FINISH_WORD "" +#define S3_SILENCE_WORD "" +#define S3_UNKNOWN_WORD "" + +/** + * If the given word contains a trailing "(....)" (i.e., a Sphinx-II style alternative + * pronunciation specification), strip that trailing portion from it. Note that the given + * string is modified. + * Return value: If string was modified, the character position at which the original string + * was truncated; otherwise -1. + */ +POCKETSPHINX_EXPORT +int32 dict_word2basestr(char *word); + +/** + * Retain a pointer to an dict_t. + */ +POCKETSPHINX_EXPORT +dict_t *dict_retain(dict_t *d); + +/** + * Release a pointer to a dictionary. + */ +POCKETSPHINX_EXPORT +int dict_free(dict_t *d); + +/** Report a dictionary structure */ +POCKETSPHINX_EXPORT +void dict_report(dict_t *d /**< A dictionary structure */ + ); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c new file mode 100644 index 0000000..126898f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c @@ -0,0 +1,572 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include "dict2pid.h" +#include "hmm.h" + + +/** + * @file dict2pid.c - dictionary word to senone sequence mappings + */ + +void +compress_table(s3ssid_t * uncomp_tab, s3ssid_t * com_tab, + s3cipid_t * ci_map, int32 n_ci) +{ + int32 found; + int32 r; + int32 tmp_r; + + for (r = 0; r < n_ci; r++) { + com_tab[r] = BAD_S3SSID; + ci_map[r] = BAD_S3CIPID; + } + /** Compress this map */ + for (r = 0; r < n_ci; r++) { + + found = 0; + for (tmp_r = 0; tmp_r < r && com_tab[tmp_r] != BAD_S3SSID; tmp_r++) { /* If it appears before, just filled in cimap; */ + if (uncomp_tab[r] == com_tab[tmp_r]) { + found = 1; + ci_map[r] = tmp_r; + break; + } + } + + if (found == 0) { + com_tab[tmp_r] = uncomp_tab[r]; + ci_map[r] = tmp_r; + } + } +} + + +static void +compress_right_context_tree(dict2pid_t * d2p, + s3ssid_t ***rdiph_rc) +{ + int32 n_ci; + int32 b, l, r; + s3ssid_t *rmap; + s3ssid_t *tmpssid; + s3cipid_t *tmpcimap; + bin_mdef_t *mdef = d2p->mdef; + size_t alloc; + + n_ci = mdef->n_ciphone; + + tmpssid = ckd_calloc(n_ci, sizeof(s3ssid_t)); + tmpcimap = ckd_calloc(n_ci, sizeof(s3cipid_t)); + + d2p->rssid = + (xwdssid_t **) ckd_calloc(mdef->n_ciphone, sizeof(xwdssid_t *)); + alloc = mdef->n_ciphone * sizeof(xwdssid_t *); + + for (b = 0; b < n_ci; b++) { + d2p->rssid[b] = + (xwdssid_t *) ckd_calloc(mdef->n_ciphone, sizeof(xwdssid_t)); + alloc += mdef->n_ciphone * sizeof(xwdssid_t); + + for (l = 0; l < n_ci; l++) { + rmap = rdiph_rc[b][l]; + compress_table(rmap, tmpssid, tmpcimap, mdef->n_ciphone); + + for (r = 0; r < mdef->n_ciphone && tmpssid[r] != BAD_S3SSID; + r++); + + if (tmpssid[0] != BAD_S3SSID) { + d2p->rssid[b][l].ssid = ckd_calloc(r, sizeof(s3ssid_t)); + memcpy(d2p->rssid[b][l].ssid, tmpssid, + r * sizeof(s3ssid_t)); + d2p->rssid[b][l].cimap = + ckd_calloc(mdef->n_ciphone, sizeof(s3cipid_t)); + memcpy(d2p->rssid[b][l].cimap, tmpcimap, + (mdef->n_ciphone) * sizeof(s3cipid_t)); + d2p->rssid[b][l].n_ssid = r; + } + else { + d2p->rssid[b][l].ssid = NULL; + d2p->rssid[b][l].cimap = NULL; + d2p->rssid[b][l].n_ssid = 0; + } + } + } + + E_INFO("Allocated %d bytes (%d KiB) for word-final triphones\n", + (int)alloc, (int)alloc / 1024); + ckd_free(tmpssid); + ckd_free(tmpcimap); +} + +static void +compress_left_right_context_tree(dict2pid_t * d2p) +{ + int32 n_ci; + int32 b, l, r; + s3ssid_t *rmap; + s3ssid_t *tmpssid; + s3cipid_t *tmpcimap; + bin_mdef_t *mdef = d2p->mdef; + size_t alloc; + + n_ci = mdef->n_ciphone; + + tmpssid = ckd_calloc(n_ci, sizeof(s3ssid_t)); + tmpcimap = ckd_calloc(n_ci, sizeof(s3cipid_t)); + + assert(d2p->lrdiph_rc); + + d2p->lrssid = + (xwdssid_t **) ckd_calloc(mdef->n_ciphone, sizeof(xwdssid_t *)); + alloc = mdef->n_ciphone * sizeof(xwdssid_t *); + + for (b = 0; b < n_ci; b++) { + + d2p->lrssid[b] = + (xwdssid_t *) ckd_calloc(mdef->n_ciphone, sizeof(xwdssid_t)); + alloc += mdef->n_ciphone * sizeof(xwdssid_t); + + for (l = 0; l < n_ci; l++) { + rmap = d2p->lrdiph_rc[b][l]; + + compress_table(rmap, tmpssid, tmpcimap, mdef->n_ciphone); + + for (r = 0; r < mdef->n_ciphone && tmpssid[r] != BAD_S3SSID; + r++); + + if (tmpssid[0] != BAD_S3SSID) { + d2p->lrssid[b][l].ssid = ckd_calloc(r, sizeof(s3ssid_t)); + memcpy(d2p->lrssid[b][l].ssid, tmpssid, + r * sizeof(s3ssid_t)); + d2p->lrssid[b][l].cimap = + ckd_calloc(mdef->n_ciphone, sizeof(s3cipid_t)); + memcpy(d2p->lrssid[b][l].cimap, tmpcimap, + (mdef->n_ciphone) * sizeof(s3cipid_t)); + d2p->lrssid[b][l].n_ssid = r; + } + else { + d2p->lrssid[b][l].ssid = NULL; + d2p->lrssid[b][l].cimap = NULL; + d2p->lrssid[b][l].n_ssid = 0; + } + } + } + + /* Try to compress lrdiph_rc into lrdiph_rc_compressed */ + ckd_free(tmpssid); + ckd_free(tmpcimap); + + E_INFO("Allocated %d bytes (%d KiB) for single-phone word triphones\n", + (int)alloc, (int)alloc / 1024); +} + +/** + ARCHAN, A duplicate of get_rc_npid in ctxt_table.h. I doubt whether it is correct + because the compressed map has not been checked. +*/ +int32 +get_rc_nssid(dict2pid_t * d2p, s3wid_t w) +{ + int32 pronlen; + s3cipid_t b, lc; + dict_t *dict = d2p->dict; + + pronlen = dict->word[w].pronlen; + b = dict->word[w].ciphone[pronlen - 1]; + + if (pronlen == 1) { + /* Is this true ? + No known left context. But all cimaps (for any l) are identical; pick one + */ + /*E_INFO("Single phone word\n"); */ + return (d2p->lrssid[b][0].n_ssid); + } + else { + /* E_INFO("Multiple phone word\n"); */ + lc = dict->word[w].ciphone[pronlen - 2]; + return (d2p->rssid[b][lc].n_ssid); + } + +} + +s3cipid_t * +dict2pid_get_rcmap(dict2pid_t * d2p, s3wid_t w) +{ + int32 pronlen; + s3cipid_t b, lc; + dict_t *dict = d2p->dict; + + pronlen = dict->word[w].pronlen; + b = dict->word[w].ciphone[pronlen - 1]; + + if (pronlen == 1) { + /* Is this true ? + No known left context. But all cimaps (for any l) are identical; pick one + */ + /*E_INFO("Single phone word\n"); */ + return (d2p->lrssid[b][0].cimap); + } + else { + /* E_INFO("Multiple phone word\n"); */ + lc = dict->word[w].ciphone[pronlen - 2]; + return (d2p->rssid[b][lc].cimap); + } +} + +static void +free_compress_map(xwdssid_t ** tree, int32 n_ci) +{ + int32 b, l; + for (b = 0; b < n_ci; b++) { + for (l = 0; l < n_ci; l++) { + ckd_free(tree[b][l].ssid); + ckd_free(tree[b][l].cimap); + } + ckd_free(tree[b]); + } + ckd_free(tree); +} + +static void +populate_lrdiph(dict2pid_t *d2p, s3ssid_t ***rdiph_rc, s3cipid_t b) +{ + bin_mdef_t *mdef = d2p->mdef; + s3cipid_t l, r; + + for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { + for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { + s3pid_t p; + p = bin_mdef_phone_id_nearest(mdef, (s3cipid_t) b, + (s3cipid_t) l, + (s3cipid_t) r, + WORD_POSN_SINGLE); + d2p->lrdiph_rc[b][l][r] + = bin_mdef_pid2ssid(mdef, p); + if (r == bin_mdef_silphone(mdef)) + d2p->ldiph_lc[b][r][l] + = bin_mdef_pid2ssid(mdef, p); + if (rdiph_rc && l == bin_mdef_silphone(mdef)) + rdiph_rc[b][l][r] + = bin_mdef_pid2ssid(mdef, p); + assert(IS_S3SSID(bin_mdef_pid2ssid(mdef, p))); + E_DEBUG("%s(%s,%s) => %d / %d\n", + bin_mdef_ciphone_str(mdef, b), + bin_mdef_ciphone_str(mdef, l), + bin_mdef_ciphone_str(mdef, r), + p, bin_mdef_pid2ssid(mdef, p)); + } + } +} + +int +dict2pid_add_word(dict2pid_t *d2p, + int32 wid) +{ + bin_mdef_t *mdef = d2p->mdef; + dict_t *d = d2p->dict; + + if (dict_pronlen(d, wid) > 1) { + s3cipid_t l; + /* Make sure we have left and right context diphones for this + * word. */ + if (d2p->ldiph_lc[dict_first_phone(d, wid)][dict_second_phone(d, wid)][0] + == BAD_S3SSID) { + E_DEBUG("Filling in left-context diphones for %s(?,%s)\n", + bin_mdef_ciphone_str(mdef, dict_first_phone(d, wid)), + bin_mdef_ciphone_str(mdef, dict_second_phone(d, wid))); + for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { + int p + = bin_mdef_phone_id_nearest(mdef, + dict_first_phone(d, wid), l, + dict_second_phone(d, wid), + WORD_POSN_BEGIN); + d2p->ldiph_lc[dict_first_phone(d, wid)][dict_second_phone(d, wid)][l] + = bin_mdef_pid2ssid(mdef, p); + } + } + if (d2p->rssid[dict_last_phone(d, wid)][dict_second_last_phone(d, wid)].n_ssid + == 0) { + s3ssid_t *rmap; + s3ssid_t *tmpssid; + s3cipid_t *tmpcimap; + s3cipid_t r; + + E_DEBUG("Filling in right-context diphones for %s(%s,?)\n", + bin_mdef_ciphone_str(mdef, dict_last_phone(d, wid)), + bin_mdef_ciphone_str(mdef, dict_second_last_phone(d, wid))); + rmap = ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(*rmap)); + for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { + int p + = bin_mdef_phone_id_nearest(mdef, + dict_last_phone(d, wid), + dict_second_last_phone(d, wid), r, + WORD_POSN_END); + rmap[r] = bin_mdef_pid2ssid(mdef, p); + } + tmpssid = ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(*tmpssid)); + tmpcimap = ckd_calloc(bin_mdef_n_ciphone(mdef), sizeof(*tmpcimap)); + compress_table(rmap, tmpssid, tmpcimap, bin_mdef_n_ciphone(mdef)); + for (r = 0; r < mdef->n_ciphone && tmpssid[r] != BAD_S3SSID; r++) + ; + d2p->rssid[dict_last_phone(d, wid)][dict_second_last_phone(d, wid)].ssid = tmpssid; + d2p->rssid[dict_last_phone(d, wid)][dict_second_last_phone(d, wid)].cimap = tmpcimap; + d2p->rssid[dict_last_phone(d, wid)][dict_second_last_phone(d, wid)].n_ssid = r; + ckd_free(rmap); + } + } + else { + /* Make sure we have a left-right context triphone entry for + * this word. */ + E_INFO("Filling in context triphones for %s(?,?)\n", + bin_mdef_ciphone_str(mdef, dict_first_phone(d, wid))); + if (d2p->lrdiph_rc[dict_first_phone(d, wid)][0][0] == BAD_S3SSID) { + populate_lrdiph(d2p, NULL, dict_first_phone(d, wid)); + } + } + + return 0; +} + +s3ssid_t +dict2pid_internal(dict2pid_t *d2p, + int32 wid, + int pos) +{ + int b, l, r, p; + dict_t *dict = d2p->dict; + bin_mdef_t *mdef = d2p->mdef; + + if (pos == 0 || pos == dict_pronlen(dict, wid)) + return BAD_S3SSID; + + b = dict_pron(dict, wid, pos); + l = dict_pron(dict, wid, pos - 1); + r = dict_pron(dict, wid, pos + 1); + p = bin_mdef_phone_id_nearest(mdef, (s3cipid_t) b, + (s3cipid_t) l, (s3cipid_t) r, + WORD_POSN_INTERNAL); + return bin_mdef_pid2ssid(mdef, p); +} + +dict2pid_t * +dict2pid_build(bin_mdef_t * mdef, dict_t * dict) +{ + dict2pid_t *dict2pid; + s3ssid_t ***rdiph_rc; + bitvec_t *ldiph, *rdiph, *single; + int32 pronlen; + int32 b, l, r, w, p; + + E_INFO("Building PID tables for dictionary\n"); + assert(mdef); + assert(dict); + + dict2pid = (dict2pid_t *) ckd_calloc(1, sizeof(dict2pid_t)); + dict2pid->refcount = 1; + dict2pid->mdef = bin_mdef_retain(mdef); + dict2pid->dict = dict_retain(dict); + E_INFO("Allocating %d^3 * %d bytes (%d KiB) for word-initial triphones\n", + mdef->n_ciphone, sizeof(s3ssid_t), + mdef->n_ciphone * mdef->n_ciphone * mdef->n_ciphone * sizeof(s3ssid_t) / 1024); + dict2pid->ldiph_lc = + (s3ssid_t ***) ckd_calloc_3d(mdef->n_ciphone, mdef->n_ciphone, + mdef->n_ciphone, sizeof(s3ssid_t)); + /* Only used internally to generate rssid */ + rdiph_rc = + (s3ssid_t ***) ckd_calloc_3d(mdef->n_ciphone, mdef->n_ciphone, + mdef->n_ciphone, sizeof(s3ssid_t)); + + dict2pid->lrdiph_rc = (s3ssid_t ***) ckd_calloc_3d(mdef->n_ciphone, + mdef->n_ciphone, + mdef->n_ciphone, + sizeof + (s3ssid_t)); + /* Actually could use memset for this, if BAD_S3SSID is guaranteed + * to be 65535... */ + for (b = 0; b < mdef->n_ciphone; ++b) { + for (r = 0; r < mdef->n_ciphone; ++r) { + for (l = 0; l < mdef->n_ciphone; ++l) { + dict2pid->ldiph_lc[b][r][l] = BAD_S3SSID; + dict2pid->lrdiph_rc[b][l][r] = BAD_S3SSID; + rdiph_rc[b][l][r] = BAD_S3SSID; + } + } + } + + /* Track which diphones / ciphones have been seen. */ + ldiph = bitvec_alloc(mdef->n_ciphone * mdef->n_ciphone); + rdiph = bitvec_alloc(mdef->n_ciphone * mdef->n_ciphone); + single = bitvec_alloc(mdef->n_ciphone); + + for (w = 0; w < dict_size(dict2pid->dict); w++) { + pronlen = dict_pronlen(dict, w); + + if (pronlen >= 2) { + b = dict_first_phone(dict, w); + r = dict_second_phone(dict, w); + /* Populate ldiph_lc */ + if (bitvec_is_clear(ldiph, b * mdef->n_ciphone + r)) { + /* Mark this diphone as done */ + bitvec_set(ldiph, b * mdef->n_ciphone + r); + + /* Record all possible ssids for b(?,r) */ + for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { + p = bin_mdef_phone_id_nearest(mdef, (s3cipid_t) b, + (s3cipid_t) l, (s3cipid_t) r, + WORD_POSN_BEGIN); + dict2pid->ldiph_lc[b][r][l] = bin_mdef_pid2ssid(mdef, p); + } + } + + + /* Populate rdiph_rc */ + l = dict_second_last_phone(dict, w); + b = dict_last_phone(dict, w); + if (bitvec_is_clear(rdiph, b * mdef->n_ciphone + l)) { + /* Mark this diphone as done */ + bitvec_set(rdiph, b * mdef->n_ciphone + l); + + for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { + p = bin_mdef_phone_id_nearest(mdef, (s3cipid_t) b, + (s3cipid_t) l, (s3cipid_t) r, + WORD_POSN_END); + rdiph_rc[b][l][r] = bin_mdef_pid2ssid(mdef, p); + } + } + } + else if (pronlen == 1) { + b = dict_pron(dict, w, 0); + E_DEBUG("Building tables for single phone word %s phone %d = %s\n", + dict_wordstr(dict, w), b, bin_mdef_ciphone_str(mdef, b)); + /* Populate lrdiph_rc (and also ldiph_lc, rdiph_rc if needed) */ + if (bitvec_is_clear(single, b)) { + populate_lrdiph(dict2pid, rdiph_rc, b); + bitvec_set(single, b); + } + } + } + + bitvec_free(ldiph); + bitvec_free(rdiph); + bitvec_free(single); + + /* Try to compress rdiph_rc into rdiph_rc_compressed */ + compress_right_context_tree(dict2pid, rdiph_rc); + compress_left_right_context_tree(dict2pid); + + ckd_free_3d(rdiph_rc); + + return dict2pid; +} + +dict2pid_t * +dict2pid_retain(dict2pid_t *d2p) +{ + ++d2p->refcount; + return d2p; +} + +int +dict2pid_free(dict2pid_t * d2p) +{ + if (d2p == NULL) + return 0; + if (--d2p->refcount > 0) + return d2p->refcount; + + if (d2p->ldiph_lc) + ckd_free_3d((void ***) d2p->ldiph_lc); + + if (d2p->lrdiph_rc) + ckd_free_3d((void ***) d2p->lrdiph_rc); + + if (d2p->rssid) + free_compress_map(d2p->rssid, bin_mdef_n_ciphone(d2p->mdef)); + + if (d2p->lrssid) + free_compress_map(d2p->lrssid, bin_mdef_n_ciphone(d2p->mdef)); + + bin_mdef_free(d2p->mdef); + dict_free(d2p->dict); + ckd_free(d2p); + return 0; +} + +void +dict2pid_dump(FILE * fp, dict2pid_t * d2p) +{ + int32 w, p, pronlen; + int32 i, j, b, l, r; + bin_mdef_t *mdef = d2p->mdef; + dict_t *dict = d2p->dict; + + fprintf(fp, "# INTERNAL (wd comssid ssid ssid ... ssid comssid)\n"); + for (w = 0; w < dict_size(dict); w++) { + fprintf(fp, "%30s ", dict_wordstr(dict, w)); + + pronlen = dict_pronlen(dict, w); + for (p = 0; p < pronlen; p++) + fprintf(fp, " %5d", dict2pid_internal(d2p, w, p)); + fprintf(fp, "\n"); + } + fprintf(fp, "#\n"); + + fprintf(fp, "# LDIPH_LC (b r l ssid)\n"); + for (b = 0; b < bin_mdef_n_ciphone(mdef); b++) { + for (r = 0; r < bin_mdef_n_ciphone(mdef); r++) { + for (l = 0; l < bin_mdef_n_ciphone(mdef); l++) { + if (IS_S3SSID(d2p->ldiph_lc[b][r][l])) + fprintf(fp, "%6s %6s %6s %5d\n", bin_mdef_ciphone_str(mdef, (s3cipid_t) b), bin_mdef_ciphone_str(mdef, (s3cipid_t) r), bin_mdef_ciphone_str(mdef, (s3cipid_t) l), d2p->ldiph_lc[b][r][l]); /* RAH, ldiph_lc is returning an int32, %d expects an int16 */ + } + } + } + fprintf(fp, "#\n"); + + fprintf(fp, "# SSEQ %d (senid senid ...)\n", mdef->n_sseq); + for (i = 0; i < mdef->n_sseq; i++) { + fprintf(fp, "%5d ", i); + for (j = 0; j < bin_mdef_n_emit_state(mdef); j++) + fprintf(fp, " %5d", mdef->sseq[i][j]); + fprintf(fp, "\n"); + } + fprintf(fp, "#\n"); + fprintf(fp, "# END\n"); + + fflush(fp); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h new file mode 100644 index 0000000..c08d3e5 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h @@ -0,0 +1,187 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2014 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _S3_DICT2PID_H_ +#define _S3_DICT2PID_H_ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include +#include "s3types.h" +#include "bin_mdef.h" +#include "dict.h" + +/** \file dict2pid.h + * \brief Building triphones for a dictionary. + * + * This is one of the more complicated parts of a cross-word + * triphone model decoder. The first and last phones of each word + * get their left and right contexts, respectively, from other + * words. For single-phone words, both its contexts are from other + * words, simultaneously. As these words are not known beforehand, + * life gets complicated. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * \struct xwdssid_t + * \brief cross word triphone model structure + */ + +typedef struct xwdssid_s { + s3ssid_t *ssid; /**< Senone Sequence ID list for all context ciphones */ + s3cipid_t *cimap; /**< Index into ssid[] above for each ci phone */ + int32 n_ssid; /**< #Unique ssid in above, compressed ssid list */ +} xwdssid_t; + +/** + \struct dict2pid_t + \brief Building composite triphone (as well as word internal triphones) with the dictionary. +*/ + +typedef struct dict2pid_s { + int refcount; + + bin_mdef_t *mdef; /**< Model definition, used to generate + internal ssids on the fly. */ + dict_t *dict; /**< Dictionary this table refers to. */ + + /*Notice the order of the arguments */ + /* FIXME: This is crying out for compression - in Mandarin we have + * 180 context independent phones, which makes this an 11MB + * array. */ + s3ssid_t ***ldiph_lc; /**< For multi-phone words, [base][rc][lc] -> ssid; filled out for + word-initial base x rc combinations in current vocabulary */ + + + xwdssid_t **rssid; /**< Right context state sequence id table + First dimension: base phone, + Second dimension: left context. + */ + + + s3ssid_t ***lrdiph_rc; /**< For single-phone words, [base][lc][rc] -> ssid; filled out for + single-phone base x lc combinations in current vocabulary */ + + xwdssid_t **lrssid; /**< Left-Right context state sequence id table + First dimension: base phone, + Second dimension: left context. + */ +} dict2pid_t; + +/** Access macros; not designed for arbitrary use */ +#define dict2pid_rssid(d,ci,lc) (&(d)->rssid[ci][lc]) +#define dict2pid_ldiph_lc(d,b,r,l) ((d)->ldiph_lc[b][r][l]) +#define dict2pid_lrdiph_rc(d,b,l,r) ((d)->lrdiph_rc[b][l][r]) + +/** + * Build the dict2pid structure for the given model/dictionary + */ +POCKETSPHINX_EXPORT +dict2pid_t *dict2pid_build(bin_mdef_t *mdef, /**< A model definition*/ + dict_t *dict /**< An initialized dictionary */ + ); + +/** + * Retain a pointer to dict2pid + */ +POCKETSPHINX_EXPORT +dict2pid_t *dict2pid_retain(dict2pid_t *d2p); + +/** + * Free the memory dict2pid structure + */ +POCKETSPHINX_EXPORT +int dict2pid_free(dict2pid_t *d2p /**< In: the d2p */ + ); + +/** + * Return the senone sequence ID for the given word position. + */ +s3ssid_t dict2pid_internal(dict2pid_t *d2p, + int32 wid, + int pos); + +/** + * Add a word to the dict2pid structure (after adding it to dict). + */ +POCKETSPHINX_EXPORT +int dict2pid_add_word(dict2pid_t *d2p, + int32 wid); + +/** + * For debugging + */ +void dict2pid_dump(FILE *fp, /**< In: a file pointer */ + dict2pid_t *d2p /**< In: a dict2pid_t structure */ + ); + +/** Report a dict2pid data structure */ +void dict2pid_report(dict2pid_t *d2p /**< In: a dict2pid_t structure */ + ); + +/** + * Get number of rc + */ +int32 get_rc_nssid(dict2pid_t *d2p, /**< In: a dict2pid */ + s3wid_t w /**< In: a wid */ + ); + +/** + * Get RC map + */ +s3cipid_t* dict2pid_get_rcmap(dict2pid_t *d2p, /**< In: a dict2pid */ + s3wid_t w /**< In: a wid */ + ); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt new file mode 100644 index 0000000..e3297ea --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt @@ -0,0 +1,23 @@ +Ideas for accelerating PTM computation +-------------------------------------- + +First thing to note is that codebook computation now takes up the +majority of the time spent evaluating PTMs. So speeding up Gaussian +evaluation is suddenly important again. + +Using a tighter top-N beam will speed up Gaussian computation by +imposing a higher floor on densities, but this effect isn't worth a +whole lot, in contrast to SC models where mixture computation rather +than density computation is the most expensive part. + +This means that we should probably bring back kd-trees, although the +implementation should be tweaked to be faster loading. + +Also, maybe more importantly, we can do some form of CI-GMM selection +on the codebooks. This won't actually work with the way the models +are set up currently since the CI phones share the same codebook as +the CD ones, and the goal is to prune codebooks rather than phones. + +But wait! It's okay, because we still have the same top-N mechanism +as before. We can use those top-N scores to do early pruning of +entire codebooks. This ought to give us the most bang for the buck. diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c new file mode 100644 index 0000000..43d11eb --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c @@ -0,0 +1,692 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/byteorder.h" +#include "sphinxbase/fixpoint.h" +#include "sphinxbase/genrand.h" +#include "sphinxbase/err.h" +#include "sphinxbase/cmd_ln.h" +#include "sphinxbase/ckd_alloc.h" + +#include "fe_internal.h" +#include "fe_warp.h" + +static const arg_t fe_args[] = { + waveform_to_cepstral_command_line_macro(), + { NULL, 0, NULL, NULL } +}; + +int +fe_parse_general_params(cmd_ln_t *config, fe_t * fe) +{ + int j, frate, window_samples; + + fe->config = cmd_ln_retain(config); + fe->sampling_rate = cmd_ln_float32_r(config, "-samprate"); + frate = cmd_ln_int32_r(config, "-frate"); + if (frate > MAX_INT16 || frate > fe->sampling_rate || frate < 1) { + E_ERROR + ("Frame rate %d can not be bigger than sample rate %.02f\n", + frate, fe->sampling_rate); + return -1; + } + + fe->frame_rate = (int16)frate; + if (cmd_ln_boolean_r(config, "-dither")) { + fe->dither = 1; + fe->dither_seed = cmd_ln_int32_r(config, "-seed"); + } +#ifdef WORDS_BIGENDIAN + /* i.e. if input_endian is *not* "big", then fe->swap is true. */ + fe->swap = strcmp("big", cmd_ln_str_r(config, "-input_endian")); +#else + /* and vice versa */ + fe->swap = strcmp("little", cmd_ln_str_r(config, "-input_endian")); +#endif + fe->window_length = cmd_ln_float32_r(config, "-wlen"); + fe->pre_emphasis_alpha = cmd_ln_float32_r(config, "-alpha"); + + fe->num_cepstra = (uint8)cmd_ln_int32_r(config, "-ncep"); + fe->fft_size = (int16)cmd_ln_int32_r(config, "-nfft"); + + window_samples = (int)(fe->window_length * fe->sampling_rate); + E_INFO("Frames are %d samples at intervals of %d\n", + window_samples, (int)(fe->sampling_rate / frate)); + if (window_samples > MAX_INT16) { + /* This is extremely unlikely! */ + E_ERROR("Frame size exceeds maximum FFT size (%d > %d)\n", + window_samples, MAX_INT16); + return -1; + } + + /* Set FFT size automatically from window size. */ + if (fe->fft_size == 0) { + fe->fft_order = 0; + fe->fft_size = (1<fft_order); + while (fe->fft_size < window_samples) { + fe->fft_order++; + fe->fft_size <<= 1; + } + E_INFO("FFT size automatically set to %d\n", fe->fft_size); + } + else { + /* Check FFT size, compute FFT order (log_2(n)) */ + for (j = fe->fft_size, fe->fft_order = 0; j > 1; j >>= 1, fe->fft_order++) { + if (((j % 2) != 0) || (fe->fft_size <= 0)) { + E_ERROR("fft: number of points must be a power of 2 (is %d)\n", + fe->fft_size); + return -1; + } + } + /* Verify that FFT size is greater or equal to window length. */ + if (fe->fft_size < window_samples) { + E_ERROR("FFT: Number of points must be greater or " + "equal to frame size\n"); + return -1; + } + } + + fe->remove_dc = cmd_ln_boolean_r(config, "-remove_dc"); + + if (0 == strcmp(cmd_ln_str_r(config, "-transform"), "dct")) + fe->transform = DCT_II; + else if (0 == strcmp(cmd_ln_str_r(config, "-transform"), "legacy")) + fe->transform = LEGACY_DCT; + else if (0 == strcmp(cmd_ln_str_r(config, "-transform"), "htk")) + fe->transform = DCT_HTK; + else { + E_ERROR("Invalid transform type (values are 'dct', 'legacy', 'htk')\n"); + return -1; + } + + if (cmd_ln_boolean_r(config, "-logspec")) + fe->log_spec = RAW_LOG_SPEC; + if (cmd_ln_boolean_r(config, "-smoothspec")) + fe->log_spec = SMOOTH_LOG_SPEC; + + return 0; +} + +static int +fe_parse_melfb_params(cmd_ln_t *config, fe_t *fe, melfb_t * mel) +{ + mel->sampling_rate = fe->sampling_rate; + mel->fft_size = fe->fft_size; + mel->num_cepstra = fe->num_cepstra; + mel->num_filters = cmd_ln_int32_r(config, "-nfilt"); + + if (fe->log_spec) + fe->feature_dimension = mel->num_filters; + else + fe->feature_dimension = fe->num_cepstra; + + mel->upper_filt_freq = cmd_ln_float32_r(config, "-upperf"); + mel->lower_filt_freq = cmd_ln_float32_r(config, "-lowerf"); + + mel->doublewide = cmd_ln_boolean_r(config, "-doublebw"); + + mel->warp_type = cmd_ln_str_r(config, "-warp_type"); + mel->warp_params = cmd_ln_str_r(config, "-warp_params"); + mel->lifter_val = cmd_ln_int32_r(config, "-lifter"); + + mel->unit_area = cmd_ln_boolean_r(config, "-unit_area"); + mel->round_filters = cmd_ln_boolean_r(config, "-round_filters"); + + if (fe_warp_set(mel, mel->warp_type) != FE_SUCCESS) { + E_ERROR("Failed to initialize the warping function.\n"); + return -1; + } + fe_warp_set_parameters(mel, mel->warp_params, mel->sampling_rate); + return 0; +} + +void +fe_print_current(fe_t const *fe) +{ + E_INFO("Current FE Parameters:\n"); + E_INFO("\tSampling Rate: %f\n", fe->sampling_rate); + E_INFO("\tFrame Size: %d\n", fe->frame_size); + E_INFO("\tFrame Shift: %d\n", fe->frame_shift); + E_INFO("\tFFT Size: %d\n", fe->fft_size); + E_INFO("\tLower Frequency: %g\n", + fe->mel_fb->lower_filt_freq); + E_INFO("\tUpper Frequency: %g\n", + fe->mel_fb->upper_filt_freq); + E_INFO("\tNumber of filters: %d\n", fe->mel_fb->num_filters); + E_INFO("\tNumber of Overflow Samps: %d\n", fe->num_overflow_samps); + E_INFO("Will %sremove DC offset at frame level\n", + fe->remove_dc ? "" : "not "); + if (fe->dither) { + E_INFO("Will add dither to audio\n"); + E_INFO("Dither seeded with %d\n", fe->dither_seed); + } + else { + E_INFO("Will not add dither to audio\n"); + } + if (fe->mel_fb->lifter_val) { + E_INFO("Will apply sine-curve liftering, period %d\n", + fe->mel_fb->lifter_val); + } + E_INFO("Will %snormalize filters to unit area\n", + fe->mel_fb->unit_area ? "" : "not "); + E_INFO("Will %sround filter frequencies to DFT points\n", + fe->mel_fb->round_filters ? "" : "not "); + E_INFO("Will %suse double bandwidth in mel filter\n", + fe->mel_fb->doublewide ? "" : "not "); +} + +fe_t * +fe_init_auto_r(cmd_ln_t *config) +{ + fe_t *fe; + + fe = (fe_t*)ckd_calloc(1, sizeof(*fe)); + fe->refcount = 1; + + /* transfer params to front end */ + if (fe_parse_general_params(config, fe) < 0) { + fe_free(fe); + return NULL; + } + + /* compute remaining fe parameters */ + /* We add 0.5 so approximate the float with the closest + * integer. E.g., 2.3 is truncate to 2, whereas 3.7 becomes 4 + */ + fe->frame_shift = (int32) (fe->sampling_rate / fe->frame_rate + 0.5); + fe->frame_size = (int32) (fe->window_length * fe->sampling_rate + 0.5); + fe->pre_emphasis_prior = 0; + + assert (fe->frame_shift > 1); + if (fe->frame_size < fe->frame_shift) { + E_ERROR + ("Frame size %d (-wlen) must be greater than frame shift %d (-frate)\n", + fe->frame_size, fe->frame_shift); + fe_free(fe); + return NULL; + } + + if (fe->frame_size > (fe->fft_size)) { + E_ERROR + ("Number of FFT points has to be a power of 2 higher than %d, it is %d\n", + fe->frame_size, fe->fft_size); + fe_free(fe); + return NULL; + } + + if (fe->dither) + fe_init_dither(fe->dither_seed); + + /* establish buffers for overflow samps and hamming window */ + fe->overflow_samps = ckd_calloc(fe->frame_size, sizeof(float32)); + fe->hamming_window = ckd_calloc(fe->frame_size/2, sizeof(window_t)); + + /* create hamming window */ + fe_create_hamming(fe->hamming_window, fe->frame_size); + + /* init and fill appropriate filter structure */ + fe->mel_fb = ckd_calloc(1, sizeof(*fe->mel_fb)); + + /* transfer params to mel fb */ + fe_parse_melfb_params(config, fe, fe->mel_fb); + + if (fe->mel_fb->upper_filt_freq > fe->sampling_rate / 2 + 1.0) { + E_ERROR("Upper frequency %.1f is higher than samprate/2 (%.1f)\n", + fe->mel_fb->upper_filt_freq, fe->sampling_rate / 2); + fe_free(fe); + return NULL; + } + + fe_build_melfilters(fe->mel_fb); + fe_compute_melcosine(fe->mel_fb); + if (cmd_ln_boolean_r(config, "-remove_noise")) + fe->noise_stats = fe_init_noisestats(fe->mel_fb->num_filters); + + /* Create temporary FFT, spectrum and mel-spectrum buffers. */ + /* FIXME: Gosh there are a lot of these. */ + fe->spch = ckd_calloc(fe->frame_size, sizeof(*fe->spch)); + fe->frame = ckd_calloc(fe->fft_size, sizeof(*fe->frame)); + fe->spec = ckd_calloc(fe->fft_size, sizeof(*fe->spec)); + fe->mfspec = ckd_calloc(fe->mel_fb->num_filters, sizeof(*fe->mfspec)); + + /* create twiddle factors */ + fe->ccc = ckd_calloc(fe->fft_size / 4, sizeof(*fe->ccc)); + fe->sss = ckd_calloc(fe->fft_size / 4, sizeof(*fe->sss)); + fe_create_twiddle(fe); + + if (cmd_ln_boolean_r(config, "-verbose")) { + fe_print_current(fe); + } + + /*** Initialize the overflow buffers ***/ + fe_start_utt(fe); + return fe; +} + +arg_t const * +fe_get_args(void) +{ + return fe_args; +} + +cmd_ln_t * +fe_get_config(fe_t *fe) +{ + return fe->config; +} + +void +fe_init_dither(int32 seed) +{ + E_INFO("You are using %d as the seed.\n", seed); + s3_rand_seed(seed); +} + +int32 +fe_start_utt(fe_t * fe) +{ + fe->num_overflow_samps = 0; + // Does the same thing as above, but whatever... + memset(fe->overflow_samps, 0, + fe->frame_size * sizeof(*fe->overflow_samps)); + fe->pre_emphasis_prior = 0; + return 0; +} + +int +fe_get_output_size(fe_t *fe) +{ + return (int)fe->feature_dimension; +} + +void +fe_get_input_size(fe_t *fe, int *out_frame_shift, + int *out_frame_size) +{ + if (out_frame_shift) + *out_frame_shift = fe->frame_shift; + if (out_frame_size) + *out_frame_size = fe->frame_size; +} + +int32 +fe_process_frame(fe_t * fe, int16 const *spch, int32 nsamps, mfcc_t * fr_cep) +{ + fe_read_frame_int16(fe, spch, nsamps); + return fe_write_frame(fe, fr_cep); +} + +int +fe_process_frames_int16(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes) +{ + int32 frame_count; + int outidx, i, n_overflow, orig_n_overflow; + int16 const *orig_spch; + + /* In the special case where there is no output buffer, return the + * maximum number of frames which would be generated. */ + if (buf_cep == NULL) { + if (*inout_nsamps + fe->num_overflow_samps < (size_t)fe->frame_size) + *inout_nframes = 0; + else + *inout_nframes = 1 + + ((*inout_nsamps + fe->num_overflow_samps - fe->frame_size) + / fe->frame_shift); + return *inout_nframes; + } + + /* Are there not enough samples to make at least 1 frame? */ + if (*inout_nsamps + fe->num_overflow_samps < (size_t)fe->frame_size) { + if (*inout_nsamps > 0) { + /* Append them to the overflow buffer. */ + memcpy(fe->overflow_samps + fe->num_overflow_samps, + *inout_spch, *inout_nsamps * (sizeof(**inout_spch))); + fe->num_overflow_samps += *inout_nsamps; + /* Update input-output pointers and counters. */ + *inout_spch += *inout_nsamps; + *inout_nsamps = 0; + } + /* We produced no frames of output, sorry! */ + *inout_nframes = 0; + return 0; + } + + /* Can't write a frame? Then do nothing! */ + if (*inout_nframes < 1) { + *inout_nframes = 0; + return 0; + } + + /* Keep track of the original start of the buffer. */ + orig_spch = *inout_spch; + orig_n_overflow = fe->num_overflow_samps; + /* How many frames will we be able to get? */ + frame_count = 1 + + ((*inout_nsamps + fe->num_overflow_samps - fe->frame_size) + / fe->frame_shift); + /* Limit it to the number of output frames available. */ + if (frame_count > *inout_nframes) + frame_count = *inout_nframes; + /* Index of output frame. */ + outidx = 0; + + /* Start processing, taking care of any incoming overflow. */ + if (fe->num_overflow_samps) { + int offset = fe->frame_size - fe->num_overflow_samps; + + /* Append start of spch to overflow samples to make a full frame. */ + memcpy(fe->overflow_samps + fe->num_overflow_samps, + *inout_spch, offset * sizeof(**inout_spch)); + fe_read_frame_int16(fe, fe->overflow_samps, fe->frame_size); + assert(outidx < frame_count); + fe_write_frame(fe, buf_cep[outidx]); + outidx++; + /* Update input-output pointers and counters. */ + *inout_spch += offset; + *inout_nsamps -= offset; + fe->num_overflow_samps -= fe->frame_shift; + } + else { + fe_read_frame_int16(fe, *inout_spch, fe->frame_size); + assert(outidx < frame_count); + fe_write_frame(fe, buf_cep[outidx]); + outidx++; + /* Update input-output pointers and counters. */ + *inout_spch += fe->frame_size; + *inout_nsamps -= fe->frame_size; + } + + /* Process all remaining frames. */ + for (i = 1; i < frame_count; ++i) { + assert(*inout_nsamps >= (size_t)fe->frame_shift); + + fe_shift_frame_int16(fe, *inout_spch, fe->frame_shift); + assert(outidx < frame_count); + fe_write_frame(fe, buf_cep[outidx]); + outidx++; + /* Update input-output pointers and counters. */ + *inout_spch += fe->frame_shift; + *inout_nsamps -= fe->frame_shift; + /* Amount of data behind the original input which is still needed. */ + if (fe->num_overflow_samps > 0) + fe->num_overflow_samps -= fe->frame_shift; + } + + /* How many relevant overflow samples are there left? */ + if (fe->num_overflow_samps <= 0) { + /* Maximum number of overflow samples past *inout_spch to save. */ + n_overflow = *inout_nsamps; + if (n_overflow > fe->frame_shift) + n_overflow = fe->frame_shift; + fe->num_overflow_samps = fe->frame_size - fe->frame_shift; + /* Make sure this isn't an illegal read! */ + if (fe->num_overflow_samps > *inout_spch - orig_spch) + fe->num_overflow_samps = *inout_spch - orig_spch; + fe->num_overflow_samps += n_overflow; + if (fe->num_overflow_samps > 0) { + memcpy(fe->overflow_samps, + *inout_spch - (fe->frame_size - fe->frame_shift), + fe->num_overflow_samps * sizeof(**inout_spch)); + /* Update the input pointer to cover this stuff. */ + *inout_spch += n_overflow; + *inout_nsamps -= n_overflow; + } + } + else { + /* There is still some relevant data left in the overflow buffer. */ + /* Shift existing data to the beginning. */ + memmove(fe->overflow_samps, + fe->overflow_samps + orig_n_overflow - fe->num_overflow_samps, + fe->num_overflow_samps * sizeof(*fe->overflow_samps)); + /* Copy in whatever we had in the original speech buffer. */ + n_overflow = *inout_spch - orig_spch + *inout_nsamps; + if (n_overflow > fe->frame_size - fe->num_overflow_samps) + n_overflow = fe->frame_size - fe->num_overflow_samps; + memcpy(fe->overflow_samps + fe->num_overflow_samps, + orig_spch, n_overflow * sizeof(*orig_spch)); + fe->num_overflow_samps += n_overflow; + /* Advance the input pointers. */ + if (n_overflow > *inout_spch - orig_spch) { + n_overflow -= (*inout_spch - orig_spch); + *inout_spch += n_overflow; + *inout_nsamps -= n_overflow; + } + } + + /* Finally update the frame counter with the number of frames we procesed. */ + *inout_nframes = outidx; /* FIXME: Not sure why I wrote it this way... */ + return 0; +} + +int +fe_process_frames(fe_t *fe, + int16 const **inout_spch, + size_t *inout_nsamps, + mfcc_t **buf_cep, + int32 *inout_nframes) +{ + return fe_process_frames_int16(fe, inout_spch, inout_nsamps, buf_cep, inout_nframes); +} + +int +fe_process_utt(fe_t * fe, int16 const * spch, size_t nsamps, + mfcc_t *** cep_block, int32 * nframes) +{ + mfcc_t **cep; + int rv; + + /* Figure out how many frames we will need. */ + fe_process_frames_int16(fe, NULL, &nsamps, NULL, nframes); + /* Create the output buffer (it has to exist, even if there are no output frames). */ + if (*nframes) + cep = (mfcc_t **)ckd_calloc_2d(*nframes, fe->feature_dimension, sizeof(**cep)); + else + cep = (mfcc_t **)ckd_calloc_2d(1, fe->feature_dimension, sizeof(**cep)); + /* Now just call fe_process_frames() with the allocated buffer. */ + rv = fe_process_frames_int16(fe, &spch, &nsamps, cep, nframes); + *cep_block = cep; + + return rv; +} + +int32 +fe_end_utt(fe_t * fe, mfcc_t * cepvector, int32 * nframes) +{ + /* Process any remaining data. */ + if (fe->num_overflow_samps > 0) { + fe_read_frame_int16(fe, fe->overflow_samps, + fe->num_overflow_samps); + fe_write_frame(fe, cepvector); + *nframes = 1; + } + else { + *nframes = 0; + } + + /* reset overflow buffers... */ + fe->num_overflow_samps = 0; + + return 0; +} + +fe_t * +fe_retain(fe_t *fe) +{ + ++fe->refcount; + return fe; +} + +int +fe_free(fe_t * fe) +{ + if (fe == NULL) + return 0; + if (--fe->refcount > 0) + return fe->refcount; + + /* kill FE instance - free everything... */ + if (fe->mel_fb) { + if (fe->mel_fb->mel_cosine) + fe_free_2d((void *) fe->mel_fb->mel_cosine); + ckd_free(fe->mel_fb->lifter); + ckd_free(fe->mel_fb->spec_start); + ckd_free(fe->mel_fb->filt_start); + ckd_free(fe->mel_fb->filt_width); + ckd_free(fe->mel_fb->filt_coeffs); + ckd_free(fe->mel_fb); + } + ckd_free(fe->spch); + ckd_free(fe->frame); + ckd_free(fe->ccc); + ckd_free(fe->sss); + ckd_free(fe->spec); + ckd_free(fe->mfspec); + ckd_free(fe->overflow_samps); + ckd_free(fe->hamming_window); + if (fe->noise_stats) + fe_free_noisestats(fe->noise_stats); + cmd_ln_free_r(fe->config); + ckd_free(fe); + + return 0; +} + +/** + * Convert a block of mfcc_t to float32 (can be done in-place) + **/ +int32 +fe_mfcc_to_float(fe_t * fe, + mfcc_t ** input, float32 ** output, int32 nframes) +{ + int32 i; + +#ifndef FIXED_POINT + if ((void *) input == (void *) output) + return nframes * fe->feature_dimension; +#endif + for (i = 0; i < nframes * fe->feature_dimension; ++i) + output[0][i] = MFCC2FLOAT(input[0][i]); + + return i; +} + +/** + * Convert a block of float32 to mfcc_t (can be done in-place) + **/ +int32 +fe_float_to_mfcc(fe_t * fe, + float32 ** input, mfcc_t ** output, int32 nframes) +{ + int32 i; + +#ifndef FIXED_POINT + if ((void *) input == (void *) output) + return nframes * fe->feature_dimension; +#endif + for (i = 0; i < nframes * fe->feature_dimension; ++i) + output[0][i] = FLOAT2MFCC(input[0][i]); + + return i; +} + +int32 +fe_logspec_to_mfcc(fe_t * fe, const mfcc_t * fr_spec, mfcc_t * fr_cep) +{ +#ifdef FIXED_POINT + fe_spec2cep(fe, fr_spec, fr_cep); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + powspec[i] = (powspec_t) fr_spec[i]; + fe_spec2cep(fe, powspec, fr_cep); + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} + +int32 +fe_logspec_dct2(fe_t * fe, const mfcc_t * fr_spec, mfcc_t * fr_cep) +{ +#ifdef FIXED_POINT + fe_dct2(fe, fr_spec, fr_cep, 0); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + powspec[i] = (powspec_t) fr_spec[i]; + fe_dct2(fe, powspec, fr_cep, 0); + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} + +int32 +fe_mfcc_dct3(fe_t * fe, const mfcc_t * fr_cep, mfcc_t * fr_spec) +{ +#ifdef FIXED_POINT + fe_dct3(fe, fr_cep, fr_spec); +#else /* ! FIXED_POINT */ + powspec_t *powspec; + int32 i; + + powspec = ckd_malloc(fe->mel_fb->num_filters * sizeof(powspec_t)); + fe_dct3(fe, fr_cep, powspec); + for (i = 0; i < fe->mel_fb->num_filters; ++i) + fr_spec[i] = (mfcc_t) powspec[i]; + ckd_free(powspec); +#endif /* ! FIXED_POINT */ + return 0; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h new file mode 100644 index 0000000..cd2a9d3 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h @@ -0,0 +1,181 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __FE_INTERNAL_H__ +#define __FE_INTERNAL_H__ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/fe.h" +#include "sphinxbase/fixpoint.h" + +#include "fe_noise.h" +#include "fe_type.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +/* Values for the 'logspec' field. */ +enum { + RAW_LOG_SPEC = 1, + SMOOTH_LOG_SPEC = 2 +}; + +/* Values for the 'transform' field. */ +enum { + LEGACY_DCT = 0, + DCT_II = 1, + DCT_HTK = 2 +}; + +typedef struct melfb_s melfb_t; +/** Base Struct to hold all structure for MFCC computation. */ +struct melfb_s { + float32 sampling_rate; + int32 num_cepstra; + int32 num_filters; + int32 fft_size; + float32 lower_filt_freq; + float32 upper_filt_freq; + /* DCT coefficients. */ + mfcc_t **mel_cosine; + /* Filter coefficients. */ + mfcc_t *filt_coeffs; + int16 *spec_start; + int16 *filt_start; + int16 *filt_width; + /* Luxury mobile home. */ + int32 doublewide; + char const *warp_type; + char const *warp_params; + uint32 warp_id; + /* Precomputed normalization constants for unitary DCT-II/DCT-III */ + mfcc_t sqrt_inv_n, sqrt_inv_2n; + /* Value and coefficients for HTK-style liftering */ + int32 lifter_val; + mfcc_t *lifter; + /* Normalize filters to unit area */ + int32 unit_area; + /* Round filter frequencies to DFT points (hurts accuracy, but is + useful for legacy purposes) */ + int32 round_filters; +}; + +/* sqrt(1/2), also used for unitary DCT-II/DCT-III */ +#define SQRT_HALF FLOAT2MFCC(0.707106781186548) + +/** Structure for the front-end computation. */ +struct fe_s { + cmd_ln_t *config; + int refcount; + + float32 sampling_rate; + int16 frame_rate; + int16 frame_shift; + + float32 window_length; + int16 frame_size; + int16 fft_size; + + uint8 fft_order; + uint8 feature_dimension; + uint8 num_cepstra; + uint8 remove_dc; + + uint8 log_spec; + uint8 swap; + uint8 dither; + uint8 transform; + + float32 pre_emphasis_alpha; + int32 dither_seed; + + /* Twiddle factors for FFT. */ + frame_t *ccc, *sss; + /* Mel filter parameters. */ + melfb_t *mel_fb; + /* Half of a Hamming Window. */ + window_t *hamming_window; + + /* Temporary buffers for processing. */ + int16 *spch; + frame_t *frame; + powspec_t *spec, *mfspec; + int16 *overflow_samps; + int num_overflow_samps; + int16 pre_emphasis_prior; + /* Noise removal */ + noise_stats_t *noise_stats; +}; + +void fe_init_dither(int32 seed); + +/* Load a frame of data into the fe. */ +int fe_read_frame_int16(fe_t *fe, int16 const *in, int32 len); + +/* Shift the input buffer back and read more data. */ +int fe_shift_frame_int16(fe_t *fe, int16 const *in, int32 len); + +/* Process a frame of data into features. */ +int fe_write_frame(fe_t *fe, mfcc_t *fea); + +/* Initialization functions. */ +int32 fe_build_melfilters(melfb_t *MEL_FB); +int32 fe_compute_melcosine(melfb_t *MEL_FB); +void fe_create_hamming(window_t *in, int32 in_len); +void fe_create_twiddle(fe_t *fe); + +fixed32 fe_log_add(fixed32 x, fixed32 y); +fixed32 fe_log_sub(fixed32 x, fixed32 y); + +/* Miscellaneous processing functions. */ +void fe_spec2cep(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep); +void fe_dct2(fe_t *fe, const powspec_t *mflogspec, mfcc_t *mfcep, int htk); +void fe_dct3(fe_t *fe, const mfcc_t *mfcep, powspec_t *mflogspec); + +#ifdef __cplusplus +} +#endif + +#endif /* __FE_INTERNAL_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c new file mode 100644 index 0000000..b8de909 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c @@ -0,0 +1,364 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* This noise removal algorithm is inspired by the following papers + * Computationally Efficient Speech Enchancement by Spectral Minina Tracking + * by G. Doblinger + * + * Power-Normalized Cepstral Coefficients (PNCC) for Robust Speech Recognition + * by C. Kim. + * + * For the recent research and state of art see papers about IMRCA and + * A Minimum-Mean-Square-Error Noise Reduction Algorithm On Mel-Frequency + * Cepstra For Robust Speech Recognition by Dong Yu and others + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/err.h" + +#include "fe_noise.h" +#include "fe_internal.h" + +/* Noise supression constants */ +#define SMOOTH_WINDOW 4 +#define LAMBDA_POWER 0.7 +#define LAMBDA_A 0.995 +#define LAMBDA_B 0.5 +#define LAMBDA_T 0.85 +#define MU_T 0.2 +#define MAX_GAIN 20 +#define SLOW_PEAK_FORGET_FACTOR 0.9995 +#define SLOW_PEAK_LEARN_FACTOR 0.9 +#define SPEECH_VOLUME_RANGE 8.0 + +struct noise_stats_s { + /* Smoothed power */ + powspec_t *power; + /* Noise estimate */ + powspec_t *noise; + /* Signal floor estimate */ + powspec_t *floor; + /* Peak for temporal masking */ + powspec_t *peak; + /* Buffers used in update_noisestats */ + powspec_t *signal, *gain; + + /* Initialize it next time */ + int undefined; + /* Number of items to process */ + int num_filters; + + /* Sum of slow peaks for VAD */ + powspec_t slow_peak_sum; + + /* Precomputed constants */ + powspec_t lambda_power; + powspec_t comp_lambda_power; + powspec_t lambda_a; + powspec_t comp_lambda_a; + powspec_t lambda_b; + powspec_t comp_lambda_b; + powspec_t lambda_t; + powspec_t mu_t; + powspec_t max_gain; + powspec_t inv_max_gain; + + powspec_t smooth_scaling[2 * SMOOTH_WINDOW + 3]; +}; + +static void +fe_lower_envelope(noise_stats_t *noise_stats, const powspec_t *buf, powspec_t *floor_buf, int32 num_filt) +{ + int i; + + for (i = 0; i < num_filt; i++) { +#ifndef FIXED_POINT + if (buf[i] >= floor_buf[i]) { + floor_buf[i] = + noise_stats->lambda_a * floor_buf[i] + noise_stats->comp_lambda_a * buf[i]; + } + else { + floor_buf[i] = + noise_stats->lambda_b * floor_buf[i] + noise_stats->comp_lambda_b * buf[i]; + } +#else + if (buf[i] >= floor_buf[i]) { + floor_buf[i] = fe_log_add(noise_stats->lambda_a + floor_buf[i], + noise_stats->comp_lambda_a + buf[i]); + } + else { + floor_buf[i] = fe_log_add(noise_stats->lambda_b + floor_buf[i], + noise_stats->comp_lambda_b + buf[i]); + } +#endif + } +} + +/* temporal masking */ +static void +fe_temp_masking(noise_stats_t *noise_stats, powspec_t * buf, powspec_t * peak, int32 num_filt) +{ + powspec_t cur_in; + int i; + + for (i = 0; i < num_filt; i++) { + cur_in = buf[i]; + +#ifndef FIXED_POINT + peak[i] *= noise_stats->lambda_t; + if (buf[i] < noise_stats->lambda_t * peak[i]) + buf[i] = peak[i] * noise_stats->mu_t; +#else + peak[i] += noise_stats->lambda_t; + if (buf[i] < noise_stats->lambda_t + peak[i]) + buf[i] = peak[i] + noise_stats->mu_t; +#endif + + if (cur_in > peak[i]) + peak[i] = cur_in; + } +} + +/* spectral weight smoothing */ +static void +fe_weight_smooth(noise_stats_t *noise_stats, powspec_t * buf, powspec_t * coefs, int32 num_filt) +{ + int i, j; + int l1, l2; + powspec_t coef; + + for (i = 0; i < num_filt; i++) { + l1 = ((i - SMOOTH_WINDOW) > 0) ? (i - SMOOTH_WINDOW) : 0; + l2 = ((i + SMOOTH_WINDOW) < + (num_filt - 1)) ? (i + SMOOTH_WINDOW) : (num_filt - 1); + +#ifndef FIXED_POINT + (void)noise_stats; + coef = 0; + for (j = l1; j <= l2; j++) { + coef += coefs[j]; + } + buf[i] = buf[i] * (coef / (l2 - l1 + 1)); +#else + coef = MIN_FIXLOG; + for (j = l1; j <= l2; j++) { + coef = fe_log_add(coef, coefs[j]); + } + buf[i] = buf[i] + coef - noise_stats->smooth_scaling[l2 - l1 + 1]; +#endif + + } +} + +noise_stats_t * +fe_init_noisestats(int num_filters) +{ + int i; + noise_stats_t *noise_stats; + + noise_stats = (noise_stats_t *) ckd_calloc(1, sizeof(noise_stats_t)); + + noise_stats->power = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->noise = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->floor = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->peak = + (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + + noise_stats->undefined = TRUE; + noise_stats->num_filters = num_filters; + +#ifndef FIXED_POINT + noise_stats->lambda_power = LAMBDA_POWER; + noise_stats->comp_lambda_power = 1 - LAMBDA_POWER; + noise_stats->lambda_a = LAMBDA_A; + noise_stats->comp_lambda_a = 1 - LAMBDA_A; + noise_stats->lambda_b = LAMBDA_B; + noise_stats->comp_lambda_b = 1 - LAMBDA_B; + noise_stats->lambda_t = LAMBDA_T; + noise_stats->mu_t = MU_T; + noise_stats->max_gain = MAX_GAIN; + noise_stats->inv_max_gain = 1.0 / MAX_GAIN; + + for (i = 1; i < 2 * SMOOTH_WINDOW + 1; i++) { + noise_stats->smooth_scaling[i] = 1.0 / i; + } +#else + noise_stats->lambda_power = FLOAT2FIX(log(LAMBDA_POWER)); + noise_stats->comp_lambda_power = FLOAT2FIX(log(1 - LAMBDA_POWER)); + noise_stats->lambda_a = FLOAT2FIX(log(LAMBDA_A)); + noise_stats->comp_lambda_a = FLOAT2FIX(log(1 - LAMBDA_A)); + noise_stats->lambda_b = FLOAT2FIX(log(LAMBDA_B)); + noise_stats->comp_lambda_b = FLOAT2FIX(log(1 - LAMBDA_B)); + noise_stats->lambda_t = FLOAT2FIX(log(LAMBDA_T)); + noise_stats->mu_t = FLOAT2FIX(log(MU_T)); + noise_stats->max_gain = FLOAT2FIX(log(MAX_GAIN)); + noise_stats->inv_max_gain = FLOAT2FIX(log(1.0 / MAX_GAIN)); + + for (i = 1; i < 2 * SMOOTH_WINDOW + 3; i++) { + noise_stats->smooth_scaling[i] = FLOAT2FIX(log(i)); + } +#endif + + noise_stats->signal = (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + noise_stats->gain = (powspec_t *) ckd_calloc(num_filters, sizeof(powspec_t)); + + return noise_stats; +} + +void +fe_reset_noisestats(noise_stats_t * noise_stats) +{ + if (noise_stats) + noise_stats->undefined = TRUE; +} + +void +fe_free_noisestats(noise_stats_t * noise_stats) +{ + ckd_free(noise_stats->signal); + ckd_free(noise_stats->gain); + ckd_free(noise_stats->power); + ckd_free(noise_stats->noise); + ckd_free(noise_stats->floor); + ckd_free(noise_stats->peak); + ckd_free(noise_stats); +} + +/** + * For fixed point we are doing the computation in a fixlog domain, + * so we have to add many processing cases. + */ +void +fe_remove_noise(fe_t * fe) +{ + noise_stats_t *noise_stats; + powspec_t *mfspec; + int32 i, num_filts; + + if (fe->noise_stats == NULL) + return; + + noise_stats = fe->noise_stats; + mfspec = fe->mfspec; + num_filts = noise_stats->num_filters; + + if (noise_stats->undefined) { + noise_stats->slow_peak_sum = FIX2FLOAT(0.0); + for (i = 0; i < num_filts; i++) { + noise_stats->power[i] = mfspec[i]; +#ifndef FIXED_POINT + noise_stats->noise[i] = mfspec[i] / noise_stats->max_gain; + noise_stats->floor[i] = mfspec[i] / noise_stats->max_gain; + noise_stats->peak[i] = 0.0; +#else + noise_stats->noise[i] = mfspec[i] - noise_stats->max_gain;; + noise_stats->floor[i] = mfspec[i] - noise_stats->max_gain; + noise_stats->peak[i] = MIN_FIXLOG; +#endif + } + noise_stats->undefined = FALSE; + } + + /* Calculate smoothed power */ + for (i = 0; i < num_filts; i++) { +#ifndef FIXED_POINT + noise_stats->power[i] = + noise_stats->lambda_power * noise_stats->power[i] + noise_stats->comp_lambda_power * mfspec[i]; +#else + noise_stats->power[i] = fe_log_add(noise_stats->lambda_power + noise_stats->power[i], + noise_stats->comp_lambda_power + mfspec[i]); +#endif + } + + /* Update noise spectrum estimate */ + fe_lower_envelope(noise_stats, noise_stats->power, noise_stats->noise, num_filts); + + /* Drop out noise from signal */ + for (i = 0; i < num_filts; i++) { +#ifndef FIXED_POINT + noise_stats->signal[i] = noise_stats->power[i] - noise_stats->noise[i]; + if (noise_stats->signal[i] < 1.0) + noise_stats->signal[i] = 1.0; +#else + noise_stats->signal[i] = fe_log_sub(noise_stats->power[i], noise_stats->noise[i]); +#endif + } + + /* FIXME: Somewhat unclear why we have to do this twice, but this + * seeems to estimate some kind of signal floor. */ + fe_lower_envelope(noise_stats, noise_stats->signal, noise_stats->floor, num_filts); + + fe_temp_masking(noise_stats, noise_stats->signal, noise_stats->peak, num_filts); + + for (i = 0; i < num_filts; i++) { + if (noise_stats->signal[i] < noise_stats->floor[i]) + noise_stats->signal[i] = noise_stats->floor[i]; + } + +#ifndef FIXED_POINT + for (i = 0; i < num_filts; i++) { + if (noise_stats->signal[i] < noise_stats->max_gain * noise_stats->power[i]) + noise_stats->gain[i] = noise_stats->signal[i] / noise_stats->power[i]; + else + noise_stats->gain[i] = noise_stats->max_gain; + if (noise_stats->gain[i] < noise_stats->inv_max_gain) + noise_stats->gain[i] = noise_stats->inv_max_gain; + } +#else + for (i = 0; i < num_filts; i++) { + noise_stats->gain[i] = noise_stats->signal[i] - noise_stats->power[i]; + if (noise_stats->gain[i] > noise_stats->max_gain) + noise_stats->gain[i] = noise_stats->max_gain; + if (noise_stats->gain[i] < noise_stats->inv_max_gain) + noise_stats->gain[i] = noise_stats->inv_max_gain; + } +#endif + + /* Weight smoothing and time frequency normalization */ + fe_weight_smooth(noise_stats, mfspec, noise_stats->gain, num_filts); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h new file mode 100644 index 0000000..257b503 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h @@ -0,0 +1,60 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef FE_NOISE_H +#define FE_NOISE_H + +#include "sphinxbase/fe.h" +#include "sphinxbase/fixpoint.h" +#include "fe_type.h" + +typedef struct noise_stats_s noise_stats_t; + +/* Creates noisestats object */ +noise_stats_t *fe_init_noisestats(int num_filters); + +/* Resets collected noise statistics */ +void fe_reset_noisestats(noise_stats_t * noise_stats); + +/* Frees allocated data */ +void fe_free_noisestats(noise_stats_t * noise_stats); + +/** + * Process frame, update noise statistics, remove noise components if needed. + */ +void fe_remove_noise(fe_t *fe); + +#endif /* FE_NOISE_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c new file mode 100644 index 0000000..4e47de9 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c @@ -0,0 +1,1388 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1996-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +/** + * Windows math.h does not contain M_PI + */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/byteorder.h" +#include "sphinxbase/fixpoint.h" +#include "sphinxbase/fe.h" +#include "sphinxbase/genrand.h" +#include "sphinxbase/err.h" + +#include "fe_internal.h" +#include "fe_warp.h" + +/* Use extra precision for cosines, Hamming window, pre-emphasis + * coefficient, twiddle factors. */ +#ifdef FIXED_POINT +#define FLOAT2COS(x) FLOAT2FIX_ANY(x,30) +#define COSMUL(x,y) FIXMUL_ANY(x,y,30) +#else +#define FLOAT2COS(x) (x) +#define COSMUL(x,y) ((x)*(y)) +#endif + +#ifdef FIXED_POINT + +/* Internal log-addition table for natural log with radix point at 8 + * bits. Each entry is 256 * log(1 + e^{-n/256}). This is used in the + * log-add computation: + * + * e^z = e^x + e^y + * e^z = e^x(1 + e^{y-x}) = e^y(1 + e^{x-y}) + * z = x + log(1 + e^{y-x}) = y + log(1 + e^{x-y}) + * + * So when y > x, z = y + logadd_table[-(x-y)] + * when x > y, z = x + logadd_table[-(y-x)] + */ +static const unsigned char fe_logadd_table[] = { + 177, 177, 176, 176, 175, 175, 174, 174, 173, 173, + 172, 172, 172, 171, 171, 170, 170, 169, 169, 168, + 168, 167, 167, 166, 166, 165, 165, 164, 164, 163, + 163, 162, 162, 161, 161, 161, 160, 160, 159, 159, + 158, 158, 157, 157, 156, 156, 155, 155, 155, 154, + 154, 153, 153, 152, 152, 151, 151, 151, 150, 150, + 149, 149, 148, 148, 147, 147, 147, 146, 146, 145, + 145, 144, 144, 144, 143, 143, 142, 142, 141, 141, + 141, 140, 140, 139, 139, 138, 138, 138, 137, 137, + 136, 136, 136, 135, 135, 134, 134, 134, 133, 133, + 132, 132, 131, 131, 131, 130, 130, 129, 129, 129, + 128, 128, 128, 127, 127, 126, 126, 126, 125, 125, + 124, 124, 124, 123, 123, 123, 122, 122, 121, 121, + 121, 120, 120, 119, 119, 119, 118, 118, 118, 117, + 117, 117, 116, 116, 115, 115, 115, 114, 114, 114, + 113, 113, 113, 112, 112, 112, 111, 111, 110, 110, + 110, 109, 109, 109, 108, 108, 108, 107, 107, 107, + 106, 106, 106, 105, 105, 105, 104, 104, 104, 103, + 103, 103, 102, 102, 102, 101, 101, 101, 100, 100, + 100, 99, 99, 99, 98, 98, 98, 97, 97, 97, + 96, 96, 96, 96, 95, 95, 95, 94, 94, 94, + 93, 93, 93, 92, 92, 92, 92, 91, 91, 91, + 90, 90, 90, 89, 89, 89, 89, 88, 88, 88, + 87, 87, 87, 87, 86, 86, 86, 85, 85, 85, + 85, 84, 84, 84, 83, 83, 83, 83, 82, 82, + 82, 82, 81, 81, 81, 80, 80, 80, 80, 79, + 79, 79, 79, 78, 78, 78, 78, 77, 77, 77, + 77, 76, 76, 76, 75, 75, 75, 75, 74, 74, + 74, 74, 73, 73, 73, 73, 72, 72, 72, 72, + 71, 71, 71, 71, 71, 70, 70, 70, 70, 69, + 69, 69, 69, 68, 68, 68, 68, 67, 67, 67, + 67, 67, 66, 66, 66, 66, 65, 65, 65, 65, + 64, 64, 64, 64, 64, 63, 63, 63, 63, 63, + 62, 62, 62, 62, 61, 61, 61, 61, 61, 60, + 60, 60, 60, 60, 59, 59, 59, 59, 59, 58, + 58, 58, 58, 58, 57, 57, 57, 57, 57, 56, + 56, 56, 56, 56, 55, 55, 55, 55, 55, 54, + 54, 54, 54, 54, 53, 53, 53, 53, 53, 52, + 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, + 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, + 49, 49, 48, 48, 48, 48, 48, 48, 47, 47, + 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, + 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, + 44, 44, 43, 43, 43, 43, 43, 43, 43, 42, + 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, + 41, 41, 40, 40, 40, 40, 40, 40, 40, 39, + 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, + 37, 36, 36, 36, 36, 36, 36, 36, 35, 35, + 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, + 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, + 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0 +}; + +static const int fe_logadd_table_size = + sizeof(fe_logadd_table) / sizeof(fe_logadd_table[0]); + +fixed32 +fe_log_add(fixed32 x, fixed32 y) +{ + fixed32 d, r; + + if (x > y) { + d = (x - y) >> (DEFAULT_RADIX - 8); + r = x; + } + else { + d = (y - x) >> (DEFAULT_RADIX - 8); + r = y; + } + + if (r <= MIN_FIXLOG) + return MIN_FIXLOG; + else if (d > fe_logadd_table_size - 1) + return r; + else { + r += ((fixed32) fe_logadd_table[d] << (DEFAULT_RADIX - 8)); +/* printf("%d - %d = %d | %f - %f = %f | %f - %f = %f\n", + x, y, r, FIX2FLOAT(x), FIX2FLOAT(y), FIX2FLOAT(r), + exp(FIX2FLOAT(x)), exp(FIX2FLOAT(y)), exp(FIX2FLOAT(r))); +*/ + return r; + } +} + +/* + * log_sub for spectral subtraction, similar to logadd but we had + * to smooth function around zero with fixlog in order to improve + * table interpolation properties + * + * The table is created with the file included into distribution + * + * e^z = e^x - e^y + * e^z = e^x (1 - e^(-(x - y))) + * z = x + log(1 - e^(-(x - y))) + * z = x + fixlog(a) + (log(1 - e^(- a)) - log(a)) + * + * Input radix is 8 output radix is 10 + */ +static const uint16 fe_logsub_table[] = { +1, 3, 5, 7, 9, 11, 13, 15, 17, 19, +21, 23, 25, 27, 29, 31, 33, 35, 37, 39, +41, 43, 45, 47, 49, 51, 53, 55, 56, 58, +60, 62, 64, 66, 68, 70, 72, 74, 76, 78, +80, 82, 84, 86, 88, 90, 92, 94, 95, 97, +99, 101, 103, 105, 107, 109, 111, 113, 115, 117, +119, 121, 122, 124, 126, 128, 130, 132, 134, 136, +138, 140, 142, 143, 145, 147, 149, 151, 153, 155, +157, 159, 161, 162, 164, 166, 168, 170, 172, 174, +176, 178, 179, 181, 183, 185, 187, 189, 191, 193, +194, 196, 198, 200, 202, 204, 206, 207, 209, 211, +213, 215, 217, 219, 220, 222, 224, 226, 228, 230, +232, 233, 235, 237, 239, 241, 243, 244, 246, 248, +250, 252, 254, 255, 257, 259, 261, 263, 265, 266, +268, 270, 272, 274, 275, 277, 279, 281, 283, 284, +286, 288, 290, 292, 294, 295, 297, 299, 301, 302, +304, 306, 308, 310, 311, 313, 315, 317, 319, 320, +322, 324, 326, 327, 329, 331, 333, 335, 336, 338, +340, 342, 343, 345, 347, 349, 350, 352, 354, 356, +357, 359, 361, 363, 364, 366, 368, 370, 371, 373, +375, 377, 378, 380, 382, 384, 385, 387, 389, 391, +392, 394, 396, 397, 399, 401, 403, 404, 406, 408, +410, 411, 413, 415, 416, 418, 420, 422, 423, 425, +427, 428, 430, 432, 433, 435, 437, 439, 440, 442, +444, 445, 447, 449, 450, 452, 454, 455, 457, 459, +460, 462, 464, 465, 467, 469, 471, 472, 474, 476, +477, 479, 481, 482, 484, 486, 487, 489, 490, 492, +494, 495, 497, 499, 500, 502, 504, 505, 507, 509, +510, 512, 514, 515, 517, 518, 520, 522, 523, 525, +527, 528, 530, 532, 533, 535, 536, 538, 540, 541, +543, 544, 546, 548, 549, 551, 553, 554, 556, 557, +559, 561, 562, 564, 565, 567, 569, 570, 572, 573, +575, 577, 578, 580, 581, 583, 585, 586, 588, 589, +591, 592, 594, 596, 597, 599, 600, 602, 603, 605, +607, 608, 610, 611, 613, 614, 616, 618, 619, 621, +622, 624, 625, 627, 628, 630, 632, 633, 635, 636, +638, 639, 641, 642, 644, 645, 647, 649, 650, 652, +653, 655, 656, 658, 659, 661, 662, 664, 665, 667, +668, 670, 671, 673, 674, 676, 678, 679, 681, 682, +684, 685, 687, 688, 690, 691, 693, 694, 696, 697, +699, 700, 702, 703, 705, 706, 708, 709, 711, 712, +714, 715, 717, 718, 719, 721, 722, 724, 725, 727, +728, 730, 731, 733, 734, 736, 737, 739, 740, 742, +743, 745, 746, 747, 749, 750, 752, 753, 755, 756, +758, 759, 761, 762, 763, 765, 766, 768, 769, 771, +772, 774, 775, 776, 778, 779, 781, 782, 784, 785, +786, 788, 789, 791, 792, 794, 795, 796, 798, 799, +801, 802, 804, 805, 806, 808, 809, 811, 812, 813, +815, 816, 818, 819, 820, 822, 823, 825, 826, 827, +829, 830, 832, 833, 834, 836, 837, 839, 840, 841, +843, 844, 846, 847, 848, 850, 851, 852, 854, 855, +857, 858, 859, 861, 862, 863, 865, 866, 868, 869, +870, 872, 873, 874, 876, 877, 878, 880, 881, 883, +884, 885, 887, 888, 889, 891, 892, 893, 895, 896, +897, 899, 900, 901, 903, 904, 905, 907, 908, 909, +911, 912, 913, 915, 916, 917, 919, 920, 921, 923, +924, 925, 927, 928, 929, 931, 932, 933, 935, 936, +937, 939, 940, 941, 942, 944, 945, 946, 948, 949, +950, 952, 953, 954, 956, 957, 958, 959, 961, 962, +963, 965, 966, 967, 968, 970, 971, 972, 974, 975, +976, 977, 979, 980, 981, 983, 984, 985, 986, 988, +989, 990, 991, 993, 994, 995, 997, 998, 999, 1000, +1002, 1003, 1004, 1005, 1007, 1008, 1009, 1010, 1012, 1013, +1014, 1015, 1017, 1018, 1019, 1020, 1022, 1023, 1024, 1025, +1027, 1028, 1029, 1030, 1032, 1033, 1034, 1035, 1037, 1038, +1039, 1040, 1041, 1043, 1044, 1045, 1046, 1048, 1049, 1050, +1051, 1052, 1054, 1055, 1056, 1057, 1059, 1060, 1061, 1062, +1063, 1065, 1066, 1067, 1068, 1069, 1071, 1072, 1073, 1074, +1076, 1077, 1078, 1079, 1080, 1082, 1083, 1084, 1085, 1086, +1087, 1089, 1090, 1091, 1092, 1093, 1095, 1096, 1097, 1098, +1099, 1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110, +1111, 1112, 1114, 1115, 1116, 1117, 1118, 1119, 1121, 1122, +1123, 1124, 1125, 1126, 1128, 1129, 1130, 1131, 1132, 1133, +1135, 1136, 1137, 1138, 1139, 1140, 1141, 1143, 1144, 1145, +1146, 1147, 1148, 1149, 1151, 1152, 1153, 1154, 1155, 1156, +1157, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1167, 1168, +1169, 1170, 1171, 1172, 1173, 1174, 1176, 1177, 1178, 1179, +1180, 1181, 1182, 1183, 1185, 1186, 1187, 1188, 1189, 1190, +1191, 1192, 1193, 1195, 1196, 1197, 1198, 1199, 1200, 1201, +1202, 1203, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, +1213, 1214, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, +1224, 1225, 1226, 1228, 1229, 1230, 1231, 1232, 1233, 1234, +1235, 1236, 1237, 1238, 1239, 1240, 1242, 1243, 1244, 1245, +1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, +1256, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, +1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1277, +1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, +1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, +1298, 1299, 1300, 1301, 1302, 1303, 1305, 1306, 1307, 1308, +1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, +1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, +1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, +1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, +1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, +1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, +1369, 1370, 1371, 1372, 1372, 1373, 1374, 1375, 1376, 1377, +1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, +1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, +1398, 1399, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, +1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, +1417, 1418, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, +1426, 1427, 1428, 1429, 1430, 1431, 1432, 1432, 1433, 1434, +1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, +1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, +1454, 1455, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, +1463, 1464, 1465, 1466, 1466, 1467, 1468, 1469, 1470, 1471, +1472, 1473, 1474, 1475, 1475, 1476, 1477, 1478, 1479, 1480, +1481, 1482, 1483, 1483, 1484, 1485, 1486, 1487, 1488, 1489, +1490, 1491, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, +1499, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1506, +1507, 1508, 1509, 1510, 1511, 1512, 1513, 1513, 1514, 1515, +1516, 1517, 1518, 1519, 1520, 1520, 1521, 1522, 1523, 1524, +1525, 1526, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1532, +1533, 1534, 1535, 1536, 1537, 1538, 1538, 1539, 1540, 1541, +1542, 1543, 1544, 1544, 1545, 1546, 1547, 1548, 1549, 1550, +1550, 1551, 1552, 1553, 1554, 1555, 1555, 1556, 1557, 1558, +1559, 1560, 1560, 1561, 1562, 1563, 1564, 1565, 1565, 1566, +1567, 1568, 1569, 1570, 1570, 1571, 1572, 1573, 1574, 1575, +1575, 1576, 1577, 1578, 1579, 1580, 1580, 1581, 1582, 1583, +1584, 1584, 1585, 1586, 1587, 1588, 1589, 1589, 1590, 1591, +1592, 1593, 1593, 1594, 1595, 1596, 1597, 1598, 1598, 1599, +1600, 1601, 1602, 1602, 1603, 1604, 1605, 1606, 1606, 1607, +1608, 1609, 1610, 1610, 1611, 1612, 1613, 1614, 1614, 1615, +1616, 1617, 1618, 1618, 1619, 1620, 1621, 1622, 1622, 1623, +1624, 1625, 1626, 1626, 1627, 1628, 1629, 1630, 1630, 1631, +1632, 1633, 1634, 1634, 1635, 1636, 1637, 1637, 1638, 1639, +1640, 1641, 1641, 1642, 1643, 1644, 1645, 1645, 1646, 1647, +1648, 1648, 1649, 1650, 1651, 1652, 1652, 1653, 1654, 1655, +1655, 1656, 1657, 1658, 1658, 1659, 1660, 1661, 1662, 1662, +1663, 1664, 1665, 1665, 1666, 1667, 1668, 1668, 1669, 1670, +1671, 1671, 1672, 1673, 1674, 1675, 1675, 1676, 1677, 1678, +1678, 1679, 1680, 1681, 1681, 1682, 1683, 1684, 1684, 1685, +1686, 1687, 1687, 1688, 1689, 1690, 1690, 1691, 1692, 1693, +1693, 1694, 1695, 1696, 1696, 1697, 1698, 1699, 1699, 1700, +1701, 1702, 1702, 1703, 1704, 1705, 1705, 1706, 1707, 1707, +1708, 1709, 1710, 1710, 1711, 1712, 1713, 1713, 1714, 1715, +1716, 1716, 1717, 1718, 1718, 1719, 1720, 1721, 1721, 1722, +1723, 1724, 1724, 1725, 1726, 1727, 1727, 1728, 1729, 1729, +1730, 1731, 1732, 1732, 1733, 1734, 1734, 1735, 1736, 1737, +1737, 1738, 1739, 1740, 1740, 1741, 1742, 1742, 1743, 1744, +1745, 1745, 1746, 1747, 1747, 1748, 1749, 1749, 1750, 1751, +1752, 1752, 1753, 1754, 1754, 1755, 1756, 1757, 1757, 1758, +1759, 1759, 1760, 1761, 1762, 1762, 1763, 1764, 1764, 1765, +1766, 1766, 1767, 1768, 1769, 1769, 1770, 1771, 1771, 1772, +1773, 1773, 1774, 1775, 1776, 1776, 1777, 1778, 1778, 1779, +1780, 1780, 1781, 1782, 1782, 1783, 1784, 1784, 1785, 1786, +1787, 1787, 1788, 1789, 1789, 1790, 1791, 1791, 1792, 1793, +1793, 1794, 1795, 1795, 1796, 1797, 1798, 1798, 1799, 1800, +1800, 1801, 1802, 1802, 1803, 1804, 1804, 1805, 1806, 1806, +1807, 1808, 1808, 1809, 1810, 1810, 1811, 1812, 1812, 1813, +1814, 1814, 1815, 1816, 1816, 1817, 1818, 1818, 1819, 1820, +1820, 1821, 1822, 1822, 1823, 1824, 1824, 1825, 1826, 1826, +1827, 1828, 1828, 1829, 1830, 1830, 1831, 1832, 1832, 1833, +1834, 1834, 1835, 1836, 1836, 1837, 1838, 1838, 1839, 1840, +1840, 1841, 1842, 1842, 1843, 1844, 1844, 1845, 1845, 1846, +1847, 1847, 1848, 1849, 1849, 1850, 1851, 1851, 1852, 1853, +1853, 1854, 1855, 1855, 1856, 1857, 1857, 1858, 1858, 1859, +1860, 1860, 1861, 1862, 1862, 1863, 1864, 1864, 1865, 1866, +1866, 1867, 1867, 1868, 1869, 1869, 1870, 1871, 1871, 1872, +1873, 1873, 1874, 1874, 1875, 1876, 1876, 1877, 1878, 1878, +1879, 1879, 1880, 1881, 1881, 1882, 1883, 1883, 1884, 1885, +1885, 1886, 1886, 1887, 1888, 1888, 1889, 1890, 1890, 1891, +1891, 1892, 1893, 1893, 1894, 1895, 1895, 1896, 1896, 1897, +1898, 1898, 1899, 1900, 1900, 1901, 1901, 1902, 1903, 1903, +1904, 1904, 1905, 1906, 1906, 1907, 1908, 1908, 1909, 1909, +1910, 1911, 1911, 1912, 1912, 1913, 1914, 1914, 1915, 1916, +1916, 1917, 1917, 1918, 1919, 1919, 1920, 1920, 1921, 1922, +1922, 1923, 1923, 1924, 1925, 1925, 1926, 1926, 1927, 1928, +1928, 1929, 1929, 1930, 1931, 1931, 1932, 1932, 1933, 1934, +1934, 1935, 1935, 1936, 1937, 1937, 1938, 1938, 1939, 1940, +1940, 1941, 1941, 1942, 1943, 1943, 1944, 1944, 1945, 1946, +1946, 1947, 1947, 1948, 1949, 1949, 1950, 1950, 1951, 1952, +1952, 1953, 1953, 1954, 1955, 1955, 1956, 1956, 1957, 1957, +1958, 1959, 1959, 1960, 1960, 1961, 1962, 1962, 1963, 1963, +1964, 1964, 1965, 1966, 1966, 1967, 1967, 1968, 1969, 1969, +1970, 1970, 1971, 1971, 1972, 1973, 1973, 1974, 1974, 1975, +1976, 1976, 1977, 1977, 1978, 1978, 1979, 1980, 1980, 1981, +1981, 1982, 1982, 1983, 1984, 1984, 1985, 1985, 1986, 1986, +1987, 1988, 1988, 1989, 1989, 1990, 1990, 1991, 1992, 1992, +1993, 1993, 1994, 1994, 1995, 1996, 1996, 1997, 1997, 1998, +1998, 1999, 1999, 2000, 2001, 2001, 2002, 2002, 2003, 2003, +2004, 2005, 2005, 2006, 2006, 2007, 2007, 2008, 2008, 2009, +2010, 2010, 2011, 2011, 2012, 2012, 2013, 2014, 2014, 2015, +2015, 2016, 2016, 2017, 2017, 2018, 2019, 2019, 2020, 2020, +2021, 2021, 2022, 2022, 2023, 2023, 2024, 2025, 2025, 2026, +2026, 2027, 2027, 2028, 2028, 2029, 2030, 2030, 2031, 2031, +2032, 2032, 2033, 2033, 2034, 2034, 2035, 2036, 2036, 2037, +2037, 2038, 2038, 2039, 2039, 2040, 2040, 2041, 2042, 2042, +2043, 2043, 2044, 2044, 2045, 2045, 2046, 2046, 2047, 2048, +2048, 2049, 2049, 2050, 2050, 2051, 2051, 2052, 2052, 2053, +2053, 2054, 2054, 2055, 2056, 2056, 2057, 2057, 2058, 2058, +2059, 2059, 2060, 2060, 2061, 2061, 2062, 2062, 2063, 2064, +2064, 2065, 2065, 2066, 2066, 2067, 2067, 2068, 2068, 2069, +2069, 2070, 2070, 2071, 2072, 2072, 2073, 2073, 2074, 2074, +2075, 2075, 2076, 2076, 2077, 2077, 2078, 2078, 2079, 2079, +2080, 2080, 2081 +}; + +static const int fe_logsub_table_size = + sizeof(fe_logsub_table) / sizeof(fe_logsub_table[0]); + +fixed32 +fe_log_sub(fixed32 x, fixed32 y) +{ + fixed32 d, r; + + if (x < MIN_FIXLOG || y >= x) + return MIN_FIXLOG; + + d = (x - y) >> (DEFAULT_RADIX - 8); + + if (d > fe_logsub_table_size - 1) + return x; + + r = fe_logsub_table[d] << (DEFAULT_RADIX - 10); +/* + printf("diff=%d\n", + x + FIXLN(x-y) - r - + (x + FLOAT2FIX(logf(-expm1f(FIX2FLOAT(y - x)))))); +*/ + return x + FIXLN(x-y) - r; +} + +static fixed32 +fe_log(float32 x) +{ + if (x <= 0) { + return MIN_FIXLOG; + } + else { + return FLOAT2FIX(log(x)); + } +} +#endif + +static float32 +fe_mel(melfb_t * mel, float32 x) +{ + float32 warped = fe_warp_unwarped_to_warped(mel, x); + + return (float32) (2595.0 * log10(1.0 + warped / 700.0)); +} + +static float32 +fe_melinv(melfb_t * mel, float32 x) +{ + float32 warped = (float32) (700.0 * (pow(10.0, x / 2595.0) - 1.0)); + return fe_warp_warped_to_unwarped(mel, warped); +} + +int32 +fe_build_melfilters(melfb_t * mel_fb) +{ + float32 melmin, melmax, melbw, fftfreq; + int n_coeffs, i, j; + + + /* Filter coefficient matrix, in flattened form. */ + mel_fb->spec_start = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->spec_start)); + mel_fb->filt_start = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->filt_start)); + mel_fb->filt_width = + ckd_calloc(mel_fb->num_filters, sizeof(*mel_fb->filt_width)); + + /* First calculate the widths of each filter. */ + /* Minimum and maximum frequencies in mel scale. */ + melmin = fe_mel(mel_fb, mel_fb->lower_filt_freq); + melmax = fe_mel(mel_fb, mel_fb->upper_filt_freq); + + /* Width of filters in mel scale */ + melbw = (melmax - melmin) / (mel_fb->num_filters + 1); + if (mel_fb->doublewide) { + melmin -= melbw; + melmax += melbw; + if ((fe_melinv(mel_fb, melmin) < 0) || + (fe_melinv(mel_fb, melmax) > mel_fb->sampling_rate / 2)) { + E_WARN + ("Out of Range: low filter edge = %f (%f)\n", + fe_melinv(mel_fb, melmin), 0.0); + E_WARN + (" high filter edge = %f (%f)\n", + fe_melinv(mel_fb, melmax), mel_fb->sampling_rate / 2); + return FE_INVALID_PARAM_ERROR; + } + } + + /* DFT point spacing */ + fftfreq = mel_fb->sampling_rate / (float32) mel_fb->fft_size; + + /* Count and place filter coefficients. */ + n_coeffs = 0; + for (i = 0; i < mel_fb->num_filters; ++i) { + float32 freqs[3]; + + /* Left, center, right frequencies in Hertz */ + for (j = 0; j < 3; ++j) { + if (mel_fb->doublewide) + freqs[j] = fe_melinv(mel_fb, (i + j * 2) * melbw + melmin); + else + freqs[j] = fe_melinv(mel_fb, (i + j) * melbw + melmin); + /* Round them to DFT points if requested */ + if (mel_fb->round_filters) + freqs[j] = ((int) (freqs[j] / fftfreq + 0.5)) * fftfreq; + } + + /* spec_start is the start of this filter in the power spectrum. */ + mel_fb->spec_start[i] = -1; + /* There must be a better way... */ + for (j = 0; j < mel_fb->fft_size / 2 + 1; ++j) { + float32 hz = j * fftfreq; + if (hz < freqs[0]) + continue; + else if (hz > freqs[2] || j == mel_fb->fft_size / 2) { + /* filt_width is the width in DFT points of this filter. */ + mel_fb->filt_width[i] = j - mel_fb->spec_start[i]; + /* filt_start is the start of this filter in the filt_coeffs array. */ + mel_fb->filt_start[i] = n_coeffs; + n_coeffs += mel_fb->filt_width[i]; + break; + } + if (mel_fb->spec_start[i] == -1) + mel_fb->spec_start[i] = j; + } + } + + /* Now go back and allocate the coefficient array. */ + mel_fb->filt_coeffs = + ckd_malloc(n_coeffs * sizeof(*mel_fb->filt_coeffs)); + + /* And now generate the coefficients. */ + n_coeffs = 0; + for (i = 0; i < mel_fb->num_filters; ++i) { + float32 freqs[3]; + + /* Left, center, right frequencies in Hertz */ + for (j = 0; j < 3; ++j) { + if (mel_fb->doublewide) + freqs[j] = fe_melinv(mel_fb, (i + j * 2) * melbw + melmin); + else + freqs[j] = fe_melinv(mel_fb, (i + j) * melbw + melmin); + /* Round them to DFT points if requested */ + if (mel_fb->round_filters) + freqs[j] = ((int) (freqs[j] / fftfreq + 0.5)) * fftfreq; + } + + for (j = 0; j < mel_fb->filt_width[i]; ++j) { + float32 hz, loslope, hislope; + + hz = (mel_fb->spec_start[i] + j) * fftfreq; + if (hz < freqs[0] || hz > freqs[2]) { + E_FATAL + ("Failed to create filterbank, frequency range does not match. " + "Sample rate %f, FFT size %d, lowerf %f < freq %f > upperf %f.\n", + mel_fb->sampling_rate, mel_fb->fft_size, freqs[0], hz, + freqs[2]); + } + loslope = (hz - freqs[0]) / (freqs[1] - freqs[0]); + hislope = (freqs[2] - hz) / (freqs[2] - freqs[1]); + if (mel_fb->unit_area) { + loslope *= 2 / (freqs[2] - freqs[0]); + hislope *= 2 / (freqs[2] - freqs[0]); + } + if (loslope < hislope) { +#ifdef FIXED_POINT + mel_fb->filt_coeffs[n_coeffs] = fe_log(loslope); +#else + mel_fb->filt_coeffs[n_coeffs] = loslope; +#endif + } + else { +#ifdef FIXED_POINT + mel_fb->filt_coeffs[n_coeffs] = fe_log(hislope); +#else + mel_fb->filt_coeffs[n_coeffs] = hislope; +#endif + } + ++n_coeffs; + } + } + + return FE_SUCCESS; +} + +int32 +fe_compute_melcosine(melfb_t * mel_fb) +{ + + float64 freqstep; + int32 i, j; + + mel_fb->mel_cosine = + (mfcc_t **) ckd_calloc_2d(mel_fb->num_cepstra, + mel_fb->num_filters, sizeof(mfcc_t)); + + freqstep = M_PI / mel_fb->num_filters; + /* NOTE: The first row vector is actually unnecessary but we leave + * it in to avoid confusion. */ + for (i = 0; i < mel_fb->num_cepstra; i++) { + for (j = 0; j < mel_fb->num_filters; j++) { + float64 cosine; + + cosine = cos(freqstep * i * (j + 0.5)); + mel_fb->mel_cosine[i][j] = FLOAT2COS(cosine); + } + } + + /* Also precompute normalization constants for unitary DCT. */ + mel_fb->sqrt_inv_n = FLOAT2COS(sqrt(1.0 / mel_fb->num_filters)); + mel_fb->sqrt_inv_2n = FLOAT2COS(sqrt(2.0 / mel_fb->num_filters)); + + /* And liftering weights */ + if (mel_fb->lifter_val) { + mel_fb->lifter = + calloc(mel_fb->num_cepstra, sizeof(*mel_fb->lifter)); + for (i = 0; i < mel_fb->num_cepstra; ++i) { + mel_fb->lifter[i] = FLOAT2MFCC(1 + mel_fb->lifter_val / 2 + * sin(i * M_PI / + mel_fb->lifter_val)); + } + } + + return (0); +} + +static void +fe_pre_emphasis_int16(int16 const *in, frame_t * out, int32 len, + float32 factor, int16 prior) +{ + int i; + +#if defined(FIXED16) + int16 fxd_alpha = (int16)(factor * 0x8000); + int32 tmp1, tmp2; + + tmp1 = (int32)in[0] << 15; + tmp2 = (int32)prior * fxd_alpha; + out[0] = (int16)((tmp1 - tmp2) >> 15); + for (i = 1; i < len; ++i) { + tmp1 = (int32)in[i] << 15; + tmp2 = (int32)in[i-1] * fxd_alpha; + out[i] = (int16)((tmp1 - tmp2) >> 15); + } +#elif defined(FIXED_POINT) + fixed32 fxd_alpha = FLOAT2FIX(factor); + out[0] = ((fixed32) in[0] << DEFAULT_RADIX) - (prior * fxd_alpha); + for (i = 1; i < len; ++i) + out[i] = ((fixed32) in[i] << DEFAULT_RADIX) + - (fixed32) in[i - 1] * fxd_alpha; +#else + out[0] = (frame_t) in[0] - (frame_t) prior *factor; + for (i = 1; i < len; i++) + out[i] = (frame_t) in[i] - (frame_t) in[i - 1] * factor; +#endif +} + +static void +fe_copy_to_frame_int16(int16 const *in, frame_t * out, int32 len) +{ + int i; + +#if defined(FIXED16) + memcpy(out, in, len * sizeof(*out)); +#elif defined(FIXED_POINT) + for (i = 0; i < len; i++) + out[i] = (int32) in[i] << DEFAULT_RADIX; +#else /* FIXED_POINT */ + for (i = 0; i < len; i++) + out[i] = (frame_t) in[i]; +#endif /* FIXED_POINT */ +} + +void +fe_create_hamming(window_t * in, int32 in_len) +{ + int i; + + /* Symmetric, so we only create the first half of it. */ + for (i = 0; i < in_len / 2; i++) { + float64 hamm; + hamm = (0.54 - 0.46 * cos(2 * M_PI * i / + ((float64) in_len - 1.0))); +#ifdef FIXED16 + in[i] = (int16)(hamm * 0x8000); +#else + in[i] = FLOAT2COS(hamm); +#endif + } +} + +static void +fe_hamming_window(frame_t * in, window_t * window, int32 in_len, + int32 remove_dc) +{ + int i; + + if (remove_dc) { +#ifdef FIXED16 + int32 mean = 0; /* Use int32 to avoid possibility of overflow */ +#else + frame_t mean = 0; +#endif + + for (i = 0; i < in_len; i++) + mean += in[i]; + mean /= in_len; + for (i = 0; i < in_len; i++) + in[i] -= (frame_t) mean; + } + +#ifdef FIXED16 + for (i = 0; i < in_len/2; i++) { + int32 tmp1, tmp2; + + tmp1 = (int32)in[i] * window[i]; + tmp2 = (int32)in[in_len-1-i] * window[i]; + in[i] = (int16)(tmp1 >> 15); + in[in_len-1-i] = (int16)(tmp2 >> 15); + } +#else + for (i = 0; i < in_len/2; i++) { + in[i] = COSMUL(in[i], window[i]); + in[in_len - 1 - i] = COSMUL(in[in_len - 1 - i], window[i]); + } +#endif +} + +static int +fe_spch_to_frame(fe_t * fe, int len) +{ + /* Copy to the frame buffer. */ + if (fe->pre_emphasis_alpha != 0.0) { + fe_pre_emphasis_int16(fe->spch, fe->frame, len, + fe->pre_emphasis_alpha, + fe->pre_emphasis_prior); + if (len >= fe->frame_shift) + fe->pre_emphasis_prior = fe->spch[fe->frame_shift - 1]; + else + fe->pre_emphasis_prior = fe->spch[len - 1]; + } + else + fe_copy_to_frame_int16(fe->spch, fe->frame, len); + + /* Zero pad up to FFT size. */ + memset(fe->frame + len, 0, (fe->fft_size - len) * sizeof(*fe->frame)); + + /* Window. */ + fe_hamming_window(fe->frame, fe->hamming_window, fe->frame_size, + fe->remove_dc); + + return len; +} + +int +fe_read_frame_int16(fe_t * fe, int16 const *in, int32 len) +{ + int i; + + if (len > fe->frame_size) + len = fe->frame_size; + + /* Read it into the raw speech buffer. */ + memcpy(fe->spch, in, len * sizeof(*in)); + /* Swap and dither if necessary. */ + if (fe->swap) + for (i = 0; i < len; ++i) + SWAP_INT16(&fe->spch[i]); + if (fe->dither) + for (i = 0; i < len; ++i) + fe->spch[i] += (int16) ((!(s3_rand_int31() % 4)) ? 1 : 0); + + return fe_spch_to_frame(fe, len); +} + +int +fe_read_frame(fe_t * fe, int16 const *in, int32 len) +{ + return fe_read_frame_int16(fe, in, len); +} + +int +fe_shift_frame_int16(fe_t * fe, int16 const *in, int32 len) +{ + int offset, i; + + if (len > fe->frame_shift) + len = fe->frame_shift; + offset = fe->frame_size - fe->frame_shift; + + /* Shift data into the raw speech buffer. */ + memmove(fe->spch, fe->spch + fe->frame_shift, + offset * sizeof(*fe->spch)); + memcpy(fe->spch + offset, in, len * sizeof(*fe->spch)); + /* Swap and dither if necessary. */ + if (fe->swap) + for (i = 0; i < len; ++i) + SWAP_INT16(&fe->spch[offset + i]); + if (fe->dither) + for (i = 0; i < len; ++i) + fe->spch[offset + i] + += (int16) ((!(s3_rand_int31() % 4)) ? 1 : 0); + + return fe_spch_to_frame(fe, offset + len); +} + +int +fe_shift_frame(fe_t * fe, int16 const *in, int32 len) +{ + return fe_shift_frame_int16(fe, in, len); +} + +/** + * Create arrays of twiddle factors. + */ +void +fe_create_twiddle(fe_t * fe) +{ + int i; + + for (i = 0; i < fe->fft_size / 4; ++i) { + float64 a = 2 * M_PI * i / fe->fft_size; +#ifdef FIXED16 + fe->ccc[i] = (int16)(cos(a) * 0x8000); + fe->sss[i] = (int16)(sin(a) * 0x8000); +#elif defined(FIXED_POINT) + fe->ccc[i] = FLOAT2COS(cos(a)); + fe->sss[i] = FLOAT2COS(sin(a)); +#else + fe->ccc[i] = cos(a); + fe->sss[i] = sin(a); +#endif + } +} + +/* Translated from the FORTRAN (obviously) from "Real-Valued Fast + * Fourier Transform Algorithms" by Henrik V. Sorensen et al., IEEE + * Transactions on Acoustics, Speech, and Signal Processing, vol. 35, + * no.6. The 16-bit version does a version of "block floating + * point" in order to avoid rounding errors. + */ +#if defined(FIXED16) +static int +fe_fft_real(fe_t *fe) +{ + int i, j, k, m, n, lz; + frame_t *x, xt, max; + + x = fe->frame; + m = fe->fft_order; + n = fe->fft_size; + + /* Bit-reverse the input. */ + j = 0; + for (i = 0; i < n - 1; ++i) { + if (i < j) { + xt = x[j]; + x[j] = x[i]; + x[i] = xt; + } + k = n / 2; + while (k <= j) { + j -= k; + k /= 2; + } + j += k; + } + /* Determine how many bits of dynamic range are in the input. */ + max = 0; + for (i = 0; i < n; ++i) + if (abs(x[i]) > max) + max = abs(x[i]); + /* The FFT has a gain of M bits, so we need to attenuate the input + * by M bits minus the number of leading zeroes in the input's + * range in order to avoid overflows. */ + for (lz = 0; lz < m; ++lz) + if (max & (1 << (15-lz))) + break; + + /* Basic butterflies (2-point FFT, real twiddle factors): + * x[i] = x[i] + 1 * x[i+1] + * x[i+1] = x[i] + -1 * x[i+1] + */ + /* The quantization error introduced by attenuating the input at + * any given stage of the FFT has a cascading effect, so we hold + * off on it until it's absolutely necessary. */ + for (i = 0; i < n; i += 2) { + int atten = (lz == 0); + xt = x[i] >> atten; + x[i] = xt + (x[i + 1] >> atten); + x[i + 1] = xt - (x[i + 1] >> atten); + } + + /* The rest of the butterflies, in stages from 1..m */ + for (k = 1; k < m; ++k) { + int n1, n2, n4; + /* Start attenuating once we hit the number of leading zeros. */ + int atten = (k >= lz); + + n4 = k - 1; + n2 = k; + n1 = k + 1; + /* Stride over each (1 << (k+1)) points */ + for (i = 0; i < n; i += (1 << n1)) { + /* Basic butterfly with real twiddle factors: + * x[i] = x[i] + 1 * x[i + (1<> atten; + x[i] = xt + (x[i + (1 << n2)] >> atten); + x[i + (1 << n2)] = xt - (x[i + (1 << n2)] >> atten); + + /* The other ones with real twiddle factors: + * x[i + (1<> atten; + x[i + (1 << n4)] = x[i + (1 << n4)] >> atten; + + /* Butterflies with complex twiddle factors. + * There are (1<ccc[j << (m - n1)]; + ss = fe->sss[j << (m - n1)]; + + /* There are some symmetry properties which allow us + * to get away with only four multiplications here. */ + { + int32 tmp1, tmp2; + tmp1 = (int32)x[i3] * cc + (int32)x[i4] * ss; + tmp2 = (int32)x[i3] * ss - (int32)x[i4] * cc; + t1 = (int16)(tmp1 >> 15) >> atten; + t2 = (int16)(tmp2 >> 15) >> atten; + } + + x[i4] = (x[i2] >> atten) - t2; + x[i3] = (-x[i2] >> atten) - t2; + x[i2] = (x[i1] >> atten) - t1; + x[i1] = (x[i1] >> atten) + t1; + } + } + } + + /* Return the residual scaling factor. */ + return lz; +} +#else /* !FIXED16 */ +static int +fe_fft_real(fe_t *fe) +{ + int i, j, k, m, n; + frame_t *x, xt; + + x = fe->frame; + m = fe->fft_order; + n = fe->fft_size; + + /* Bit-reverse the input. */ + j = 0; + for (i = 0; i < n - 1; ++i) { + if (i < j) { + xt = x[j]; + x[j] = x[i]; + x[i] = xt; + } + k = n / 2; + while (k <= j) { + j -= k; + k /= 2; + } + j += k; + } + + /* Basic butterflies (2-point FFT, real twiddle factors): + * x[i] = x[i] + 1 * x[i+1] + * x[i+1] = x[i] + -1 * x[i+1] + */ + for (i = 0; i < n; i += 2) { + xt = x[i]; + x[i] = (xt + x[i + 1]); + x[i + 1] = (xt - x[i + 1]); + } + + /* The rest of the butterflies, in stages from 1..m */ + for (k = 1; k < m; ++k) { + int n1, n2, n4; + + n4 = k - 1; + n2 = k; + n1 = k + 1; + /* Stride over each (1 << (k+1)) points */ + for (i = 0; i < n; i += (1 << n1)) { + /* Basic butterfly with real twiddle factors: + * x[i] = x[i] + 1 * x[i + (1<ccc[j << (m - n1)]; + ss = fe->sss[j << (m - n1)]; + + /* There are some symmetry properties which allow us + * to get away with only four multiplications here. */ + t1 = COSMUL(x[i3], cc) + COSMUL(x[i4], ss); + t2 = COSMUL(x[i3], ss) - COSMUL(x[i4], cc); + + x[i4] = (x[i2] - t2); + x[i3] = (-x[i2] - t2); + x[i2] = (x[i1] - t1); + x[i1] = (x[i1] + t1); + } + } + } + + /* This isn't used, but return it for completeness. */ + return m; +} +#endif /* !FIXED16 */ + +static void +fe_spec_magnitude(fe_t * fe) +{ + frame_t *fft; + powspec_t *spec; + int32 j, scale, fftsize; + + /* Do FFT and get the scaling factor back (only actually used in + * fixed-point). Note the scaling factor is expressed in bits. */ + scale = fe_fft_real(fe); + + /* Convenience pointers to make things less awkward below. */ + fft = fe->frame; + spec = fe->spec; + fftsize = fe->fft_size; + + /* We need to scale things up the rest of the way to N. */ + scale = fe->fft_order - scale; + + /* The first point (DC coefficient) has no imaginary part */ + { +#ifdef FIXED16 + spec[0] = fixlog(abs(fft[0]) << scale) * 2; +#elif defined(FIXED_POINT) + spec[0] = FIXLN(abs(fft[0]) << scale) * 2; +#else + spec[0] = fft[0] * fft[0]; +#endif + } + + for (j = 1; j <= fftsize / 2; j++) { +#ifdef FIXED16 + int32 rr = fixlog(abs(fft[j]) << scale) * 2; + int32 ii = fixlog(abs(fft[fftsize - j]) << scale) * 2; + spec[j] = fe_log_add(rr, ii); +#elif defined(FIXED_POINT) + int32 rr = FIXLN(abs(fft[j]) << scale) * 2; + int32 ii = FIXLN(abs(fft[fftsize - j]) << scale) * 2; + spec[j] = fe_log_add(rr, ii); +#else + spec[j] = fft[j] * fft[j] + fft[fftsize - j] * fft[fftsize - j]; +#endif + } +} + +static void +fe_mel_spec(fe_t * fe) +{ + int whichfilt; + powspec_t *spec, *mfspec; + + /* Convenience poitners. */ + spec = fe->spec; + mfspec = fe->mfspec; + + for (whichfilt = 0; whichfilt < fe->mel_fb->num_filters; whichfilt++) { + int spec_start, filt_start, i; + + spec_start = fe->mel_fb->spec_start[whichfilt]; + filt_start = fe->mel_fb->filt_start[whichfilt]; + +#ifdef FIXED_POINT + mfspec[whichfilt] = + spec[spec_start] + fe->mel_fb->filt_coeffs[filt_start]; + for (i = 1; i < fe->mel_fb->filt_width[whichfilt]; i++) { + mfspec[whichfilt] = fe_log_add(mfspec[whichfilt], + spec[spec_start + i] + + fe->mel_fb-> + filt_coeffs[filt_start + i]); + } +#else /* !FIXED_POINT */ + mfspec[whichfilt] = 0; + for (i = 0; i < fe->mel_fb->filt_width[whichfilt]; i++) + mfspec[whichfilt] += + spec[spec_start + i] * fe->mel_fb->filt_coeffs[filt_start + + i]; +#endif /* !FIXED_POINT */ + } + +} + +#define LOG_FLOOR 1e-4 + +static void +fe_mel_cep(fe_t * fe, mfcc_t * mfcep) +{ + int32 i; + powspec_t *mfspec; + + /* Convenience pointer. */ + mfspec = fe->mfspec; + + for (i = 0; i < fe->mel_fb->num_filters; ++i) { +#ifndef FIXED_POINT /* It's already in log domain for fixed point */ + mfspec[i] = log(mfspec[i] + LOG_FLOOR); +#endif /* !FIXED_POINT */ + } + + /* If we are doing LOG_SPEC, then do nothing. */ + if (fe->log_spec == RAW_LOG_SPEC) { + for (i = 0; i < fe->feature_dimension; i++) { + mfcep[i] = (mfcc_t) mfspec[i]; + } + } + /* For smoothed spectrum, do DCT-II followed by (its inverse) DCT-III */ + else if (fe->log_spec == SMOOTH_LOG_SPEC) { + /* FIXME: This is probably broken for fixed-point. */ + fe_dct2(fe, mfspec, mfcep, 0); + fe_dct3(fe, mfcep, mfspec); + for (i = 0; i < fe->feature_dimension; i++) { + mfcep[i] = (mfcc_t) mfspec[i]; + } + } + else if (fe->transform == DCT_II) + fe_dct2(fe, mfspec, mfcep, FALSE); + else if (fe->transform == DCT_HTK) + fe_dct2(fe, mfspec, mfcep, TRUE); + else + fe_spec2cep(fe, mfspec, mfcep); + + return; +} + +void +fe_spec2cep(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep) +{ + int32 i, j, beta; + + /* Compute C0 separately (its basis vector is 1) to avoid + * costly multiplications. */ + mfcep[0] = mflogspec[0] / 2; /* beta = 0.5 */ + for (j = 1; j < fe->mel_fb->num_filters; j++) + mfcep[0] += mflogspec[j]; /* beta = 1.0 */ + mfcep[0] /= (frame_t) fe->mel_fb->num_filters; + + for (i = 1; i < fe->num_cepstra; ++i) { + mfcep[i] = 0; + for (j = 0; j < fe->mel_fb->num_filters; j++) { + if (j == 0) + beta = 1; /* 0.5 */ + else + beta = 2; /* 1.0 */ + mfcep[i] += COSMUL(mflogspec[j], + fe->mel_fb->mel_cosine[i][j]) * beta; + } + /* Note that this actually normalizes by num_filters, like the + * original Sphinx front-end, due to the doubled 'beta' factor + * above. */ + mfcep[i] /= (frame_t) fe->mel_fb->num_filters * 2; + } +} + +void +fe_dct2(fe_t * fe, const powspec_t * mflogspec, mfcc_t * mfcep, int htk) +{ + int32 i, j; + + /* Compute C0 separately (its basis vector is 1) to avoid + * costly multiplications. */ + mfcep[0] = mflogspec[0]; + for (j = 1; j < fe->mel_fb->num_filters; j++) + mfcep[0] += mflogspec[j]; + if (htk) + mfcep[0] = COSMUL(mfcep[0], fe->mel_fb->sqrt_inv_2n); + else /* sqrt(1/N) = sqrt(2/N) * 1/sqrt(2) */ + mfcep[0] = COSMUL(mfcep[0], fe->mel_fb->sqrt_inv_n); + + for (i = 1; i < fe->num_cepstra; ++i) { + mfcep[i] = 0; + for (j = 0; j < fe->mel_fb->num_filters; j++) { + mfcep[i] += COSMUL(mflogspec[j], fe->mel_fb->mel_cosine[i][j]); + } + mfcep[i] = COSMUL(mfcep[i], fe->mel_fb->sqrt_inv_2n); + } +} + +void +fe_lifter(fe_t * fe, mfcc_t * mfcep) +{ + int32 i; + + if (fe->mel_fb->lifter_val == 0) + return; + + for (i = 0; i < fe->num_cepstra; ++i) { + mfcep[i] = MFCCMUL(mfcep[i], fe->mel_fb->lifter[i]); + } +} + +void +fe_dct3(fe_t * fe, const mfcc_t * mfcep, powspec_t * mflogspec) +{ + int32 i, j; + + for (i = 0; i < fe->mel_fb->num_filters; ++i) { + mflogspec[i] = COSMUL(mfcep[0], SQRT_HALF); + for (j = 1; j < fe->num_cepstra; j++) { + mflogspec[i] += COSMUL(mfcep[j], fe->mel_fb->mel_cosine[j][i]); + } + mflogspec[i] = COSMUL(mflogspec[i], fe->mel_fb->sqrt_inv_2n); + } +} + +int +fe_write_frame(fe_t * fe, mfcc_t * feat) +{ + fe_spec_magnitude(fe); + fe_mel_spec(fe); + fe_remove_noise(fe); + fe_mel_cep(fe, feat); + fe_lifter(fe, feat); + + return 1; +} + + +void * +fe_create_2d(int32 d1, int32 d2, int32 elem_size) +{ + return (void *) ckd_calloc_2d(d1, d2, elem_size); +} + +void +fe_free_2d(void *arr) +{ + ckd_free_2d((void **) arr); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h new file mode 100644 index 0000000..160ed8f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h @@ -0,0 +1,65 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef FE_TYPE_H +#define FE_TYPE_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/fe.h" +#include "sphinxbase/fixpoint.h" + +#ifdef FIXED16 +/* Q15 format */ +typedef int16 frame_t; +typedef int16 window_t; +typedef int32 powspec_t; +typedef struct { int16 r, i; } complex; +#elif defined(FIXED_POINT) +typedef fixed32 frame_t; +typedef int32 powspec_t; +typedef fixed32 window_t; +typedef struct { fixed32 r, i; } complex; +#else /* FIXED_POINT */ +typedef float64 frame_t; +typedef float64 powspec_t; +typedef float64 window_t; +typedef struct { float64 r, i; } complex; +#endif /* FIXED_POINT */ + +#endif /* FE_TYPE_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c new file mode 100644 index 0000000..e409bea --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c @@ -0,0 +1,252 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp.c + * + * Description: + * Allows a caller to choose a warping function. + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $";*/ + +#include "fe_warp_inverse_linear.h" +#include "fe_warp_affine.h" +#include "fe_warp_piecewise_linear.h" +#include "fe_warp.h" + +#include "sphinxbase/err.h" + +#include +#include +#include +#include + +/* This is for aliases for each of the entries below. Currently not + used. +*/ +static char *__name2id[] = { + "inverse", + "linear", + "piecewise", + NULL +}; + +static char *name2id[] = { + "inverse_linear", + "affine", + "piecewise_linear", + NULL +}; + +static fe_warp_conf_t fe_warp_conf[FE_WARP_ID_MAX + 1] = { + {fe_warp_inverse_linear_set_parameters, + fe_warp_inverse_linear_doc, + fe_warp_inverse_linear_id, + fe_warp_inverse_linear_n_param, + fe_warp_inverse_linear_warped_to_unwarped, + fe_warp_inverse_linear_unwarped_to_warped, + fe_warp_inverse_linear_print}, /* Inverse linear warping */ + {fe_warp_affine_set_parameters, + fe_warp_affine_doc, + fe_warp_affine_id, + fe_warp_affine_n_param, + fe_warp_affine_warped_to_unwarped, + fe_warp_affine_unwarped_to_warped, + fe_warp_affine_print}, /* Affine warping */ + {fe_warp_piecewise_linear_set_parameters, + fe_warp_piecewise_linear_doc, + fe_warp_piecewise_linear_id, + fe_warp_piecewise_linear_n_param, + fe_warp_piecewise_linear_warped_to_unwarped, + fe_warp_piecewise_linear_unwarped_to_warped, + fe_warp_piecewise_linear_print}, /* Piecewise_Linear warping */ +}; + +int +fe_warp_set(melfb_t *mel, const char *id_name) +{ + uint32 i; + + for (i = 0; name2id[i]; i++) { + if (strcmp(id_name, name2id[i]) == 0) { + mel->warp_id = i; + break; + } + } + + if (name2id[i] == NULL) { + for (i = 0; __name2id[i]; i++) { + if (strcmp(id_name, __name2id[i]) == 0) { + mel->warp_id = i; + break; + } + } + if (__name2id[i] == NULL) { + E_ERROR("Unimplemented warping function %s\n", id_name); + E_ERROR("Implemented functions are:\n"); + for (i = 0; name2id[i]; i++) { + fprintf(stderr, "\t%s\n", name2id[i]); + } + mel->warp_id = FE_WARP_ID_NONE; + + return FE_START_ERROR; + } + } + + return FE_SUCCESS; +} + +void +fe_warp_set_parameters(melfb_t *mel, char const *param_str, float sampling_rate) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + fe_warp_conf[mel->warp_id].set_parameters(param_str, sampling_rate); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("feat module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } +} + +const char * +fe_warp_doc(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].doc(); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return NULL; +} + +uint32 +fe_warp_id(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + assert(mel->warp_id == fe_warp_conf[mel->warp_id].id()); + return mel->warp_id; + } + else if (mel->warp_id != FE_WARP_ID_NONE) { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return FE_WARP_ID_NONE; +} + +uint32 +fe_warp_n_param(melfb_t *mel) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].n_param(); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +float +fe_warp_warped_to_unwarped(melfb_t *mel, float nonlinear) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].warped_to_unwarped(nonlinear); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +float +fe_warp_unwarped_to_warped(melfb_t *mel,float linear) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + return fe_warp_conf[mel->warp_id].unwarped_to_warped(linear); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } + + return 0; +} + +void +fe_warp_print(melfb_t *mel, const char *label) +{ + if (mel->warp_id <= FE_WARP_ID_MAX) { + fe_warp_conf[mel->warp_id].print(label); + } + else if (mel->warp_id == FE_WARP_ID_NONE) { + E_FATAL("fe_warp module must be configured w/ a valid ID\n"); + } + else { + E_FATAL + ("fe_warp module misconfigured with invalid fe_warp_id %u\n", + mel->warp_id); + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h new file mode 100644 index 0000000..f2fd145 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h @@ -0,0 +1,90 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_H +#define FE_WARP_H + +#include "fe_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define FE_WARP_ID_INVERSE_LINEAR 0 +#define FE_WARP_ID_AFFINE 1 +#define FE_WARP_ID_PIECEWISE_LINEAR 2 +#define FE_WARP_ID_EIDE_GISH 3 +#define FE_WARP_ID_MAX 2 +#define FE_WARP_ID_NONE 0xffffffff + +typedef struct { + void (*set_parameters)(char const *param_str, float sampling_rate); + const char * (*doc)(void); + uint32 (*id)(void); + uint32 (*n_param)(void); + float (*warped_to_unwarped)(float nonlinear); + float (*unwarped_to_warped)(float linear); + void (*print)(const char *label); +} fe_warp_conf_t; + +int fe_warp_set(melfb_t *mel, const char *id_name); + +uint32 fe_warp_id(melfb_t *mel); + +const char * fe_warp_doc(melfb_t *mel); + +void fe_warp_set_parameters(melfb_t *mel, char const *param_str, float sampling_rate); + +uint32 fe_warp_n_param(melfb_t *mel); + +float fe_warp_warped_to_unwarped(melfb_t *mel, float nonlinear); + +float fe_warp_unwarped_to_warped(melfb_t *mel, float linear); + +void fe_warp_print(melfb_t *mel, const char *label); + +#define FE_WARP_NO_SIZE 0xffffffff + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c new file mode 100644 index 0000000..3986119 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c @@ -0,0 +1,181 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_affine.c + * + * Description: + * Warp the frequency axis according to an affine function, i.e.: + * + * w' = a * w + b + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_affine.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/err.h" + +#include "fe_warp.h" +#include "fe_warp_affine.h" + +#define N_PARAM 2 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + * params[1] : b + */ +static float params[N_PARAM] = { 1.0f, 0.0f }; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_affine_doc() +{ + return "affine :== < w' = a * x + b >"; +} + +uint32 +fe_warp_affine_id() +{ + return FE_WARP_ID_AFFINE; +} + +uint32 +fe_warp_affine_n_param() +{ + return N_PARAM; +} + +void +fe_warp_affine_set_parameters(char const *param_str, float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Affine warping takes up to two arguments, %s ignored.\n", + tok); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Affine warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_affine_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = (nonlinear - b) / a */ + float temp = nonlinear - params[1]; + temp /= params[0]; + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_affine_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + /* nonlinear = a * linear - b */ + float temp = linear * params[0]; + temp += params[1]; + return temp; + } +} + +void +fe_warp_affine_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h new file mode 100644 index 0000000..44027d9 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h @@ -0,0 +1,76 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_AFFINE_H +#define FE_WARP_AFFINE_H + +#include "sphinxbase/fe.h" + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_affine_doc(void); + +uint32 +fe_warp_affine_id(void); + +uint32 +fe_warp_affine_n_param(void); + +void +fe_warp_affine_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_affine_warped_to_unwarped(float nonlinear); + +float +fe_warp_affine_unwarped_to_warped(float linear); + +void +fe_warp_affine_print(const char *label); + +#ifdef __cplusplus +} +#endif + +#endif /* FE_WARP_AFFINE_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c new file mode 100644 index 0000000..85e4298 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c @@ -0,0 +1,178 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_inverse_linear.c + * + * Description: + * Warp the frequency axis according to an inverse_linear function, i.e.: + * + * w' = w / a + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_inverse_linear.c,v 1.3 2006/02/23 19:40:11 eht Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/err.h" + +#include "fe_warp.h" +#include "fe_warp_inverse_linear.h" + +#define N_PARAM 1 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + */ +static float params[N_PARAM] = { 1.0f }; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_inverse_linear_doc() +{ + return "inverse_linear :== < w' = x / a >"; +} + +uint32 +fe_warp_inverse_linear_id() +{ + return FE_WARP_ID_INVERSE_LINEAR; +} + +uint32 +fe_warp_inverse_linear_n_param() +{ + return N_PARAM; +} + +void +fe_warp_inverse_linear_set_parameters(char const *param_str, float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Inverse linear warping takes only one argument, %s ignored.\n", + tok); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Inverse linear warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_inverse_linear_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = nonlinear * a */ + float temp = nonlinear * params[0]; + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_inverse_linear_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + /* nonlinear = a / linear */ + float temp = linear / params[0]; + return temp; + } +} + +void +fe_warp_inverse_linear_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h new file mode 100644 index 0000000..8d4a767 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h @@ -0,0 +1,77 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_inverse_linear_H +#define FE_WARP_inverse_linear_H + +#include "sphinxbase/fe.h" + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_inverse_linear_doc(void); + +uint32 +fe_warp_inverse_linear_id(void); + +uint32 +fe_warp_inverse_linear_n_param(void); + +void +fe_warp_inverse_linear_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_inverse_linear_warped_to_unwarped(float nonlinear); + +float +fe_warp_inverse_linear_unwarped_to_warped(float linear); + +void +fe_warp_inverse_linear_print(const char *label); + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_inverse_linear_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c new file mode 100644 index 0000000..3457012 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c @@ -0,0 +1,223 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: fe_warp_piecewise_linear.c + * + * Description: + * + * Warp the frequency axis according to an piecewise linear + * function. The function is linear up to a frequency F, where + * the slope changes so that the Nyquist frequency in the warped + * axis maps to the Nyquist frequency in the unwarped. + * + * w' = a * w, w < F + * w' = a' * w + b, W > F + * w'(0) = 0 + * w'(F) = F + * w'(Nyq) = Nyq + * + *********************************************************************/ + +/* static char rcsid[] = "@(#)$Id: fe_warp_piecewise_linear.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $"; */ + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/err.h" + +#include "fe_warp.h" +#include "fe_warp_piecewise_linear.h" + +#define N_PARAM 2 +#define YES 1 +#define NO 0 + +/* + * params[0] : a + * params[1] : F (the non-differentiable point) + */ +static float params[N_PARAM] = { 1.0f, 6800.0f }; +static float final_piece[2]; +static int32 is_neutral = YES; +static char p_str[256] = ""; +static float nyquist_frequency = 0.0f; + + +const char * +fe_warp_piecewise_linear_doc() +{ + return "piecewise_linear :== < w' = a * w, w < F >"; +} + +uint32 +fe_warp_piecewise_linear_id() +{ + return FE_WARP_ID_PIECEWISE_LINEAR; +} + +uint32 +fe_warp_piecewise_linear_n_param() +{ + return N_PARAM; +} + +void +fe_warp_piecewise_linear_set_parameters(char const *param_str, + float sampling_rate) +{ + char *tok; + char *seps = " \t"; + char temp_param_str[256]; + int param_index = 0; + + nyquist_frequency = sampling_rate / 2; + if (param_str == NULL) { + is_neutral = YES; + return; + } + /* The new parameters are the same as the current ones, so do nothing. */ + if (strcmp(param_str, p_str) == 0) { + return; + } + is_neutral = NO; + strcpy(temp_param_str, param_str); + memset(params, 0, N_PARAM * sizeof(float)); + memset(final_piece, 0, 2 * sizeof(float)); + strcpy(p_str, param_str); + /* FIXME: strtok() is not re-entrant... */ + tok = strtok(temp_param_str, seps); + while (tok != NULL) { + params[param_index++] = (float) atof_c(tok); + tok = strtok(NULL, seps); + if (param_index >= N_PARAM) { + break; + } + } + if (tok != NULL) { + E_INFO + ("Piecewise linear warping takes up to two arguments, %s ignored.\n", + tok); + } + if (params[1] < sampling_rate) { + /* Precompute these. These are the coefficients of a + * straight line that contains the points (F, aF) and (N, + * N), where a = params[0], F = params[1], N = Nyquist + * frequency. + */ + if (params[1] == 0) { + params[1] = sampling_rate * 0.85f; + } + final_piece[0] = + (nyquist_frequency - + params[0] * params[1]) / (nyquist_frequency - params[1]); + final_piece[1] = + nyquist_frequency * params[1] * (params[0] - + 1.0f) / (nyquist_frequency - + params[1]); + } + else { + memset(final_piece, 0, 2 * sizeof(float)); + } + if (params[0] == 0) { + is_neutral = YES; + E_INFO + ("Piecewise linear warping cannot have slope zero, warping not applied.\n"); + } +} + +float +fe_warp_piecewise_linear_warped_to_unwarped(float nonlinear) +{ + if (is_neutral) { + return nonlinear; + } + else { + /* linear = (nonlinear - b) / a */ + float temp; + if (nonlinear < params[0] * params[1]) { + temp = nonlinear / params[0]; + } + else { + temp = nonlinear - final_piece[1]; + temp /= final_piece[0]; + } + if (temp > nyquist_frequency) { + E_WARN + ("Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n", + params[0], temp, nyquist_frequency); + } + return temp; + } +} + +float +fe_warp_piecewise_linear_unwarped_to_warped(float linear) +{ + if (is_neutral) { + return linear; + } + else { + float temp; + /* nonlinear = a * linear - b */ + if (linear < params[1]) { + temp = linear * params[0]; + } + else { + temp = final_piece[0] * linear + final_piece[1]; + } + return temp; + } +} + +void +fe_warp_piecewise_linear_print(const char *label) +{ + uint32 i; + + for (i = 0; i < N_PARAM; i++) { + printf("%s[%04u]: %6.3f ", label, i, params[i]); + } + printf("\n"); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h new file mode 100644 index 0000000..f15cb25 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h @@ -0,0 +1,77 @@ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef FE_WARP_PIECEWIDE_LINEAR_H +#define FE_WARP_PIECEWIDE_LINEAR_H + +#include "sphinxbase/fe.h" + + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +const char * +fe_warp_piecewise_linear_doc(void); + +uint32 +fe_warp_piecewise_linear_id(void); + +uint32 +fe_warp_piecewise_linear_n_param(void); + +void +fe_warp_piecewise_linear_set_parameters(char const *param_str, float sampling_rate); + +float +fe_warp_piecewise_linear_warped_to_unwarped(float nonlinear); + +float +fe_warp_piecewise_linear_unwarped_to_warped(float linear); + +void +fe_warp_piecewise_linear_print(const char *label); + +#ifdef __cplusplus +} +#endif + + +#endif /* FE_WARP_PIECEWIDE_LINEAR_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c new file mode 100644 index 0000000..f00c71f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c @@ -0,0 +1,229 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + * File: fixlog.c + * + * Description: Fast approximate fixed-point logarithms + * + * Author: David Huggins-Daines + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/fixpoint.h" + +#include "fe_internal.h" + +/* Table of log2(x/128)*(1<= 4 + y = __builtin_clz(x); + x <<= y; + y = (31 - y); +#else + for (y = 31; y > 0; --y) { + if (x & 0x80000000) + break; + x <<= 1; + } +#endif + y <<= DEFAULT_RADIX; + /* Do a table lookup for the MSB of the mantissa. */ + x = (x >> 24) & 0x7f; + return y + logtable[x]; +} + +int +fixlog(uint32 x) +{ + int32 y; + y = fixlog2(x); + return FIXMUL(y, FIXLN_2); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py new file mode 100644 index 0000000..cf01c8a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +import math + +radix = 8 +scale = 1< 0: + stop = int(round(math.log(-math.expm1(-byx/scale)) * out_scale)) + if stop == 0: + break + + byx = byx + 1. + +print "static const uint16 logsub_table[] = {" +for i in range(0,len(logtab),10): + if i+10 <= len(logtab): + print ", ".join(str(x) for x in logtab[i:i+10]) + "," + else: + print ", ".join(str(x) for x in logtab[i:]) +print "};" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py new file mode 100644 index 0000000..7a3ed59 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +import math + +radix = 8 +scale = 1< + */ + +/* This implements part of the YIN algorithm: + * + * "YIN, a fundamental frequency estimator for speech and music". + * Alain de Cheveigné and Hideki Kawahara. Journal of the Acoustical + * Society of America, 111 (4), April 2002. + */ + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/fixpoint.h" + +#include "sphinxbase/yin.h" + +#include +#include + +struct yin_s { + uint16 frame_size; /** Size of analysis frame. */ + uint16 search_threshold; /**< Threshold for finding period, in Q15 */ + uint16 search_range; /**< Range around best local estimate to search, in Q15 */ + uint16 nfr; /**< Number of frames read so far. */ + + unsigned char wsize; /**< Size of smoothing window. */ + unsigned char wstart; /**< First frame in window. */ + unsigned char wcur; /**< Current frame of analysis. */ + unsigned char endut; /**< Hoch Hech! Are we at the utterance end? */ + + fixed32 **diff_window; /**< Window of difference function outputs. */ + uint16 *period_window; /**< Window of best period estimates. */ +}; + +/** + * The core of YIN: cumulative mean normalized difference function. + */ +static void +cmn_diff(int16 const *signal, int32 *out_diff, int ndiff) +{ + uint32 cum, cshift; + int32 t, tscale; + + out_diff[0] = 32768; + cum = 0; + cshift = 0; + + /* Determine how many bits we can scale t up by below. */ + for (tscale = 0; tscale < 32; ++tscale) + if (ndiff & (1<<(31-tscale))) + break; + --tscale; /* Avoid teh overflowz. */ + /* printf("tscale is %d (ndiff - 1) << tscale is %d\n", + tscale, (ndiff-1) << tscale); */ + + /* Somewhat elaborate block floating point implementation. + * The fp implementation of this is really a lot simpler. */ + for (t = 1; t < ndiff; ++t) { + uint32 dd, dshift, norm; + int j; + + dd = 0; + dshift = 0; + for (j = 0; j < ndiff; ++j) { + int diff = signal[j] - signal[t + j]; + /* Guard against overflows. */ + if (dd > (1UL<>= 1; + ++dshift; + } + dd += (diff * diff) >> dshift; + } + /* Make sure the diffs and cum are shifted to the same + * scaling factor (usually dshift will be zero) */ + if (dshift > cshift) { + cum += dd << (dshift-cshift); + } + else { + cum += dd >> (cshift-dshift); + } + + /* Guard against overflows and also ensure that (t< cum. */ + while (cum > (1UL<>= 1; + ++cshift; + } + /* Avoid divide-by-zero! */ + if (cum == 0) cum = 1; + /* Calculate the normalizer in high precision. */ + norm = (t << tscale) / cum; + /* Do a long multiply and shift down to Q15. */ + out_diff[t] = (int32)(((long long)dd * norm) + >> (tscale - 15 + cshift - dshift)); + /* printf("dd %d cshift %d dshift %d scaledt %d cum %d norm %d cmn %d\n", + dd, cshift, dshift, (t<frame_size = frame_size; + pe->search_threshold = (uint16)(search_threshold * 32768); + pe->search_range = (uint16)(search_range * 32768); + pe->wsize = smooth_window * 2 + 1; + pe->diff_window = ckd_calloc_2d(pe->wsize, + pe->frame_size / 2, + sizeof(**pe->diff_window)); + pe->period_window = ckd_calloc(pe->wsize, + sizeof(*pe->period_window)); + return pe; +} + +void +yin_free(yin_t *pe) +{ + ckd_free_2d(pe->diff_window); + ckd_free(pe->period_window); + ckd_free(pe); +} + +void +yin_start(yin_t *pe) +{ + /* Reset the circular window pointers. */ + pe->wstart = pe->endut = 0; + pe->nfr = 0; +} + +void +yin_end(yin_t *pe) +{ + pe->endut = 1; +} + +int +thresholded_search(int32 *diff_window, fixed32 threshold, int start, int end) +{ + int i, min, argmin; + + min = INT_MAX; + argmin = 0; + for (i = start; i < end; ++i) { + int diff = diff_window[i]; + + if (diff < threshold) { + min = diff; + argmin = i; + break; + } + if (diff < min) { + min = diff; + argmin = i; + } + } + return argmin; +} + +void +yin_write(yin_t *pe, int16 const *frame) +{ + int outptr, difflen; + + /* Rotate the window one frame forward. */ + ++pe->wstart; + /* Fill in the frame before wstart. */ + outptr = pe->wstart - 1; + /* Wrap around the window pointer. */ + if (pe->wstart == pe->wsize) + pe->wstart = 0; + + /* Now calculate normalized difference function. */ + difflen = pe->frame_size / 2; + cmn_diff(frame, pe->diff_window[outptr], difflen); + + /* Find the first point under threshold. If not found, then + * use the absolute minimum. */ + pe->period_window[outptr] + = thresholded_search(pe->diff_window[outptr], + pe->search_threshold, 0, difflen); + + /* Increment total number of frames. */ + ++pe->nfr; +} + +int +yin_read(yin_t *pe, uint16 *out_period, uint16 *out_bestdiff) +{ + int wstart, wlen, half_wsize, i; + int best, best_diff, search_width, low_period, high_period; + + half_wsize = (pe->wsize-1)/2; + /* Without any smoothing, just return the current value (don't + * need to do anything to the current poitner either). */ + if (half_wsize == 0) { + if (pe->endut) + return 0; + *out_period = pe->period_window[0]; + *out_bestdiff = pe->diff_window[0][pe->period_window[0]]; + return 1; + } + + /* We can't do anything unless we have at least (wsize-1)/2 + 1 + * frames, unless we're at the end of the utterance. */ + if (pe->endut == 0 && pe->nfr < half_wsize + 1) { + /* Don't increment the current pointer either. */ + return 0; + } + + /* Establish the smoothing window. */ + /* End of utterance. */ + if (pe->endut) { + /* We are done (no more data) when pe->wcur = pe->wstart. */ + if (pe->wcur == pe->wstart) + return 0; + /* I.e. pe->wcur (circular minus) half_wsize. */ + wstart = (pe->wcur + pe->wsize - half_wsize) % pe->wsize; + /* Number of frames from wstart up to pe->wstart. */ + wlen = pe->wstart - wstart; + if (wlen < 0) wlen += pe->wsize; + /*printf("ENDUT! ");*/ + } + /* Beginning of utterance. */ + else if (pe->nfr < pe->wsize) { + wstart = 0; + wlen = pe->nfr; + } + /* Normal case, it is what it is. */ + else { + wstart = pe->wstart; + wlen = pe->wsize; + } + + /* Now (finally) look for the best local estimate. */ + /* printf("Searching for local estimate in %d frames around %d\n", + wlen, pe->nfr + 1 - wlen); */ + best = pe->period_window[pe->wcur]; + best_diff = pe->diff_window[pe->wcur][best]; + for (i = 0; i < wlen; ++i) { + int j = wstart + i; + int diff; + + j %= pe->wsize; + diff = pe->diff_window[j][pe->period_window[j]]; + /* printf("%.2f,%.2f ", 1.0 - (double)diff/32768, + pe->period_window[j] ? 8000.0/pe->period_window[j] : 8000.0); */ + if (diff < best_diff) { + best_diff = diff; + best = pe->period_window[j]; + } + } + /* printf("best: %.2f, %.2f\n", 1.0 - (double)best_diff/32768, + best ? 8000.0/best : 8000.0); */ + /* If it's the same as the current one then return it. */ + if (best == pe->period_window[pe->wcur]) { + /* Increment the current pointer. */ + if (++pe->wcur == pe->wsize) + pe->wcur = 0; + *out_period = best; + *out_bestdiff = best_diff; + return 1; + } + /* Otherwise, redo the search inside a narrower range. */ + search_width = best * pe->search_range / 32768; + /* printf("Search width = %d * %.2f = %d\n", + best, (double)pe->search_range/32768, search_width); */ + if (search_width == 0) search_width = 1; + low_period = best - search_width; + high_period = best + search_width; + if (low_period < 0) low_period = 0; + if (high_period > pe->frame_size / 2) high_period = pe->frame_size / 2; + /* printf("Searching from %d to %d\n", low_period, high_period); */ + best = thresholded_search(pe->diff_window[pe->wcur], + pe->search_threshold, + low_period, high_period); + best_diff = pe->diff_window[pe->wcur][best]; + + if (out_period) + *out_period = (best > 32768) ? 32768 : best; + if (out_bestdiff) + *out_bestdiff = (best_diff > 32768) ? 32768 : best_diff; + + /* Increment the current pointer. */ + if (++pe->wcur == pe->wsize) + pe->wcur = 0; + return 1; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c new file mode 100644 index 0000000..271baf4 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c @@ -0,0 +1,227 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * agc.c -- Various forms of automatic gain control (AGC) + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.5 2005/06/21 19:25:41 arthchan2003 + * 1, Fixed doxygen documentation. 2, Added $ keyword. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 04-Nov-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/agc.h" + +/* NOTE! These must match the enum in agc.h */ +const char *agc_type_str[] = { + "none", + "max", + "emax", + "noise" +}; +static const int n_agc_type_str = sizeof(agc_type_str)/sizeof(agc_type_str[0]); + +agc_type_t +agc_type_from_str(const char *str) +{ + int i; + + for (i = 0; i < n_agc_type_str; ++i) { + if (0 == strcmp(str, agc_type_str[i])) + return (agc_type_t)i; + } + E_FATAL("Unknown AGC type '%s'\n", str); + return AGC_NONE; +} + +agc_t *agc_init(void) +{ + agc_t *agc; + agc = ckd_calloc(1, sizeof(*agc)); + agc->noise_thresh = FLOAT2MFCC(2.0); + + return agc; +} + +void agc_free(agc_t *agc) +{ + ckd_free(agc); +} + +/** + * Normalize c0 for all frames such that max(c0) = 0. + */ +void +agc_max(agc_t *agc, mfcc_t **mfc, int32 n_frame) +{ + int32 i; + + if (n_frame <= 0) + return; + agc->obs_max = mfc[0][0]; + for (i = 1; i < n_frame; i++) { + if (mfc[i][0] > agc->obs_max) { + agc->obs_max = mfc[i][0]; + agc->obs_frame = 1; + } + } + + E_INFO("AGCMax: obs=max= %.2f\n", agc->obs_max); + for (i = 0; i < n_frame; i++) + mfc[i][0] -= agc->obs_max; +} + +void +agc_emax_set(agc_t *agc, float32 m) +{ + agc->max = FLOAT2MFCC(m); + E_INFO("AGCEMax: max= %.2f\n", m); +} + +float32 +agc_emax_get(agc_t *agc) +{ + return MFCC2FLOAT(agc->max); +} + +void +agc_emax(agc_t *agc, mfcc_t **mfc, int32 n_frame) +{ + int i; + + if (n_frame <= 0) + return; + for (i = 0; i < n_frame; ++i) { + if (mfc[i][0] > agc->obs_max) { + agc->obs_max = mfc[i][0]; + agc->obs_frame = 1; + } + mfc[i][0] -= agc->max; + } +} + +/* Update estimated max for next utterance */ +void +agc_emax_update(agc_t *agc) +{ + if (agc->obs_frame) { /* Update only if some data observed */ + agc->obs_max_sum += agc->obs_max; + agc->obs_utt++; + + /* Re-estimate max over past history; decay the history */ + agc->max = agc->obs_max_sum / agc->obs_utt; + if (agc->obs_utt == 16) { + agc->obs_max_sum /= 2; + agc->obs_utt = 8; + } + } + E_INFO("AGCEMax: obs= %.2f, new= %.2f\n", agc->obs_max, agc->max); + + /* Reset the accumulators for the next utterance. */ + agc->obs_frame = 0; + agc->obs_max = FLOAT2MFCC(-1000.0); /* Less than any real C0 value (hopefully!!) */ +} + +void +agc_noise(agc_t *agc, + mfcc_t **cep, + int32 nfr) +{ + mfcc_t min_energy; /* Minimum log-energy */ + mfcc_t noise_level; /* Average noise_level */ + int32 i; /* frame index */ + int32 noise_frames; /* Number of noise frames */ + + /* Determine minimum log-energy in utterance */ + min_energy = cep[0][0]; + for (i = 0; i < nfr; ++i) { + if (cep[i][0] < min_energy) + min_energy = cep[i][0]; + } + + /* Average all frames between min_energy and min_energy + agc->noise_thresh */ + noise_frames = 0; + noise_level = 0; + min_energy += agc->noise_thresh; + for (i = 0; i < nfr; ++i) { + if (cep[i][0] < min_energy) { + noise_level += cep[i][0]; + noise_frames++; + } + } + + if (noise_frames > 0) { + noise_level /= noise_frames; + E_INFO("AGC NOISE: max= %6.3f\n", MFCC2FLOAT(noise_level)); + /* Subtract noise_level from all log_energy values */ + for (i = 0; i < nfr; i++) { + cep[i][0] -= noise_level; + } + } +} + +void +agc_set_threshold(agc_t *agc, float32 threshold) +{ + agc->noise_thresh = FLOAT2MFCC(threshold); +} + +float32 +agc_get_threshold(agc_t *agc) +{ + return FLOAT2MFCC(agc->noise_thresh); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c new file mode 100644 index 0000000..071044b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c @@ -0,0 +1,188 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmn.c -- Various forms of cepstral mean normalization + */ + +#include +#include +#include +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" +#include "sphinxbase/cmn.h" + +/* NOTE! These must match the enum in cmn.h */ +const char *cmn_type_str[] = { + "none", + "batch", + "live" +}; +const char *cmn_alt_type_str[] = { + "none", + "current", + "prior" +}; +static const int n_cmn_type_str = sizeof(cmn_type_str)/sizeof(cmn_type_str[0]); + +cmn_type_t +cmn_type_from_str(const char *str) +{ + int i; + + for (i = 0; i < n_cmn_type_str; ++i) { + if (0 == strcmp(str, cmn_type_str[i]) || 0 == strcmp(str, cmn_alt_type_str[i])) + return (cmn_type_t)i; + } + E_FATAL("Unknown CMN type '%s'\n", str); + return CMN_NONE; +} + +cmn_t * +cmn_init(int32 veclen) +{ + cmn_t *cmn; + cmn = (cmn_t *) ckd_calloc(1, sizeof(cmn_t)); + cmn->veclen = veclen; + cmn->cmn_mean = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->cmn_var = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->sum = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->nframe = 0; + + return cmn; +} + + +void +cmn(cmn_t *cmn, mfcc_t ** mfc, int32 varnorm, int32 n_frame) +{ + mfcc_t *mfcp; + mfcc_t t; + int32 i, f; + int32 n_pos_frame; + + assert(mfc != NULL); + + if (n_frame <= 0) + return; + + /* If cmn->cmn_mean wasn't NULL, we need to zero the contents */ + memset(cmn->cmn_mean, 0, cmn->veclen * sizeof(mfcc_t)); + + /* Find mean cep vector for this utterance */ + for (f = 0, n_pos_frame = 0; f < n_frame; f++) { + mfcp = mfc[f]; + + /* Skip zero energy frames */ + if (mfcp[0] < 0) + continue; + + for (i = 0; i < cmn->veclen; i++) { + cmn->cmn_mean[i] += mfcp[i]; + } + + n_pos_frame++; + } + + for (i = 0; i < cmn->veclen; i++) + cmn->cmn_mean[i] /= n_pos_frame; + + E_INFO("CMN: "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT("\n"); + if (!varnorm) { + /* Subtract mean from each cep vector */ + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + for (i = 0; i < cmn->veclen; i++) + mfcp[i] -= cmn->cmn_mean[i]; + } + } + else { + /* Scale cep vectors to have unit variance along each dimension, and subtract means */ + /* If cmn->cmn_var wasn't NULL, we need to zero the contents */ + memset(cmn->cmn_var, 0, cmn->veclen * sizeof(mfcc_t)); + + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + + for (i = 0; i < cmn->veclen; i++) { + t = mfcp[i] - cmn->cmn_mean[i]; + cmn->cmn_var[i] += MFCCMUL(t, t); + } + } + for (i = 0; i < cmn->veclen; i++) + /* Inverse Std. Dev, RAH added type case from sqrt */ + cmn->cmn_var[i] = FLOAT2MFCC(sqrt((float64)n_frame / MFCC2FLOAT(cmn->cmn_var[i]))); + + for (f = 0; f < n_frame; f++) { + mfcp = mfc[f]; + for (i = 0; i < cmn->veclen; i++) + mfcp[i] = MFCCMUL((mfcp[i] - cmn->cmn_mean[i]), cmn->cmn_var[i]); + } + } +} + +/* + * RAH, free previously allocated memory + */ +void +cmn_free(cmn_t * cmn) +{ + if (cmn != NULL) { + if (cmn->cmn_var) + ckd_free((void *) cmn->cmn_var); + + if (cmn->cmn_mean) + ckd_free((void *) cmn->cmn_mean); + + if (cmn->sum) + ckd_free((void *) cmn->sum); + + ckd_free((void *) cmn); + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c new file mode 100644 index 0000000..59bf975 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c @@ -0,0 +1,163 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" +#include "sphinxbase/cmn.h" + +void +cmn_live_set(cmn_t *cmn, mfcc_t const * vec) +{ + int32 i; + + E_INFO("Update from < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); + + for (i = 0; i < cmn->veclen; i++) { + cmn->cmn_mean[i] = vec[i]; + cmn->sum[i] = vec[i] * CMN_WIN; + } + cmn->nframe = CMN_WIN; + + E_INFO("Update to < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); +} + +static void +cmn_live_shiftwin(cmn_t *cmn) +{ + mfcc_t sf; + int32 i; + + E_INFO("Update from < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); + + sf = FLOAT2MFCC(1.0) / cmn->nframe; + for (i = 0; i < cmn->veclen; i++) + cmn->cmn_mean[i] = cmn->sum[i] / cmn->nframe; /* sum[i] * sf */ + + /* Make the accumulation decay exponentially */ + if (cmn->nframe >= CMN_WIN_HWM) { + sf = CMN_WIN * sf; + for (i = 0; i < cmn->veclen; i++) + cmn->sum[i] = MFCCMUL(cmn->sum[i], sf); + cmn->nframe = CMN_WIN; + } + + E_INFO("Update to < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); +} + +void +cmn_live_update(cmn_t *cmn) +{ + mfcc_t sf; + int32 i; + + if (cmn->nframe <= 0) + return; + + E_INFO("Update from < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); + + /* Update mean buffer */ + sf = FLOAT2MFCC(1.0) / cmn->nframe; + for (i = 0; i < cmn->veclen; i++) + cmn->cmn_mean[i] = cmn->sum[i] / cmn->nframe; /* sum[i] * sf; */ + + /* Make the accumulation decay exponentially */ + if (cmn->nframe > CMN_WIN_HWM) { + sf = CMN_WIN * sf; + for (i = 0; i < cmn->veclen; i++) + cmn->sum[i] = MFCCMUL(cmn->sum[i], sf); + cmn->nframe = CMN_WIN; + } + + E_INFO("Update to < "); + for (i = 0; i < cmn->veclen; i++) + E_INFOCONT("%5.2f ", MFCC2FLOAT(cmn->cmn_mean[i])); + E_INFOCONT(">\n"); +} + +void +cmn_live(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) +{ + int32 i, j; + + if (nfr <= 0) + return; + + if (varnorm) + E_FATAL + ("Variance normalization not implemented in live mode decode\n"); + + for (i = 0; i < nfr; i++) { + + /* Skip zero energy frames */ + if (incep[i][0] < 0) + continue; + + for (j = 0; j < cmn->veclen; j++) { + cmn->sum[j] += incep[i][j]; + incep[i][j] -= cmn->cmn_mean[j]; + } + + ++cmn->nframe; + } + + /* Shift buffer down if we have more than CMN_WIN_HWM frames */ + if (cmn->nframe > CMN_WIN_HWM) + cmn_live_shiftwin(cmn); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c new file mode 100644 index 0000000..1b52147 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c @@ -0,0 +1,1497 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * feat.c -- Feature vector description and cepstra->feature computation. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.22 2006/02/23 03:59:40 arthchan2003 + * Merged from branch SPHINX3_5_2_RCI_IRII_BRANCH: a, Free buffers correctly. b, Fixed dox-doc. + * + * Revision 1.21.4.3 2005/10/17 04:45:57 arthchan2003 + * Free stuffs in cmn and feat corectly. + * + * Revision 1.21.4.2 2005/09/26 02:19:57 arthchan2003 + * Add message to show the directory which the feature is searched for. + * + * Revision 1.21.4.1 2005/07/03 22:55:50 arthchan2003 + * More correct deallocation in feat.c. The cmn deallocation is still not correct at this point. + * + * Revision 1.21 2005/06/22 03:29:35 arthchan2003 + * Makefile.am s for all subdirectory of libs3decoder/ + * + * Revision 1.4 2005/04/21 23:50:26 archan + * Some more refactoring on the how reporting of structures inside kbcore_t is done, it is now 50% nice. Also added class-based LM test case into test-decode.sh.in. At this moment, everything in search mode 5 is already done. It is time to test the idea whether the search can really be used. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 20.Apr.2001 RAH (rhoughton@mediasite.com, ricky.houghton@cs.cmu.edu) + * Adding feat_free() to free allocated memory + * + * 02-Jan-2001 Rita Singh (rsingh@cs.cmu.edu) at Carnegie Mellon University + * Modified feat_s2mfc2feat_block() to handle empty buffers at + * the end of an utterance + * + * 30-Dec-2000 Rita Singh (rsingh@cs.cmu.edu) at Carnegie Mellon University + * Added feat_s2mfc2feat_block() to allow feature computation + * from sequences of blocks of cepstral vectors + * + * 12-Jun-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Major changes to accommodate arbitrary feature input types. Added + * feat_read(), moved various cep2feat functions from other files into + * this one. Also, made this module object-oriented with the feat_t type. + * Changed definition of s2mfc_read to let the caller manage MFC buffers. + * + * 03-Oct-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added unistd.h include. + * + * 02-Oct-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added check for sf argument to s2mfc_read being within file size. + * + * 18-Sep-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added sf, ef parameters to s2mfc_read(). + * + * 10-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added feat_cepsize(). + * Added different feature-handling (s2_4x, s3_1x39 at this point). + * Moved feature-dependent functions to feature-dependent files. + * + * 09-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Moved constant declarations from feat.h into here. + * + * 04-Nov-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/* + * This module encapsulates different feature streams used by the Sphinx group. New + * stream types can be added by augmenting feat_init() and providing an accompanying + * compute_feat function. It also provides a "generic" feature vector definition for + * handling "arbitrary" speech input feature types (see the last section in feat_init()). + * In this case the speech input data should already be feature vectors; no computation, + * such as MFC->feature conversion, is available or needed. + */ + +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244 4996) +#endif + +#include "sphinxbase/fe.h" +#include "sphinxbase/feat.h" +#include "sphinxbase/bio.h" +#include "sphinxbase/pio.h" +#include "sphinxbase/cmn.h" +#include "sphinxbase/agc.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/prim_type.h" +#include "sphinxbase/glist.h" + +#define FEAT_VERSION "1.0" +#define FEAT_DCEP_WIN 2 + +#ifdef DUMP_FEATURES +static void +cep_dump_dbg(feat_t *fcb, mfcc_t **mfc, int32 nfr, const char *text) +{ + int32 i, j; + + E_INFO("%s\n", text); + for (i = 0; i < nfr; i++) { + for (j = 0; j < fcb->cepsize; j++) { + fprintf(stderr, "%f ", MFCC2FLOAT(mfc[i][j])); + } + fprintf(stderr, "\n"); + } +} +static void +feat_print_dbg(feat_t *fcb, mfcc_t ***feat, int32 nfr, const char *text) +{ + E_INFO("%s\n", text); + feat_print(fcb, feat, nfr, stderr); +} +#else /* !DUMP_FEATURES */ +#define cep_dump_dbg(fcb,mfc,nfr,text) +#define feat_print_dbg(fcb,mfc,nfr,text) +#endif + +int32 ** +parse_subvecs(char const *str) +{ + char const *strp; + int32 n, n2, l; + glist_t dimlist; /* List of dimensions in one subvector */ + glist_t veclist; /* List of dimlists (subvectors) */ + int32 **subvec; + gnode_t *gn, *gn2; + + veclist = NULL; + + strp = str; + for (;;) { + dimlist = NULL; + + for (;;) { + if (sscanf(strp, "%d%n", &n, &l) != 1) + E_FATAL("'%s': Couldn't read int32 @pos %d\n", str, + strp - str); + strp += l; + + if (*strp == '-') { + strp++; + + if (sscanf(strp, "%d%n", &n2, &l) != 1) + E_FATAL("'%s': Couldn't read int32 @pos %d\n", str, + strp - str); + strp += l; + } + else + n2 = n; + + if ((n < 0) || (n > n2)) + E_FATAL("'%s': Bad subrange spec ending @pos %d\n", str, + strp - str); + + for (; n <= n2; n++) { + gnode_t *gn; + for (gn = dimlist; gn; gn = gnode_next(gn)) + if (gnode_int32(gn) == n) + break; + if (gn != NULL) + E_FATAL("'%s': Duplicate dimension ending @pos %d\n", + str, strp - str); + + dimlist = glist_add_int32(dimlist, n); + } + + if ((*strp == '\0') || (*strp == '/')) + break; + + if (*strp != ',') + E_FATAL("'%s': Bad delimiter @pos %d\n", str, strp - str); + + strp++; + } + + veclist = glist_add_ptr(veclist, (void *) dimlist); + + if (*strp == '\0') + break; + + assert(*strp == '/'); + strp++; + } + + /* Convert the glists to arrays; remember the glists are in reverse order of the input! */ + n = glist_count(veclist); /* #Subvectors */ + subvec = (int32 **) ckd_calloc(n + 1, sizeof(int32 *)); /* +1 for sentinel */ + subvec[n] = NULL; /* sentinel */ + + for (--n, gn = veclist; (n >= 0) && gn; gn = gnode_next(gn), --n) { + gn2 = (glist_t) gnode_ptr(gn); + + n2 = glist_count(gn2); /* Length of this subvector */ + if (n2 <= 0) + E_FATAL("'%s': 0-length subvector\n", str); + + subvec[n] = (int32 *) ckd_calloc(n2 + 1, sizeof(int32)); /* +1 for sentinel */ + subvec[n][n2] = -1; /* sentinel */ + + for (--n2; (n2 >= 0) && gn2; gn2 = gnode_next(gn2), --n2) + subvec[n][n2] = gnode_int32(gn2); + assert((n2 < 0) && (!gn2)); + } + assert((n < 0) && (!gn)); + + /* Free the glists */ + for (gn = veclist; gn; gn = gnode_next(gn)) { + gn2 = (glist_t) gnode_ptr(gn); + glist_free(gn2); + } + glist_free(veclist); + + return subvec; +} + +void +subvecs_free(int32 **subvecs) +{ + int32 **sv; + + for (sv = subvecs; sv && *sv; ++sv) + ckd_free(*sv); + ckd_free(subvecs); +} + +int +feat_set_subvecs(feat_t *fcb, int32 **subvecs) +{ + int32 **sv; + uint32 n_sv, n_dim, i; + + if (subvecs == NULL) { + subvecs_free(fcb->subvecs); + ckd_free(fcb->sv_buf); + ckd_free(fcb->sv_len); + fcb->n_sv = 0; + fcb->subvecs = NULL; + fcb->sv_len = NULL; + fcb->sv_buf = NULL; + fcb->sv_dim = 0; + return 0; + } + + if (fcb->n_stream != 1) { + E_ERROR("Subvector specifications require single-stream features!"); + return -1; + } + + n_sv = 0; + n_dim = 0; + for (sv = subvecs; sv && *sv; ++sv) { + int32 *d; + + for (d = *sv; d && *d != -1; ++d) { + ++n_dim; + } + ++n_sv; + } + if (n_dim > feat_dimension(fcb)) { + E_ERROR("Total dimensionality of subvector specification %d " + "> feature dimensionality %d\n", n_dim, feat_dimension(fcb)); + return -1; + } + + fcb->n_sv = n_sv; + fcb->subvecs = subvecs; + fcb->sv_len = (uint32 *)ckd_calloc(n_sv, sizeof(*fcb->sv_len)); + fcb->sv_buf = (mfcc_t *)ckd_calloc(n_dim, sizeof(*fcb->sv_buf)); + fcb->sv_dim = n_dim; + for (i = 0; i < n_sv; ++i) { + int32 *d; + for (d = subvecs[i]; d && *d != -1; ++d) { + ++fcb->sv_len[i]; + } + } + + return 0; +} + +/** + * Project feature components to subvectors (if any). + */ +static void +feat_subvec_project(feat_t *fcb, mfcc_t ***inout_feat, uint32 nfr) +{ + uint32 i; + + if (fcb->subvecs == NULL) + return; + for (i = 0; i < nfr; ++i) { + mfcc_t *out; + int32 j; + + out = fcb->sv_buf; + for (j = 0; j < fcb->n_sv; ++j) { + int32 *d; + for (d = fcb->subvecs[j]; d && *d != -1; ++d) { + *out++ = inout_feat[i][0][*d]; + } + } + memcpy(inout_feat[i][0], fcb->sv_buf, fcb->sv_dim * sizeof(*fcb->sv_buf)); + } +} + +mfcc_t *** +feat_array_alloc(feat_t * fcb, int32 nfr) +{ + int32 i, j, k; + mfcc_t *data, *d, ***feat; + + assert(fcb); + assert(nfr > 0); + assert(feat_dimension(fcb) > 0); + + /* Make sure to use the dimensionality of the features *before* + LDA and subvector projection. */ + k = 0; + for (i = 0; i < fcb->n_stream; ++i) + k += fcb->stream_len[i]; + assert((uint32)k >= feat_dimension(fcb)); + assert(k >= fcb->sv_dim); + + feat = + (mfcc_t ***) ckd_calloc_2d(nfr, feat_dimension1(fcb), sizeof(mfcc_t *)); + data = (mfcc_t *) ckd_calloc(nfr * k, sizeof(mfcc_t)); + + for (i = 0; i < nfr; i++) { + d = data + i * k; + for (j = 0; j < feat_dimension1(fcb); j++) { + feat[i][j] = d; + d += feat_dimension2(fcb, j); + } + } + + return feat; +} + +mfcc_t *** +feat_array_realloc(feat_t *fcb, mfcc_t ***old_feat, int32 ofr, int32 nfr) +{ + int32 i, k, cf; + mfcc_t*** new_feat; + + assert(fcb); + assert(nfr > 0); + assert(ofr > 0); + assert(feat_dimension(fcb) > 0); + + /* Make sure to use the dimensionality of the features *before* + LDA and subvector projection. */ + k = 0; + for (i = 0; i < fcb->n_stream; ++i) + k += fcb->stream_len[i]; + assert((uint32)k >= feat_dimension(fcb)); + assert(k >= fcb->sv_dim); + + new_feat = feat_array_alloc(fcb, nfr); + + cf = (nfr < ofr) ? nfr : ofr; + memcpy(new_feat[0][0], old_feat[0][0], cf * k * sizeof(mfcc_t)); + + feat_array_free(old_feat); + + return new_feat; +} + +void +feat_array_free(mfcc_t ***feat) +{ + ckd_free(feat[0][0]); + ckd_free_2d((void **)feat); +} + +static void +feat_s2_4x_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i, j; + + assert(fcb); + assert(feat_cepsize(fcb) == 13); + assert(feat_n_stream(fcb) == 4); + assert(feat_stream_len(fcb, 0) == 12); + assert(feat_stream_len(fcb, 1) == 24); + assert(feat_stream_len(fcb, 2) == 3); + assert(feat_stream_len(fcb, 3) == 12); + assert(feat_window_size(fcb) == 4); + + /* CEP; skip C0 */ + memcpy(feat[0], mfc[0] + 1, (feat_cepsize(fcb) - 1) * sizeof(mfcc_t)); + + /* + * DCEP(SHORT): mfc[2] - mfc[-2] + * DCEP(LONG): mfc[4] - mfc[-4] + */ + w = mfc[2] + 1; /* +1 to skip C0 */ + _w = mfc[-2] + 1; + + f = feat[1]; + for (i = 0; i < feat_cepsize(fcb) - 1; i++) /* Short-term */ + f[i] = w[i] - _w[i]; + + w = mfc[4] + 1; /* +1 to skip C0 */ + _w = mfc[-4] + 1; + + for (j = 0; j < feat_cepsize(fcb) - 1; i++, j++) /* Long-term */ + f[i] = w[j] - _w[j]; + + /* D2CEP: (mfc[3] - mfc[-1]) - (mfc[1] - mfc[-3]) */ + w1 = mfc[3] + 1; /* Final +1 to skip C0 */ + _w1 = mfc[-1] + 1; + w_1 = mfc[1] + 1; + _w_1 = mfc[-3] + 1; + + f = feat[3]; + for (i = 0; i < feat_cepsize(fcb) - 1; i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } + + /* POW: C0, DC0, D2C0; differences computed as above for rest of cep */ + f = feat[2]; + f[0] = mfc[0][0]; + f[1] = mfc[2][0] - mfc[-2][0]; + + d1 = mfc[3][0] - mfc[-1][0]; + d2 = mfc[1][0] - mfc[-3][0]; + f[2] = d1 - d2; +} + + +static void +feat_s3_1x39_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_cepsize(fcb) == 13); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == 39); + assert(feat_window_size(fcb) == 3); + + /* CEP; skip C0 */ + memcpy(feat[0], mfc[0] + 1, (feat_cepsize(fcb) - 1) * sizeof(mfcc_t)); + /* + * DCEP: mfc[2] - mfc[-2]; + */ + f = feat[0] + feat_cepsize(fcb) - 1; + w = mfc[2] + 1; /* +1 to skip C0 */ + _w = mfc[-2] + 1; + + for (i = 0; i < feat_cepsize(fcb) - 1; i++) + f[i] = w[i] - _w[i]; + + /* POW: C0, DC0, D2C0 */ + f += feat_cepsize(fcb) - 1; + + f[0] = mfc[0][0]; + f[1] = mfc[2][0] - mfc[-2][0]; + + d1 = mfc[3][0] - mfc[-1][0]; + d2 = mfc[1][0] - mfc[-3][0]; + f[2] = d1 - d2; + + /* D2CEP: (mfc[3] - mfc[-1]) - (mfc[1] - mfc[-3]) */ + f += 3; + + w1 = mfc[3] + 1; /* Final +1 to skip C0 */ + _w1 = mfc[-1] + 1; + w_1 = mfc[1] + 1; + _w_1 = mfc[-3] + 1; + + for (i = 0; i < feat_cepsize(fcb) - 1; i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + + +static void +feat_s3_cep(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_window_size(fcb) == 0); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); +} + +static void +feat_s3_cep_dcep(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == (uint32)feat_cepsize(fcb) * 2); + assert(feat_window_size(fcb) == 2); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[2] - mfc[-2]; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[2]; + _w = mfc[-2]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; +} + +static void +feat_1s_c_d_dd_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == (uint32)feat_cepsize(fcb) * 3); + assert(feat_window_size(fcb) == FEAT_DCEP_WIN + 1); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN]; + _w = mfc[-FEAT_DCEP_WIN]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * D2CEP: (mfc[w+1] - mfc[-w+1]) - (mfc[w-1] - mfc[-w-1]), + * where w = FEAT_DCEP_WIN + */ + f += feat_cepsize(fcb); + + w1 = mfc[FEAT_DCEP_WIN + 1]; + _w1 = mfc[-FEAT_DCEP_WIN + 1]; + w_1 = mfc[FEAT_DCEP_WIN - 1]; + _w_1 = mfc[-FEAT_DCEP_WIN - 1]; + + for (i = 0; i < feat_cepsize(fcb); i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + +static void +feat_1s_c_d_ld_dd_cep2feat(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + mfcc_t *f; + mfcc_t *w, *_w; + mfcc_t *w1, *w_1, *_w1, *_w_1; + mfcc_t d1, d2; + int32 i; + + assert(fcb); + assert(feat_n_stream(fcb) == 1); + assert(feat_stream_len(fcb, 0) == (uint32)feat_cepsize(fcb) * 4); + assert(feat_window_size(fcb) == FEAT_DCEP_WIN * 2); + + /* CEP */ + memcpy(feat[0], mfc[0], feat_cepsize(fcb) * sizeof(mfcc_t)); + + /* + * DCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN; + */ + f = feat[0] + feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN]; + _w = mfc[-FEAT_DCEP_WIN]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * LDCEP: mfc[w] - mfc[-w], where w = FEAT_DCEP_WIN * 2; + */ + f += feat_cepsize(fcb); + w = mfc[FEAT_DCEP_WIN * 2]; + _w = mfc[-FEAT_DCEP_WIN * 2]; + + for (i = 0; i < feat_cepsize(fcb); i++) + f[i] = w[i] - _w[i]; + + /* + * D2CEP: (mfc[w+1] - mfc[-w+1]) - (mfc[w-1] - mfc[-w-1]), + * where w = FEAT_DCEP_WIN + */ + f += feat_cepsize(fcb); + + w1 = mfc[FEAT_DCEP_WIN + 1]; + _w1 = mfc[-FEAT_DCEP_WIN + 1]; + w_1 = mfc[FEAT_DCEP_WIN - 1]; + _w_1 = mfc[-FEAT_DCEP_WIN - 1]; + + for (i = 0; i < feat_cepsize(fcb); i++) { + d1 = w1[i] - _w1[i]; + d2 = w_1[i] - _w_1[i]; + + f[i] = d1 - d2; + } +} + +static void +feat_copy(feat_t * fcb, mfcc_t ** mfc, mfcc_t ** feat) +{ + int32 win, i, j; + + win = feat_window_size(fcb); + + /* Concatenate input features */ + for (i = -win; i <= win; ++i) { + uint32 spos = 0; + + for (j = 0; j < feat_n_stream(fcb); ++j) { + uint32 stream_len; + + /* Unscale the stream length by the window. */ + stream_len = feat_stream_len(fcb, j) / (2 * win + 1); + memcpy(feat[j] + ((i + win) * stream_len), + mfc[i] + spos, + stream_len * sizeof(mfcc_t)); + spos += stream_len; + } + } +} + +feat_t * +feat_init(char const *type, cmn_type_t cmn, int32 varnorm, + agc_type_t agc, int32 breport, int32 cepsize) +{ + feat_t *fcb; + + if (cepsize == 0) + cepsize = 13; + if (breport) + E_INFO + ("Initializing feature stream to type: '%s', ceplen=%d, CMN='%s', VARNORM='%s', AGC='%s'\n", + type, cepsize, cmn_type_str[cmn], varnorm ? "yes" : "no", agc_type_str[agc]); + + fcb = (feat_t *) ckd_calloc(1, sizeof(feat_t)); + fcb->refcount = 1; + fcb->name = (char *) ckd_salloc(type); + if (strcmp(type, "s2_4x") == 0) { + /* Sphinx-II format 4-stream feature (Hack!! hardwired constants below) */ + if (cepsize != 13) { + E_ERROR("s2_4x features require cepsize == 13\n"); + ckd_free(fcb); + return NULL; + } + fcb->cepsize = 13; + fcb->n_stream = 4; + fcb->stream_len = (uint32 *) ckd_calloc(4, sizeof(uint32)); + fcb->stream_len[0] = 12; + fcb->stream_len[1] = 24; + fcb->stream_len[2] = 3; + fcb->stream_len[3] = 12; + fcb->out_dim = 51; + fcb->window_size = 4; + fcb->compute_feat = feat_s2_4x_cep2feat; + } + else if ((strcmp(type, "s3_1x39") == 0) || (strcmp(type, "1s_12c_12d_3p_12dd") == 0)) { + /* 1-stream cep/dcep/pow/ddcep (Hack!! hardwired constants below) */ + if (cepsize != 13) { + E_ERROR("s2_4x features require cepsize == 13\n"); + ckd_free(fcb); + return NULL; + } + fcb->cepsize = 13; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = 39; + fcb->out_dim = 39; + fcb->window_size = 3; + fcb->compute_feat = feat_s3_1x39_cep2feat; + } + else if (strncmp(type, "1s_c_d_dd", 9) == 0) { + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = cepsize * 3; + fcb->out_dim = cepsize * 3; + fcb->window_size = FEAT_DCEP_WIN + 1; /* ddcep needs the extra 1 */ + fcb->compute_feat = feat_1s_c_d_dd_cep2feat; + } + else if (strncmp(type, "1s_c_d_ld_dd", 12) == 0) { + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = cepsize * 4; + fcb->out_dim = cepsize * 4; + fcb->window_size = FEAT_DCEP_WIN * 2; + fcb->compute_feat = feat_1s_c_d_ld_dd_cep2feat; + } + else if (strncmp(type, "cep_dcep", 8) == 0 || strncmp(type, "1s_c_d", 6) == 0) { + /* 1-stream cep/dcep */ + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb) * 2; + fcb->out_dim = fcb->stream_len[0]; + fcb->window_size = 2; + fcb->compute_feat = feat_s3_cep_dcep; + } + else if (strncmp(type, "cep", 3) == 0 || strncmp(type, "1s_c", 4) == 0) { + /* 1-stream cep */ + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb); + fcb->out_dim = fcb->stream_len[0]; + fcb->window_size = 0; + fcb->compute_feat = feat_s3_cep; + } + else if (strncmp(type, "1s_3c", 5) == 0 || strncmp(type, "1s_4c", 5) == 0) { + /* 1-stream cep with frames concatenated, so called cepwin features */ + if (strncmp(type, "1s_3c", 5) == 0) + fcb->window_size = 3; + else + fcb->window_size = 4; + + fcb->cepsize = cepsize; + fcb->n_stream = 1; + fcb->stream_len = (uint32 *) ckd_calloc(1, sizeof(uint32)); + fcb->stream_len[0] = feat_cepsize(fcb) * (2 * fcb->window_size + 1); + fcb->out_dim = fcb->stream_len[0]; + fcb->compute_feat = feat_copy; + } + else { + int32 i, k, l; + size_t len; + char *strp; + char *mtype = ckd_salloc(type); + char *wd = ckd_salloc(type); + /* + * Generic definition: Format should be %d,%d,%d,...,%d (i.e., + * comma separated list of feature stream widths; #items = + * #streams). An optional window size (frames will be + * concatenated) is also allowed, which can be specified with + * a colon after the list of feature streams. + */ + len = strlen(mtype); + k = 0; + for (i = 1; (size_t)i < len - 1; i++) { + if (mtype[i] == ',') { + mtype[i] = ' '; + k++; + } + else if (mtype[i] == ':') { + mtype[i] = '\0'; + fcb->window_size = atoi(mtype + i + 1); + break; + } + } + k++; /* Presumably there are (#commas+1) streams */ + fcb->n_stream = k; + fcb->stream_len = (uint32 *) ckd_calloc(k, sizeof(uint32)); + + /* Scan individual feature stream lengths */ + strp = mtype; + i = 0; + fcb->out_dim = 0; + fcb->cepsize = 0; + while (sscanf(strp, "%s%n", wd, &l) == 1) { + strp += l; + if ((i >= fcb->n_stream) + || (sscanf(wd, "%u", &(fcb->stream_len[i])) != 1) + || (fcb->stream_len[i] <= 0)) + E_FATAL("Bad feature type argument\n"); + /* Input size before windowing */ + fcb->cepsize += fcb->stream_len[i]; + if (fcb->window_size > 0) + fcb->stream_len[i] *= (fcb->window_size * 2 + 1); + /* Output size after windowing */ + fcb->out_dim += fcb->stream_len[i]; + i++; + } + if (i != fcb->n_stream) + E_FATAL("Bad feature type argument\n"); + if (fcb->cepsize != cepsize) + E_FATAL("Bad feature type argument\n"); + + /* Input is already the feature stream */ + fcb->compute_feat = feat_copy; + ckd_free(mtype); + ckd_free(wd); + } + + if (cmn != CMN_NONE) + fcb->cmn_struct = cmn_init(feat_cepsize(fcb)); + fcb->cmn = cmn; + fcb->varnorm = varnorm; + if (agc != AGC_NONE) { + fcb->agc_struct = agc_init(); + /* + * No need to check if agc is set to EMAX; agc_emax_set() changes only emax related things + * Moreover, if agc is not NONE and block mode is used, feat_agc() SILENTLY + * switches to EMAX + */ + /* HACK: hardwired initial estimates based on use of CMN (from Sphinx2) */ + agc_emax_set(fcb->agc_struct, (cmn != CMN_NONE) ? 5.0 : 10.0); + } + fcb->agc = agc; + /* + * Make sure this buffer is large enough to be used in feat_s2mfc2feat_block_utt() + */ + fcb->cepbuf = (mfcc_t **) ckd_calloc_2d((LIVEBUFBLOCKSIZE < feat_window_size(fcb) * 2) ? feat_window_size(fcb) * 2 : LIVEBUFBLOCKSIZE, + feat_cepsize(fcb), + sizeof(mfcc_t)); + /* This one is actually just an array of pointers to "flatten out" + * wraparounds. */ + fcb->tmpcepbuf = (mfcc_t** )ckd_calloc(2 * feat_window_size(fcb) + 1, + sizeof(*fcb->tmpcepbuf)); + + return fcb; +} + + +void +feat_print(feat_t * fcb, mfcc_t *** feat, int32 nfr, FILE * fp) +{ + uint32 i, j, k; + + for (i = 0; i < (uint32)nfr; i++) { + fprintf(fp, "%8d:\n", i); + + for (j = 0; j < (uint32)feat_dimension1(fcb); j++) { + fprintf(fp, "\t%2d:", j); + + for (k = 0; k < feat_dimension2(fcb, j); k++) + fprintf(fp, " %8.4f", MFCC2FLOAT(feat[i][j][k])); + fprintf(fp, "\n"); + } + } + + fflush(fp); +} + +static void +feat_cmn(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 beginutt, int32 endutt) +{ + cmn_type_t cmn_type = fcb->cmn; + + if (!(beginutt && endutt) + && cmn_type != CMN_NONE) /* Only cmn_prior in block computation mode. */ + fcb->cmn = cmn_type = CMN_LIVE; + + switch (cmn_type) { + case CMN_BATCH: + cmn(fcb->cmn_struct, mfc, fcb->varnorm, nfr); + break; + case CMN_LIVE: + cmn_live(fcb->cmn_struct, mfc, fcb->varnorm, nfr); + if (endutt) + cmn_live_update(fcb->cmn_struct); + break; + default: + ; + } + cep_dump_dbg(fcb, mfc, nfr, "After CMN"); +} + +static void +feat_agc(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 beginutt, int32 endutt) +{ + agc_type_t agc_type = fcb->agc; + + if (!(beginutt && endutt) + && agc_type != AGC_NONE) /* Only agc_emax in block computation mode. */ + agc_type = AGC_EMAX; + + switch (agc_type) { + case AGC_MAX: + agc_max(fcb->agc_struct, mfc, nfr); + break; + case AGC_EMAX: + agc_emax(fcb->agc_struct, mfc, nfr); + if (endutt) + agc_emax_update(fcb->agc_struct); + break; + case AGC_NOISE: + agc_noise(fcb->agc_struct, mfc, nfr); + break; + default: + ; + } + cep_dump_dbg(fcb, mfc, nfr, "After AGC"); +} + +static void +feat_compute_utt(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 win, mfcc_t ***feat) +{ + int32 i; + + cep_dump_dbg(fcb, mfc, nfr, "Incoming features (after padding)"); + + /* Create feature vectors */ + for (i = win; i < nfr - win; i++) { + fcb->compute_feat(fcb, mfc + i, feat[i - win]); + } + + feat_print_dbg(fcb, feat, nfr - win * 2, "After dynamic feature computation"); + + if (fcb->lda) { + feat_lda_transform(fcb, feat, nfr - win * 2); + feat_print_dbg(fcb, feat, nfr - win * 2, "After LDA"); + } + + if (fcb->subvecs) { + feat_subvec_project(fcb, feat, nfr - win * 2); + feat_print_dbg(fcb, feat, nfr - win * 2, "After subvector projection"); + } +} + + +/** + * Read Sphinx-II format mfc file (s2mfc = Sphinx-II format MFC data). + * If out_mfc is NULL, no actual reading will be done, and the number of + * frames (plus padding) that would be read is returned. + * + * It's important that normalization is done before padding because + * frames outside the data we are interested in shouldn't be taken + * into normalization stats. + * + * @return # frames read (plus padding) if successful, -1 if + * error (e.g., mfc array too small). + */ +static int32 +feat_s2mfc_read_norm_pad(feat_t *fcb, char *file, int32 win, + int32 sf, int32 ef, + mfcc_t ***out_mfc, + int32 maxfr, + int32 cepsize) +{ + FILE *fp; + int32 n_float32; + float32 *float_feat; + struct stat statbuf; + int32 i, n, byterev; + int32 start_pad, end_pad; + mfcc_t **mfc; + + /* Initialize the output pointer to NULL, so that any attempts to + free() it if we fail before allocating it will not segfault! */ + if (out_mfc) + *out_mfc = NULL; + E_INFO("Reading mfc file: '%s'[%d..%d]\n", file, sf, ef); + if (ef >= 0 && ef <= sf) { + E_ERROR("%s: End frame (%d) <= Start frame (%d)\n", file, ef, sf); + return -1; + } + + /* Find filesize; HACK!! To get around intermittent NFS failures, use stat_retry */ + if ((stat_retry(file, &statbuf) < 0) + || ((fp = fopen(file, "rb")) == NULL)) { + E_ERROR_SYSTEM("Failed to open file '%s' for reading", file); + return -1; + } + + /* Read #floats in header */ + if (fread_retry(&n_float32, sizeof(int32), 1, fp) != 1) { + E_ERROR("%s: fread(#floats) failed\n", file); + fclose(fp); + return -1; + } + + /* Check if n_float32 matches file size */ + byterev = 0; + if ((int32) (n_float32 * sizeof(float32) + 4) != (int32) statbuf.st_size) { /* RAH, typecast both sides to remove compile warning */ + n = n_float32; + SWAP_INT32(&n); + + if ((int32) (n * sizeof(float32) + 4) != (int32) (statbuf.st_size)) { /* RAH, typecast both sides to remove compile warning */ + E_ERROR + ("%s: Header size field: %d(%08x); filesize: %d(%08x)\n", + file, n_float32, n_float32, statbuf.st_size, + statbuf.st_size); + fclose(fp); + return -1; + } + + n_float32 = n; + byterev = 1; + } + if (n_float32 <= 0) { + E_ERROR("%s: Header size field (#floats) = %d\n", file, n_float32); + fclose(fp); + return -1; + } + + /* Convert n to #frames of input */ + n = n_float32 / cepsize; + if (n * cepsize != n_float32) { + E_ERROR("Header size field: %d; not multiple of %d\n", n_float32, + cepsize); + fclose(fp); + return -1; + } + + /* Check start and end frames */ + if (sf > 0) { + if (sf >= n) { + E_ERROR("%s: Start frame (%d) beyond file size (%d)\n", file, + sf, n); + fclose(fp); + return -1; + } + } + if (ef < 0) + ef = n-1; + else if (ef >= n) { + E_WARN("%s: End frame (%d) beyond file size (%d), will truncate\n", + file, ef, n); + ef = n-1; + } + + /* Add window to start and end frames */ + sf -= win; + ef += win; + if (sf < 0) { + start_pad = -sf; + sf = 0; + } + else + start_pad = 0; + if (ef >= n) { + end_pad = ef - n + 1; + ef = n - 1; + } + else + end_pad = 0; + + /* Limit n if indicated by [sf..ef] */ + if ((ef - sf + 1) < n) + n = (ef - sf + 1); + if (maxfr > 0 && n + start_pad + end_pad > maxfr) { + E_ERROR("%s: Maximum output size(%d frames) < actual #frames(%d)\n", + file, maxfr, n + start_pad + end_pad); + fclose(fp); + return -1; + } + + /* If no output buffer was supplied, then skip the actual data reading. */ + if (out_mfc != NULL) { + /* Position at desired start frame and read actual MFC data */ + mfc = (mfcc_t **)ckd_calloc_2d(n + start_pad + end_pad, cepsize, sizeof(mfcc_t)); + if (sf > 0) + fseek(fp, sf * cepsize * sizeof(float32), SEEK_CUR); + n_float32 = n * cepsize; +#ifdef FIXED_POINT + float_feat = ckd_calloc(n_float32, sizeof(float32)); +#else + float_feat = mfc[start_pad]; +#endif + if (fread_retry(float_feat, sizeof(float32), n_float32, fp) != n_float32) { + E_ERROR("%s: fread(%dx%d) (MFC data) failed\n", file, n, cepsize); + ckd_free_2d(mfc); + fclose(fp); + return -1; + } + if (byterev) { + for (i = 0; i < n_float32; i++) { + SWAP_FLOAT32(&float_feat[i]); + } + } +#ifdef FIXED_POINT + for (i = 0; i < n_float32; ++i) { + mfc[start_pad][i] = FLOAT2MFCC(float_feat[i]); + } + ckd_free(float_feat); +#endif + + /* Normalize */ + feat_cmn(fcb, mfc + start_pad, n, 1, 1); + feat_agc(fcb, mfc + start_pad, n, 1, 1); + + /* Replicate start and end frames if necessary. */ + for (i = 0; i < start_pad; ++i) + memcpy(mfc[i], mfc[start_pad], cepsize * sizeof(mfcc_t)); + for (i = 0; i < end_pad; ++i) + memcpy(mfc[start_pad + n + i], mfc[start_pad + n - 1], + cepsize * sizeof(mfcc_t)); + + *out_mfc = mfc; + } + + fclose(fp); + return n + start_pad + end_pad; +} + + + +int32 +feat_s2mfc2feat(feat_t * fcb, const char *file, const char *dir, const char *cepext, + int32 sf, int32 ef, mfcc_t *** feat, int32 maxfr) +{ + char *path; + char *ps = "/"; + int32 win, nfr; + size_t file_length, cepext_length, path_length = 0; + mfcc_t **mfc; + + if (fcb->cepsize <= 0) { + E_ERROR("Bad cepsize: %d\n", fcb->cepsize); + return -1; + } + + if (cepext == NULL) + cepext = ""; + + /* + * Create mfc filename, combining file, dir and extension if + * necessary + */ + + /* + * First we decide about the path. If dir is defined, then use + * it. Otherwise assume the filename already contains the path. + */ + if (dir == NULL) { + dir = ""; + ps = ""; + /* + * This is not true but some 3rd party apps + * may parse the output explicitly checking for this line + */ + E_INFO("At directory . (current directory)\n"); + } + else { + E_INFO("At directory %s\n", dir); + /* + * Do not forget the path separator! + */ + path_length += strlen(dir) + 1; + } + + /* + * Include cepext, if it's not already part of the filename. + */ + file_length = strlen(file); + cepext_length = strlen(cepext); + if ((file_length > cepext_length) + && (strcmp(file + file_length - cepext_length, cepext) == 0)) { + cepext = ""; + cepext_length = 0; + } + + /* + * Do not forget the '\0' + */ + path_length += file_length + cepext_length + 1; + path = (char*) ckd_calloc(path_length, sizeof(char)); + +#ifdef HAVE_SNPRINTF + /* + * Paranoia is our best friend... + */ + while ((file_length = snprintf(path, path_length, "%s%s%s%s", dir, ps, file, cepext)) > path_length) { + path_length = file_length; + path = (char*) ckd_realloc(path, path_length * sizeof(char)); + } +#else + sprintf(path, "%s%s%s%s", dir, ps, file, cepext); +#endif + + win = feat_window_size(fcb); + /* Pad maxfr with win, so we read enough raw feature data to + * calculate the requisite number of dynamic features. */ + if (maxfr >= 0) + maxfr += win * 2; + + if (feat != NULL) { + /* Read mfc file including window or padding if necessary. */ + nfr = feat_s2mfc_read_norm_pad(fcb, path, win, sf, ef, &mfc, maxfr, fcb->cepsize); + ckd_free(path); + if (nfr < 0) { + ckd_free_2d((void **) mfc); + return -1; + } + + /* Actually compute the features */ + feat_compute_utt(fcb, mfc, nfr, win, feat); + + ckd_free_2d((void **) mfc); + } + else { + /* Just calculate the number of frames we would need. */ + nfr = feat_s2mfc_read_norm_pad(fcb, path, win, sf, ef, NULL, maxfr, fcb->cepsize); + ckd_free(path); + if (nfr < 0) + return nfr; + } + + + return (nfr - win * 2); +} + +static int32 +feat_s2mfc2feat_block_utt(feat_t * fcb, mfcc_t ** uttcep, + int32 nfr, mfcc_t *** ofeat) +{ + mfcc_t **cepbuf; + int32 i, win, cepsize; + + win = feat_window_size(fcb); + cepsize = feat_cepsize(fcb); + + /* Copy and pad out the utterance (this requires that the + * feature computation functions always access the buffer via + * the frame pointers, which they do) */ + cepbuf = (mfcc_t **)ckd_calloc(nfr + win * 2, sizeof(mfcc_t *)); + memcpy(cepbuf + win, uttcep, nfr * sizeof(mfcc_t *)); + + /* Do normalization before we interpolate on the boundary */ + feat_cmn(fcb, cepbuf + win, nfr, 1, 1); + feat_agc(fcb, cepbuf + win, nfr, 1, 1); + + /* Now interpolate */ + for (i = 0; i < win; ++i) { + cepbuf[i] = fcb->cepbuf[i]; + memcpy(cepbuf[i], uttcep[0], cepsize * sizeof(mfcc_t)); + cepbuf[nfr + win + i] = fcb->cepbuf[win + i]; + memcpy(cepbuf[nfr + win + i], uttcep[nfr - 1], cepsize * sizeof(mfcc_t)); + } + /* Compute as usual. */ + feat_compute_utt(fcb, cepbuf, nfr + win * 2, win, ofeat); + ckd_free(cepbuf); + return nfr; +} + +int32 +feat_s2mfc2feat_live(feat_t * fcb, mfcc_t ** uttcep, int32 *inout_ncep, + int32 beginutt, int32 endutt, mfcc_t *** ofeat) +{ + int32 win, cepsize, nbufcep; + int32 i, j, nfeatvec; + int32 zero = 0; + + /* Avoid having to check this everywhere. */ + if (inout_ncep == NULL) inout_ncep = &zero; + + /* Special case for entire utterances. */ + if (beginutt && endutt && *inout_ncep > 0) + return feat_s2mfc2feat_block_utt(fcb, uttcep, *inout_ncep, ofeat); + + win = feat_window_size(fcb); + cepsize = feat_cepsize(fcb); + + /* Empty the input buffer on start of utterance. */ + if (beginutt) + fcb->bufpos = fcb->curpos; + + /* Calculate how much data is in the buffer already. */ + nbufcep = fcb->bufpos - fcb->curpos; + if (nbufcep < 0) + nbufcep = fcb->bufpos + LIVEBUFBLOCKSIZE - fcb->curpos; + /* Add any data that we have to replicate. */ + if (beginutt && *inout_ncep > 0) + nbufcep += win; + if (endutt) + nbufcep += win; + + /* Only consume as much input as will fit in the buffer. */ + if (nbufcep + *inout_ncep > LIVEBUFBLOCKSIZE) { + /* We also can't overwrite the trailing window, hence the + * reason why win is subtracted here. */ + *inout_ncep = LIVEBUFBLOCKSIZE - nbufcep - win; + /* Cancel end of utterance processing. */ + endutt = FALSE; + } + + /* FIXME: Don't modify the input! */ + feat_cmn(fcb, uttcep, *inout_ncep, beginutt, endutt); + feat_agc(fcb, uttcep, *inout_ncep, beginutt, endutt); + + /* Replicate first frame into the first win frames if we're at the + * beginning of the utterance and there was some actual input to + * deal with. (FIXME: Not entirely sure why that condition) */ + if (beginutt && *inout_ncep > 0) { + for (i = 0; i < win; i++) { + memcpy(fcb->cepbuf[fcb->bufpos++], uttcep[0], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + } + /* Move the current pointer past this data. */ + fcb->curpos = fcb->bufpos; + nbufcep -= win; + } + + /* Copy in frame data to the circular buffer. */ + for (i = 0; i < *inout_ncep; ++i) { + memcpy(fcb->cepbuf[fcb->bufpos++], uttcep[i], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + ++nbufcep; + } + + /* Replicate last frame into the last win frames if we're at the + * end of the utterance (even if there was no input, so we can + * flush the output). */ + if (endutt) { + int32 tpos; /* Index of last input frame. */ + if (fcb->bufpos == 0) + tpos = LIVEBUFBLOCKSIZE - 1; + else + tpos = fcb->bufpos - 1; + for (i = 0; i < win; ++i) { + memcpy(fcb->cepbuf[fcb->bufpos++], fcb->cepbuf[tpos], + cepsize * sizeof(mfcc_t)); + fcb->bufpos %= LIVEBUFBLOCKSIZE; + } + } + + /* We have to leave the trailing window of frames. */ + nfeatvec = nbufcep - win; + if (nfeatvec <= 0) + return 0; /* Do nothing. */ + + for (i = 0; i < nfeatvec; ++i) { + /* Handle wraparound cases. */ + if (fcb->curpos - win < 0 || fcb->curpos + win >= LIVEBUFBLOCKSIZE) { + /* Use tmpcepbuf for this case. Actually, we just need the pointers. */ + for (j = -win; j <= win; ++j) { + int32 tmppos = + (fcb->curpos + j + LIVEBUFBLOCKSIZE) % LIVEBUFBLOCKSIZE; + fcb->tmpcepbuf[win + j] = fcb->cepbuf[tmppos]; + } + fcb->compute_feat(fcb, fcb->tmpcepbuf + win, ofeat[i]); + } + else { + fcb->compute_feat(fcb, fcb->cepbuf + fcb->curpos, ofeat[i]); + } + /* Move the read pointer forward. */ + ++fcb->curpos; + fcb->curpos %= LIVEBUFBLOCKSIZE; + } + + if (fcb->lda) + feat_lda_transform(fcb, ofeat, nfeatvec); + + if (fcb->subvecs) + feat_subvec_project(fcb, ofeat, nfeatvec); + + return nfeatvec; +} + +void +feat_update_stats(feat_t *fcb) +{ + if (fcb->cmn == CMN_LIVE) { + cmn_live_update(fcb->cmn_struct); + } + if (fcb->agc == AGC_EMAX || fcb->agc == AGC_MAX) { + agc_emax_update(fcb->agc_struct); + } +} + +feat_t * +feat_retain(feat_t *f) +{ + ++f->refcount; + return f; +} + +int +feat_free(feat_t * f) +{ + if (f == NULL) + return 0; + if (--f->refcount > 0) + return f->refcount; + + if (f->cepbuf) + ckd_free_2d((void **) f->cepbuf); + ckd_free(f->tmpcepbuf); + + if (f->name) { + ckd_free((void *) f->name); + } + if (f->lda) + ckd_free_3d((void ***) f->lda); + + ckd_free(f->stream_len); + ckd_free(f->sv_len); + ckd_free(f->sv_buf); + subvecs_free(f->subvecs); + + cmn_free(f->cmn_struct); + agc_free(f->agc_struct); + + ckd_free(f); + return 0; +} + + +void +feat_report(feat_t * f) +{ + int i; + E_INFO_NOFN("Initialization of feat_t, report:\n"); + E_INFO_NOFN("Feature type = %s\n", f->name); + E_INFO_NOFN("Cepstral size = %d\n", f->cepsize); + E_INFO_NOFN("Number of streams = %d\n", f->n_stream); + for (i = 0; i < f->n_stream; i++) { + E_INFO_NOFN("Vector size of stream[%d]: %d\n", i, + f->stream_len[i]); + } + E_INFO_NOFN("Number of subvectors = %d\n", f->n_sv); + for (i = 0; i < f->n_sv; i++) { + int32 *sv; + + E_INFO_NOFN("Components of subvector[%d]:", i); + for (sv = f->subvecs[i]; sv && *sv != -1; ++sv) + E_INFOCONT(" %d", *sv); + E_INFOCONT("\n"); + } + E_INFO_NOFN("Whether CMN is used = %d\n", f->cmn); + E_INFO_NOFN("Whether AGC is used = %d\n", f->agc); + E_INFO_NOFN("Whether variance is normalized = %d\n", f->varnorm); + E_INFO_NOFN("\n"); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c new file mode 100644 index 0000000..ac1b6cc --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c @@ -0,0 +1,158 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * lda.c -- Read and apply LDA matrices to features. + * + * Author: David Huggins-Daines + */ + +#include +#include +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4018) +#endif + +#include "sphinxbase/feat.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/bio.h" +#include "sphinxbase/err.h" + +#define MATRIX_FILE_VERSION "0.1" + +int32 +feat_read_lda(feat_t *feat, const char *ldafile, int32 dim) +{ + FILE *fh; + int32 byteswap; + uint32 chksum, i, m, n; + char **argname, **argval; + + assert(feat); + if (feat->n_stream != 1) { + E_ERROR("LDA incompatible with multi-stream features (n_stream = %d)\n", + feat->n_stream); + return -1; + } + + if ((fh = fopen(ldafile, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open transform file '%s' for reading", ldafile); + return -1; + } + + if (bio_readhdr(fh, &argname, &argval, &byteswap) < 0) { + E_ERROR("Failed to read header from transform file '%s'\n", ldafile); + fclose(fh); + return -1; + } + + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], MATRIX_FILE_VERSION) != 0) + E_WARN("%s: Version mismatch: %s, expecting %s\n", + ldafile, argval[i], MATRIX_FILE_VERSION); + } + } + + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + if (feat->lda) + ckd_free_3d((void ***)feat->lda); + + { + /* Use a temporary variable to avoid strict-aliasing problems. */ + void ***outlda; + + if (bio_fread_3d(&outlda, sizeof(float32), + &feat->n_lda, &m, &n, + fh, byteswap, &chksum) < 0) { + E_ERROR_SYSTEM("%s: bio_fread_3d(lda) failed\n", ldafile); + fclose(fh); + return -1; + } + feat->lda = (void *)outlda; + } + fclose(fh); + +#ifdef FIXED_POINT + /* FIXME: This is a fragile hack that depends on mfcc_t and + * float32 being the same size (which they are, but...) */ + for (i = 0; i < feat->n_lda * m * n; ++i) { + feat->lda[0][0][i] = FLOAT2MFCC(((float *)feat->lda[0][0])[i]); + } +#endif + + /* Note that SphinxTrain stores the eigenvectors as row vectors. */ + if (n != feat->stream_len[0]) + E_FATAL("LDA matrix dimension %d doesn't match feature stream size %d\n", n, feat->stream_len[0]); + + /* Override dim from file if it is 0 or greater than m. */ + if ((uint32)dim > m || dim <= 0) { + dim = m; + } + feat->out_dim = dim; + + return 0; +} + +void +feat_lda_transform(feat_t *fcb, mfcc_t ***inout_feat, uint32 nfr) +{ + mfcc_t *tmp; + uint32 i, j, k; + + tmp = ckd_calloc(fcb->stream_len[0], sizeof(mfcc_t)); + for (i = 0; i < nfr; ++i) { + /* Do the matrix multiplication inline here since fcb->lda + * is transposed (eigenvectors in rows not columns). */ + /* FIXME: In the future we ought to use the BLAS. */ + memset(tmp, 0, sizeof(mfcc_t) * fcb->stream_len[0]); + for (j = 0; j < feat_dimension(fcb); ++j) { + for (k = 0; k < fcb->stream_len[0]; ++k) { + tmp[j] += MFCCMUL(inout_feat[i][0][k], fcb->lda[0][j][k]); + } + } + memcpy(inout_feat[i][0], tmp, fcb->stream_len[0] * sizeof(mfcc_t)); + } + ckd_free(tmp); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c new file mode 100644 index 0000000..f51c76e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c @@ -0,0 +1,315 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * fsg_history.c -- FSG Viterbi decode history + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 25-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started.. + */ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "fsg_search_internal.h" +#include "fsg_history.h" + + +#define __FSG_DBG__ 0 + + +fsg_history_t * +fsg_history_init(fsg_model_t * fsg, dict_t *dict) +{ + fsg_history_t *h; + + h = (fsg_history_t *) ckd_calloc(1, sizeof(fsg_history_t)); + h->fsg = fsg; + h->entries = blkarray_list_init(); + + if (fsg && dict) { + h->n_ciphone = bin_mdef_n_ciphone(dict->mdef); + h->frame_entries = + (glist_t **) ckd_calloc_2d(fsg_model_n_state(fsg), + bin_mdef_n_ciphone(dict->mdef), + sizeof(**h->frame_entries)); + } + else { + h->frame_entries = NULL; + } + + return h; +} + +void +fsg_history_free(fsg_history_t *h) +{ + int32 s, lc, ns, np; + gnode_t *gn; + + if (h->fsg) { + ns = fsg_model_n_state(h->fsg); + np = h->n_ciphone; + + for (s = 0; s < ns; s++) { + for (lc = 0; lc < np; lc++) { + for (gn = h->frame_entries[s][lc]; gn; gn = gnode_next(gn)) { + ckd_free(gnode_ptr(gn)); + } + glist_free(h->frame_entries[s][lc]); + } + } + } + ckd_free_2d(h->frame_entries); + blkarray_list_free(h->entries); + ckd_free(h); +} + + +void +fsg_history_set_fsg(fsg_history_t *h, fsg_model_t *fsg, dict_t *dict) +{ + if (blkarray_list_n_valid(h->entries) != 0) { + E_WARN("Switching FSG while history not empty; history cleared\n"); + blkarray_list_reset(h->entries); + } + + if (h->frame_entries) + ckd_free_2d((void **) h->frame_entries); + h->frame_entries = NULL; + h->fsg = fsg; + + if (fsg && dict) { + h->n_ciphone = bin_mdef_n_ciphone(dict->mdef); + h->frame_entries = + (glist_t **) ckd_calloc_2d(fsg_model_n_state(fsg), + bin_mdef_n_ciphone(dict->mdef), + sizeof(glist_t)); + } +} + + +void +fsg_history_entry_add(fsg_history_t * h, + fsg_link_t * link, + int32 frame, int32 score, int32 pred, + int32 lc, fsg_pnode_ctxt_t rc) +{ + fsg_hist_entry_t *entry, *new_entry; + int32 s; + gnode_t *gn, *prev_gn; + + /* Skip the optimization for the initial dummy entries; always enter them */ + if (frame < 0) { + new_entry = + (fsg_hist_entry_t *) ckd_calloc(1, sizeof(fsg_hist_entry_t)); + new_entry->fsglink = link; + new_entry->frame = frame; + new_entry->score = score; + new_entry->pred = pred; + new_entry->lc = lc; + new_entry->rc = rc; + + blkarray_list_append(h->entries, (void *) new_entry); + return; + } + + s = fsg_link_to_state(link); + + /* Locate where this entry should be inserted in frame_entries[s][lc] */ + prev_gn = NULL; + for (gn = h->frame_entries[s][lc]; gn; gn = gnode_next(gn)) { + entry = (fsg_hist_entry_t *) gnode_ptr(gn); + + if (score BETTER_THAN entry->score) + break; /* Found where to insert new entry */ + + /* Existing entry score not worse than new score */ + if (FSG_PNODE_CTXT_SUB(&rc, &(entry->rc)) == 0) + return; /* rc set reduced to 0; new entry can be ignored */ + + prev_gn = gn; + } + + /* Create new entry after prev_gn (if prev_gn is NULL, at head) */ + new_entry = + (fsg_hist_entry_t *) ckd_calloc(1, sizeof(fsg_hist_entry_t)); + new_entry->fsglink = link; + new_entry->frame = frame; + new_entry->score = score; + new_entry->pred = pred; + new_entry->lc = lc; + new_entry->rc = rc; /* Note: rc set must be non-empty at this point */ + + if (!prev_gn) { + h->frame_entries[s][lc] = glist_add_ptr(h->frame_entries[s][lc], + (void *) new_entry); + prev_gn = h->frame_entries[s][lc]; + } + else + prev_gn = glist_insert_ptr(prev_gn, (void *) new_entry); + + /* + * Update the rc set of all the remaining entries in the list. At this + * point, gn is the entry, if any, immediately following new entry. + */ + while (gn) { + entry = (fsg_hist_entry_t *) gnode_ptr(gn); + + if (FSG_PNODE_CTXT_SUB(&(entry->rc), &rc) == 0) { + /* rc set of entry reduced to 0; can prune this entry */ + ckd_free((void *) entry); + gn = gnode_free(gn, prev_gn); + } + else { + prev_gn = gn; + gn = gnode_next(gn); + } + } +} + + +/* + * Transfer the surviving history entries for this frame into the permanent + * history table. + */ +void +fsg_history_end_frame(fsg_history_t * h) +{ + int32 s, lc, ns, np; + gnode_t *gn; + fsg_hist_entry_t *entry; + + ns = fsg_model_n_state(h->fsg); + np = h->n_ciphone; + + for (s = 0; s < ns; s++) { + for (lc = 0; lc < np; lc++) { + for (gn = h->frame_entries[s][lc]; gn; gn = gnode_next(gn)) { + entry = (fsg_hist_entry_t *) gnode_ptr(gn); + blkarray_list_append(h->entries, (void *) entry); + } + + glist_free(h->frame_entries[s][lc]); + h->frame_entries[s][lc] = NULL; + } + } +} + + +fsg_hist_entry_t * +fsg_history_entry_get(fsg_history_t * h, int32 id) +{ + return ((fsg_hist_entry_t *) blkarray_list_get(h->entries, id)); +} + + +void +fsg_history_reset(fsg_history_t * h) +{ + blkarray_list_reset(h->entries); +} + + +int32 +fsg_history_n_entries(fsg_history_t * h) +{ + return (blkarray_list_n_valid(h->entries)); +} + +void +fsg_history_utt_start(fsg_history_t * h) +{ + int32 s, lc, ns, np; + + assert(blkarray_list_n_valid(h->entries) == 0); + assert(h->frame_entries); + + ns = fsg_model_n_state(h->fsg); + np = h->n_ciphone; + + for (s = 0; s < ns; s++) { + for (lc = 0; lc < np; lc++) { + assert(h->frame_entries[s][lc] == NULL); + } + } +} + +void +fsg_history_utt_end(fsg_history_t * h) +{ + (void)h; +} + +void +fsg_history_print(fsg_history_t *h, dict_t *dict) +{ + int bpidx, bp; + + (void)dict; + for (bpidx = 0; bpidx < blkarray_list_n_valid(h->entries); bpidx++) { + bp = bpidx; + printf("History entry: "); + while (bp > 0) { + fsg_hist_entry_t *hist_entry = fsg_history_entry_get(h, bp); + fsg_link_t *fl = fsg_hist_entry_fsglink(hist_entry); + bp = fsg_hist_entry_pred(hist_entry); + if (fl) { + int32 wid = fsg_link_wid(fl); + const char *baseword = fsg_model_word_str(h->fsg, wid); + + printf("%s(%d->%d:%d) ", baseword, + fsg_link_from_state(hist_entry->fsglink), + fsg_link_to_state(hist_entry->fsglink), + hist_entry->frame); + } + } + printf("\n"); + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h new file mode 100644 index 0000000..f30a758 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h @@ -0,0 +1,226 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * fsg_history.h -- FSG Viterbi decode history + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * $Log: fsg_history.h,v $ + * Revision 1.1.1.1 2006/05/23 18:45:02 dhuggins + * re-importation + * + * Revision 1.1 2004/07/16 00:57:12 egouvea + * Added Ravi's implementation of FSG support. + * + * Revision 1.7 2004/07/07 22:30:35 rkm + * *** empty log message *** + * + * Revision 1.6 2004/07/07 13:56:33 rkm + * Added reporting of (acoustic score - best senone score)/frame + * + * Revision 1.5 2004/06/25 14:49:08 rkm + * Optimized size of history table and speed of word transitions by maintaining only best scoring word exits at each state + * + * Revision 1.4 2004/06/23 20:32:16 rkm + * *** empty log message *** + * + * Revision 1.3 2004/05/27 15:16:08 rkm + * *** empty log message *** + * + * + * 25-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started, based on S3.3 version. + */ + + +#ifndef __S2_FSG_HISTORY_H__ +#define __S2_FSG_HISTORY_H__ + + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include "blkarray_list.h" +#include "fsg_lextree.h" +#include "dict.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/* + * The Viterbi history structure. This is a tree, with the root at the + * FSG start state, at frame 0, with a null predecessor. + */ + +/* + * A single Viterbi history entry + */ +typedef struct fsg_hist_entry_s { + fsg_link_t *fsglink; /* Link taken result in this entry */ + int32 score; /* Total path score at the end of this + transition */ + int32 pred; /* Predecessor entry; -1 if none */ + frame_idx_t frame; /* Ending frame for this entry */ + int16 lc; /* Left context provided by this entry to + succeeding words */ + fsg_pnode_ctxt_t rc; /* Possible right contexts to which this entry + applies */ +} fsg_hist_entry_t; + +/* Access macros */ +#define fsg_hist_entry_fsglink(v) ((v)->fsglink) +#define fsg_hist_entry_frame(v) ((v)->frame) +#define fsg_hist_entry_score(v) ((v)->score) +#define fsg_hist_entry_pred(v) ((v)->pred) +#define fsg_hist_entry_lc(v) ((v)->lc) +#define fsg_hist_entry_rc(v) ((v)->rc) + + +/* + * The entire tree of history entries (fsg_history_t.entries). + * Optimization: In a given frame, there may be several history entries, with + * the same left and right phonetic context, terminating in a particular state. + * Only the best scoring one of these needs to be saved, since everything else + * will be pruned according to the Viterbi algorithm. frame_entries is used + * temporarily in each frame to determine these best scoring entries in that + * frame. Only the ones not pruned are transferred to entries at the end of + * the frame. However, null transitions are a problem since they create + * entries that depend on entries created in the CURRENT frame. Hence, this + * pruning is done in two stages: first for the non-null transitions, and then + * for the null transitions alone. (This solution is sub-optimal, and can be + * improved with a little more work. SMOP.) + * Why is frame_entries a list? Each entry has a unique terminating state, + * and has a unique lc CIphone. But it has a SET of rc CIphones. + * frame_entries[s][lc] is an ordered list of entries created in the current + * frame, terminating in state s, and with left context lc. The list is in + * descending order of path score. When a new entry with (s,lc) arrives, + * its position in the list is determined. Then its rc set is modified by + * subtracting the union of the rc's of all its predecessors (i.e., better + * scoring entries). If the resulting rc set is empty, the entry is discarded. + * Otherwise, it is inserted, and the rc sets of all downstream entries in the + * list are updated by subtracting the new entry's rc. If any of them becomes + * empty, it is also discarded. + * As mentioned earlier, this procedure is applied in two stages, for the + * non-null transitions, and the null transitions, separately. + */ +typedef struct fsg_history_s { + fsg_model_t *fsg; /* The FSG for which this object applies */ + blkarray_list_t *entries; /* A list of history table entries; the root + entry is the first element of the list */ + glist_t **frame_entries; + int n_ciphone; +} fsg_history_t; + + +/* + * One-time initialization: Allocate and return an initially empty history + * module. + */ +fsg_history_t *fsg_history_init(fsg_model_t *fsg, dict_t *dict); + +void fsg_history_utt_start(fsg_history_t *h); + +void fsg_history_utt_end(fsg_history_t *h); + + +/* + * Create a history entry recording the completion of the given FSG + * transition, at the end of the given frame, with the given score, and + * the given predecessor history entry. + * The entry is initially temporary, and may be superseded by another + * with a higher score. The surviving entries must be transferred to + * the main history table, via fsg_history_end_frame(). + */ +void fsg_history_entry_add (fsg_history_t *h, + fsg_link_t *l, /* FSG transition */ + int32 frame, + int32 score, + int32 pred, + int32 lc, + fsg_pnode_ctxt_t rc); + +/* + * Transfer the surviving history entries for this frame into the permanent + * history table. This function can be called several times during a frame. + * Each time, the entries surviving so far are transferred, and the temporary + * lists cleared. This feature is used to handle the entries due to non-null + * transitions and null transitions separately. + */ +void fsg_history_end_frame (fsg_history_t *h); + + +/* Clear the hitory table */ +void fsg_history_reset (fsg_history_t *h); + + +/* Return the number of valid entries in the given history table */ +int32 fsg_history_n_entries (fsg_history_t *h); + +/* + * Return a ptr to the history entry for the given ID; NULL if there is no + * such entry. + */ +fsg_hist_entry_t *fsg_history_entry_get(fsg_history_t *h, int32 id); + + +/* + * Switch the FSG associated with the given history module. Should be done + * when the history list is empty. If not empty, the list is cleared. + */ +void fsg_history_set_fsg (fsg_history_t *h, fsg_model_t *fsg, dict_t *dict); + +/* Free the given Viterbi search history object */ +void fsg_history_free (fsg_history_t *h); + +/* Print the entire history */ +void fsg_history_print(fsg_history_t *h, dict_t *dict); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c new file mode 100644 index 0000000..e68f15f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c @@ -0,0 +1,835 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file fsg_lextree.c + * @brief The collection of all the lextrees for the entire FSM. + * @author M K Ravishankar + * @author Bhiksha Raj + */ + +/* System headers. */ +#include +#include +#include + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include "fsg_lextree.h" + +#define __FSG_DBG__ 0 + +/* A linklist structure that is actually used to build local lextrees at grammar nodes */ +typedef struct fsg_glist_linklist_t { + int32 ci, rc; + glist_t glist; + struct fsg_glist_linklist_t *next; +} fsg_glist_linklist_t; + +/** + * Build the phone lextree for all transitions out of state from_state. + * Return the root node of this tree. + * Also, return a linear linked list of all allocated fsg_pnode_t nodes in + * *alloc_head (for memory management purposes). + */ +static fsg_pnode_t *fsg_psubtree_init(fsg_lextree_t *tree, + fsg_model_t *fsg, + int32 from_state, + fsg_pnode_t **alloc_head); + +/** + * Free the given lextree. alloc_head: head of linear list of allocated + * nodes updated by fsg_psubtree_init(). + */ +static void fsg_psubtree_free(fsg_pnode_t *alloc_head); + +/** + * Dump the list of nodes in the given lextree to the given file. alloc_head: + * head of linear list of allocated nodes updated by fsg_psubtree_init(). + */ +static void fsg_psubtree_dump(fsg_lextree_t *tree, fsg_pnode_t *root, FILE *fp); + +/** + * Compute the left and right context CIphone sets for each state. + */ +static void +fsg_lextree_lc_rc(fsg_lextree_t *lextree) +{ + int32 s, i, j; + int32 n_ci; + fsg_model_t *fsg; + int32 silcipid; + int32 len; + + silcipid = bin_mdef_silphone(lextree->mdef); + assert(silcipid >= 0); + n_ci = bin_mdef_n_ciphone(lextree->mdef); + + fsg = lextree->fsg; + /* + * lextree->lc[s] = set of left context CIphones for state s. Similarly, rc[s] + * for right context CIphones. + */ + lextree->lc = ckd_calloc_2d(fsg->n_state, n_ci + 1, sizeof(**lextree->lc)); + lextree->rc = ckd_calloc_2d(fsg->n_state, n_ci + 1, sizeof(**lextree->rc)); + E_INFO("Allocated %d bytes (%d KiB) for left and right context phones\n", + fsg->n_state * (n_ci + 1) * 2, + fsg->n_state * (n_ci + 1) * 2 / 1024); + + + for (s = 0; s < fsg->n_state; s++) { + fsg_arciter_t *itor; + for (itor = fsg_model_arcs(fsg, s); itor; itor = fsg_arciter_next(itor)) { + fsg_link_t *l = fsg_arciter_get(itor); + int32 dictwid; /**< Dictionary (not FSG) word ID!! */ + + if (fsg_link_wid(l) >= 0) { + dictwid = dict_wordid(lextree->dict, + fsg_model_word_str(lextree->fsg, l->wid)); + + /* + * Add the first CIphone of l->wid to the rclist of state s, and + * the last CIphone to lclist of state d. + * (Filler phones are a pain to deal with. There is no direct + * marking of a filler phone; but only filler words are supposed to + * use such phones, so we use that fact. HACK!! FRAGILE!!) + * + * UPD: tests carsh here if .fsg model used with wrong hmm and + * dictionary + */ + if (fsg_model_is_filler(fsg, fsg_link_wid(l))) { + /* Filler phone; use silence phone as context */ + lextree->rc[fsg_link_from_state(l)][silcipid] = 1; + lextree->lc[fsg_link_to_state(l)][silcipid] = 1; + } + else { + len = dict_pronlen(lextree->dict, dictwid); + lextree->rc[fsg_link_from_state(l)][dict_pron(lextree->dict, dictwid, 0)] = 1; + lextree->lc[fsg_link_to_state(l)][dict_pron(lextree->dict, dictwid, len - 1)] = 1; + } + } + } + } + + for (s = 0; s < fsg->n_state; s++) { + /* + * Add SIL phone to the lclist and rclist of each state. Strictly + * speaking, only needed at start and final states, respectively, but + * all states considered since the user may change the start and final + * states. In any case, most applications would have a silence self + * loop at each state, hence these would be needed anyway. + */ + lextree->lc[s][silcipid] = 1; + lextree->rc[s][silcipid] = 1; + } + + /* + * Propagate lc and rc lists past null transitions. (Since FSG contains + * null transitions closure, no need to worry about a chain of successive + * null transitions. Right??) + * + * This can't be joined with the previous loop because we first calculate + * contexts and only then we can propagate them. + */ + for (s = 0; s < fsg->n_state; s++) { + fsg_arciter_t *itor; + for (itor = fsg_model_arcs(fsg, s); itor; itor = fsg_arciter_next(itor)) { + fsg_link_t *l = fsg_arciter_get(itor); + if (fsg_link_wid(l) < 0) { + /* + * lclist(d) |= lclist(s), because all the words ending up at s, can + * now also end at d, becoming the left context for words leaving d. + */ + for (i = 0; i < n_ci; i++) + lextree->lc[fsg_link_to_state(l)][i] |= lextree->lc[fsg_link_from_state(l)][i]; + /* + * Similarly, rclist(s) |= rclist(d), because all the words leaving d + * can equivalently leave s, becoming the right context for words + * ending up at s. + */ + for (i = 0; i < n_ci; i++) + lextree->rc[fsg_link_from_state(l)][i] |= lextree->rc[fsg_link_to_state(l)][i]; + } + } + } + + /* Convert the bit-vector representation into a list */ + for (s = 0; s < fsg->n_state; s++) { + j = 0; + for (i = 0; i < n_ci; i++) { + if (lextree->lc[s][i]) { + lextree->lc[s][j] = i; + j++; + } + } + lextree->lc[s][j] = -1; /* Terminate the list */ + + j = 0; + for (i = 0; i < n_ci; i++) { + if (lextree->rc[s][i]) { + lextree->rc[s][j] = i; + j++; + } + } + lextree->rc[s][j] = -1; /* Terminate the list */ + } +} + +/* + * For now, allocate the entire lextree statically. + */ +fsg_lextree_t * +fsg_lextree_init(fsg_model_t * fsg, dict_t *dict, dict2pid_t *d2p, + bin_mdef_t *mdef, hmm_context_t *ctx, + int32 wip, int32 pip) +{ + int32 s, n_leaves; + fsg_lextree_t *lextree; + fsg_pnode_t *pn; + + lextree = ckd_calloc(1, sizeof(fsg_lextree_t)); + lextree->fsg = fsg; + lextree->root = ckd_calloc(fsg_model_n_state(fsg), + sizeof(fsg_pnode_t *)); + lextree->alloc_head = ckd_calloc(fsg_model_n_state(fsg), + sizeof(fsg_pnode_t *)); + lextree->ctx = ctx; + lextree->dict = dict; + lextree->d2p = d2p; + lextree->mdef = mdef; + lextree->wip = wip; + lextree->pip = pip; + + /* Compute lc and rc for fsg. */ + fsg_lextree_lc_rc(lextree); + + /* Create lextree for each state, i.e. an HMM network that + * represents words for all arcs exiting that state. Note that + * for a dense grammar such as an N-gram model, this will + * rapidly exhaust all available memory. */ + lextree->n_pnode = 0; + n_leaves = 0; + for (s = 0; s < fsg_model_n_state(fsg); s++) { + lextree->root[s] = + fsg_psubtree_init(lextree, fsg, s, &(lextree->alloc_head[s])); + + for (pn = lextree->alloc_head[s]; pn; pn = pn->alloc_next) { + lextree->n_pnode++; + if (pn->leaf) + ++n_leaves; + } + } + E_INFO("%d HMM nodes in lextree (%d leaves)\n", + lextree->n_pnode, n_leaves); + E_INFO("Allocated %d bytes (%d KiB) for all lextree nodes\n", + lextree->n_pnode * sizeof(fsg_pnode_t), + lextree->n_pnode * sizeof(fsg_pnode_t) / 1024); + E_INFO("Allocated %d bytes (%d KiB) for lextree leafnodes\n", + n_leaves * sizeof(fsg_pnode_t), + n_leaves * sizeof(fsg_pnode_t) / 1024); + +#if __FSG_DBG__ + fsg_lextree_dump(lextree, stdout); +#endif + + return lextree; +} + + +void +fsg_lextree_dump(fsg_lextree_t * lextree, FILE * fp) +{ + int32 s; + + for (s = 0; s < fsg_model_n_state(lextree->fsg); s++) { + fprintf(fp, "State %5d root %p\n", s, lextree->root[s]); + fsg_psubtree_dump(lextree, lextree->root[s], fp); + } + fflush(fp); +} + + +void +fsg_lextree_free(fsg_lextree_t * lextree) +{ + int32 s; + + if (lextree == NULL) + return; + + if (lextree->fsg) + for (s = 0; s < fsg_model_n_state(lextree->fsg); s++) + fsg_psubtree_free(lextree->alloc_head[s]); + + ckd_free_2d(lextree->lc); + ckd_free_2d(lextree->rc); + ckd_free(lextree->root); + ckd_free(lextree->alloc_head); + ckd_free(lextree); +} + +/****************************** + * psubtree stuff starts here * + ******************************/ + +void fsg_glist_linklist_free(fsg_glist_linklist_t *glist) +{ + if (glist) { + fsg_glist_linklist_t *nxtglist; + if (glist->glist) + glist_free(glist->glist); + nxtglist = glist->next; + while (nxtglist) { + ckd_free(glist); + glist = nxtglist; + if (glist->glist) + glist_free(glist->glist); + nxtglist = glist->next; + } + ckd_free(glist); + } + return; +} + +void +fsg_pnode_add_all_ctxt(fsg_pnode_ctxt_t * ctxt) +{ + int32 i; + + for (i = 0; i < FSG_PNODE_CTXT_BVSZ; i++) + ctxt->bv[i] = 0xffffffff; +} + +uint32 fsg_pnode_ctxt_sub_generic(fsg_pnode_ctxt_t *src, fsg_pnode_ctxt_t *sub) +{ + int32 i; + uint32 res = 0; + + for (i = 0; i < FSG_PNODE_CTXT_BVSZ; i++) + res |= (src->bv[i] = ~(sub->bv[i]) & src->bv[i]); + return res; +} + + +/* + * fsg_pnode_ctxt_sub(fsg_pnode_ctxt_t * src, fsg_pnode_ctxt_t * sub) + * This has been moved into a macro in fsg_psubtree.h + * because it is called so frequently! + */ + + +/* + * Add the word emitted by the given transition (fsglink) to the given lextree + * (rooted at root), and return the new lextree root. (There may actually be + * several root nodes, maintained in a linked list via fsg_pnode_t.sibling. + * "root" is the head of this list.) + * lclist, rclist: sets of left and right context phones for this link. + * alloc_head: head of a linear list of all allocated pnodes for the parent + * FSG state, kept elsewhere and updated by this routine. + */ +static fsg_pnode_t * +psubtree_add_trans(fsg_lextree_t *lextree, + fsg_pnode_t * root, + fsg_glist_linklist_t **curglist, + fsg_link_t * fsglink, + int16 *lclist, int16 *rclist, + fsg_pnode_t ** alloc_head) +{ + int32 silcipid; /* Silence CI phone ID */ + int32 pronlen; /* Pronunciation length */ + int32 wid; /* FSG (not dictionary!!) word ID */ + int32 dictwid; /* Dictionary (not FSG!!) word ID */ + int32 ssid; /* Senone Sequence ID */ + int32 tmatid; + gnode_t *gn; + fsg_pnode_t *pnode, *pred, *head; + int32 n_ci, p, lc, rc; + glist_t lc_pnodelist; /* Temp pnodes list for different left contexts */ + glist_t rc_pnodelist; /* Temp pnodes list for different right contexts */ + int32 i, j; + int n_lc_alloc = 0, n_int_alloc = 0, n_rc_alloc = 0; + + silcipid = bin_mdef_silphone(lextree->mdef); + n_ci = bin_mdef_n_ciphone(lextree->mdef); + + wid = fsg_link_wid(fsglink); + assert(wid >= 0); /* Cannot be a null transition */ + dictwid = dict_wordid(lextree->dict, + fsg_model_word_str(lextree->fsg, wid)); + pronlen = dict_pronlen(lextree->dict, dictwid); + assert(pronlen >= 1); + + assert(lclist[0] >= 0); /* At least one phonetic context provided */ + assert(rclist[0] >= 0); + + head = *alloc_head; + pred = NULL; + + if (pronlen == 1) { /* Single-phone word */ + int ci = dict_first_phone(lextree->dict, dictwid); + /* Only non-filler words are mpx */ + if (!dict_filler_word(lextree->dict, dictwid)) { + /* + * Left diphone ID for single-phone words already assumes SIL is right + * context; only left contexts need to be handled. + */ + lc_pnodelist = NULL; + + for (i = 0; lclist[i] >= 0; i++) { + lc = lclist[i]; + ssid = dict2pid_lrdiph_rc(lextree->d2p, ci, lc, silcipid); + tmatid = bin_mdef_pid2tmatid(lextree->mdef, dict_first_phone(lextree->dict, dictwid)); + /* Check if this ssid already allocated for some other context */ + for (gn = lc_pnodelist; gn; gn = gnode_next(gn)) { + pnode = (fsg_pnode_t *) gnode_ptr(gn); + + if (hmm_nonmpx_ssid(&pnode->hmm) == ssid) { + /* already allocated; share it for this context phone */ + fsg_pnode_add_ctxt(pnode, lc); + break; + } + } + + if (!gn) { /* ssid not already allocated */ + pnode = + (fsg_pnode_t *) ckd_calloc(1, sizeof(fsg_pnode_t)); + pnode->ctx = lextree->ctx; + pnode->next.fsglink = fsglink; + pnode->logs2prob = + (fsg_link_logs2prob(fsglink) >> SENSCR_SHIFT) + + lextree->wip + lextree->pip; + pnode->ci_ext = dict_first_phone(lextree->dict, dictwid); + pnode->ppos = 0; + pnode->leaf = TRUE; + pnode->sibling = root; /* All root nodes linked together */ + fsg_pnode_add_ctxt(pnode, lc); /* Initially zeroed by calloc above */ + pnode->alloc_next = head; + head = pnode; + root = pnode; + ++n_lc_alloc; + + hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); + + lc_pnodelist = + glist_add_ptr(lc_pnodelist, (void *) pnode); + } + } + + glist_free(lc_pnodelist); + } + else { /* Filler word; no context modelled */ + ssid = bin_mdef_pid2ssid(lextree->mdef, ci); /* probably the same... */ + tmatid = bin_mdef_pid2tmatid(lextree->mdef, ci); + + pnode = (fsg_pnode_t *) ckd_calloc(1, sizeof(fsg_pnode_t)); + pnode->ctx = lextree->ctx; + pnode->next.fsglink = fsglink; + pnode->logs2prob = (fsg_link_logs2prob(fsglink) >> SENSCR_SHIFT) + + lextree->wip + lextree->pip; + pnode->ci_ext = silcipid; /* Presents SIL as context to neighbors */ + pnode->ppos = 0; + pnode->leaf = TRUE; + pnode->sibling = root; + fsg_pnode_add_all_ctxt(&(pnode->ctxt)); + pnode->alloc_next = head; + head = pnode; + root = pnode; + ++n_int_alloc; + + hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); + } + } + else { /* Multi-phone word */ + fsg_pnode_t **ssid_pnode_map; /* Temp array of ssid->pnode mapping */ + ssid_pnode_map = + (fsg_pnode_t **) ckd_calloc(n_ci, sizeof(fsg_pnode_t *)); + lc_pnodelist = NULL; + rc_pnodelist = NULL; + + for (p = 0; p < pronlen; p++) { + int ci = dict_pron(lextree->dict, dictwid, p); + if (p == 0) { /* Root phone, handle required left contexts */ + /* Find if we already have an lc_pnodelist for the first phone of this word */ + fsg_glist_linklist_t *glist; + + rc = dict_pron(lextree->dict, dictwid, 1); + for (glist = *curglist; + glist && glist->glist; + glist = glist->next) { + if (glist->ci == ci && glist->rc == rc) + break; + } + if (glist && glist->glist) { + assert(glist->ci == ci && glist->rc == rc); + /* We've found a valid glist. Hook to it and move to next phoneme */ + E_DEBUG("Found match for (%d,%d)\n", ci, rc); + lc_pnodelist = glist->glist; + /* Set the predecessor node for the future tree first */ + pred = (fsg_pnode_t *) gnode_ptr(lc_pnodelist); + continue; + } + else { + /* Two cases that can bring us here + * a. glist == NULL, i.e. end of current list. Create new entry. + * b. glist->glist == NULL, i.e. first entry into list. + */ + if (glist == NULL) { /* Case a; reduce it to case b by allocing glist */ + glist = (fsg_glist_linklist_t*) ckd_calloc(1, sizeof(fsg_glist_linklist_t)); + glist->next = *curglist; + *curglist = glist; + } + glist->ci = ci; + glist->rc = rc; + lc_pnodelist = glist->glist = NULL; /* Gets created below */ + } + + for (i = 0; lclist[i] >= 0; i++) { + lc = lclist[i]; + ssid = dict2pid_ldiph_lc(lextree->d2p, ci, rc, lc); + tmatid = bin_mdef_pid2tmatid(lextree->mdef, dict_first_phone(lextree->dict, dictwid)); + /* Compression is not done by d2p, so we do it + * here. This might be slow, but it might not + * be... we'll see. */ + pnode = ssid_pnode_map[0]; + for (j = 0; j < n_ci && ssid_pnode_map[j] != NULL; ++j) { + pnode = ssid_pnode_map[j]; + if (hmm_nonmpx_ssid(&pnode->hmm) == ssid) + break; + } + assert(j < n_ci); + if (!pnode) { /* Allocate pnode for this new ssid */ + pnode = + (fsg_pnode_t *) ckd_calloc(1, + sizeof + (fsg_pnode_t)); + pnode->ctx = lextree->ctx; + /* This bit is tricky! For now we'll put the prob in the final link only */ + /* pnode->logs2prob = (fsg_link_logs2prob(fsglink) >> SENSCR_SHIFT) + + lextree->wip + lextree->pip; */ + pnode->logs2prob = lextree->wip + lextree->pip; + pnode->ci_ext = dict_first_phone(lextree->dict, dictwid); + pnode->ppos = 0; + pnode->leaf = FALSE; + pnode->sibling = root; /* All root nodes linked together */ + pnode->alloc_next = head; + head = pnode; + root = pnode; + ++n_lc_alloc; + + hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); + + lc_pnodelist = + glist_add_ptr(lc_pnodelist, (void *) pnode); + ssid_pnode_map[j] = pnode; + } + fsg_pnode_add_ctxt(pnode, lc); + } + /* Put the lc_pnodelist back into glist */ + glist->glist = lc_pnodelist; + + /* The predecessor node for the future tree is the root */ + pred = root; + } + else if (p != pronlen - 1) { /* Word internal phone */ + fsg_pnode_t *pnodeyoungest; + + ssid = dict2pid_internal(lextree->d2p, dictwid, p); + tmatid = bin_mdef_pid2tmatid(lextree->mdef, dict_pron (lextree->dict, dictwid, p)); + /* First check if we already have this ssid in our tree */ + pnode = pred->next.succ; + pnodeyoungest = pnode; /* The youngest sibling */ + while (pnode && (hmm_nonmpx_ssid(&pnode->hmm) != ssid || pnode->leaf)) { + pnode = pnode->sibling; + } + if (pnode && (hmm_nonmpx_ssid(&pnode->hmm) == ssid && !pnode->leaf)) { + /* Found the ssid; go to next phoneme */ + E_DEBUG("Found match for %d\n", ci); + pred = pnode; + continue; + } + + /* pnode not found, allocate it */ + pnode = (fsg_pnode_t *) ckd_calloc(1, sizeof(fsg_pnode_t)); + pnode->ctx = lextree->ctx; + pnode->logs2prob = lextree->pip; + pnode->ci_ext = dict_pron(lextree->dict, dictwid, p); + pnode->ppos = p; + pnode->leaf = FALSE; + pnode->sibling = pnodeyoungest; /* May be NULL */ + if (p == 1) { /* Predecessor = set of root nodes for left ctxts */ + for (gn = lc_pnodelist; gn; gn = gnode_next(gn)) { + pred = (fsg_pnode_t *) gnode_ptr(gn); + pred->next.succ = pnode; + } + } + else { /* Predecessor = word internal node */ + pred->next.succ = pnode; + } + pnode->alloc_next = head; + head = pnode; + ++n_int_alloc; + + hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); + + pred = pnode; + } + else { /* Leaf phone, handle required right contexts */ + /* Note, leaf phones are not part of the tree */ + xwdssid_t *rssid; + memset((void *) ssid_pnode_map, 0, + n_ci * sizeof(fsg_pnode_t *)); + lc = dict_pron(lextree->dict, dictwid, p-1); + rssid = dict2pid_rssid(lextree->d2p, ci, lc); + tmatid = bin_mdef_pid2tmatid(lextree->mdef, dict_pron (lextree->dict, dictwid, p)); + + for (i = 0; rclist[i] >= 0; i++) { + rc = rclist[i]; + + j = rssid->cimap[rc]; + ssid = rssid->ssid[j]; + pnode = ssid_pnode_map[j]; + + if (!pnode) { /* Allocate pnode for this new ssid */ + pnode = + (fsg_pnode_t *) ckd_calloc(1, + sizeof + (fsg_pnode_t)); + pnode->ctx = lextree->ctx; + /* We are plugging the word prob here. Ugly */ + /* pnode->logs2prob = lextree->pip; */ + pnode->logs2prob = (fsg_link_logs2prob(fsglink) >> SENSCR_SHIFT) + + lextree->pip; + pnode->ci_ext = dict_pron(lextree->dict, dictwid, p); + pnode->ppos = p; + pnode->leaf = TRUE; + pnode->sibling = rc_pnodelist ? + (fsg_pnode_t *) gnode_ptr(rc_pnodelist) : NULL; + pnode->next.fsglink = fsglink; + pnode->alloc_next = head; + head = pnode; + ++n_rc_alloc; + + hmm_init(lextree->ctx, &pnode->hmm, FALSE, ssid, tmatid); + + rc_pnodelist = + glist_add_ptr(rc_pnodelist, (void *) pnode); + ssid_pnode_map[j] = pnode; + } + else { + assert(hmm_nonmpx_ssid(&pnode->hmm) == ssid); + } + fsg_pnode_add_ctxt(pnode, rc); + } + + if (p == 1) { /* Predecessor = set of root nodes for left ctxts */ + for (gn = lc_pnodelist; gn; gn = gnode_next(gn)) { + pred = (fsg_pnode_t *) gnode_ptr(gn); + if (!pred->next.succ) + pred->next.succ = (fsg_pnode_t *) gnode_ptr(rc_pnodelist); + else { + /* Link to the end of the sibling chain */ + fsg_pnode_t *succ = pred->next.succ; + while (succ->sibling) succ = succ->sibling; + succ->sibling = (fsg_pnode_t*) gnode_ptr(rc_pnodelist); + /* Since all entries of lc_pnodelist point + to the same array, sufficient to update it once */ + break; + } + } + } + else { /* Predecessor = word internal node */ + if (!pred->next.succ) + pred->next.succ = (fsg_pnode_t *) gnode_ptr(rc_pnodelist); + else { + /* Link to the end of the sibling chain */ + fsg_pnode_t *succ = pred->next.succ; + while (succ->sibling) succ = succ->sibling; + succ->sibling = (fsg_pnode_t *) gnode_ptr(rc_pnodelist); + } + } + } + } + + ckd_free((void *) ssid_pnode_map); + /* glist_free(lc_pnodelist); Nope; this gets freed outside */ + glist_free(rc_pnodelist); + } + + E_DEBUG("Allocated %d HMMs (%d lc, %d rc, %d internal)\n", + n_lc_alloc + n_rc_alloc + n_int_alloc, + n_lc_alloc, n_rc_alloc, n_int_alloc); + *alloc_head = head; + + return root; +} + + +static fsg_pnode_t * +fsg_psubtree_init(fsg_lextree_t *lextree, + fsg_model_t * fsg, int32 from_state, + fsg_pnode_t ** alloc_head) +{ + fsg_arciter_t *itor; + fsg_link_t *fsglink; + fsg_pnode_t *root; + int32 n_ci, n_arc; + fsg_glist_linklist_t *glist = NULL; + + root = NULL; + assert(*alloc_head == NULL); + + n_ci = bin_mdef_n_ciphone(lextree->mdef); + if (n_ci > (FSG_PNODE_CTXT_BVSZ * 32)) { + E_FATAL + ("#phones > %d; increase FSG_PNODE_CTXT_BVSZ and recompile\n", + FSG_PNODE_CTXT_BVSZ * 32); + } + + n_arc = 0; + for (itor = fsg_model_arcs(fsg, from_state); itor; + itor = fsg_arciter_next(itor)) { + int32 dst; + fsglink = fsg_arciter_get(itor); + dst = fsglink->to_state; + + if (fsg_link_wid(fsglink) < 0) + continue; + + E_DEBUG("Building lextree for arc from %d to %d: %s\n", + from_state, dst, fsg_model_word_str(fsg, fsg_link_wid(fsglink))); + root = psubtree_add_trans(lextree, root, &glist, fsglink, + lextree->lc[from_state], + lextree->rc[dst], + alloc_head); + ++n_arc; + } + E_DEBUG("State %d has %d outgoing arcs\n", from_state, n_arc); + + fsg_glist_linklist_free(glist); + + return root; +} + + +static void +fsg_psubtree_free(fsg_pnode_t * head) +{ + fsg_pnode_t *next; + + while (head) { + next = head->alloc_next; + hmm_deinit(&head->hmm); + ckd_free(head); + head = next; + } +} + +void fsg_psubtree_dump_node(fsg_lextree_t *tree, fsg_pnode_t *node, FILE *fp) +{ + int32 i; + fsg_link_t *tl; + + /* Indentation */ + for (i = 0; i <= node->ppos; i++) + fprintf(fp, " "); + + fprintf(fp, "%p.@", node); /* Pointer used as node + * ID */ + fprintf(fp, " %5d.SS", hmm_nonmpx_ssid(&node->hmm)); + fprintf(fp, " %10d.LP", node->logs2prob); + fprintf(fp, " %p.SIB", node->sibling); + fprintf(fp, " %s.%d", bin_mdef_ciphone_str(tree->mdef, node->ci_ext), node->ppos); + if ((node->ppos == 0) || node->leaf) { + fprintf(fp, " ["); + for (i = 0; i < FSG_PNODE_CTXT_BVSZ; i++) + fprintf(fp, "%08x", node->ctxt.bv[i]); + fprintf(fp, "]"); + } + if (node->leaf) { + tl = node->next.fsglink; + fprintf(fp, " {%s[%d->%d](%d)}", + fsg_model_word_str(tree->fsg, tl->wid), + tl->from_state, tl->to_state, tl->logs2prob); + } else { + fprintf(fp, " %p.NXT", node->next.succ); + } + fprintf(fp, "\n"); + + return; +} + +void +fsg_psubtree_dump(fsg_lextree_t *tree, fsg_pnode_t *root, FILE * fp) +{ + fsg_pnode_t *succ; + + if (root == NULL) return; + if (root->ppos == 0) { + while(root->sibling && root->sibling->next.succ == root->next.succ) { + fsg_psubtree_dump_node(tree, root, fp); + root = root->sibling; + } + fflush(fp); + } + + fsg_psubtree_dump_node(tree, root, fp); + + if (root->leaf) { + if (root->ppos == 0 && root->sibling) { /* For single-phone words */ + fsg_psubtree_dump(tree, root->sibling,fp); + } + return; + } + + succ = root->next.succ; + while(succ) { + fsg_psubtree_dump(tree, succ,fp); + succ = succ->sibling; + } + + if (root->ppos == 0) { + fsg_psubtree_dump(tree, root->sibling,fp); + fflush(fp); + } + + return; +} + +void +fsg_psubtree_pnode_deactivate(fsg_pnode_t * pnode) +{ + hmm_clear(&pnode->hmm); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h new file mode 100644 index 0000000..de2b461 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h @@ -0,0 +1,266 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * fsg_lextree.h -- The collection of all the lextrees for the entire FSM. + * + */ + +#ifndef __S2_FSG_LEXTREE_H__ +#define __S2_FSG_LEXTREE_H__ + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include "hmm.h" +#include "dict.h" +#include "dict2pid.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/* + * Compile-time constant determining the size of the + * bitvector fsg_pnode_t.fsg_pnode_ctxt_t.bv. (See below.) + * But it makes memory allocation simpler and more efficient. + * Make it smaller (2) to save memory if your phoneset has less than + * 64 phones. + */ +#define FSG_PNODE_CTXT_BVSZ 4 + +typedef struct fsg_pnode_ctxt_s { + uint32 bv[FSG_PNODE_CTXT_BVSZ]; +} fsg_pnode_ctxt_t; + + +/* + * All transitions (words) out of any given FSG state represented are by a + * phonetic prefix lextree (except for epsilon or null transitions; they + * are not part of the lextree). Lextree leaf nodes represent individual + * FSG transitions, so no sharing is allowed at the leaf nodes. The FSG + * transition probs are distributed along the lextree: the prob at a node + * is the max of the probs of all leaf nodes (and, hence, FSG transitions) + * reachable from that node. + * + * To conserve memory, the underlying HMMs with state-level information are + * allocated only as needed. Root and leaf nodes must also account for all + * the possible phonetic contexts, with an independent HMM for each distinct + * context. + */ +typedef struct fsg_pnode_s { + /* + * If this is not a leaf node, the first successor (child) node. Otherwise + * the parent FSG transition for which this is the leaf node (for figuring + * the FSG destination state, and word emitted by the transition). A node + * may have several children. The succ ptr gives just the first; the rest + * are linked via the sibling ptr below. + */ + union { + struct fsg_pnode_s *succ; + fsg_link_t *fsglink; + } next; + + /* + * For simplicity of memory management (i.e., freeing the pnodes), all + * pnodes allocated for all transitions out of a state are maintained in a + * linear linked list through the alloc_next pointer. + */ + struct fsg_pnode_s *alloc_next; + + /* + * The next node that is also a child of the parent of this node; NULL if + * none. + */ + struct fsg_pnode_s *sibling; + + /* + * The transition (log) probability to be incurred upon transitioning to + * this node. (Transition probabilities are really associated with the + * transitions. But a lextree node has exactly one incoming transition. + * Hence, the prob can be associated with the node.) + * This is a logs2(prob) value, and includes the language weight. + */ + int32 logs2prob; + + /* + * The root and leaf positions associated with any transition have to deal + * with multiple phonetic contexts. However, different contexts may result + * in the same SSID (senone-seq ID), and can share a single pnode with that + * SSID. But the pnode should track the set of context CI phones that share + * it. Hence the fsg_pnode_ctxt_t bit-vector set-representation. (For + * simplicity of implementation, its size is a compile-time constant for + * now.) Single phone words would need a 2-D array of context, but that's + * too expensive. For now, they simply use SIL as right context, so only + * the left context is properly modelled. + * (For word-internal phones, this field is unused, of course.) + */ + fsg_pnode_ctxt_t ctxt; + + uint16 ci_ext; /* This node's CIphone as viewed externally (context) */ + uint8 ppos; /* Phoneme position in pronunciation */ + uint8 leaf; /* Whether this is a leaf node */ + + /* HMM-state-level stuff here */ + hmm_context_t *ctx; + hmm_t hmm; +} fsg_pnode_t; + +/* Access macros */ +#define fsg_pnode_leaf(p) ((p)->leaf) +#define fsg_pnode_logs2prob(p) ((p)->logs2prob) +#define fsg_pnode_succ(p) ((p)->next.succ) +#define fsg_pnode_fsglink(p) ((p)->next.fsglink) +#define fsg_pnode_sibling(p) ((p)->sibling) +#define fsg_pnode_hmmptr(p) (&((p)->hmm)) +#define fsg_pnode_ci_ext(p) ((p)->ci_ext) +#define fsg_pnode_ppos(p) ((p)->ppos) +#define fsg_pnode_leaf(p) ((p)->leaf) +#define fsg_pnode_ctxt(p) ((p)->ctxt) + +#define fsg_pnode_add_ctxt(p,c) ((p)->ctxt.bv[(c)>>5] |= (1 << ((c)&0x001f))) + +/* + * The following is macroized because its called very frequently + * ::: uint32 fsg_pnode_ctxt_sub (fsg_pnode_ctxt_t *src, fsg_pnode_ctxt_t *sub); + */ +/* + * Subtract bitvector sub from bitvector src (src updated with the result). + * Return 0 if result is all 0, non-zero otherwise. + */ + +#if (FSG_PNODE_CTXT_BVSZ == 1) + #define FSG_PNODE_CTXT_SUB(src,sub) \ + ((src)->bv[0] = (~((sub)->bv[0]) & (src)->bv[0])) +#elif (FSG_PNODE_CTXT_BVSZ == 2) + #define FSG_PNODE_CTXT_SUB(src,sub) \ + (((src)->bv[0] = (~((sub)->bv[0]) & (src)->bv[0])) | \ + ((src)->bv[1] = (~((sub)->bv[1]) & (src)->bv[1]))) +#elif (FSG_PNODE_CTXT_BVSZ == 4) + #define FSG_PNODE_CTXT_SUB(src,sub) \ + (((src)->bv[0] = (~((sub)->bv[0]) & (src)->bv[0])) | \ + ((src)->bv[1] = (~((sub)->bv[1]) & (src)->bv[1])) | \ + ((src)->bv[2] = (~((sub)->bv[2]) & (src)->bv[2])) | \ + ((src)->bv[3] = (~((sub)->bv[3]) & (src)->bv[3]))) +#else + #define FSG_PNODE_CTXT_SUB(src,sub) fsg_pnode_ctxt_sub_generic((src),(sub)) +#endif + +/** + * Collection of lextrees for an FSG. + */ +typedef struct fsg_lextree_s { + fsg_model_t *fsg; /**< The fsg for which this lextree is built. */ + hmm_context_t *ctx; /**< HMM context structure. */ + dict_t *dict; /**< Pronunciation dictionary for this FSG. */ + dict2pid_t *d2p; /**< Context-dependent phone mappings for this FSG. */ + bin_mdef_t *mdef; /**< Model definition (triphone mappings). */ + + /* + * Left and right CIphone sets for each state. + * Left context CIphones for a state S: If word W transitions into S, W's + * final CIphone is in S's {lc}. Words transitioning out of S must consider + * these left context CIphones. + * Similarly, right contexts for state S: If word W transitions out of S, + * W's first CIphone is in S's {rc}. Words transitioning into S must consider + * these right contexts. + * + * NOTE: Words may transition into and out of S INDIRECTLY, with intermediate + * null transitions. + * NOTE: Single-phone words are difficult; only SILENCE right context is + * modelled for them. + * NOTE: Non-silence filler phones aren't included in these sets. Filler + * words don't use context, and present the SILENCE phone as context to + * adjacent words. + */ + int16 **lc; /**< Left context triphone mappings for FSG. */ + int16 **rc; /**< Right context triphone mappings for FSG. */ + + fsg_pnode_t **root; /* root[s] = lextree representing all transitions + out of state s. Note that the "tree" for each + state is actually a collection of trees, linked + via fsg_pnode_t.sibling (root[s]->sibling) */ + fsg_pnode_t **alloc_head; /* alloc_head[s] = head of linear list of all + pnodes allocated for state s */ + int32 n_pnode; /* #HMM nodes in search structure */ + int32 wip; + int32 pip; +} fsg_lextree_t; + +/* Access macros */ +#define fsg_lextree_root(lt,s) ((lt)->root[s]) +#define fsg_lextree_n_pnode(lt) ((lt)->n_pnode) + +/** + * Create, initialize, and return a new phonetic lextree for the given FSG. + */ +fsg_lextree_t *fsg_lextree_init(fsg_model_t *fsg, dict_t *dict, + dict2pid_t *d2p, + bin_mdef_t *mdef, hmm_context_t *ctx, + int32 wip, int32 pip); + +/** + * Free lextrees for an FSG. + */ +void fsg_lextree_free(fsg_lextree_t *fsg); + +/** + * Print an FSG lextree to a file for debugging. + */ +void fsg_lextree_dump(fsg_lextree_t *fsg, FILE *fh); + +/** + * Mark the given pnode as inactive (for search). + */ +void fsg_psubtree_pnode_deactivate(fsg_pnode_t *pnode); + +/** + * Set all flags on in the given context bitvector. + */ +void fsg_pnode_add_all_ctxt(fsg_pnode_ctxt_t *ctxt); + +/** + * Generic variant for arbitrary size + */ +uint32 fsg_pnode_ctxt_sub_generic(fsg_pnode_ctxt_t *src, fsg_pnode_ctxt_t *sub); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c new file mode 100644 index 0000000..a2e98e9 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c @@ -0,0 +1,1574 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * fsg_search.c -- Search structures for FSM decoding. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 2004 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 18-Feb-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Started. + */ + +/* System headers. */ +#include +#include +#include + +/* SphinxBase headers. */ +#include +#include +#include +#include + +/* Local headers. */ +#include "pocketsphinx_internal.h" +#include "ps_lattice_internal.h" +#include "fsg_search_internal.h" +#include "fsg_history.h" +#include "fsg_lextree.h" + +/* Turn this on for detailed debugging dump */ +#define __FSG_DBG__ 0 +#define __FSG_DBG_CHAN__ 0 +#define __FSG_ALLOW_BESTPATH__ 1 + +static ps_seg_t *fsg_search_seg_iter(ps_search_t *search); +static ps_lattice_t *fsg_search_lattice(ps_search_t *search); +static int fsg_search_prob(ps_search_t *search); + +static ps_searchfuncs_t fsg_funcs = { + /* start: */ fsg_search_start, + /* step: */ fsg_search_step, + /* finish: */ fsg_search_finish, + /* reinit: */ fsg_search_reinit, + /* free: */ fsg_search_free, + /* lattice: */ fsg_search_lattice, + /* hyp: */ fsg_search_hyp, + /* prob: */ fsg_search_prob, + /* seg_iter: */ fsg_search_seg_iter, +}; + +static int +fsg_search_add_silences(fsg_search_t *fsgs, fsg_model_t *fsg) +{ + dict_t *dict; + int32 wid; + int n_sil; + + dict = ps_search_dict(fsgs); + /* + * NOTE: Unlike N-Gram search, we do not use explicit start and + * end symbols. This is because the start and end nodes are + * defined in the grammar. We do add silence/filler self-loops to + * all states in order to allow for silence between words and at + * the beginning and end of utterances. + * + * This has some implications for word graph generation, namely, + * that there can (and usually will) be multiple start and end + * states in the word graph. We therefore do add explicit start + * and end nodes to the graph. + */ + /* Add silence self-loops to all states. */ + fsg_model_add_silence(fsg, "", -1, + cmd_ln_float32_r(ps_search_config(fsgs), "-silprob")); + n_sil = 0; + /* Add self-loops for all other fillers. */ + for (wid = dict_filler_start(dict); wid < dict_filler_end(dict); ++wid) { + char const *word = dict_wordstr(dict, wid); + if (wid == dict_startwid(dict) || wid == dict_finishwid(dict)) + continue; + fsg_model_add_silence(fsg, word, -1, + cmd_ln_float32_r(ps_search_config(fsgs), "-fillprob")); + ++n_sil; + } + + return n_sil; +} + +/* Scans the dictionary and check if all words are present. */ +static int +fsg_search_check_dict(fsg_search_t *fsgs, fsg_model_t *fsg) +{ + dict_t *dict; + int i; + + dict = ps_search_dict(fsgs); + for (i = 0; i < fsg_model_n_word(fsg); ++i) { + char const *word; + int32 wid; + + word = fsg_model_word_str(fsg, i); + wid = dict_wordid(dict, word); + if (wid == BAD_S3WID) { + E_ERROR("The word '%s' is missing in the dictionary\n", word); + return FALSE; + } + } + + return TRUE; +} + +static int +fsg_search_add_altpron(fsg_search_t *fsgs, fsg_model_t *fsg) +{ + dict_t *dict; + int n_alt, n_word; + int i; + + dict = ps_search_dict(fsgs); + /* Scan FSG's vocabulary for words that have alternate pronunciations. */ + n_alt = 0; + n_word = fsg_model_n_word(fsg); + for (i = 0; i < n_word; ++i) { + char const *word; + int32 wid; + + word = fsg_model_word_str(fsg, i); + wid = dict_wordid(dict, word); + if (wid != BAD_S3WID) { + while ((wid = dict_nextalt(dict, wid)) != BAD_S3WID) { + n_alt += fsg_model_add_alt(fsg, word, dict_wordstr(dict, wid)); + } + } + } + + E_INFO("Added %d alternate word transitions\n", n_alt); + return n_alt; +} + +ps_search_t * +fsg_search_init(const char *name, + fsg_model_t *fsg, + cmd_ln_t *config, + acmod_t *acmod, + dict_t *dict, + dict2pid_t *d2p) +{ + fsg_search_t *fsgs = ckd_calloc(1, sizeof(*fsgs)); + ps_search_init(ps_search_base(fsgs), &fsg_funcs, PS_SEARCH_TYPE_FSG, name, config, acmod, dict, d2p); + + fsgs->fsg = fsg_model_retain(fsg); + /* Initialize HMM context. */ + fsgs->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), + acmod->tmat->tp, NULL, acmod->mdef->sseq); + if (fsgs->hmmctx == NULL) { + ps_search_free(ps_search_base(fsgs)); + return NULL; + } + + /* Initialize the search history object */ + fsgs->history = fsg_history_init(NULL, dict); + fsgs->frame = -1; + + /* Get search pruning parameters */ + fsgs->beam_factor = 1.0f; + fsgs->beam = fsgs->beam_orig + = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-beam")) + >> SENSCR_SHIFT; + fsgs->pbeam = fsgs->pbeam_orig + = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pbeam")) + >> SENSCR_SHIFT; + fsgs->wbeam = fsgs->wbeam_orig + = (int32) logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-wbeam")) + >> SENSCR_SHIFT; + + /* LM related weights/penalties */ + fsgs->lw = cmd_ln_float32_r(config, "-lw"); + fsgs->pip = (int32) (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pip")) + * fsgs->lw) + >> SENSCR_SHIFT; + fsgs->wip = (int32) (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-wip")) + * fsgs->lw) + >> SENSCR_SHIFT; + + /* Acoustic score scale for posterior probabilities. */ + fsgs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); + + E_INFO("FSG(beam: %d, pbeam: %d, wbeam: %d; wip: %d, pip: %d)\n", + fsgs->beam_orig, fsgs->pbeam_orig, fsgs->wbeam_orig, + fsgs->wip, fsgs->pip); + + if (!fsg_search_check_dict(fsgs, fsg)) { + fsg_search_free(ps_search_base(fsgs)); + return NULL; + } + + if (cmd_ln_boolean_r(config, "-fsgusefiller") && + !fsg_model_has_sil(fsg)) + fsg_search_add_silences(fsgs, fsg); + + if (cmd_ln_boolean_r(config, "-fsgusealtpron") && + !fsg_model_has_alt(fsg)) + fsg_search_add_altpron(fsgs, fsg); + +#if __FSG_ALLOW_BESTPATH__ + /* If bestpath is enabled, hypotheses are generated from a ps_lattice_t. + * This is not allowed by default because it tends to be very slow. */ + if (cmd_ln_boolean_r(config, "-bestpath")) + fsgs->bestpath = TRUE; +#endif + + if (fsg_search_reinit(ps_search_base(fsgs), + ps_search_dict(fsgs), + ps_search_dict2pid(fsgs)) < 0) + { + ps_search_free(ps_search_base(fsgs)); + return NULL; + + } + ptmr_init(&fsgs->perf); + + return ps_search_base(fsgs); +} + +void +fsg_search_free(ps_search_t *search) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + + double n_speech = (double)fsgs->n_tot_frame + / cmd_ln_int32_r(ps_search_config(fsgs), "-frate"); + + E_INFO("TOTAL fsg %.2f CPU %.3f xRT\n", + fsgs->perf.t_tot_cpu, + fsgs->perf.t_tot_cpu / n_speech); + E_INFO("TOTAL fsg %.2f wall %.3f xRT\n", + fsgs->perf.t_tot_elapsed, + fsgs->perf.t_tot_elapsed / n_speech); + + ps_search_base_free(search); + fsg_lextree_free(fsgs->lextree); + if (fsgs->history) { + fsg_history_reset(fsgs->history); + fsg_history_set_fsg(fsgs->history, NULL, NULL); + fsg_history_free(fsgs->history); + } + hmm_context_free(fsgs->hmmctx); + fsg_model_free(fsgs->fsg); + ckd_free(fsgs); +} + +int +fsg_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + + /* Free the old lextree */ + if (fsgs->lextree) + fsg_lextree_free(fsgs->lextree); + + /* Free old dict2pid, dict */ + ps_search_base_reinit(search, dict, d2p); + + /* Update the number of words (not used by this module though). */ + search->n_words = dict_size(dict); + + /* Allocate new lextree for the given FSG */ + fsgs->lextree = fsg_lextree_init(fsgs->fsg, dict, d2p, + ps_search_acmod(fsgs)->mdef, + fsgs->hmmctx, fsgs->wip, fsgs->pip); + + /* Inform the history module of the new fsg */ + fsg_history_set_fsg(fsgs->history, fsgs->fsg, dict); + + return 0; +} + + +static void +fsg_search_sen_active(fsg_search_t *fsgs) +{ + gnode_t *gn; + fsg_pnode_t *pnode; + hmm_t *hmm; + + acmod_clear_active(ps_search_acmod(fsgs)); + + for (gn = fsgs->pnode_active; gn; gn = gnode_next(gn)) { + pnode = (fsg_pnode_t *) gnode_ptr(gn); + hmm = fsg_pnode_hmmptr(pnode); + assert(hmm_frame(hmm) == fsgs->frame); + acmod_activate_hmm(ps_search_acmod(fsgs), hmm); + } +} + + +/* + * Evaluate all the active HMMs. + * (Executed once per frame.) + */ +static void +fsg_search_hmm_eval(fsg_search_t *fsgs) +{ + gnode_t *gn; + fsg_pnode_t *pnode; + hmm_t *hmm; + int32 bestscore; + int32 n, maxhmmpf; + + bestscore = WORST_SCORE; + + if (!fsgs->pnode_active) { + E_ERROR("Frame %d: No active HMM!!\n", fsgs->frame); + return; + } + + for (n = 0, gn = fsgs->pnode_active; gn; gn = gnode_next(gn), n++) { + int32 score; + + pnode = (fsg_pnode_t *) gnode_ptr(gn); + hmm = fsg_pnode_hmmptr(pnode); + assert(hmm_frame(hmm) == fsgs->frame); + +#if __FSG_DBG__ + E_INFO("pnode(%08x) active @frm %5d\n", (int32) pnode, + fsgs->frame); + hmm_dump(hmm, stdout); +#endif + score = hmm_vit_eval(hmm); +#if __FSG_DBG_CHAN__ + E_INFO("pnode(%08x) after eval @frm %5d\n", + (int32) pnode, fsgs->frame); + hmm_dump(hmm, stdout); +#endif + + if (score BETTER_THAN bestscore) + bestscore = score; + } + +#if __FSG_DBG__ + E_INFO("[%5d] %6d HMM; bestscr: %11d\n", fsgs->frame, n, bestscore); +#endif + fsgs->n_hmm_eval += n; + + /* Adjust beams if #active HMMs larger than absolute threshold */ + maxhmmpf = cmd_ln_int32_r(ps_search_config(fsgs), "-maxhmmpf"); + if (maxhmmpf != -1 && n > maxhmmpf) { + /* + * Too many HMMs active; reduce the beam factor applied to the default + * beams, but not if the factor is already at a floor (0.1). + */ + if (fsgs->beam_factor > 0.1) { /* Hack!! Hardwired constant 0.1 */ + fsgs->beam_factor *= 0.9f; /* Hack!! Hardwired constant 0.9 */ + fsgs->beam = + (int32) (fsgs->beam_orig * fsgs->beam_factor); + fsgs->pbeam = + (int32) (fsgs->pbeam_orig * fsgs->beam_factor); + fsgs->wbeam = + (int32) (fsgs->wbeam_orig * fsgs->beam_factor); + } + } + else { + fsgs->beam_factor = 1.0f; + fsgs->beam = fsgs->beam_orig; + fsgs->pbeam = fsgs->pbeam_orig; + fsgs->wbeam = fsgs->wbeam_orig; + } + + if (n > fsg_lextree_n_pnode(fsgs->lextree)) + E_FATAL("PANIC! Frame %d: #HMM evaluated(%d) > #PNodes(%d)\n", + fsgs->frame, n, fsg_lextree_n_pnode(fsgs->lextree)); + + fsgs->bestscore = bestscore; +} + + +static void +fsg_search_pnode_trans(fsg_search_t *fsgs, fsg_pnode_t * pnode) +{ + fsg_pnode_t *child; + hmm_t *hmm; + int32 newscore, thresh, nf; + + assert(pnode); + assert(!fsg_pnode_leaf(pnode)); + + nf = fsgs->frame + 1; + thresh = fsgs->bestscore + fsgs->beam; + + hmm = fsg_pnode_hmmptr(pnode); + + for (child = fsg_pnode_succ(pnode); + child; child = fsg_pnode_sibling(child)) { + newscore = hmm_out_score(hmm) + child->logs2prob; + + if ((newscore BETTER_THAN thresh) + && (newscore BETTER_THAN hmm_in_score(&child->hmm))) { + /* Incoming score > pruning threshold and > target's existing score */ + if (hmm_frame(&child->hmm) < nf) { + /* Child node not yet activated; do so */ + fsgs->pnode_active_next = + glist_add_ptr(fsgs->pnode_active_next, + (void *) child); + } + + hmm_enter(&child->hmm, newscore, hmm_out_history(hmm), nf); + } + } +} + + +static void +fsg_search_pnode_exit(fsg_search_t *fsgs, fsg_pnode_t * pnode) +{ + hmm_t *hmm; + fsg_link_t *fl; + int32 wid; + fsg_pnode_ctxt_t ctxt; + + assert(pnode); + assert(fsg_pnode_leaf(pnode)); + + hmm = fsg_pnode_hmmptr(pnode); + fl = fsg_pnode_fsglink(pnode); + assert(fl); + + wid = fsg_link_wid(fl); + assert(wid >= 0); + +#if __FSG_DBG__ + E_INFO("[%5d] Exit(%08x) %10d(score) %5d(pred)\n", + fsgs->frame, (int32) pnode, + hmm_out_score(hmm), hmm_out_history(hmm)); +#endif + + /* + * Check if this is filler or single phone word; these do not model right + * context (i.e., the exit score applies to all right contexts). + */ + if (fsg_model_is_filler(fsgs->fsg, wid) + /* FIXME: This might be slow due to repeated calls to dict_to_id(). */ + || (dict_is_single_phone(ps_search_dict(fsgs), + dict_wordid(ps_search_dict(fsgs), + fsg_model_word_str(fsgs->fsg, wid))))) { + /* Create a dummy context structure that applies to all right contexts */ + fsg_pnode_add_all_ctxt(&ctxt); + + /* Create history table entry for this word exit */ + fsg_history_entry_add(fsgs->history, + fl, + fsgs->frame, + hmm_out_score(hmm), + hmm_out_history(hmm), + pnode->ci_ext, ctxt); + + } + else { + /* Create history table entry for this word exit */ + fsg_history_entry_add(fsgs->history, + fl, + fsgs->frame, + hmm_out_score(hmm), + hmm_out_history(hmm), + pnode->ci_ext, pnode->ctxt); + } +} + + +/* + * (Beam) prune the just evaluated HMMs, determine which ones remain + * active, which ones transition to successors, which ones exit and + * terminate in their respective destination FSM states. + * (Executed once per frame.) + */ +static void +fsg_search_hmm_prune_prop(fsg_search_t *fsgs) +{ + gnode_t *gn; + fsg_pnode_t *pnode; + hmm_t *hmm; + int32 thresh, word_thresh, phone_thresh; + + assert(fsgs->pnode_active_next == NULL); + + thresh = fsgs->bestscore + fsgs->beam; + phone_thresh = fsgs->bestscore + fsgs->pbeam; + word_thresh = fsgs->bestscore + fsgs->wbeam; + + for (gn = fsgs->pnode_active; gn; gn = gnode_next(gn)) { + pnode = (fsg_pnode_t *) gnode_ptr(gn); + hmm = fsg_pnode_hmmptr(pnode); + + if (hmm_bestscore(hmm) >= thresh) { + /* Keep this HMM active in the next frame */ + if (hmm_frame(hmm) == fsgs->frame) { + hmm_frame(hmm) = fsgs->frame + 1; + fsgs->pnode_active_next = + glist_add_ptr(fsgs->pnode_active_next, + (void *) pnode); + } + else { + assert(hmm_frame(hmm) == fsgs->frame + 1); + } + + if (!fsg_pnode_leaf(pnode)) { + if (hmm_out_score(hmm) >= phone_thresh) { + /* Transition out of this phone into its children */ + fsg_search_pnode_trans(fsgs, pnode); + } + } + else { + if (hmm_out_score(hmm) >= word_thresh) { + /* Transition out of leaf node into destination FSG state */ + fsg_search_pnode_exit(fsgs, pnode); + } + } + } + } +} + + +/* + * Propagate newly created history entries through null transitions. + */ +static void +fsg_search_null_prop(fsg_search_t *fsgs) +{ + int32 bpidx, n_entries, thresh, newscore; + fsg_hist_entry_t *hist_entry; + fsg_link_t *l; + int32 s; + fsg_model_t *fsg; + + fsg = fsgs->fsg; + thresh = fsgs->bestscore + fsgs->wbeam; /* Which beam really?? */ + + n_entries = fsg_history_n_entries(fsgs->history); + + for (bpidx = fsgs->bpidx_start; bpidx < n_entries; bpidx++) { + fsg_arciter_t *itor; + hist_entry = fsg_history_entry_get(fsgs->history, bpidx); + + l = fsg_hist_entry_fsglink(hist_entry); + + /* Destination FSG state for history entry */ + s = l ? fsg_link_to_state(l) : fsg_model_start_state(fsg); + + /* + * Check null transitions from d to all other states. (Only need to + * propagate one step, since FSG contains transitive closure of null + * transitions.) + */ + /* Add all links from from_state to dst */ + for (itor = fsg_model_arcs(fsg, s); itor; + itor = fsg_arciter_next(itor)) { + fsg_link_t *l = fsg_arciter_get(itor); + + /* FIXME: Need to deal with tag transitions somehow. */ + if (fsg_link_wid(l) != -1) + continue; + newscore = + fsg_hist_entry_score(hist_entry) + + (fsg_link_logs2prob(l) >> SENSCR_SHIFT); + + if (newscore >= thresh) { + fsg_history_entry_add(fsgs->history, l, + fsg_hist_entry_frame(hist_entry), + newscore, + bpidx, + fsg_hist_entry_lc(hist_entry), + fsg_hist_entry_rc(hist_entry)); + } + } + } +} + + +/* + * Perform cross-word transitions; propagate each history entry created in this + * frame to lextree roots attached to the target FSG state for that entry. + */ +static void +fsg_search_word_trans(fsg_search_t *fsgs) +{ + int32 bpidx, n_entries; + fsg_hist_entry_t *hist_entry; + fsg_link_t *l; + int32 score, newscore, thresh, nf, d; + fsg_pnode_t *root; + int32 lc, rc; + + n_entries = fsg_history_n_entries(fsgs->history); + + thresh = fsgs->bestscore + fsgs->beam; + nf = fsgs->frame + 1; + + for (bpidx = fsgs->bpidx_start; bpidx < n_entries; bpidx++) { + hist_entry = fsg_history_entry_get(fsgs->history, bpidx); + assert(hist_entry); + score = fsg_hist_entry_score(hist_entry); + assert(fsgs->frame == fsg_hist_entry_frame(hist_entry)); + + l = fsg_hist_entry_fsglink(hist_entry); + + /* Destination state for hist_entry */ + d = l ? fsg_link_to_state(l) : fsg_model_start_state(fsgs-> + fsg); + + lc = fsg_hist_entry_lc(hist_entry); + + /* Transition to all root nodes attached to state d */ + for (root = fsg_lextree_root(fsgs->lextree, d); + root; root = root->sibling) { + rc = root->ci_ext; + + if ((root->ctxt.bv[lc >> 5] & (1 << (lc & 0x001f))) && + (hist_entry->rc.bv[rc >> 5] & (1 << (rc & 0x001f)))) { + /* + * Last CIphone of history entry is in left-context list supported by + * target root node, and + * first CIphone of target root node is in right context list supported + * by history entry; + * So the transition can go ahead (if new score is good enough). + */ + newscore = score + root->logs2prob; + + if ((newscore BETTER_THAN thresh) + && (newscore BETTER_THAN hmm_in_score(&root->hmm))) { + if (hmm_frame(&root->hmm) < nf) { + /* Newly activated node; add to active list */ + fsgs->pnode_active_next = + glist_add_ptr(fsgs->pnode_active_next, + (void *) root); +#if __FSG_DBG__ + E_INFO + ("[%5d] WordTrans bpidx[%d] -> pnode[%08x] (activated)\n", + fsgs->frame, bpidx, (int32) root); +#endif + } + else { +#if __FSG_DBG__ + E_INFO + ("[%5d] WordTrans bpidx[%d] -> pnode[%08x]\n", + fsgs->frame, bpidx, (int32) root); +#endif + } + + hmm_enter(&root->hmm, newscore, bpidx, nf); + } + } + } + } +} + + +int +fsg_search_step(ps_search_t *search, int frame_idx) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + int16 const *senscr; + acmod_t *acmod = search->acmod; + gnode_t *gn; + fsg_pnode_t *pnode; + hmm_t *hmm; + + /* Activate our HMMs for the current frame if need be. */ + if (!acmod->compallsen) + fsg_search_sen_active(fsgs); + /* Compute GMM scores for the current frame. */ + senscr = acmod_score(acmod, &frame_idx); + fsgs->n_sen_eval += acmod->n_senone_active; + hmm_context_set_senscore(fsgs->hmmctx, senscr); + + /* Mark backpointer table for current frame. */ + fsgs->bpidx_start = fsg_history_n_entries(fsgs->history); + + /* Evaluate all active pnodes (HMMs) */ + fsg_search_hmm_eval(fsgs); + + /* + * Prune and propagate the HMMs evaluated; create history entries for + * word exits. The words exits are tentative, and may be pruned; make + * the survivors permanent via fsg_history_end_frame(). + */ + fsg_search_hmm_prune_prop(fsgs); + fsg_history_end_frame(fsgs->history); + + /* + * Propagate new history entries through any null transitions, creating + * new history entries, and then make the survivors permanent. + */ + fsg_search_null_prop(fsgs); + fsg_history_end_frame(fsgs->history); + + /* + * Perform cross-word transitions; propagate each history entry across its + * terminating state to the root nodes of the lextree attached to the state. + */ + fsg_search_word_trans(fsgs); + + /* + * We've now come full circle, HMM and FSG states have been updated for + * the next frame. + * Update the active lists, deactivate any currently active HMMs that + * did not survive into the next frame + */ + for (gn = fsgs->pnode_active; gn; gn = gnode_next(gn)) { + pnode = (fsg_pnode_t *) gnode_ptr(gn); + hmm = fsg_pnode_hmmptr(pnode); + + if (hmm_frame(hmm) == fsgs->frame) { + /* This HMM NOT activated for the next frame; reset it */ + fsg_psubtree_pnode_deactivate(pnode); + } + else { + assert(hmm_frame(hmm) == (fsgs->frame + 1)); + } + } + + /* Free the currently active list */ + glist_free(fsgs->pnode_active); + + /* Make the next-frame active list the current one */ + fsgs->pnode_active = fsgs->pnode_active_next; + fsgs->pnode_active_next = NULL; + + /* End of this frame; ready for the next */ + ++fsgs->frame; + + return 1; +} + + +/* + * Set all HMMs to inactive, clear active lists, initialize FSM start + * state to be the only active node. + * (Executed at the start of each utterance.) + */ +int +fsg_search_start(ps_search_t *search) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + int32 silcipid; + fsg_pnode_ctxt_t ctxt; + + /* Reset dynamic adjustment factor for beams */ + fsgs->beam_factor = 1.0f; + fsgs->beam = fsgs->beam_orig; + fsgs->pbeam = fsgs->pbeam_orig; + fsgs->wbeam = fsgs->wbeam_orig; + + silcipid = bin_mdef_ciphone_id(ps_search_acmod(fsgs)->mdef, "SIL"); + + /* Initialize EVERYTHING to be inactive */ + assert(fsgs->pnode_active == NULL); + assert(fsgs->pnode_active_next == NULL); + + fsg_history_reset(fsgs->history); + fsg_history_utt_start(fsgs->history); + fsgs->final = FALSE; + + /* Dummy context structure that allows all right contexts to use this entry */ + fsg_pnode_add_all_ctxt(&ctxt); + + /* Create dummy history entry leading to start state */ + fsgs->frame = -1; + fsgs->bestscore = 0; + fsg_history_entry_add(fsgs->history, + NULL, -1, 0, -1, silcipid, ctxt); + fsgs->bpidx_start = 0; + + /* Propagate dummy history entry through NULL transitions from start state */ + fsg_search_null_prop(fsgs); + + /* Perform word transitions from this dummy history entry */ + fsg_search_word_trans(fsgs); + + /* Make the next-frame active list the current one */ + fsgs->pnode_active = fsgs->pnode_active_next; + fsgs->pnode_active_next = NULL; + + ++fsgs->frame; + + fsgs->n_hmm_eval = 0; + fsgs->n_sen_eval = 0; + + ptmr_reset(&fsgs->perf); + ptmr_start(&fsgs->perf); + + return 0; +} + +/* + * Cleanup at the end of each utterance. + */ +int +fsg_search_finish(ps_search_t *search) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + gnode_t *gn; + fsg_pnode_t *pnode; + int32 n_hist, cf; + + /* Deactivate all nodes in the current and next-frame active lists */ + for (gn = fsgs->pnode_active; gn; gn = gnode_next(gn)) { + pnode = (fsg_pnode_t *) gnode_ptr(gn); + fsg_psubtree_pnode_deactivate(pnode); + } + for (gn = fsgs->pnode_active_next; gn; gn = gnode_next(gn)) { + pnode = (fsg_pnode_t *) gnode_ptr(gn); + fsg_psubtree_pnode_deactivate(pnode); + } + + glist_free(fsgs->pnode_active); + fsgs->pnode_active = NULL; + glist_free(fsgs->pnode_active_next); + fsgs->pnode_active_next = NULL; + + fsgs->final = TRUE; + + n_hist = fsg_history_n_entries(fsgs->history); + fsgs->n_tot_frame += fsgs->frame; + E_INFO + ("%d frames, %d HMMs (%d/fr), %d senones (%d/fr), %d history entries (%d/fr)\n\n", + fsgs->frame, fsgs->n_hmm_eval, + (fsgs->frame > 0) ? fsgs->n_hmm_eval / fsgs->frame : 0, + fsgs->n_sen_eval, + (fsgs->frame > 0) ? fsgs->n_sen_eval / fsgs->frame : 0, + n_hist, (fsgs->frame > 0) ? n_hist / fsgs->frame : 0); + + /* Print out some statistics. */ + ptmr_stop(&fsgs->perf); + /* This is the number of frames processed. */ + cf = ps_search_acmod(fsgs)->output_frame; + if (cf > 0) { + double n_speech = (double) (cf + 1) + / cmd_ln_int32_r(ps_search_config(fsgs), "-frate"); + E_INFO("fsg %.2f CPU %.3f xRT\n", + fsgs->perf.t_cpu, fsgs->perf.t_cpu / n_speech); + E_INFO("fsg %.2f wall %.3f xRT\n", + fsgs->perf.t_elapsed, fsgs->perf.t_elapsed / n_speech); + } + + + return 0; +} + +static int +fsg_search_find_exit(fsg_search_t *fsgs, int frame_idx, int final, int32 *out_score) +{ + fsg_hist_entry_t *hist_entry = NULL; + fsg_model_t *fsg; + int bpidx, frm, last_frm, besthist; + int32 bestscore; + + if (frame_idx == -1) + frame_idx = fsgs->frame - 1; + last_frm = frm = frame_idx; + + /* Scan backwards to find a word exit in frame_idx. */ + bpidx = fsg_history_n_entries(fsgs->history) - 1; + while (bpidx > 0) { + hist_entry = fsg_history_entry_get(fsgs->history, bpidx); + if (fsg_hist_entry_frame(hist_entry) <= frame_idx) { + frm = last_frm = fsg_hist_entry_frame(hist_entry); + break; + } + bpidx--; + } + + /* No hypothesis (yet). */ + if (bpidx <= 0) + return bpidx; + + /* Now find best word exit in this frame. */ + bestscore = INT_MIN; + besthist = -1; + fsg = fsgs->fsg; + while (frm == last_frm) { + fsg_link_t *fl; + int32 score; + + fl = fsg_hist_entry_fsglink(hist_entry); + score = fsg_hist_entry_score(hist_entry); + + if (fl == NULL) + break; + + /* Prefer final hypothesis */ + if (score == bestscore && fsg_link_to_state(fl) == fsg_model_final_state(fsg)) { + besthist = bpidx; + } else if (score BETTER_THAN bestscore) { + /* Only enforce the final state constraint if this is a final hypothesis. */ + if ((!final) + || fsg_link_to_state(fl) == fsg_model_final_state(fsg)) { + bestscore = score; + besthist = bpidx; + } + } + + --bpidx; + if (bpidx < 0) + break; + hist_entry = fsg_history_entry_get(fsgs->history, bpidx); + frm = fsg_hist_entry_frame(hist_entry); + } + + /* Final state not reached. */ + if (besthist == -1) { + E_ERROR("Final result does not match the grammar in frame %d\n", frame_idx); + return -1; + } + + /* This here's the one we want. */ + if (out_score) + *out_score = bestscore; + + return besthist; +} + +/* FIXME: Mostly duplicated with ngram_search_bestpath(). */ +static ps_latlink_t * +fsg_search_bestpath(ps_search_t *search, int32 *out_score, int backward) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + + (void)backward; + if (search->last_link == NULL) { + search->last_link = ps_lattice_bestpath(search->dag, NULL, + 1.0, fsgs->ascale); + if (search->last_link == NULL) + return NULL; + /* Also calculate betas so we can fill in the posterior + * probability field in the segmentation. */ + if (search->post == 0) + search->post = ps_lattice_posterior(search->dag, NULL, fsgs->ascale); + } + if (out_score) + *out_score = search->last_link->path_scr + search->dag->final_node_ascr; + return search->last_link; +} + +char const * +fsg_search_hyp(ps_search_t *search, int32 *out_score) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + dict_t *dict = ps_search_dict(search); + char *c; + size_t len; + int bp, bpidx; + + /* Get last backpointer table index. */ + bpidx = fsg_search_find_exit(fsgs, fsgs->frame, fsgs->final, out_score); + /* No hypothesis (yet). */ + if (bpidx <= 0) { + return NULL; + } + + /* If bestpath is enabled and the utterance is complete, then run it. + * Note that setting bestpath in fsg_search_init is disabled by default. */ + if (fsgs->bestpath && fsgs->final) { + ps_lattice_t *dag; + ps_latlink_t *link; + + if ((dag = fsg_search_lattice(search)) == NULL) { + E_WARN("Failed to obtain the lattice while bestpath enabled\n"); + return NULL; + } + if ((link = fsg_search_bestpath(search, out_score, FALSE)) == NULL) { + E_WARN("Failed to find the bestpath in a lattice\n"); + return NULL; + } + return ps_lattice_hyp(dag, link); + } + + bp = bpidx; + len = 0; + while (bp > 0) { + fsg_hist_entry_t *hist_entry = fsg_history_entry_get(fsgs->history, bp); + fsg_link_t *fl = fsg_hist_entry_fsglink(hist_entry); + char const *baseword; + int32 wid; + + bp = fsg_hist_entry_pred(hist_entry); + wid = fsg_link_wid(fl); + if (wid < 0 || fsg_model_is_filler(fsgs->fsg, wid)) + continue; + baseword = dict_basestr(dict, + dict_wordid(dict, + fsg_model_word_str(fsgs->fsg, wid))); + len += strlen(baseword) + 1; + } + + ckd_free(search->hyp_str); + if (len == 0) { + search->hyp_str = NULL; + return search->hyp_str; + } + search->hyp_str = ckd_calloc(1, len); + + bp = bpidx; + c = search->hyp_str + len - 1; + while (bp > 0) { + fsg_hist_entry_t *hist_entry = fsg_history_entry_get(fsgs->history, bp); + fsg_link_t *fl = fsg_hist_entry_fsglink(hist_entry); + char const *baseword; + int32 wid; + + bp = fsg_hist_entry_pred(hist_entry); + wid = fsg_link_wid(fl); + if (wid < 0 || fsg_model_is_filler(fsgs->fsg, wid)) + continue; + baseword = dict_basestr(dict, + dict_wordid(dict, + fsg_model_word_str(fsgs->fsg, wid))); + len = strlen(baseword); + c -= len; + memcpy(c, baseword, len); + if (c > search->hyp_str) { + --c; + *c = ' '; + } + } + + return search->hyp_str; +} + +static void +fsg_seg_bp2itor(ps_seg_t *seg, fsg_hist_entry_t *hist_entry) +{ + fsg_search_t *fsgs = (fsg_search_t *)seg->search; + fsg_hist_entry_t *ph = NULL; + int32 bp; + + if ((bp = fsg_hist_entry_pred(hist_entry)) >= 0) + ph = fsg_history_entry_get(fsgs->history, bp); + seg->word = fsg_model_word_str(fsgs->fsg, hist_entry->fsglink->wid); + seg->ef = fsg_hist_entry_frame(hist_entry); + seg->sf = ph ? fsg_hist_entry_frame(ph) + 1 : 0; + /* This is kind of silly but it happens for null transitions. */ + if (seg->sf > seg->ef) seg->sf = seg->ef; + seg->prob = 0; /* Bogus value... */ + /* "Language model" score = transition probability. */ + seg->lback = 1; + seg->lscr = fsg_link_logs2prob(hist_entry->fsglink) >> SENSCR_SHIFT; + if (ph) { + /* FIXME: Not sure exactly how cross-word triphones are handled. */ + seg->ascr = hist_entry->score - ph->score - seg->lscr; + } + else + seg->ascr = hist_entry->score - seg->lscr; +} + + +static void +fsg_seg_free(ps_seg_t *seg) +{ + fsg_seg_t *itor = (fsg_seg_t *)seg; + ckd_free(itor->hist); + ckd_free(itor); +} + +static ps_seg_t * +fsg_seg_next(ps_seg_t *seg) +{ + fsg_seg_t *itor = (fsg_seg_t *)seg; + + if (++itor->cur == itor->n_hist) { + fsg_seg_free(seg); + return NULL; + } + + fsg_seg_bp2itor(seg, itor->hist[itor->cur]); + return seg; +} + +static ps_segfuncs_t fsg_segfuncs = { + /* seg_next */ fsg_seg_next, + /* seg_free */ fsg_seg_free +}; + +static ps_seg_t * +fsg_search_seg_iter(ps_search_t *search) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + fsg_seg_t *itor; + int32 out_score; + int bp, bpidx, cur; + + bpidx = fsg_search_find_exit(fsgs, fsgs->frame, fsgs->final, &out_score); + /* No hypothesis (yet). */ + if (bpidx <= 0) + return NULL; + + /* If bestpath is enabled and the utterance is complete, then run it. + * Note that setting bestpath in fsg_search_init is disabled by default. */ + if (fsgs->bestpath && fsgs->final) { + ps_lattice_t *dag; + ps_latlink_t *link; + + if ((dag = fsg_search_lattice(search)) == NULL) + return NULL; + if ((link = fsg_search_bestpath(search, &out_score, TRUE)) == NULL) + return NULL; + return ps_lattice_seg_iter(dag, link, 1.0); + } + + /* Calling this an "iterator" is a bit of a misnomer since we have + * to get the entire backtrace in order to produce it. On the + * other hand, all we actually need is the bptbl IDs, and we can + * allocate a fixed-size array of them. */ + itor = ckd_calloc(1, sizeof(*itor)); + itor->base.vt = &fsg_segfuncs; + itor->base.search = search; + itor->base.lwf = 1.0; + itor->n_hist = 0; + bp = bpidx; + while (bp > 0) { + fsg_hist_entry_t *hist_entry = fsg_history_entry_get(fsgs->history, bp); + bp = fsg_hist_entry_pred(hist_entry); + ++itor->n_hist; + } + if (itor->n_hist == 0) { + ckd_free(itor); + return NULL; + } + itor->hist = ckd_calloc(itor->n_hist, sizeof(*itor->hist)); + cur = itor->n_hist - 1; + bp = bpidx; + while (bp > 0) { + fsg_hist_entry_t *hist_entry = fsg_history_entry_get(fsgs->history, bp); + itor->hist[cur] = hist_entry; + bp = fsg_hist_entry_pred(hist_entry); + --cur; + } + + /* Fill in relevant fields for first element. */ + fsg_seg_bp2itor((ps_seg_t *)itor, itor->hist[0]); + + return (ps_seg_t *)itor; +} + +static int +fsg_search_prob(ps_search_t *search) +{ + fsg_search_t *fsgs = (fsg_search_t *)search; + + /* If bestpath is enabled and the utterance is complete, then run it. + * Note that setting bestpath in fsg_search_init is disabled by default. */ + if (fsgs->bestpath && fsgs->final) { + ps_lattice_t *dag; + ps_latlink_t *link; + + if ((dag = fsg_search_lattice(search)) == NULL) + return 0; + if ((link = fsg_search_bestpath(search, NULL, TRUE)) == NULL) + return 0; + return search->post; + } + else { + /* FIXME: Give some kind of good estimate here, eventually. */ + return 0; + } +} + +static ps_latnode_t * +find_node(ps_lattice_t *dag, fsg_model_t *fsg, int sf, int32 wid, int32 node_id) +{ + ps_latnode_t *node; + + (void)fsg; + for (node = dag->nodes; node; node = node->next) + if ((node->sf == sf) && (node->wid == wid) && (node->node_id == node_id)) + break; + return node; +} + +static ps_latnode_t * +new_node(ps_lattice_t *dag, fsg_model_t *fsg, int sf, int ef, int32 wid, int32 node_id, int32 ascr) +{ + ps_latnode_t *node; + + node = find_node(dag, fsg, sf, wid, node_id); + + if (node) { + /* Update end frames. */ + if (node->lef == -1 || node->lef < ef) + node->lef = ef; + if (node->fef == -1 || node->fef > ef) + node->fef = ef; + /* Update best link score. */ + if (ascr BETTER_THAN node->info.best_exit) + node->info.best_exit = ascr; + } + else { + /* New node; link to head of list */ + node = listelem_malloc(dag->latnode_alloc); + node->wid = wid; + node->sf = sf; + node->fef = node->lef = ef; + node->reachable = FALSE; + node->entries = NULL; + node->exits = NULL; + node->info.best_exit = ascr; + node->node_id = node_id; + + node->next = dag->nodes; + dag->nodes = node; + ++dag->n_nodes; + } + + return node; +} + +static ps_latnode_t * +find_start_node(fsg_search_t *fsgs, ps_lattice_t *dag) +{ + ps_latnode_t *node; + glist_t start = NULL; + int nstart = 0; + + /* Look for all nodes starting in frame zero with some exits. */ + for (node = dag->nodes; node; node = node->next) { + if (node->sf == 0 && node->exits) { + E_INFO("Start node %s.%d:%d:%d\n", + fsg_model_word_str(fsgs->fsg, node->wid), + node->sf, node->fef, node->lef); + start = glist_add_ptr(start, node); + ++nstart; + } + } + + /* If there was more than one start node candidate, then we need + * to create an artificial start node with epsilon transitions to + * all of them. */ + if (nstart == 1) { + node = gnode_ptr(start); + } + else { + gnode_t *st; + int wid; + + wid = fsg_model_word_add(fsgs->fsg, ""); + if (fsgs->fsg->silwords) + bitvec_set(fsgs->fsg->silwords, wid); + node = new_node(dag, fsgs->fsg, 0, 0, wid, -1, 0); + for (st = start; st; st = gnode_next(st)) + ps_lattice_link(dag, node, gnode_ptr(st), 0, 0); + } + glist_free(start); + return node; +} + +static ps_latnode_t * +find_end_node(fsg_search_t *fsgs, ps_lattice_t *dag) +{ + ps_latnode_t *node; + glist_t end = NULL; + int nend = 0; + + /* Look for all nodes ending in last frame with some entries. */ + for (node = dag->nodes; node; node = node->next) { + if (node->lef == dag->n_frames - 1 && node->entries) { + E_INFO("End node %s.%d:%d:%d (%d)\n", + fsg_model_word_str(fsgs->fsg, node->wid), + node->sf, node->fef, node->lef, node->info.best_exit); + end = glist_add_ptr(end, node); + ++nend; + } + } + + if (nend == 1) { + node = gnode_ptr(end); + } + else if (nend == 0) { + ps_latnode_t *last = NULL; + int ef = 0; + + /* If there were no end node candidates, then just use the + * node with the last exit frame. */ + for (node = dag->nodes; node; node = node->next) { + if (node->lef > ef && node->entries) { + last = node; + ef = node->lef; + } + } + node = last; + if (node) + E_INFO("End node %s.%d:%d:%d (%d)\n", + fsg_model_word_str(fsgs->fsg, node->wid), + node->sf, node->fef, node->lef, node->info.best_exit); + } + else { + /* If there was more than one end node candidate, then we need + * to create an artificial end node with epsilon transitions + * out of all of them. */ + gnode_t *st; + int wid; + wid = fsg_model_word_add(fsgs->fsg, ""); + if (fsgs->fsg->silwords) + bitvec_set(fsgs->fsg->silwords, wid); + node = new_node(dag, fsgs->fsg, fsgs->frame, fsgs->frame, wid, -1, 0); + /* Use the "best" (in reality it will be the only) exit link + * score from this final node as the link score. */ + for (st = end; st; st = gnode_next(st)) { + ps_latnode_t *src = gnode_ptr(st); + ps_lattice_link(dag, src, node, src->info.best_exit, fsgs->frame); + } + } + glist_free(end); + return node; +} + +static void +mark_reachable(ps_lattice_t *dag, ps_latnode_t *end) +{ + glist_t q; + + (void)dag; + /* It doesn't matter which order we do this in. */ + end->reachable = TRUE; + q = glist_add_ptr(NULL, end); + while (q) { + ps_latnode_t *node = gnode_ptr(q); + latlink_list_t *x; + + /* Pop the front of the list. */ + q = gnode_free(q, NULL); + /* Expand all its predecessors that haven't been seen yet. */ + for (x = node->entries; x; x = x->next) { + ps_latnode_t *next = x->link->from; + if (!next->reachable) { + next->reachable = TRUE; + q = glist_add_ptr(q, next); + } + } + } +} + +/** + * Generate a lattice from FSG search results. + * + * One might think that this is simply a matter of adding acoustic + * scores to the FSG's edges. However, one would be wrong. The + * crucial difference here is that the word lattice is acyclic, and it + * also contains timing information. + */ +static ps_lattice_t * +fsg_search_lattice(ps_search_t *search) +{ + fsg_search_t *fsgs; + fsg_model_t *fsg; + ps_latnode_t *node; + ps_lattice_t *dag; + int32 i, n; + + fsgs = (fsg_search_t *)search; + + /* Check to see if a lattice has previously been created over the + * same number of frames, and reuse it if so. */ + if (search->dag && search->dag->n_frames == fsgs->frame) + return search->dag; + + /* Nope, create a new one. */ + ps_lattice_free(search->dag); + search->dag = NULL; + dag = ps_lattice_init_search(search, fsgs->frame); + fsg = fsgs->fsg; + + /* + * Each history table entry represents a link in the word graph. + * The set of nodes is determined by the number of unique + * (word,start-frame) pairs in the history table. So we will + * first find all those nodes. + */ + n = fsg_history_n_entries(fsgs->history); + for (i = 0; i < n; ++i) { + fsg_hist_entry_t *fh = fsg_history_entry_get(fsgs->history, i); + int32 ascr; + int sf; + + /* Skip null transitions. */ + if (fh->fsglink == NULL || fh->fsglink->wid == -1) + continue; + + /* Find the start node of this link. */ + if (fh->pred) { + fsg_hist_entry_t *pfh = fsg_history_entry_get(fsgs->history, fh->pred); + /* FIXME: We include the transition score in the lattice + * link score. This is because of the practical + * difficulty of obtaining it separately in bestpath or + * forward-backward search, and because it is essentially + * a unigram probability, so there is no need to treat it + * separately from the acoustic score. However, it's not + * clear that this will actually yield correct results.*/ + ascr = fh->score - pfh->score; + sf = pfh->frame + 1; + } + else { + ascr = fh->score; + sf = 0; + } + + /* + * Note that although scores are tied to links rather than + * nodes, it's possible that there are no links out of the + * destination node, and thus we need to preserve its score in + * case it turns out to be utterance-final. + */ + new_node(dag, fsg, sf, fh->frame, fh->fsglink->wid, fsg_link_to_state(fh->fsglink), ascr); + } + + /* + * Now, we will create links only to nodes that actually exist. + */ + n = fsg_history_n_entries(fsgs->history); + for (i = 0; i < n; ++i) { + fsg_hist_entry_t *fh = fsg_history_entry_get(fsgs->history, i); + fsg_arciter_t *itor; + ps_latnode_t *src, *dest; + int32 ascr; + int sf; + + /* Skip null transitions. */ + if (fh->fsglink == NULL || fh->fsglink->wid == -1) + continue; + + /* Find the start node of this link and calculate its link score. */ + if (fh->pred) { + fsg_hist_entry_t *pfh = fsg_history_entry_get(fsgs->history, fh->pred); + sf = pfh->frame + 1; + ascr = fh->score - pfh->score; + } + else { + ascr = fh->score; + sf = 0; + } + src = find_node(dag, fsg, sf, fh->fsglink->wid, fsg_link_to_state(fh->fsglink)); + sf = fh->frame + 1; + + for (itor = fsg_model_arcs(fsg, fsg_link_to_state(fh->fsglink)); + itor; itor = fsg_arciter_next(itor)) { + fsg_link_t *link = fsg_arciter_get(itor); + + /* FIXME: Need to figure out what to do about tag transitions. */ + if (link->wid >= 0) { + /* + * For each non-epsilon link following this one, look for a + * matching node in the lattice and link to it. + */ + if ((dest = find_node(dag, fsg, sf, link->wid, fsg_link_to_state(link))) != NULL) + ps_lattice_link(dag, src, dest, ascr, fh->frame); + } + else { + /* + * Transitive closure on nulls has already been done, so we + * just need to look one link forward from them. + */ + fsg_arciter_t *itor2; + + /* Add all non-null links out of j. */ + for (itor2 = fsg_model_arcs(fsg, fsg_link_to_state(link)); + itor2; itor2 = fsg_arciter_next(itor2)) { + fsg_link_t *link = fsg_arciter_get(itor2); + + if (link->wid == -1) + continue; + + if ((dest = find_node(dag, fsg, sf, link->wid, fsg_link_to_state(link))) != NULL) { + ps_lattice_link(dag, src, dest, ascr, fh->frame); + } + } + } + } + } + + + /* Figure out which nodes are the start and end nodes. */ + if ((dag->start = find_start_node(fsgs, dag)) == NULL) { + E_WARN("Failed to find the start node\n"); + goto error_out; + } + if ((dag->end = find_end_node(fsgs, dag)) == NULL) { + E_WARN("Failed to find the end node\n"); + goto error_out; + } + + + E_INFO("lattice start node %s.%d end node %s.%d\n", + fsg_model_word_str(fsg, dag->start->wid), dag->start->sf, + fsg_model_word_str(fsg, dag->end->wid), dag->end->sf); + /* FIXME: Need to calculate final_node_ascr here. */ + + /* + * Convert word IDs from FSG to dictionary. + */ + for (node = dag->nodes; node; node = node->next) { + node->wid = dict_wordid(dag->search->dict, + fsg_model_word_str(fsg, node->wid)); + node->basewid = dict_basewid(dag->search->dict, node->wid); + } + + /* + * Now we are done, because the links in the graph are uniquely + * defined by the history table. However we should remove any + * nodes which are not reachable from the end node of the FSG. + * Everything is reachable from the start node by definition. + */ + mark_reachable(dag, dag->end); + + ps_lattice_delete_unreachable(dag); + { + int32 silpen, fillpen; + + silpen = (int32)(logmath_log(fsg->lmath, + cmd_ln_float32_r(ps_search_config(fsgs), "-silprob")) + * fsg->lw) + >> SENSCR_SHIFT; + fillpen = (int32)(logmath_log(fsg->lmath, + cmd_ln_float32_r(ps_search_config(fsgs), "-fillprob")) + * fsg->lw) + >> SENSCR_SHIFT; + + ps_lattice_penalize_fillers(dag, silpen, fillpen); + } + search->dag = dag; + + return dag; + + +error_out: + ps_lattice_free(dag); + return NULL; + +} + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h new file mode 100644 index 0000000..2b1fcd1 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h @@ -0,0 +1,164 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * fsg_search_internal.h -- Search structures for FSG decoding. + */ + + +#ifndef __S2_FSG_SEARCH_H__ +#define __S2_FSG_SEARCH_H__ + + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "pocketsphinx_internal.h" +#include "hmm.h" +#include "fsg_history.h" +#include "fsg_lextree.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Segmentation "iterator" for FSG history. + */ +typedef struct fsg_seg_s { + ps_seg_t base; /**< Base structure. */ + fsg_hist_entry_t **hist; /**< Sequence of history entries. */ + int16 n_hist; /**< Number of history entries. */ + int16 cur; /**< Current position in hist. */ +} fsg_seg_t; + +/** + * Implementation of FSG search (and "FSG set") structure. + */ +typedef struct fsg_search_s { + ps_search_t base; + + hmm_context_t *hmmctx; /**< HMM context. */ + + fsg_model_t *fsg; /**< FSG model */ + struct fsg_lextree_s *lextree;/**< Lextree structure for the currently + active FSG */ + struct fsg_history_s *history;/**< For storing the Viterbi search history */ + + glist_t pnode_active; /**< Those active in this frame */ + glist_t pnode_active_next; /**< Those activated for the next frame */ + + int32 beam_orig; /**< Global pruning threshold */ + int32 pbeam_orig; /**< Pruning threshold for phone transition */ + int32 wbeam_orig; /**< Pruning threshold for word exit */ + float32 beam_factor; /**< Dynamic/adaptive factor (<=1) applied to above + beams to determine actual effective beams. + For implementing absolute pruning. */ + int32 beam, pbeam, wbeam; /**< Effective beams after applying beam_factor */ + int32 lw, pip, wip; /**< Language weights */ + + frame_idx_t frame; /**< Current frame. */ + uint8 final; /**< Decoding is finished for this utterance. */ + uint8 bestpath; /**< Whether to run bestpath search + and confidence annotation at end. */ + float32 ascale; /**< Acoustic score scale for posterior probabilities. */ + + int32 bestscore; /**< For beam pruning */ + int32 bpidx_start; /**< First history entry index this frame */ + + int32 ascr, lscr; /**< Total acoustic and lm score for utt */ + + int32 n_hmm_eval; /**< Total HMMs evaluated this utt */ + int32 n_sen_eval; /**< Total senones evaluated this utt */ + + ptmr_t perf; /**< Performance counter */ + int32 n_tot_frame; + +} fsg_search_t; + +/* Access macros */ +#define fsg_search_frame(s) ((s)->frame) + +/** + * Create, initialize and return a search module. + */ +ps_search_t *fsg_search_init(const char *name, + fsg_model_t *fsg, + cmd_ln_t *config, + acmod_t *acmod, + dict_t *dict, + dict2pid_t *d2p); + +/** + * Deallocate search structure. + */ +void fsg_search_free(ps_search_t *search); + +/** + * Update FSG search module for new or updated FSGs. + */ +int fsg_search_reinit(ps_search_t *fsgs, dict_t *dict, dict2pid_t *d2p); + +/** + * Prepare the FSG search structure for beginning decoding of the next + * utterance. + */ +int fsg_search_start(ps_search_t *search); + +/** + * Step one frame forward through the Viterbi search. + */ +int fsg_search_step(ps_search_t *search, int frame_idx); + +/** + * Windup and clean the FSG search structure after utterance. + */ +int fsg_search_finish(ps_search_t *search); + +/** + * Get hypothesis string from the FSG search. + */ +char const *fsg_search_hyp(ps_search_t *search, int32 *out_score); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c new file mode 100644 index 0000000..6ef5a9f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c @@ -0,0 +1,826 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file hmm.h Implementation of HMM base structure. + */ + +/* System headers. */ +#include +#include +#include +#include + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include "hmm.h" + +hmm_context_t * +hmm_context_init(int32 n_emit_state, + uint8 ** const *tp, + int16 const *senscore, + uint16 * const *sseq) +{ + hmm_context_t *ctx; + + assert(n_emit_state > 0); + if (n_emit_state > HMM_MAX_NSTATE) { + E_ERROR("Number of emitting states must be <= %d\n", HMM_MAX_NSTATE); + return NULL; + } + + ctx = ckd_calloc(1, sizeof(*ctx)); + ctx->n_emit_state = n_emit_state; + ctx->tp = tp; + ctx->senscore = senscore; + ctx->sseq = sseq; + ctx->st_sen_scr = ckd_calloc(n_emit_state, sizeof(*ctx->st_sen_scr)); + + return ctx; +} + +void +hmm_context_free(hmm_context_t *ctx) +{ + if (ctx == NULL) + return; + ckd_free(ctx->st_sen_scr); + ckd_free(ctx); +} + +void +hmm_init(hmm_context_t *ctx, hmm_t *hmm, int mpx, int ssid, int tmatid) +{ + hmm->ctx = ctx; + hmm->mpx = mpx; + hmm->n_emit_state = ctx->n_emit_state; + if (mpx) { + int i; + hmm->ssid = BAD_SSID; + hmm->senid[0] = ssid; + for (i = 1; i < hmm_n_emit_state(hmm); ++i) { + hmm->senid[i] = BAD_SSID; + } + } + else { + hmm->ssid = ssid; + memcpy(hmm->senid, ctx->sseq[ssid], hmm->n_emit_state * sizeof(*hmm->senid)); + } + hmm->tmatid = tmatid; + hmm_clear(hmm); +} + +void +hmm_deinit(hmm_t *hmm) +{ + (void)hmm; +} + +void +hmm_dump(hmm_t * hmm, + FILE * fp) +{ + int32 i; + + if (hmm_is_mpx(hmm)) { + fprintf(fp, "MPX "); + for (i = 0; i < hmm_n_emit_state(hmm); i++) + fprintf(fp, " %11d", hmm_senid(hmm, i)); + fprintf(fp, " ( "); + for (i = 0; i < hmm_n_emit_state(hmm); i++) + fprintf(fp, "%d ", hmm_ssid(hmm, i)); + fprintf(fp, ")\n"); + } + else { + fprintf(fp, "SSID "); + for (i = 0; i < hmm_n_emit_state(hmm); i++) + fprintf(fp, " %11d", hmm_senid(hmm, i)); + fprintf(fp, " (%d)\n", hmm_ssid(hmm, 0)); + } + + if (hmm->ctx->senscore) { + fprintf(fp, "SENSCR"); + for (i = 0; i < hmm_n_emit_state(hmm); i++) + fprintf(fp, " %11d", hmm_senscr(hmm, i)); + fprintf(fp, "\n"); + } + + fprintf(fp, "SCORES %11d", hmm_in_score(hmm)); + for (i = 1; i < hmm_n_emit_state(hmm); i++) + fprintf(fp, " %11d", hmm_score(hmm, i)); + fprintf(fp, " %11d", hmm_out_score(hmm)); + fprintf(fp, "\n"); + + fprintf(fp, "HISTID %11d", hmm_in_history(hmm)); + for (i = 1; i < hmm_n_emit_state(hmm); i++) + fprintf(fp, " %11d", hmm_history(hmm, i)); + fprintf(fp, " %11d", hmm_out_history(hmm)); + fprintf(fp, "\n"); + + if (hmm_in_score(hmm) > 0) + fprintf(fp, + "ALERT!! The input score %d is large than 0. Probably wrap around.\n", + hmm_in_score(hmm)); + if (hmm_out_score(hmm) > 0) + fprintf(fp, + "ALERT!! The output score %d is large than 0. Probably wrap around\n.", + hmm_out_score(hmm)); + + fflush(fp); +} + + +void +hmm_clear_scores(hmm_t * h) +{ + int32 i; + + hmm_in_score(h) = WORST_SCORE; + for (i = 1; i < hmm_n_emit_state(h); i++) + hmm_score(h, i) = WORST_SCORE; + hmm_out_score(h) = WORST_SCORE; + + h->bestscore = WORST_SCORE; +} + +void +hmm_clear(hmm_t * h) +{ + int32 i; + + hmm_in_score(h) = WORST_SCORE; + hmm_in_history(h) = -1; + for (i = 1; i < hmm_n_emit_state(h); i++) { + hmm_score(h, i) = WORST_SCORE; + hmm_history(h, i) = -1; + } + hmm_out_score(h) = WORST_SCORE; + hmm_out_history(h) = -1; + + h->bestscore = WORST_SCORE; + h->frame = -1; +} + +void +hmm_enter(hmm_t *h, int32 score, int32 histid, int frame) +{ + hmm_in_score(h) = score; + hmm_in_history(h) = histid; + hmm_frame(h) = frame; +} + +void +hmm_normalize(hmm_t *h, int32 bestscr) +{ + int32 i; + + for (i = 0; i < hmm_n_emit_state(h); i++) { + if (hmm_score(h, i) BETTER_THAN WORST_SCORE) + hmm_score(h, i) -= bestscr; + } + if (hmm_out_score(h) BETTER_THAN WORST_SCORE) + hmm_out_score(h) -= bestscr; +} + +#define hmm_tprob_5st(i, j) (-tp[(i)*6+(j)]) +#define nonmpx_senscr(i) (-senscore[sseq[i]]) + +static int32 +hmm_vit_eval_5st_lr(hmm_t * hmm) +{ + int16 const *senscore = hmm->ctx->senscore; + uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; + uint16 const *sseq = hmm->senid; + int32 s5, s4, s3, s2, s1, s0, t2, t1, t0, bestScore; + + /* It was the best of scores, it was the worst of scores. */ + bestScore = WORST_SCORE; + + /* Cache problem here! */ + s4 = hmm_score(hmm, 4) + nonmpx_senscr(4); + s3 = hmm_score(hmm, 3) + nonmpx_senscr(3); + /* Transitions into non-emitting state 5 */ + if (s3 BETTER_THAN WORST_SCORE) { + t1 = s4 + hmm_tprob_5st(4, 5); + t2 = s3 + hmm_tprob_5st(3, 5); + if (t1 BETTER_THAN t2) { + s5 = t1; + hmm_out_history(hmm) = hmm_history(hmm, 4); + } else { + s5 = t2; + hmm_out_history(hmm) = hmm_history(hmm, 3); + } + if (s5 WORSE_THAN WORST_SCORE) s5 = WORST_SCORE; + hmm_out_score(hmm) = s5; + bestScore = s5; + } + + s2 = hmm_score(hmm, 2) + nonmpx_senscr(2); + /* All transitions into state 4 */ + if (s2 BETTER_THAN WORST_SCORE) { + t0 = s4 + hmm_tprob_5st(4, 4); + t1 = s3 + hmm_tprob_5st(3, 4); + t2 = s2 + hmm_tprob_5st(2, 4); + if (t0 BETTER_THAN t1) { + if (t2 BETTER_THAN t0) { + s4 = t2; + hmm_history(hmm, 4) = hmm_history(hmm, 2); + } else + s4 = t0; + } else { + if (t2 BETTER_THAN t1) { + s4 = t2; + hmm_history(hmm, 4) = hmm_history(hmm, 2); + } else { + s4 = t1; + hmm_history(hmm, 4) = hmm_history(hmm, 3); + } + } + if (s4 WORSE_THAN WORST_SCORE) s4 = WORST_SCORE; + if (s4 BETTER_THAN bestScore) bestScore = s4; + hmm_score(hmm, 4) = s4; + } + + s1 = hmm_score(hmm, 1) + nonmpx_senscr(1); + /* All transitions into state 3 */ + if (s1 BETTER_THAN WORST_SCORE) { + t0 = s3 + hmm_tprob_5st(3, 3); + t1 = s2 + hmm_tprob_5st(2, 3); + t2 = s1 + hmm_tprob_5st(1, 3); + if (t0 BETTER_THAN t1) { + if (t2 BETTER_THAN t0) { + s3 = t2; + hmm_history(hmm, 3) = hmm_history(hmm, 1); + } else + s3 = t0; + } else { + if (t2 BETTER_THAN t1) { + s3 = t2; + hmm_history(hmm, 3) = hmm_history(hmm, 1); + } else { + s3 = t1; + hmm_history(hmm, 3) = hmm_history(hmm, 2); + } + } + if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; + if (s3 BETTER_THAN bestScore) bestScore = s3; + hmm_score(hmm, 3) = s3; + } + + s0 = hmm_in_score(hmm) + nonmpx_senscr(0); + /* All transitions into state 2 (state 0 is always active) */ + t0 = s2 + hmm_tprob_5st(2, 2); + t1 = s1 + hmm_tprob_5st(1, 2); + t2 = s0 + hmm_tprob_5st(0, 2); + if (t0 BETTER_THAN t1) { + if (t2 BETTER_THAN t0) { + s2 = t2; + hmm_history(hmm, 2) = hmm_in_history(hmm); + } else + s2 = t0; + } else { + if (t2 BETTER_THAN t1) { + s2 = t2; + hmm_history(hmm, 2) = hmm_in_history(hmm); + } else { + s2 = t1; + hmm_history(hmm, 2) = hmm_history(hmm, 1); + } + } + if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; + if (s2 BETTER_THAN bestScore) bestScore = s2; + hmm_score(hmm, 2) = s2; + + + /* All transitions into state 1 */ + t0 = s1 + hmm_tprob_5st(1, 1); + t1 = s0 + hmm_tprob_5st(0, 1); + if (t0 BETTER_THAN t1) { + s1 = t0; + } else { + s1 = t1; + hmm_history(hmm, 1) = hmm_in_history(hmm); + } + if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; + if (s1 BETTER_THAN bestScore) bestScore = s1; + hmm_score(hmm, 1) = s1; + + /* All transitions into state 0 */ + s0 = s0 + hmm_tprob_5st(0, 0); + if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; + if (s0 BETTER_THAN bestScore) bestScore = s0; + hmm_in_score(hmm) = s0; + + hmm_bestscore(hmm) = bestScore; + return bestScore; +} + +#define mpx_senid(st) sseq[ssid[st]][st] +#define mpx_senscr(st) (-senscore[mpx_senid(st)]) + +static int32 +hmm_vit_eval_5st_lr_mpx(hmm_t * hmm) +{ + uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; + int16 const *senscore = hmm->ctx->senscore; + uint16 * const *sseq = hmm->ctx->sseq; + uint16 *ssid = hmm->senid; + int32 bestScore; + int32 s5, s4, s3, s2, s1, s0, t2, t1, t0; + + /* Don't propagate WORST_SCORE */ + if (ssid[4] == BAD_SSID) + s4 = t1 = WORST_SCORE; + else { + s4 = hmm_score(hmm, 4) + mpx_senscr(4); + t1 = s4 + hmm_tprob_5st(4, 5); + } + if (ssid[3] == BAD_SSID) + s3 = t2 = WORST_SCORE; + else { + s3 = hmm_score(hmm, 3) + mpx_senscr(3); + t2 = s3 + hmm_tprob_5st(3, 5); + } + if (t1 BETTER_THAN t2) { + s5 = t1; + hmm_out_history(hmm) = hmm_history(hmm, 4); + } + else { + s5 = t2; + hmm_out_history(hmm) = hmm_history(hmm, 3); + } + if (s5 WORSE_THAN WORST_SCORE) s5 = WORST_SCORE; + hmm_out_score(hmm) = s5; + bestScore = s5; + + /* Don't propagate WORST_SCORE */ + if (ssid[2] == BAD_SSID) + s2 = t2 = WORST_SCORE; + else { + s2 = hmm_score(hmm, 2) + mpx_senscr(2); + t2 = s2 + hmm_tprob_5st(2, 4); + } + + t0 = t1 = WORST_SCORE; + if (s4 != WORST_SCORE) + t0 = s4 + hmm_tprob_5st(4, 4); + if (s3 != WORST_SCORE) + t1 = s3 + hmm_tprob_5st(3, 4); + if (t0 BETTER_THAN t1) { + if (t2 BETTER_THAN t0) { + s4 = t2; + hmm_history(hmm, 4) = hmm_history(hmm, 2); + ssid[4] = ssid[2]; + } + else + s4 = t0; + } + else { + if (t2 BETTER_THAN t1) { + s4 = t2; + hmm_history(hmm, 4) = hmm_history(hmm, 2); + ssid[4] = ssid[2]; + } + else { + s4 = t1; + hmm_history(hmm, 4) = hmm_history(hmm, 3); + ssid[4] = ssid[3]; + } + } + if (s4 WORSE_THAN WORST_SCORE) s4 = WORST_SCORE; + if (s4 BETTER_THAN bestScore) + bestScore = s4; + hmm_score(hmm, 4) = s4; + + /* Don't propagate WORST_SCORE */ + if (ssid[1] == BAD_SSID) + s1 = t2 = WORST_SCORE; + else { + s1 = hmm_score(hmm, 1) + mpx_senscr(1); + t2 = s1 + hmm_tprob_5st(1, 3); + } + t0 = t1 = WORST_SCORE; + if (s3 != WORST_SCORE) + t0 = s3 + hmm_tprob_5st(3, 3); + if (s2 != WORST_SCORE) + t1 = s2 + hmm_tprob_5st(2, 3); + if (t0 BETTER_THAN t1) { + if (t2 BETTER_THAN t0) { + s3 = t2; + hmm_history(hmm, 3) = hmm_history(hmm, 1); + ssid[3] = ssid[1]; + } + else + s3 = t0; + } + else { + if (t2 BETTER_THAN t1) { + s3 = t2; + hmm_history(hmm, 3) = hmm_history(hmm, 1); + ssid[3] = ssid[1]; + } + else { + s3 = t1; + hmm_history(hmm, 3) = hmm_history(hmm, 2); + ssid[3] = ssid[2]; + } + } + if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; + if (s3 BETTER_THAN bestScore) bestScore = s3; + hmm_score(hmm, 3) = s3; + + /* State 0 is always active */ + s0 = hmm_in_score(hmm) + mpx_senscr(0); + + /* Don't propagate WORST_SCORE */ + t0 = t1 = WORST_SCORE; + if (s2 != WORST_SCORE) + t0 = s2 + hmm_tprob_5st(2, 2); + if (s1 != WORST_SCORE) + t1 = s1 + hmm_tprob_5st(1, 2); + t2 = s0 + hmm_tprob_5st(0, 2); + if (t0 BETTER_THAN t1) { + if (t2 BETTER_THAN t0) { + s2 = t2; + hmm_history(hmm, 2) = hmm_in_history(hmm); + ssid[2] = ssid[0]; + } + else + s2 = t0; + } + else { + if (t2 BETTER_THAN t1) { + s2 = t2; + hmm_history(hmm, 2) = hmm_in_history(hmm); + ssid[2] = ssid[0]; + } + else { + s2 = t1; + hmm_history(hmm, 2) = hmm_history(hmm, 1); + ssid[2] = ssid[1]; + } + } + if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; + if (s2 BETTER_THAN bestScore) bestScore = s2; + hmm_score(hmm, 2) = s2; + + /* Don't propagate WORST_SCORE */ + t0 = WORST_SCORE; + if (s1 != WORST_SCORE) + t0 = s1 + hmm_tprob_5st(1, 1); + t1 = s0 + hmm_tprob_5st(0, 1); + if (t0 BETTER_THAN t1) { + s1 = t0; + } + else { + s1 = t1; + hmm_history(hmm, 1) = hmm_in_history(hmm); + ssid[1] = ssid[0]; + } + if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; + if (s1 BETTER_THAN bestScore) bestScore = s1; + hmm_score(hmm, 1) = s1; + + s0 += hmm_tprob_5st(0, 0); + if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; + if (s0 BETTER_THAN bestScore) bestScore = s0; + hmm_in_score(hmm) = s0; + + hmm_bestscore(hmm) = bestScore; + return bestScore; +} + +#define hmm_tprob_3st(i, j) (-tp[(i)*4+(j)]) + +static int32 +hmm_vit_eval_3st_lr(hmm_t * hmm) +{ + int16 const *senscore = hmm->ctx->senscore; + uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; + uint16 const *sseq = hmm->senid; + int32 s3, s2, s1, s0, t2, t1, t0, bestScore; + + s2 = hmm_score(hmm, 2) + nonmpx_senscr(2); + s1 = hmm_score(hmm, 1) + nonmpx_senscr(1); + s0 = hmm_in_score(hmm) + nonmpx_senscr(0); + + /* It was the best of scores, it was the worst of scores. */ + bestScore = WORST_SCORE; + t2 = INT_MIN; /* Not used unless skipstate is true */ + + /* Transitions into non-emitting state 3 */ + if (s1 BETTER_THAN WORST_SCORE) { + t1 = s2 + hmm_tprob_3st(2, 3); + if (hmm_tprob_3st(1,3) BETTER_THAN TMAT_WORST_SCORE) + t2 = s1 + hmm_tprob_3st(1, 3); + if (t1 BETTER_THAN t2) { + s3 = t1; + hmm_out_history(hmm) = hmm_history(hmm, 2); + } else { + s3 = t2; + hmm_out_history(hmm) = hmm_history(hmm, 1); + } + if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; + hmm_out_score(hmm) = s3; + bestScore = s3; + } + + /* All transitions into state 2 (state 0 is always active) */ + t0 = s2 + hmm_tprob_3st(2, 2); + t1 = s1 + hmm_tprob_3st(1, 2); + if (hmm_tprob_3st(0, 2) BETTER_THAN TMAT_WORST_SCORE) + t2 = s0 + hmm_tprob_3st(0, 2); + if (t0 BETTER_THAN t1) { + if (t2 BETTER_THAN t0) { + s2 = t2; + hmm_history(hmm, 2) = hmm_in_history(hmm); + } else + s2 = t0; + } else { + if (t2 BETTER_THAN t1) { + s2 = t2; + hmm_history(hmm, 2) = hmm_in_history(hmm); + } else { + s2 = t1; + hmm_history(hmm, 2) = hmm_history(hmm, 1); + } + } + if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; + if (s2 BETTER_THAN bestScore) bestScore = s2; + hmm_score(hmm, 2) = s2; + + /* All transitions into state 1 */ + t0 = s1 + hmm_tprob_3st(1, 1); + t1 = s0 + hmm_tprob_3st(0, 1); + if (t0 BETTER_THAN t1) { + s1 = t0; + } else { + s1 = t1; + hmm_history(hmm, 1) = hmm_in_history(hmm); + } + if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; + if (s1 BETTER_THAN bestScore) bestScore = s1; + hmm_score(hmm, 1) = s1; + + /* All transitions into state 0 */ + s0 = s0 + hmm_tprob_3st(0, 0); + if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; + if (s0 BETTER_THAN bestScore) bestScore = s0; + hmm_in_score(hmm) = s0; + + hmm_bestscore(hmm) = bestScore; + return bestScore; +} + +static int32 +hmm_vit_eval_3st_lr_mpx(hmm_t * hmm) +{ + uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; + int16 const *senscore = hmm->ctx->senscore; + uint16 * const *sseq = hmm->ctx->sseq; + uint16 *ssid = hmm->senid; + int32 bestScore; + int32 s3, s2, s1, s0, t2, t1, t0; + + /* Don't propagate WORST_SCORE */ + t2 = INT_MIN; /* Not used unless skipstate is true */ + if (ssid[2] == BAD_SSID) + s2 = t1 = WORST_SCORE; + else { + s2 = hmm_score(hmm, 2) + mpx_senscr(2); + t1 = s2 + hmm_tprob_3st(2, 3); + } + if (ssid[1] == BAD_SSID) + s1 = t2 = WORST_SCORE; + else { + s1 = hmm_score(hmm, 1) + mpx_senscr(1); + if (hmm_tprob_3st(1,3) BETTER_THAN TMAT_WORST_SCORE) + t2 = s1 + hmm_tprob_3st(1, 3); + } + if (t1 BETTER_THAN t2) { + s3 = t1; + hmm_out_history(hmm) = hmm_history(hmm, 2); + } + else { + s3 = t2; + hmm_out_history(hmm) = hmm_history(hmm, 1); + } + if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; + hmm_out_score(hmm) = s3; + bestScore = s3; + + /* State 0 is always active */ + s0 = hmm_in_score(hmm) + mpx_senscr(0); + + /* Don't propagate WORST_SCORE */ + t0 = t1 = WORST_SCORE; + if (s2 != WORST_SCORE) + t0 = s2 + hmm_tprob_3st(2, 2); + if (s1 != WORST_SCORE) + t1 = s1 + hmm_tprob_3st(1, 2); + if (hmm_tprob_3st(0,2) BETTER_THAN TMAT_WORST_SCORE) + t2 = s0 + hmm_tprob_3st(0, 2); + if (t0 BETTER_THAN t1) { + if (t2 BETTER_THAN t0) { + s2 = t2; + hmm_history(hmm, 2) = hmm_in_history(hmm); + ssid[2] = ssid[0]; + } + else + s2 = t0; + } + else { + if (t2 BETTER_THAN t1) { + s2 = t2; + hmm_history(hmm, 2) = hmm_in_history(hmm); + ssid[2] = ssid[0]; + } + else { + s2 = t1; + hmm_history(hmm, 2) = hmm_history(hmm, 1); + ssid[2] = ssid[1]; + } + } + if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; + if (s2 BETTER_THAN bestScore) bestScore = s2; + hmm_score(hmm, 2) = s2; + + /* Don't propagate WORST_SCORE */ + t0 = WORST_SCORE; + if (s1 != WORST_SCORE) + t0 = s1 + hmm_tprob_3st(1, 1); + t1 = s0 + hmm_tprob_3st(0, 1); + if (t0 BETTER_THAN t1) { + s1 = t0; + } + else { + s1 = t1; + hmm_history(hmm, 1) = hmm_in_history(hmm); + ssid[1] = ssid[0]; + } + if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; + if (s1 BETTER_THAN bestScore) bestScore = s1; + hmm_score(hmm, 1) = s1; + + /* State 0 is always active */ + s0 += hmm_tprob_3st(0, 0); + if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; + if (s0 BETTER_THAN bestScore) bestScore = s0; + hmm_in_score(hmm) = s0; + + hmm_bestscore(hmm) = bestScore; + return bestScore; +} + +static int32 +hmm_vit_eval_anytopo(hmm_t * hmm) +{ + hmm_context_t *ctx = hmm->ctx; + int32 to, from, bestfrom; + int32 newscr, scr, bestscr; + int final_state; + + /* Compute previous state-score + observation output prob for each emitting state */ + ctx->st_sen_scr[0] = hmm_in_score(hmm) + hmm_senscr(hmm, 0); + for (from = 1; from < hmm_n_emit_state(hmm); ++from) { + if ((ctx->st_sen_scr[from] = + hmm_score(hmm, from) + hmm_senscr(hmm, from)) WORSE_THAN WORST_SCORE) + ctx->st_sen_scr[from] = WORST_SCORE; + } + + /* FIXME/TODO: Use the BLAS for all this. */ + /* Evaluate final-state first, which does not have a self-transition */ + final_state = hmm_n_emit_state(hmm); + to = final_state; + scr = WORST_SCORE; + bestfrom = -1; + for (from = to - 1; from >= 0; --from) { + if ((hmm_tprob(hmm, from, to) BETTER_THAN TMAT_WORST_SCORE) && + ((newscr = ctx->st_sen_scr[from] + + hmm_tprob(hmm, from, to)) BETTER_THAN scr)) { + scr = newscr; + bestfrom = from; + } + } + hmm_out_score(hmm) = scr; + if (bestfrom >= 0) + hmm_out_history(hmm) = hmm_history(hmm, bestfrom); + bestscr = scr; + + /* Evaluate all other states, which might have self-transitions */ + for (to = final_state - 1; to >= 0; --to) { + /* Score from self-transition, if any */ + scr = + (hmm_tprob(hmm, to, to) BETTER_THAN TMAT_WORST_SCORE) + ? ctx->st_sen_scr[to] + hmm_tprob(hmm, to, to) + : WORST_SCORE; + + /* Scores from transitions from other states */ + bestfrom = -1; + for (from = to - 1; from >= 0; --from) { + if ((hmm_tprob(hmm, from, to) BETTER_THAN TMAT_WORST_SCORE) && + ((newscr = ctx->st_sen_scr[from] + + hmm_tprob(hmm, from, to)) BETTER_THAN scr)) { + scr = newscr; + bestfrom = from; + } + } + + /* Update new result for state to */ + if (to == 0) { + hmm_in_score(hmm) = scr; + if (bestfrom >= 0) + hmm_in_history(hmm) = hmm_history(hmm, bestfrom); + } + else { + hmm_score(hmm, to) = scr; + if (bestfrom >= 0) + hmm_history(hmm, to) = hmm_history(hmm, bestfrom); + } + /* Propagate ssid for multiplex HMMs */ + if (bestfrom >= 0 && hmm_is_mpx(hmm)) + hmm->senid[to] = hmm->senid[bestfrom]; + + if (bestscr WORSE_THAN scr) + bestscr = scr; + } + + hmm_bestscore(hmm) = bestscr; + return bestscr; +} + +int32 +hmm_vit_eval(hmm_t * hmm) +{ + if (hmm_is_mpx(hmm)) { + if (hmm_n_emit_state(hmm) == 5) + return hmm_vit_eval_5st_lr_mpx(hmm); + else if (hmm_n_emit_state(hmm) == 3) + return hmm_vit_eval_3st_lr_mpx(hmm); + else + return hmm_vit_eval_anytopo(hmm); + } + else { + if (hmm_n_emit_state(hmm) == 5) + return hmm_vit_eval_5st_lr(hmm); + else if (hmm_n_emit_state(hmm) == 3) + return hmm_vit_eval_3st_lr(hmm); + else + return hmm_vit_eval_anytopo(hmm); + } +} + +int32 +hmm_dump_vit_eval(hmm_t * hmm, FILE * fp) +{ + int32 bs = 0; + + if (fp) { + fprintf(fp, "BEFORE:\n"); + hmm_dump(hmm, fp); + } + bs = hmm_vit_eval(hmm); + if (fp) { + fprintf(fp, "AFTER:\n"); + hmm_dump(hmm, fp); + } + + return bs; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h new file mode 100644 index 0000000..719e403 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h @@ -0,0 +1,309 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file hmm.h Hidden Markov Model base structures. + */ + +#ifndef __HMM_H__ +#define __HMM_H__ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include +#include + +/* PocketSphinx headers. */ +#include "bin_mdef.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Type for frame index values. Used in HMM indexes and + * backpointers and affects memory required.Due to limitations of FSG + * search implementation this value needs to be signed. + */ +typedef int32 frame_idx_t; + +/** + * Maximum number of frames in index, should be in sync with above. + */ +#define MAX_N_FRAMES MAX_INT32 + + +/** Shift count for senone scores. */ +#define SENSCR_SHIFT 10 + +/** + * Large "bad" score. + * + * This number must be "bad" enough so that 4 times WORST_SCORE will + * not overflow. The reason for this is that the search doesn't check + * the scores in a model before evaluating the model and it may + * require as many was 4 plies before the new 'good' score can wipe + * out the initial WORST_SCORE initialization. + */ +#define WORST_SCORE ((int)0xE0000000) + +/** + * Watch out, though! Transition matrix entries that are supposed to + * be "zero" don't actually get that small due to quantization. + */ +#define TMAT_WORST_SCORE (-255) + +/** + * Is one score better than another? + */ +#define BETTER_THAN > + +/** + * Is one score worse than another? + */ +#define WORSE_THAN < + +/** \file hmm.h + * \brief HMM data structure and operation + * + * For efficiency, this version is hardwired for two possible HMM + * topologies, but will fall back to others: + * + * 5-state left-to-right HMMs: (0 is the *emitting* entry state and E + * is a non-emitting exit state; the x's indicate allowed transitions + * between source and destination states): + * + *
+ *               0   1   2   3   4   E (destination-states)
+ *           0   x   x   x
+ *           1       x   x   x
+ *           2           x   x   x
+ *           3               x   x   x
+ *           4                   x   x
+ *    (source-states)
+ * 
+ * + * 5-state topologies that contain a subset of the above transitions should work as well. + * + * 3-state left-to-right HMMs (similar notation as the 5-state topology above): + * + *
+ *               0   1   2   E (destination-states)
+ *           0   x   x   x
+ *           1       x   x   x
+ *           2           x   x 
+ *    (source-states)
+ * 
+ * + * 3-state topologies that contain a subset of the above transitions should work as well. + */ + +/** + * @struct hmm_context_t + * @brief Shared information between a set of HMMs. + * + * We assume that the initial state is emitting and that the + * transition matrix is n_emit_state x (n_emit_state+1), where the + * extra destination dimension corresponds to the non-emitting final or + * exit state. + */ +typedef struct hmm_context_s { + int32 n_emit_state; /**< Number of emitting states in this set of HMMs. */ + uint8 ** const *tp; /**< State transition scores tp[id][from][to] (logs3 values). */ + int16 const *senscore; /**< State emission scores senscore[senid] + (negated scaled logs3 values). */ + uint16 * const *sseq; /**< Senone sequence mapping. */ + int32 *st_sen_scr; /**< Temporary array of senone scores (for some topologies). */ + listelem_alloc_t *mpx_ssid_alloc; /**< Allocator for senone sequence ID arrays. */ + void *udata; /**< Whatever you feel like, gosh. */ +} hmm_context_t; + +/** + * Hard-coded limit on the number of emitting states. + */ +#define HMM_MAX_NSTATE 5 + +/** + * @struct hmm_t + * @brief An individual HMM among the HMM search space. + * + * An individual HMM among the HMM search space. An HMM with N + * emitting states consists of N+1 internal states including the + * non-emitting exit (out) state. + */ +typedef struct hmm_s { + hmm_context_t *ctx; /**< Shared context data for this HMM. */ + int32 score[HMM_MAX_NSTATE]; /**< State scores for emitting states. */ + int32 history[HMM_MAX_NSTATE]; /**< History indices for emitting states. */ + int32 out_score; /**< Score for non-emitting exit state. */ + int32 out_history; /**< History index for non-emitting exit state. */ + uint16 ssid; /**< Senone sequence ID (for non-MPX) */ + uint16 senid[HMM_MAX_NSTATE]; /**< Senone IDs (non-MPX) or sequence IDs (MPX) */ + int32 bestscore; /**< Best [emitting] state score in current frame (for pruning). */ + int16 tmatid; /**< Transition matrix ID (see hmm_context_t). */ + frame_idx_t frame; /**< Frame in which this HMM was last active; <0 if inactive */ + uint8 mpx; /**< Is this HMM multiplex? (hoisted for speed) */ + uint8 n_emit_state; /**< Number of emitting states (hoisted for speed) */ +} hmm_t; + +/** Access macros. */ +#define hmm_context(h) (h)->ctx +#define hmm_is_mpx(h) (h)->mpx + +#define hmm_in_score(h) (h)->score[0] +#define hmm_score(h,st) (h)->score[st] +#define hmm_out_score(h) (h)->out_score + +#define hmm_in_history(h) (h)->history[0] +#define hmm_history(h,st) (h)->history[st] +#define hmm_out_history(h) (h)->out_history + +#define hmm_bestscore(h) (h)->bestscore +#define hmm_frame(h) (h)->frame +#define hmm_mpx_ssid(h,st) (h)->senid[st] +#define hmm_nonmpx_ssid(h) (h)->ssid +#define hmm_ssid(h,st) (hmm_is_mpx(h) \ + ? hmm_mpx_ssid(h,st) : hmm_nonmpx_ssid(h)) +#define hmm_mpx_senid(h,st) (hmm_mpx_ssid(h,st) == BAD_SENID \ + ? BAD_SENID : (h)->ctx->sseq[hmm_mpx_ssid(h,st)][st]) +#define hmm_nonmpx_senid(h,st) ((h)->senid[st]) +#define hmm_senid(h,st) (hmm_is_mpx(h) \ + ? hmm_mpx_senid(h,st) : hmm_nonmpx_senid(h,st)) +#define hmm_senscr(h,st) (hmm_senid(h,st) == BAD_SENID \ + ? WORST_SCORE \ + : -(h)->ctx->senscore[hmm_senid(h,st)]) +#define hmm_tmatid(h) (h)->tmatid +#define hmm_tprob(h,i,j) (-(h)->ctx->tp[hmm_tmatid(h)][i][j]) +#define hmm_n_emit_state(h) ((h)->n_emit_state) +#define hmm_n_state(h) ((h)->n_emit_state + 1) + +/** + * Create an HMM context. + **/ +hmm_context_t *hmm_context_init(int32 n_emit_state, + uint8 ** const *tp, + int16 const *senscore, + uint16 * const *sseq); + +/** + * Change the senone score array for a context. + **/ +#define hmm_context_set_senscore(ctx, senscr) ((ctx)->senscore = (senscr)) + +/** + * Free an HMM context. + * + * @note The transition matrices, senone scores, and senone sequence + * mapping are all assumed to be allocated externally, and will NOT be + * freed by this function. + **/ +void hmm_context_free(hmm_context_t *ctx); + +/** + * Populate a previously-allocated HMM structure, allocating internal data. + **/ +void hmm_init(hmm_context_t *ctx, hmm_t *hmm, int mpx, int ssid, int tmatid); + +/** + * Free an HMM structure, releasing internal data (but not the HMM structure itself). + */ +void hmm_deinit(hmm_t *hmm); + +/** + * Reset the states of the HMM to the invalid condition. + + * i.e., scores to WORST_SCORE and hist to undefined. + */ +void hmm_clear(hmm_t *h); + +/** + * Reset the scores of the HMM. + */ +void hmm_clear_scores(hmm_t *h); + +/** + * Renormalize the scores in this HMM based on the given best score. + */ +void hmm_normalize(hmm_t *h, int32 bestscr); + +/** + * Enter an HMM with the given path score and history ID. + **/ +void hmm_enter(hmm_t *h, int32 score, + int32 histid, int frame); + +/** + * Viterbi evaluation of given HMM. + * + * @note If this module were being used for tracking state + * segmentations, the dummy, non-emitting exit state would have to be + * updated separately. In the Viterbi DP diagram, transitions to the + * exit state occur from the current time; they are vertical + * transitions. Hence they should be made only after the history has + * been logged for the emitting states. But we're not bothered with + * state segmentations, for now. So, we update the exit state as + * well. +*/ +int32 hmm_vit_eval(hmm_t *hmm); + + +/** + * Like hmm_vit_eval, but dump HMM state and relevant senscr to fp first, for debugging;. + */ +int32 hmm_dump_vit_eval(hmm_t *hmm, /**< In/Out: HMM being updated */ + FILE *fp /**< An output file pointer */ + ); + +/** + * For debugging, dump the whole HMM out. + */ + +void hmm_dump(hmm_t *h, /**< In/Out: HMM being updated */ + FILE *fp /**< An output file pointer */ + ); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __HMM_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c new file mode 100644 index 0000000..1a5890e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c @@ -0,0 +1,120 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2014 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* +* kws_detections.c -- Object for storing keyphrase search results +*/ + +#include "kws_detections.h" + +void +kws_detections_reset(kws_detections_t *detections) +{ + gnode_t *gn; + + if (!detections->detect_list) + return; + + for (gn = detections->detect_list; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(detections->detect_list); + detections->detect_list = NULL; +} + +void +kws_detections_add(kws_detections_t *detections, const char* keyphrase, int sf, int ef, int prob, int ascr) +{ + gnode_t *gn; + kws_detection_t* detection; + for (gn = detections->detect_list; gn; gn = gnode_next(gn)) { + kws_detection_t *det = (kws_detection_t *)gnode_ptr(gn); + if (strcmp(keyphrase, det->keyphrase) == 0 && det->sf < ef && det->ef > sf) { + if (det->prob < prob) { + det->sf = sf; + det->ef = ef; + det->prob = prob; + det->ascr = ascr; + } + return; + } + } + + /* Nothing found */ + detection = (kws_detection_t *)ckd_calloc(1, sizeof(*detection)); + detection->sf = sf; + detection->ef = ef; + detection->keyphrase = keyphrase; + detection->prob = prob; + detection->ascr = ascr; + detections->detect_list = glist_add_ptr(detections->detect_list, detection); +} + +char * +kws_detections_hyp_str(kws_detections_t *detections, int frame, int delay) +{ + gnode_t *gn; + char *c; + int len; + char *hyp_str; + + len = 0; + for (gn = detections->detect_list; gn; gn = gnode_next(gn)) { + kws_detection_t *det = (kws_detection_t *)gnode_ptr(gn); + if (det->ef < frame - delay) { + len += strlen(det->keyphrase) + 1; + } + } + + if (len == 0) { + return NULL; + } + + hyp_str = (char *)ckd_calloc(len, sizeof(char)); + c = hyp_str; + for (gn = detections->detect_list; gn; gn = gnode_next(gn)) { + kws_detection_t *det = (kws_detection_t *)gnode_ptr(gn); + if (det->ef < frame - delay) { + memcpy(c, det->keyphrase, strlen(det->keyphrase)); + c += strlen(det->keyphrase); + *c = ' '; + c++; + } + } + if (c > hyp_str) { + c--; + *c = '\0'; + } + return hyp_str; +} + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h new file mode 100644 index 0000000..e9f4788 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h @@ -0,0 +1,87 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2014 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * kws_detections.h -- Structures for storing keyphrase spotting results. + */ + +#ifndef __KWS_DETECTIONS_H__ +#define __KWS_DETECTIONS_H__ + +/* SphinxBase headers. */ +#include + +/* Local headers. */ +#include "pocketsphinx_internal.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +typedef struct kws_detection_s { + const char* keyphrase; + frame_idx_t sf; + frame_idx_t ef; + int32 prob; + int32 ascr; +} kws_detection_t; + +typedef struct kws_detections_s { + glist_t detect_list; +} kws_detections_t; + +/** + * Reset history structure. + */ +void kws_detections_reset(kws_detections_t *detections); + +/** + * Add history entry. + */ +void kws_detections_add(kws_detections_t *detections, const char* keyphrase, int sf, int ef, int prob, int ascr); + +/** + * Compose hypothesis. + */ +char* kws_detections_hyp_str(kws_detections_t *detections, int frame, int delay); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __KWS_DETECTIONS_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c new file mode 100644 index 0000000..83cc20e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c @@ -0,0 +1,705 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* +* kws_search.c -- Search object for key phrase spotting. +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "pocketsphinx_internal.h" +#include "kws_search.h" + +/** Access macros */ +#define hmm_is_active(hmm) ((hmm)->frame > 0) +#define kws_nth_hmm(keyphrase,n) (&((keyphrase)->hmms[n])) + +/* Value selected experimentally as maximum difference between triphone +score and phone loop score, used in confidence computation to make sure +that confidence value is less than 1. This might be different for +different models. Corresponds to threshold of about 1e+50 */ +#define KWS_MAX 1500 + +static ps_lattice_t * +kws_search_lattice(ps_search_t * search) +{ + (void)search; + return NULL; +} + +static int +kws_search_prob(ps_search_t * search) +{ + (void)search; + return 0; +} + +static void +kws_seg_free(ps_seg_t *seg) +{ + kws_seg_t *itor = (kws_seg_t *)seg; + ckd_free(itor); +} + +static void +kws_seg_fill(kws_seg_t *itor) +{ + kws_detection_t* detection = (kws_detection_t*)gnode_ptr(itor->detection); + + itor->base.word = detection->keyphrase; + itor->base.sf = detection->sf; + itor->base.ef = detection->ef; + itor->base.prob = detection->prob; + itor->base.ascr = detection->ascr; + itor->base.lscr = 0; +} + +static ps_seg_t * +kws_seg_next(ps_seg_t *seg) +{ + kws_seg_t *itor = (kws_seg_t *)seg; + + gnode_t *detect_head = gnode_next(itor->detection); + while (detect_head != NULL && ((kws_detection_t*)gnode_ptr(detect_head))->ef > itor->last_frame) + detect_head = gnode_next(detect_head); + itor->detection = detect_head; + + if (!itor->detection) { + kws_seg_free(seg); + return NULL; + } + + kws_seg_fill(itor); + + return seg; +} + +static ps_segfuncs_t kws_segfuncs = { + /* seg_next */ kws_seg_next, + /* seg_free */ kws_seg_free +}; + +static ps_seg_t * +kws_search_seg_iter(ps_search_t * search) +{ + kws_search_t *kwss = (kws_search_t *)search; + kws_seg_t *itor; + gnode_t *detect_head = kwss->detections->detect_list; + + while (detect_head != NULL && ((kws_detection_t*)gnode_ptr(detect_head))->ef > kwss->frame - kwss->delay) + detect_head = gnode_next(detect_head); + + if (!detect_head) + return NULL; + + itor = (kws_seg_t *)ckd_calloc(1, sizeof(*itor)); + itor->base.vt = &kws_segfuncs; + itor->base.search = search; + itor->base.lwf = 1.0; + itor->detection = detect_head; + itor->last_frame = kwss->frame - kwss->delay; + kws_seg_fill(itor); + return (ps_seg_t *)itor; +} + +static ps_searchfuncs_t kws_funcs = { + /* start: */ kws_search_start, + /* step: */ kws_search_step, + /* finish: */ kws_search_finish, + /* reinit: */ kws_search_reinit, + /* free: */ kws_search_free, + /* lattice: */ kws_search_lattice, + /* hyp: */ kws_search_hyp, + /* prob: */ kws_search_prob, + /* seg_iter: */ kws_search_seg_iter, +}; + + +/* Activate senones for scoring */ +static void +kws_search_sen_active(kws_search_t * kwss) +{ + int i; + gnode_t *gn; + + acmod_clear_active(ps_search_acmod(kwss)); + + /* active phone loop hmms */ + for (i = 0; i < kwss->n_pl; i++) + acmod_activate_hmm(ps_search_acmod(kwss), &kwss->pl_hmms[i]); + + /* activate hmms in active nodes */ + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { + kws_keyphrase_t *keyphrase = gnode_ptr(gn); + for (i = 0; i < keyphrase->n_hmms; i++) { + if (hmm_is_active(kws_nth_hmm(keyphrase, i))) + acmod_activate_hmm(ps_search_acmod(kwss), kws_nth_hmm(keyphrase, i)); + } + } +} + +/* +* Evaluate all the active HMMs. +* (Executed once per frame.) +*/ +static void +kws_search_hmm_eval(kws_search_t * kwss, int16 const *senscr) +{ + int32 i; + gnode_t *gn; + int32 bestscore = WORST_SCORE; + + hmm_context_set_senscore(kwss->hmmctx, senscr); + + /* evaluate hmms from phone loop */ + for (i = 0; i < kwss->n_pl; ++i) { + hmm_t *hmm = &kwss->pl_hmms[i]; + int32 score; + + score = hmm_vit_eval(hmm); + if (score BETTER_THAN bestscore) + bestscore = score; + } + /* evaluate hmms for active nodes */ + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { + kws_keyphrase_t *keyphrase = gnode_ptr(gn); + for (i = 0; i < keyphrase->n_hmms; i++) { + hmm_t *hmm = kws_nth_hmm(keyphrase, i); + + if (hmm_is_active(hmm)) { + int32 score; + score = hmm_vit_eval(hmm); + if (score BETTER_THAN bestscore) + bestscore = score; + } + } + } + + kwss->bestscore = bestscore; +} + +/* +* (Beam) prune the just evaluated HMMs, determine which ones remain +* active. Executed once per frame. +*/ +static void +kws_search_hmm_prune(kws_search_t * kwss) +{ + int32 thresh, i; + gnode_t *gn; + + thresh = kwss->bestscore + kwss->beam; + + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { + kws_keyphrase_t *keyphrase = gnode_ptr(gn); + for (i = 0; i < keyphrase->n_hmms; i++) { + hmm_t *hmm = kws_nth_hmm(keyphrase, i); + if (hmm_is_active(hmm) && hmm_bestscore(hmm) < thresh) + hmm_clear(hmm); + } + } +} + + +/** +* Do phone transitions +*/ +static void +kws_search_trans(kws_search_t * kwss) +{ + hmm_t *pl_best_hmm = NULL; + int32 best_out_score = WORST_SCORE; + int i; + gnode_t *gn; + + /* select best hmm in phone-loop to be a predecessor */ + for (i = 0; i < kwss->n_pl; i++) + if (hmm_out_score(&kwss->pl_hmms[i]) BETTER_THAN best_out_score) { + best_out_score = hmm_out_score(&kwss->pl_hmms[i]); + pl_best_hmm = &kwss->pl_hmms[i]; + } + + /* out probs are not ready yet */ + if (!pl_best_hmm) + return; + + /* Check whether keyphrase wasn't spotted yet */ + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { + kws_keyphrase_t *keyphrase = gnode_ptr(gn); + hmm_t *last_hmm; + + if (keyphrase->n_hmms < 1) + continue; + + last_hmm = kws_nth_hmm(keyphrase, keyphrase->n_hmms - 1); + + if (hmm_is_active(last_hmm) + && hmm_out_score(pl_best_hmm) BETTER_THAN WORST_SCORE) { + + if (hmm_out_score(last_hmm) - hmm_out_score(pl_best_hmm) + >= keyphrase->threshold) { + + int32 prob = hmm_out_score(last_hmm) - hmm_out_score(pl_best_hmm) - KWS_MAX; + kws_detections_add(kwss->detections, keyphrase->word, + hmm_out_history(last_hmm), + kwss->frame, prob, + hmm_out_score(last_hmm)); + } /* keyphrase is spotted */ + } /* last hmm of keyphrase is active */ + } /* keyphrase loop */ + + /* Make transition for all phone loop hmms */ + for (i = 0; i < kwss->n_pl; i++) { + if (hmm_out_score(pl_best_hmm) + kwss->plp BETTER_THAN + hmm_in_score(&kwss->pl_hmms[i])) { + hmm_enter(&kwss->pl_hmms[i], + hmm_out_score(pl_best_hmm) + kwss->plp, + hmm_out_history(pl_best_hmm), kwss->frame + 1); + } + } + + /* Activate new keyphrase nodes, enter their hmms */ + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { + kws_keyphrase_t *keyphrase = gnode_ptr(gn); + + if (keyphrase->n_hmms < 1) + continue; + + for (i = keyphrase->n_hmms - 1; i > 0; i--) { + hmm_t *pred_hmm = kws_nth_hmm(keyphrase, i - 1); + hmm_t *hmm = kws_nth_hmm(keyphrase, i); + + if (hmm_is_active(pred_hmm)) { + if (!hmm_is_active(hmm) + || hmm_out_score(pred_hmm) BETTER_THAN + hmm_in_score(hmm)) + hmm_enter(hmm, hmm_out_score(pred_hmm), + hmm_out_history(pred_hmm), kwss->frame + 1); + } + } + + /* Enter keyphrase start node from phone loop */ + if (hmm_out_score(pl_best_hmm) BETTER_THAN + hmm_in_score(kws_nth_hmm(keyphrase, 0))) + hmm_enter(kws_nth_hmm(keyphrase, 0), hmm_out_score(pl_best_hmm), + kwss->frame, kwss->frame + 1); + } +} + +static int +kws_search_read_list(kws_search_t *kwss, const char* keyfile) +{ + FILE *list_file; + lineiter_t *li; + char *line; + + if ((list_file = fopen(keyfile, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open keyphrase file '%s'", keyfile); + return -1; + } + + kwss->keyphrases = NULL; + + /* read keyphrases */ + for (li = lineiter_start_clean(list_file); li; li = lineiter_next(li)) { + size_t begin, end; + kws_keyphrase_t *keyphrase; + + if (li->len == 0) + continue; + + keyphrase = ckd_calloc(1, sizeof(kws_keyphrase_t)); + + line = li->buf; + end = strlen(line) - 1; + begin = end - 1; + if (line[end] == '/') { + while (line[begin] != '/' && begin > 0) + begin--; + line[end] = 0; + line[begin] = 0; + keyphrase->threshold = (int32) logmath_log(kwss->base.acmod->lmath, atof_c(line + begin + 1)) + >> SENSCR_SHIFT; + } else { + keyphrase->threshold = kwss->def_threshold; + } + + keyphrase->word = ckd_salloc(line); + + kwss->keyphrases = glist_add_ptr(kwss->keyphrases, keyphrase); + } + + fclose(list_file); + return 0; +} + +ps_search_t * +kws_search_init(const char *name, + const char *keyphrase, + const char *keyfile, + cmd_ln_t * config, + acmod_t * acmod, dict_t * dict, dict2pid_t * d2p) +{ + kws_search_t *kwss = (kws_search_t *) ckd_calloc(1, sizeof(*kwss)); + ps_search_init(ps_search_base(kwss), &kws_funcs, PS_SEARCH_TYPE_KWS, name, config, acmod, dict, + d2p); + + kwss->detections = (kws_detections_t *)ckd_calloc(1, sizeof(*kwss->detections)); + + kwss->beam = + (int32) logmath_log(acmod->lmath, + cmd_ln_float64_r(config, + "-beam")) >> SENSCR_SHIFT; + + kwss->plp = + (int32) logmath_log(acmod->lmath, + cmd_ln_float32_r(config, + "-kws_plp")) >> SENSCR_SHIFT; + + + kwss->def_threshold = + (int32) logmath_log(acmod->lmath, + cmd_ln_float64_r(config, + "-kws_threshold")) >> + SENSCR_SHIFT; + + kwss->delay = (int32) cmd_ln_int32_r(config, "-kws_delay"); + + E_INFO("KWS(beam: %d, plp: %d, default threshold %d, delay %d)\n", + kwss->beam, kwss->plp, kwss->def_threshold, kwss->delay); + + if (keyfile) { + if (kws_search_read_list(kwss, keyfile) < 0) { + E_ERROR("Failed to create kws search\n"); + kws_search_free(ps_search_base(kwss)); + return NULL; + } + } else { + kws_keyphrase_t *k = ckd_calloc(1, sizeof(kws_keyphrase_t)); + k->threshold = kwss->def_threshold; + k->word = ckd_salloc(keyphrase); + kwss->keyphrases = glist_add_ptr(NULL, k); + } + + /* Reinit for provided keyphrase */ + if (kws_search_reinit(ps_search_base(kwss), + ps_search_dict(kwss), + ps_search_dict2pid(kwss)) < 0) { + ps_search_free(ps_search_base(kwss)); + return NULL; + } + + ptmr_init(&kwss->perf); + + return ps_search_base(kwss); +} + +void +kws_search_free(ps_search_t * search) +{ + kws_search_t *kwss; + double n_speech; + gnode_t *gn; + + kwss = (kws_search_t *) search; + + n_speech = (double)kwss->n_tot_frame + / cmd_ln_int32_r(ps_search_config(kwss), "-frate"); + + E_INFO("TOTAL kws %.2f CPU %.3f xRT\n", + kwss->perf.t_tot_cpu, + kwss->perf.t_tot_cpu / n_speech); + E_INFO("TOTAL kws %.2f wall %.3f xRT\n", + kwss->perf.t_tot_elapsed, + kwss->perf.t_tot_elapsed / n_speech); + + + ps_search_base_free(search); + hmm_context_free(kwss->hmmctx); + kws_detections_reset(kwss->detections); + ckd_free(kwss->detections); + + ckd_free(kwss->pl_hmms); + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { + kws_keyphrase_t *keyphrase = gnode_ptr(gn); + ckd_free(keyphrase->hmms); + ckd_free(keyphrase->word); + ckd_free(keyphrase); + } + glist_free(kwss->keyphrases); + ckd_free(kwss); +} + +int +kws_search_reinit(ps_search_t * search, dict_t * dict, dict2pid_t * d2p) +{ + char **wrdptr; + char *tmp_keyphrase; + int32 wid, pronlen, in_dict; + int32 n_hmms, n_wrds; + int32 ssid, tmatid; + int i, j, p; + kws_search_t *kwss = (kws_search_t *) search; + bin_mdef_t *mdef = search->acmod->mdef; + int32 silcipid = bin_mdef_silphone(mdef); + gnode_t *gn; + + /* Free old dict2pid, dict */ + ps_search_base_reinit(search, dict, d2p); + + /* Initialize HMM context. */ + if (kwss->hmmctx) + hmm_context_free(kwss->hmmctx); + kwss->hmmctx = + hmm_context_init(bin_mdef_n_emit_state(search->acmod->mdef), + search->acmod->tmat->tp, NULL, + search->acmod->mdef->sseq); + if (kwss->hmmctx == NULL) + return -1; + + /* Initialize phone loop HMMs. */ + if (kwss->pl_hmms) { + for (i = 0; i < kwss->n_pl; ++i) + hmm_deinit((hmm_t *) & kwss->pl_hmms[i]); + ckd_free(kwss->pl_hmms); + } + kwss->n_pl = bin_mdef_n_ciphone(search->acmod->mdef); + kwss->pl_hmms = + (hmm_t *) ckd_calloc(kwss->n_pl, sizeof(*kwss->pl_hmms)); + for (i = 0; i < kwss->n_pl; ++i) { + hmm_init(kwss->hmmctx, (hmm_t *) & kwss->pl_hmms[i], + FALSE, + bin_mdef_pid2ssid(search->acmod->mdef, i), + bin_mdef_pid2tmatid(search->acmod->mdef, i)); + } + + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { + kws_keyphrase_t *keyphrase = gnode_ptr(gn); + + /* Initialize keyphrase HMMs */ + tmp_keyphrase = (char *) ckd_salloc(keyphrase->word); + n_wrds = str2words(tmp_keyphrase, NULL, 0); + wrdptr = (char **) ckd_calloc(n_wrds, sizeof(*wrdptr)); + str2words(tmp_keyphrase, wrdptr, n_wrds); + + /* count amount of hmms */ + n_hmms = 0; + in_dict = TRUE; + for (i = 0; i < n_wrds; i++) { + wid = dict_wordid(dict, wrdptr[i]); + if (wid == BAD_S3WID) { + E_ERROR("Word '%s' in phrase '%s' is missing in the dictionary\n", wrdptr[i], keyphrase->word); + in_dict = FALSE; + break; + } + pronlen = dict_pronlen(dict, wid); + n_hmms += pronlen; + } + + if (!in_dict) { + ckd_free(wrdptr); + ckd_free(tmp_keyphrase); + continue; + } + + /* allocate node array */ + if (keyphrase->hmms) + ckd_free(keyphrase->hmms); + keyphrase->hmms = (hmm_t *) ckd_calloc(n_hmms, sizeof(hmm_t)); + keyphrase->n_hmms = n_hmms; + + /* fill node array */ + j = 0; + for (i = 0; i < n_wrds; i++) { + wid = dict_wordid(dict, wrdptr[i]); + pronlen = dict_pronlen(dict, wid); + for (p = 0; p < pronlen; p++) { + int32 ci = dict_pron(dict, wid, p); + if (p == 0) { + /* first phone of word */ + int32 rc = + pronlen > 1 ? dict_pron(dict, wid, 1) : silcipid; + ssid = dict2pid_ldiph_lc(d2p, ci, rc, silcipid); + } + else if (p == pronlen - 1) { + /* last phone of the word */ + int32 lc = dict_pron(dict, wid, p - 1); + xwdssid_t *rssid = dict2pid_rssid(d2p, ci, lc); + int j = rssid->cimap[silcipid]; + ssid = rssid->ssid[j]; + } + else { + /* word internal phone */ + ssid = dict2pid_internal(d2p, wid, p); + } + tmatid = bin_mdef_pid2tmatid(mdef, ci); + hmm_init(kwss->hmmctx, &keyphrase->hmms[j], FALSE, ssid, + tmatid); + j++; + } + } + + ckd_free(wrdptr); + ckd_free(tmp_keyphrase); + } + + + + return 0; +} + +int +kws_search_start(ps_search_t * search) +{ + int i; + kws_search_t *kwss = (kws_search_t *) search; + + kwss->frame = 0; + kwss->bestscore = 0; + kws_detections_reset(kwss->detections); + + /* Reset and enter all phone-loop HMMs. */ + for (i = 0; i < kwss->n_pl; ++i) { + hmm_t *hmm = (hmm_t *) & kwss->pl_hmms[i]; + hmm_clear(hmm); + hmm_enter(hmm, 0, -1, 0); + } + + ptmr_reset(&kwss->perf); + ptmr_start(&kwss->perf); + + return 0; +} + +int +kws_search_step(ps_search_t * search, int frame_idx) +{ + int16 const *senscr; + kws_search_t *kwss = (kws_search_t *) search; + acmod_t *acmod = search->acmod; + + /* Activate senones */ + if (!acmod->compallsen) + kws_search_sen_active(kwss); + + /* Calculate senone scores for current frame. */ + senscr = acmod_score(acmod, &frame_idx); + + /* Evaluate hmms in phone loop and in active keyphrase nodes */ + kws_search_hmm_eval(kwss, senscr); + + /* Prune hmms with low prob */ + kws_search_hmm_prune(kwss); + + /* Do hmms transitions */ + kws_search_trans(kwss); + + ++kwss->frame; + return 0; +} + +int +kws_search_finish(ps_search_t * search) +{ + kws_search_t *kwss; + int32 cf; + + kwss = (kws_search_t *) search; + + kwss->n_tot_frame += kwss->frame; + + /* Print out some statistics. */ + ptmr_stop(&kwss->perf); + /* This is the number of frames processed. */ + cf = ps_search_acmod(kwss)->output_frame; + if (cf > 0) { + double n_speech = (double) (cf + 1) + / cmd_ln_int32_r(ps_search_config(kwss), "-frate"); + E_INFO("kws %.2f CPU %.3f xRT\n", + kwss->perf.t_cpu, kwss->perf.t_cpu / n_speech); + E_INFO("kws %.2f wall %.3f xRT\n", + kwss->perf.t_elapsed, kwss->perf.t_elapsed / n_speech); + } + + return 0; +} + +char const * +kws_search_hyp(ps_search_t * search, int32 * out_score) +{ + kws_search_t *kwss = (kws_search_t *) search; + if (out_score) + *out_score = 0; + + if (search->hyp_str) + ckd_free(search->hyp_str); + search->hyp_str = kws_detections_hyp_str(kwss->detections, kwss->frame, kwss->delay); + + return search->hyp_str; +} + +char * +kws_search_get_keyphrases(ps_search_t * search) +{ + int c, len; + kws_search_t *kwss; + char* line; + gnode_t *gn; + + kwss = (kws_search_t *) search; + + len = 0; + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) + len += strlen(((kws_keyphrase_t *)gnode_ptr(gn))->word) + 1; + + c = 0; + line = (char *)ckd_calloc(len, sizeof(*line)); + for (gn = kwss->keyphrases; gn; gn = gnode_next(gn)) { + const char *str = ((kws_keyphrase_t *)gnode_ptr(gn))->word; + memcpy(&line[c], str, strlen(str)); + c += strlen(str); + line[c++] = '\n'; + } + line[--c] = '\0'; + + return line; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h new file mode 100644 index 0000000..47a3373 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h @@ -0,0 +1,153 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2013 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * kws_search.h -- Search structures for keyphrase spotting. + */ + +#ifndef __KWS_SEARCH_H__ +#define __KWS_SEARCH_H__ + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include "pocketsphinx_internal.h" +#include "kws_detections.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Segmentation "iterator" for KWS history. + */ +typedef struct kws_seg_s { + ps_seg_t base; /**< Base structure. */ + gnode_t *detection; /**< Keyphrase detection correspondent to segment. */ + frame_idx_t last_frame; /**< Last frame to raise the detection */ +} kws_seg_t; + +typedef struct kws_keyphrase_s { + char* word; + int32 threshold; + hmm_t* hmms; + int32 n_hmms; +} kws_keyphrase_t; + +/** + * Implementation of KWS search structure. + */ +typedef struct kws_search_s { + ps_search_t base; + + hmm_context_t *hmmctx; /**< HMM context. */ + + glist_t keyphrases; /**< Keyphrases to spot */ + + kws_detections_t *detections; /**< Keyword spotting history */ + frame_idx_t frame; /**< Frame index */ + + int32 beam; + + int32 plp; /**< Phone loop probability */ + int32 bestscore; /**< For beam pruning */ + int32 def_threshold; /**< default threshold for p(hyp)/p(altern) ratio */ + int32 delay; /**< Delay to wait for best detection score */ + + int32 n_pl; /**< Number of CI phones */ + hmm_t *pl_hmms; /**< Phone loop hmms - hmms of CI phones */ + + ptmr_t perf; /**< Performance counter */ + int32 n_tot_frame; + +} kws_search_t; + +/** + * Create, initialize and return a search module. Gets keyphrases either + * from keyphrase or from a keyphrase file. + */ +ps_search_t *kws_search_init(const char *name, + const char *keyphrase, + const char *keyfile, + cmd_ln_t * config, + acmod_t * acmod, + dict_t * dict, dict2pid_t * d2p); + +/** + * Deallocate search structure. + */ +void kws_search_free(ps_search_t * search); + +/** + * Update KWS search module for new key phrase. + */ +int kws_search_reinit(ps_search_t * kwss, dict_t * dict, dict2pid_t * d2p); + +/** + * Prepare the KWS search structure for beginning decoding of the next + * utterance. + */ +int kws_search_start(ps_search_t * search); + +/** + * Step one frame forward through the Viterbi search. + */ +int kws_search_step(ps_search_t * search, int frame_idx); + +/** + * Windup and clean the KWS search structure after utterance. + */ +int kws_search_finish(ps_search_t * search); + +/** + * Get hypothesis string from the KWS search. + */ +char const *kws_search_hyp(ps_search_t * search, int32 * out_score); + +/** + * Get active keyphrases + */ +char* kws_search_get_keyphrases(ps_search_t * search); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __KWS_SEARCH_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l new file mode 100644 index 0000000..43e29ba --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l @@ -0,0 +1,87 @@ +/* -*- mode: text -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* YOU MUST USE FLEX 2.6.1 OR NEWER TO PROCESS THIS FILE!!! */ +%{ + +#include "jsgf_internal.h" +#include "jsgf_parser.h" + +%} + +%option 8bit reentrant bison-bridge noyywrap yylineno never-interactive nounput nounistd +%option header-file="jsgf_scanner.h" +%s COMMENT +%s DECL +%s DECLCOMMENT + +ws [ \t\r\n] +rulename \<[^<>]+\> +tag \{(\\.|[^\}]+)*\} +weight \/[0-9]*(\.[0-9]+)?(e-)?[0-9]*\/ +token [^ \t\r\n=;|*+<>()\[\]{}*/]+ +qstring \"(\\.|[^"]+)*\" +bom [\xEF][\xBB][\xBF] + +%% + +{ws} ; /* ignore whitespace */ +\/\/.*\n ; /* single-line comments */ +\/\* { BEGIN(COMMENT); } /* C-style comments */ +\*\/ { BEGIN(INITIAL); } +. ; /* Ignore stuff in comment mode */ + +\/\/.*\n ; /* single-line comments inside decl */ +\/\* { BEGIN(DECLCOMMENT); } /* C-style comments inside decl */ +\*\/ { BEGIN(DECL); } +. ; /* Ignore stuff in comment mode */ + +{bom}?#JSGF {BEGIN(DECL); return HEADER;} +grammar {BEGIN(DECL); return GRAMMAR;} +import {BEGIN(DECL); return IMPORT;} +public {BEGIN(DECL); return PUBLIC;} + +{rulename} { BEGIN(DECL); yylval->name = strdup(yytext); return RULENAME; } +{rulename} { yylval->name = strdup(yytext); return RULENAME; } + +{tag} { yylval->name = strdup(yytext); return TAG; } +{token} { yylval->name = strdup(yytext); return TOKEN; } +; { BEGIN(INITIAL); return yytext[0]; } +{qstring} { yylval->name = strdup(yytext); return TOKEN; } +{weight} { yylval->weight = atof_c(yytext+1); return WEIGHT; } +. return yytext[0]; /* Single-character tokens */ + +%% diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c new file mode 100644 index 0000000..4495783 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c @@ -0,0 +1,940 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +/* SphinxBase headers. */ +#include "sphinxbase/err.h" +#include "sphinxbase/pio.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/prim_type.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/hash_table.h" +#include "sphinxbase/fsg_model.h" +#include "sphinxbase/bitvec.h" + +/** + * Adjacency list (opaque) for a state in an FSG. + * + * Actually we use hash tables so that random access is a bit faster. + * Plus it allows us to make the lookup code a bit less ugly. + */ + +struct trans_list_s { + hash_table_t *null_trans; /* Null transitions keyed by state. */ + hash_table_t *trans; /* Lists of non-null transitions keyed by state. */ +}; + +/** + * Implementation of arc iterator. + */ +struct fsg_arciter_s { + hash_iter_t *itor, *null_itor; + gnode_t *gn; +}; + +#define FSG_MODEL_BEGIN_DECL "FSG_BEGIN" +#define FSG_MODEL_END_DECL "FSG_END" +#define FSG_MODEL_N_DECL "N" +#define FSG_MODEL_NUM_STATES_DECL "NUM_STATES" +#define FSG_MODEL_S_DECL "S" +#define FSG_MODEL_START_STATE_DECL "START_STATE" +#define FSG_MODEL_F_DECL "F" +#define FSG_MODEL_FINAL_STATE_DECL "FINAL_STATE" +#define FSG_MODEL_T_DECL "T" +#define FSG_MODEL_TRANSITION_DECL "TRANSITION" +#define FSG_MODEL_COMMENT_CHAR '#' + + +static int32 +nextline_str2words(FILE * fp, int32 * lineno, + char **lineptr, char ***wordptr) +{ + for (;;) { + size_t len; + int32 n; + + ckd_free(*lineptr); + if ((*lineptr = fread_line(fp, &len)) == NULL) + return -1; + + (*lineno)++; + + if ((*lineptr)[0] == FSG_MODEL_COMMENT_CHAR) + continue; /* Skip comment lines */ + + n = str2words(*lineptr, NULL, 0); + if (n == 0) + continue; /* Skip blank lines */ + + /* Abuse of realloc(), but this doesn't have to be fast. */ + if (*wordptr == NULL) + *wordptr = ckd_calloc(n, sizeof(**wordptr)); + else + *wordptr = ckd_realloc(*wordptr, n * sizeof(**wordptr)); + return str2words(*lineptr, *wordptr, n); + } +} + +void +fsg_model_trans_add(fsg_model_t * fsg, + int32 from, int32 to, int32 logp, int32 wid) +{ + fsg_link_t *link; + glist_t gl; + gnode_t *gn; + + if (fsg->trans[from].trans == NULL) + fsg->trans[from].trans = hash_table_new(5, HASH_CASE_YES); + + /* Check for duplicate link (i.e., link already exists with label=wid) */ + for (gn = gl = fsg_model_trans(fsg, from, to); gn; gn = gnode_next(gn)) { + link = (fsg_link_t *) gnode_ptr(gn); + if (link->wid == wid) { + if (link->logs2prob < logp) + link->logs2prob = logp; + return; + } + } + + /* Create transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = from; + link->to_state = to; + link->logs2prob = logp; + link->wid = wid; + + /* Add it to the list of transitions and update the hash table */ + gl = glist_add_ptr(gl, (void *) link); + hash_table_replace_bkey(fsg->trans[from].trans, + (char const *) &link->to_state, + sizeof(link->to_state), gl); +} + +int32 +fsg_model_tag_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp, int32 wid) +{ + fsg_link_t *link, *link2; + + (void)wid; + /* Check for transition probability */ + if (logp > 0) { + E_FATAL("Null transition prob must be <= 1.0 (state %d -> %d)\n", + from, to); + } + + /* Self-loop null transitions (with prob <= 1.0) are redundant */ + if (from == to) + return -1; + + if (fsg->trans[from].null_trans == NULL) + fsg->trans[from].null_trans = hash_table_new(5, HASH_CASE_YES); + + /* Check for a duplicate link; if found, keep the higher prob */ + link = fsg_model_null_trans(fsg, from, to); + if (link) { + if (link->logs2prob < logp) { + link->logs2prob = logp; + return 0; + } + else + return -1; + } + + /* Create null transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = from; + link->to_state = to; + link->logs2prob = logp; + link->wid = -1; + + link2 = (fsg_link_t *) + hash_table_enter_bkey(fsg->trans[from].null_trans, + (char const *) &link->to_state, + sizeof(link->to_state), link); + assert(link == link2); + + return 1; +} + +int32 +fsg_model_null_trans_add(fsg_model_t * fsg, int32 from, int32 to, + int32 logp) +{ + return fsg_model_tag_trans_add(fsg, from, to, logp, -1); +} + +glist_t +fsg_model_null_trans_closure(fsg_model_t * fsg, glist_t nulls) +{ + gnode_t *gn1; + int updated; + fsg_link_t *tl1, *tl2; + int32 k, n; + + E_INFO("Computing transitive closure for null transitions\n"); + + /* If our caller didn't give us a list of null-transitions, + make such a list. Just loop through all the FSG states, + and all the null-transitions in that state (which are kept in + their own hash table). */ + if (nulls == NULL) { + int i; + for (i = 0; i < fsg->n_state; ++i) { + hash_iter_t *itor; + hash_table_t *null_trans = fsg->trans[i].null_trans; + if (null_trans == NULL) + continue; + for (itor = hash_table_iter(null_trans); + itor != NULL; itor = hash_table_iter_next(itor)) { + nulls = glist_add_ptr(nulls, hash_entry_val(itor->ent)); + } + } + } + + /* + * Probably not the most efficient closure implementation, in general, but + * probably reasonably efficient for a sparse null transition matrix. + */ + n = 0; + do { + updated = FALSE; + + for (gn1 = nulls; gn1; gn1 = gnode_next(gn1)) { + hash_iter_t *itor; + + tl1 = (fsg_link_t *) gnode_ptr(gn1); + assert(tl1->wid < 0); + + if (fsg->trans[tl1->to_state].null_trans == NULL) + continue; + + for (itor = + hash_table_iter(fsg->trans[tl1->to_state].null_trans); + itor; itor = hash_table_iter_next(itor)) { + + tl2 = (fsg_link_t *) hash_entry_val(itor->ent); + + k = fsg_model_null_trans_add(fsg, + tl1->from_state, + tl2->to_state, + tl1->logs2prob + + tl2->logs2prob); + if (k >= 0) { + updated = TRUE; + if (k > 0) { + nulls = glist_add_ptr(nulls, (void *) + fsg_model_null_trans + (fsg, tl1->from_state, + tl2->to_state)); + n++; + } + } + } + } + } while (updated); + + E_INFO("%d null transitions added\n", n); + + return nulls; +} + +glist_t +fsg_model_trans(fsg_model_t * fsg, int32 i, int32 j) +{ + void *val; + + if (fsg->trans[i].trans == NULL) + return NULL; + if (hash_table_lookup_bkey(fsg->trans[i].trans, (char const *) &j, + sizeof(j), &val) < 0) + return NULL; + return (glist_t) val; +} + +fsg_link_t * +fsg_model_null_trans(fsg_model_t * fsg, int32 i, int32 j) +{ + void *val; + + if (fsg->trans[i].null_trans == NULL) + return NULL; + if (hash_table_lookup_bkey(fsg->trans[i].null_trans, (char const *) &j, + sizeof(j), &val) < 0) + return NULL; + return (fsg_link_t *) val; +} + +fsg_arciter_t * +fsg_model_arcs(fsg_model_t * fsg, int32 i) +{ + fsg_arciter_t *itor; + + if (fsg->trans[i].trans == NULL && fsg->trans[i].null_trans == NULL) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + if (fsg->trans[i].null_trans) + itor->null_itor = hash_table_iter(fsg->trans[i].null_trans); + if (fsg->trans[i].trans) + itor->itor = hash_table_iter(fsg->trans[i].trans); + if (itor->itor != NULL) + itor->gn = hash_entry_val(itor->itor->ent); + return itor; +} + +fsg_link_t * +fsg_arciter_get(fsg_arciter_t * itor) +{ + /* Iterate over non-null arcs first. */ + if (itor->gn) + return (fsg_link_t *) gnode_ptr(itor->gn); + else if (itor->null_itor) + return (fsg_link_t *) hash_entry_val(itor->null_itor->ent); + else + return NULL; +} + +fsg_arciter_t * +fsg_arciter_next(fsg_arciter_t * itor) +{ + /* Iterate over non-null arcs first. */ + if (itor->gn) { + itor->gn = gnode_next(itor->gn); + /* Move to the next destination arc. */ + if (itor->gn == NULL) { + itor->itor = hash_table_iter_next(itor->itor); + if (itor->itor != NULL) + itor->gn = hash_entry_val(itor->itor->ent); + else if (itor->null_itor == NULL) + goto stop_iteration; + } + } + else { + if (itor->null_itor == NULL) + goto stop_iteration; + itor->null_itor = hash_table_iter_next(itor->null_itor); + if (itor->null_itor == NULL) + goto stop_iteration; + } + return itor; + stop_iteration: + fsg_arciter_free(itor); + return NULL; + +} + +void +fsg_arciter_free(fsg_arciter_t * itor) +{ + if (itor == NULL) + return; + hash_table_iter_free(itor->null_itor); + hash_table_iter_free(itor->itor); + ckd_free(itor); +} + +int +fsg_model_word_id(fsg_model_t * fsg, char const *word) +{ + int wid; + + /* Search for an existing word matching this. */ + for (wid = 0; wid < fsg->n_word; ++wid) { + if (0 == strcmp(fsg->vocab[wid], word)) + break; + } + /* If not found, add this to the vocab. */ + if (wid == fsg->n_word) + return -1; + return wid; +} + +int +fsg_model_word_add(fsg_model_t * fsg, char const *word) +{ + int wid, old_size; + + /* Search for an existing word matching this. */ + wid = fsg_model_word_id(fsg, word); + /* If not found, add this to the vocab. */ + if (wid == -1) { + wid = fsg->n_word; + if (fsg->n_word == fsg->n_word_alloc) { + old_size = fsg->n_word_alloc; + fsg->n_word_alloc += 10; + fsg->vocab = ckd_realloc(fsg->vocab, + fsg->n_word_alloc * + sizeof(*fsg->vocab)); + if (fsg->silwords) + fsg->silwords = + bitvec_realloc(fsg->silwords, old_size, + fsg->n_word_alloc); + if (fsg->altwords) + fsg->altwords = + bitvec_realloc(fsg->altwords, old_size, + fsg->n_word_alloc); + } + ++fsg->n_word; + fsg->vocab[wid] = ckd_salloc(word); + } + return wid; +} + +int +fsg_model_add_silence(fsg_model_t * fsg, char const *silword, + int state, float32 silprob) +{ + int32 logsilp; + int n_trans, silwid, src; + + E_INFO("Adding silence transitions for %s to FSG\n", silword); + + silwid = fsg_model_word_add(fsg, silword); + logsilp = (int32) (logmath_log(fsg->lmath, silprob) * fsg->lw); + if (fsg->silwords == NULL) + fsg->silwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->silwords, silwid); + + n_trans = 0; + if (state == -1) { + for (src = 0; src < fsg->n_state; src++) { + fsg_model_trans_add(fsg, src, src, logsilp, silwid); + ++n_trans; + } + } + else { + fsg_model_trans_add(fsg, state, state, logsilp, silwid); + ++n_trans; + } + + E_INFO("Added %d silence word transitions\n", n_trans); + return n_trans; +} + +int +fsg_model_add_alt(fsg_model_t * fsg, char const *baseword, + char const *altword) +{ + int i, basewid, altwid; + int ntrans; + + /* FIXME: This will get slow, eventually... */ + for (basewid = 0; basewid < fsg->n_word; ++basewid) + if (0 == strcmp(fsg->vocab[basewid], baseword)) + break; + if (basewid == fsg->n_word) { + E_ERROR("Base word %s not present in FSG vocabulary!\n", baseword); + return -1; + } + altwid = fsg_model_word_add(fsg, altword); + if (fsg->altwords == NULL) + fsg->altwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->altwords, altwid); + if (fsg_model_is_filler(fsg, basewid)) { + if (fsg->silwords == NULL) + fsg->silwords = bitvec_alloc(fsg->n_word_alloc); + bitvec_set(fsg->silwords, altwid); + } + + E_DEBUG("Adding alternate word transitions (%s,%s) to FSG\n", + baseword, altword); + + /* Look for all transitions involving baseword and duplicate them. */ + /* FIXME: This will also get slow, eventually... */ + ntrans = 0; + for (i = 0; i < fsg->n_state; ++i) { + hash_iter_t *itor; + if (fsg->trans[i].trans == NULL) + continue; + for (itor = hash_table_iter(fsg->trans[i].trans); itor; + itor = hash_table_iter_next(itor)) { + glist_t trans; + gnode_t *gn; + + trans = hash_entry_val(itor->ent); + for (gn = trans; gn; gn = gnode_next(gn)) { + fsg_link_t *fl = gnode_ptr(gn); + if (fl->wid == basewid) { + fsg_link_t *link; + + /* Create transition object */ + link = listelem_malloc(fsg->link_alloc); + link->from_state = fl->from_state; + link->to_state = fl->to_state; + link->logs2prob = fl->logs2prob; /* FIXME!!!??? */ + link->wid = altwid; + + trans = glist_add_ptr(trans, (void *) link); + ++ntrans; + } + } + hash_entry_val(itor->ent) = trans; + } + } + + E_DEBUG("Added %d alternate word transitions\n", ntrans); + return ntrans; +} + + +fsg_model_t * +fsg_model_init(char const *name, logmath_t * lmath, float32 lw, + int32 n_state) +{ + fsg_model_t *fsg; + + /* Allocate basic stuff. */ + fsg = ckd_calloc(1, sizeof(*fsg)); + fsg->refcount = 1; + fsg->link_alloc = listelem_alloc_init(sizeof(fsg_link_t)); + fsg->lmath = lmath; + fsg->name = name ? ckd_salloc(name) : NULL; + fsg->n_state = n_state; + fsg->lw = lw; + + fsg->trans = ckd_calloc(fsg->n_state, sizeof(*fsg->trans)); + + return fsg; +} + +fsg_model_t * +fsg_model_read(FILE * fp, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + hash_table_t *vocab; + hash_iter_t *itor; + int32 lastwid; + char **wordptr; + char *lineptr; + char *fsgname; + int32 lineno; + int32 n, i, j; + int n_state, n_trans, n_null_trans; + glist_t nulls; + float32 p; + + lineno = 0; + vocab = hash_table_new(32, FALSE); + wordptr = NULL; + lineptr = NULL; + nulls = NULL; + fsgname = NULL; + fsg = NULL; + + /* Scan upto FSG_BEGIN header */ + for (;;) { + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if (n < 0) { + E_ERROR("%s declaration missing\n", FSG_MODEL_BEGIN_DECL); + goto parse_error; + } + + if ((strcmp(wordptr[0], FSG_MODEL_BEGIN_DECL) == 0)) { + if (n > 2) { + E_ERROR("Line[%d]: malformed FSG_BEGIN declaration\n", + lineno); + goto parse_error; + } + break; + } + } + /* Save FSG name, or it will get clobbered below :(. + * If name is missing, try the default. + */ + if (n == 2) { + fsgname = ckd_salloc(wordptr[1]); + } + else { + E_WARN("FSG name is missing\n"); + fsgname = ckd_salloc("unknown"); + } + + /* Read #states */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_N_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_NUM_STATES_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &n_state) != 1) + || (n_state <= 0)) { + E_ERROR + ("Line[%d]: #states declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Now create the FSG. */ + fsg = fsg_model_init(fsgname, lmath, lw, n_state); + ckd_free(fsgname); + fsgname = NULL; + + /* Read start state */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_S_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_START_STATE_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &(fsg->start_state)) != 1) + || (fsg->start_state < 0) + || (fsg->start_state >= fsg->n_state)) { + E_ERROR + ("Line[%d]: start state declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Read final state */ + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if ((n != 2) + || ((strcmp(wordptr[0], FSG_MODEL_F_DECL) != 0) + && (strcmp(wordptr[0], FSG_MODEL_FINAL_STATE_DECL) != 0)) + || (sscanf(wordptr[1], "%d", &(fsg->final_state)) != 1) + || (fsg->final_state < 0) + || (fsg->final_state >= fsg->n_state)) { + E_ERROR + ("Line[%d]: final state declaration line missing or malformed\n", + lineno); + goto parse_error; + } + + /* Read transitions */ + lastwid = 0; + n_trans = n_null_trans = 0; + for (;;) { + int32 wid, tprob; + + n = nextline_str2words(fp, &lineno, &lineptr, &wordptr); + if (n <= 0) { + E_ERROR("Line[%d]: transition or FSG_END statement expected\n", + lineno); + goto parse_error; + } + + if ((strcmp(wordptr[0], FSG_MODEL_END_DECL) == 0)) { + break; + } + + if ((strcmp(wordptr[0], FSG_MODEL_T_DECL) == 0) + || (strcmp(wordptr[0], FSG_MODEL_TRANSITION_DECL) == 0)) { + + + if (((n != 4) && (n != 5)) + || (sscanf(wordptr[1], "%d", &i) != 1) + || (sscanf(wordptr[2], "%d", &j) != 1) + || (i < 0) || (i >= fsg->n_state) + || (j < 0) || (j >= fsg->n_state)) { + E_ERROR + ("Line[%d]: transition spec malformed; Expecting: from-state to-state trans-prob [word]\n", + lineno); + goto parse_error; + } + + p = atof_c(wordptr[3]); + if ((p <= 0.0) || (p > 1.0)) { + E_ERROR + ("Line[%d]: transition spec malformed; Expecting float as transition probability\n", + lineno); + goto parse_error; + } + } + else { + E_ERROR("Line[%d]: transition or FSG_END statement expected\n", + lineno); + goto parse_error; + } + + tprob = (int32) (logmath_log(lmath, p) * fsg->lw); + /* Add word to "dictionary". */ + if (n > 4) { + if (hash_table_lookup_int32(vocab, wordptr[4], &wid) < 0) { + (void) hash_table_enter_int32(vocab, + ckd_salloc(wordptr[4]), + lastwid); + wid = lastwid; + ++lastwid; + } + fsg_model_trans_add(fsg, i, j, tprob, wid); + ++n_trans; + } + else { + if (fsg_model_null_trans_add(fsg, i, j, tprob) == 1) { + ++n_null_trans; + nulls = + glist_add_ptr(nulls, fsg_model_null_trans(fsg, i, j)); + } + } + } + + E_INFO("FSG: %d states, %d unique words, %d transitions (%d null)\n", + fsg->n_state, hash_table_inuse(vocab), n_trans, n_null_trans); + + + /* Now create a string table from the "dictionary" */ + fsg->n_word = hash_table_inuse(vocab); + fsg->n_word_alloc = fsg->n_word + 10; /* Pad it a bit. */ + fsg->vocab = ckd_calloc(fsg->n_word_alloc, sizeof(*fsg->vocab)); + for (itor = hash_table_iter(vocab); itor; + itor = hash_table_iter_next(itor)) { + char const *word = hash_entry_key(itor->ent); + int32 wid = (int32) (long) hash_entry_val(itor->ent); + fsg->vocab[wid] = (char *) word; + } + hash_table_free(vocab); + + /* Do transitive closure on null transitions */ + nulls = fsg_model_null_trans_closure(fsg, nulls); + glist_free(nulls); + + ckd_free(lineptr); + ckd_free(wordptr); + + return fsg; + + parse_error: + for (itor = hash_table_iter(vocab); itor; + itor = hash_table_iter_next(itor)) + ckd_free((char *) hash_entry_key(itor->ent)); + glist_free(nulls); + hash_table_free(vocab); + ckd_free(fsgname); + ckd_free(lineptr); + ckd_free(wordptr); + fsg_model_free(fsg); + return NULL; +} + + +fsg_model_t * +fsg_model_readfile(const char *file, logmath_t * lmath, float32 lw) +{ + FILE *fp; + fsg_model_t *fsg; + + if ((fp = fopen(file, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open FSG file '%s' for reading", file); + return NULL; + } + fsg = fsg_model_read(fp, lmath, lw); + fclose(fp); + return fsg; +} + +fsg_model_t * +fsg_model_retain(fsg_model_t * fsg) +{ + ++fsg->refcount; + return fsg; +} + +static void +trans_list_free(fsg_model_t * fsg, int32 i) +{ + hash_iter_t *itor; + + /* FIXME (maybe): FSG links will all get freed when we call + * listelem_alloc_free() so don't bother freeing them explicitly + * here. */ + if (fsg->trans[i].trans) { + for (itor = hash_table_iter(fsg->trans[i].trans); + itor; itor = hash_table_iter_next(itor)) { + glist_t gl = (glist_t) hash_entry_val(itor->ent); + glist_free(gl); + } + } + hash_table_free(fsg->trans[i].trans); + hash_table_free(fsg->trans[i].null_trans); +} + +int +fsg_model_free(fsg_model_t * fsg) +{ + int i; + + if (fsg == NULL) + return 0; + + if (--fsg->refcount > 0) + return fsg->refcount; + + for (i = 0; i < fsg->n_word; ++i) + ckd_free(fsg->vocab[i]); + for (i = 0; i < fsg->n_state; ++i) + trans_list_free(fsg, i); + ckd_free(fsg->trans); + ckd_free(fsg->vocab); + listelem_alloc_free(fsg->link_alloc); + bitvec_free(fsg->silwords); + bitvec_free(fsg->altwords); + ckd_free(fsg->name); + ckd_free(fsg); + return 0; +} + + +void +fsg_model_write(fsg_model_t * fsg, FILE * fp) +{ + int32 i; + + fprintf(fp, "%s %s\n", FSG_MODEL_BEGIN_DECL, + fsg->name ? fsg->name : ""); + fprintf(fp, "%s %d\n", FSG_MODEL_NUM_STATES_DECL, fsg->n_state); + fprintf(fp, "%s %d\n", FSG_MODEL_START_STATE_DECL, fsg->start_state); + fprintf(fp, "%s %d\n", FSG_MODEL_FINAL_STATE_DECL, fsg->final_state); + + for (i = 0; i < fsg->n_state; i++) { + fsg_arciter_t *itor; + + for (itor = fsg_model_arcs(fsg, i); itor; + itor = fsg_arciter_next(itor)) { + fsg_link_t *tl = fsg_arciter_get(itor); + + fprintf(fp, "%s %d %d %f %s\n", FSG_MODEL_TRANSITION_DECL, + tl->from_state, tl->to_state, + logmath_exp(fsg->lmath, + (int32) (tl->logs2prob / fsg->lw)), + (tl->wid < 0) ? "" : fsg_model_word_str(fsg, tl->wid)); + } + } + + fprintf(fp, "%s\n", FSG_MODEL_END_DECL); + + fflush(fp); +} + +void +fsg_model_writefile(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSG file '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open FSG file '%s' for reading", file); + return; + } + + fsg_model_write(fsg, fp); + + fclose(fp); +} + +static void +fsg_model_write_fsm_trans(fsg_model_t * fsg, int i, FILE * fp) +{ + fsg_arciter_t *itor; + + for (itor = fsg_model_arcs(fsg, i); itor; + itor = fsg_arciter_next(itor)) { + fsg_link_t *tl = fsg_arciter_get(itor); + fprintf(fp, "%d %d %s %f\n", + tl->from_state, tl->to_state, + (tl->wid < 0) ? "" : fsg_model_word_str(fsg, tl->wid), + -logmath_log_to_ln(fsg->lmath, tl->logs2prob / fsg->lw)); + } +} + +void +fsg_model_write_fsm(fsg_model_t * fsg, FILE * fp) +{ + int i; + + /* Write transitions from initial state first. */ + fsg_model_write_fsm_trans(fsg, fsg_model_start_state(fsg), fp); + + /* Other states. */ + for (i = 0; i < fsg->n_state; i++) { + if (i == fsg_model_start_state(fsg)) + continue; + fsg_model_write_fsm_trans(fsg, i, fp); + } + + /* Final state. */ + fprintf(fp, "%d 0\n", fsg_model_final_state(fsg)); + + fflush(fp); +} + +void +fsg_model_writefile_fsm(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSM file '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open fsm file '%s' for writing", file); + return; + } + + fsg_model_write_fsm(fsg, fp); + + fclose(fp); +} + +void +fsg_model_write_symtab(fsg_model_t * fsg, FILE * file) +{ + int i; + + fprintf(file, " 0\n"); + for (i = 0; i < fsg_model_n_word(fsg); ++i) { + fprintf(file, "%s %d\n", fsg_model_word_str(fsg, i), i + 1); + } + fflush(file); +} + +void +fsg_model_writefile_symtab(fsg_model_t * fsg, char const *file) +{ + FILE *fp; + + assert(fsg); + + E_INFO("Writing FSM symbol table '%s'\n", file); + + if ((fp = fopen(file, "w")) == NULL) { + E_ERROR("Failed to open symbol table '%s' for writing", file); + return; + } + + fsg_model_write_symtab(fsg, fp); + + fclose(fp); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c new file mode 100644 index 0000000..ab12373 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c @@ -0,0 +1,966 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/hash_table.h" +#include "sphinxbase/filename.h" +#include "sphinxbase/err.h" +#include "sphinxbase/jsgf.h" + +#include "jsgf_internal.h" +#include "jsgf_parser.h" +#include "jsgf_scanner.h" + +extern int yyparse(void *scanner, jsgf_t * jsgf); + +/** + * \file jsgf.c + * + * This file implements the data structures for parsing JSGF grammars + * into Sphinx finite-state grammars. + **/ + +static int expand_rule(jsgf_t * grammar, jsgf_rule_t * rule, + int rule_entry, int rule_exit); + +jsgf_atom_t * +jsgf_atom_new(char *name, float weight) +{ + jsgf_atom_t *atom; + + atom = ckd_calloc(1, sizeof(*atom)); + atom->name = ckd_salloc(name); + atom->weight = weight; + return atom; +} + +int +jsgf_atom_free(jsgf_atom_t * atom) +{ + if (atom == NULL) + return 0; + ckd_free(atom->name); + ckd_free(atom); + return 0; +} + +jsgf_t * +jsgf_grammar_new(jsgf_t * parent) +{ + jsgf_t *grammar; + + grammar = ckd_calloc(1, sizeof(*grammar)); + /* If this is an imported/subgrammar, then we will share a global + * namespace with the parent grammar. */ + if (parent) { + grammar->rules = parent->rules; + grammar->imports = parent->imports; + grammar->searchpath = parent->searchpath; + grammar->parent = parent; + } + else { + grammar->rules = hash_table_new(64, 0); + grammar->imports = hash_table_new(16, 0); + } + + return grammar; +} + +void +jsgf_grammar_free(jsgf_t * jsgf) +{ + /* FIXME: Probably should just use refcounting instead. */ + if (jsgf->parent == NULL) { + hash_iter_t *itor; + gnode_t *gn; + + for (itor = hash_table_iter(jsgf->rules); itor; + itor = hash_table_iter_next(itor)) { + ckd_free((char *) itor->ent->key); + jsgf_rule_free((jsgf_rule_t *) itor->ent->val); + } + hash_table_free(jsgf->rules); + for (itor = hash_table_iter(jsgf->imports); itor; + itor = hash_table_iter_next(itor)) { + ckd_free((char *) itor->ent->key); + jsgf_grammar_free((jsgf_t *) itor->ent->val); + } + hash_table_free(jsgf->imports); + for (gn = jsgf->searchpath; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(jsgf->searchpath); + for (gn = jsgf->links; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(jsgf->links); + } + ckd_free(jsgf->name); + ckd_free(jsgf->version); + ckd_free(jsgf->charset); + ckd_free(jsgf->locale); + ckd_free(jsgf); +} + +static void +jsgf_rhs_free(jsgf_rhs_t * rhs) +{ + gnode_t *gn; + + if (rhs == NULL) + return; + + jsgf_rhs_free(rhs->alt); + for (gn = rhs->atoms; gn; gn = gnode_next(gn)) + jsgf_atom_free(gnode_ptr(gn)); + glist_free(rhs->atoms); + ckd_free(rhs); +} + +jsgf_atom_t * +jsgf_kleene_new(jsgf_t * jsgf, jsgf_atom_t * atom, int plus) +{ + jsgf_rule_t *rule; + jsgf_atom_t *rule_atom; + jsgf_rhs_t *rhs; + + /* Generate an "internal" rule of the form ( | ) */ + /* Or if plus is true, ( | ) */ + rhs = ckd_calloc(1, sizeof(*rhs)); + if (plus) + rhs->atoms = glist_add_ptr(NULL, jsgf_atom_new(atom->name, 1.0)); + else + rhs->atoms = glist_add_ptr(NULL, jsgf_atom_new("", 1.0)); + rule = jsgf_define_rule(jsgf, NULL, rhs, 0); + rule_atom = jsgf_atom_new(rule->name, 1.0); + rhs = ckd_calloc(1, sizeof(*rhs)); + rhs->atoms = glist_add_ptr(NULL, rule_atom); + rhs->atoms = glist_add_ptr(rhs->atoms, atom); + rule->rhs->alt = rhs; + + return jsgf_atom_new(rule->name, 1.0); +} + +jsgf_rule_t * +jsgf_optional_new(jsgf_t * jsgf, jsgf_rhs_t * exp) +{ + jsgf_rhs_t *rhs = ckd_calloc(1, sizeof(*rhs)); + jsgf_atom_t *atom = jsgf_atom_new("", 1.0); + rhs->alt = exp; + rhs->atoms = glist_add_ptr(NULL, atom); + return jsgf_define_rule(jsgf, NULL, rhs, 0); +} + +void +jsgf_add_link(jsgf_t * grammar, jsgf_atom_t * atom, int from, int to) +{ + jsgf_link_t *link; + + link = ckd_calloc(1, sizeof(*link)); + link->from = from; + link->to = to; + link->atom = atom; + grammar->links = glist_add_ptr(grammar->links, link); +} + +static char * +extract_grammar_name(char *rule_name) +{ + char *dot_pos; + char *grammar_name = ckd_salloc(rule_name + 1); + if ((dot_pos = strrchr(grammar_name + 1, '.')) == NULL) { + ckd_free(grammar_name); + return NULL; + } + *dot_pos = '\0'; + return grammar_name; +} + +char const * +jsgf_grammar_name(jsgf_t * jsgf) +{ + return jsgf->name; +} + +static char * +jsgf_fullname(jsgf_t * jsgf, const char *name) +{ + char *fullname; + + /* Check if it is already qualified */ + if (strchr(name + 1, '.')) + return ckd_salloc(name); + + /* Skip leading < in name */ + fullname = ckd_malloc(strlen(jsgf->name) + strlen(name) + 4); + sprintf(fullname, "<%s.%s", jsgf->name, name + 1); + return fullname; +} + +static char * +jsgf_fullname_from_rule(jsgf_rule_t * rule, const char *name) +{ + char *fullname, *grammar_name; + + /* Check if it is already qualified */ + if (strchr(name + 1, '.')) + return ckd_salloc(name); + + /* Skip leading < in name */ + if ((grammar_name = extract_grammar_name(rule->name)) == NULL) + return ckd_salloc(name); + fullname = ckd_malloc(strlen(grammar_name) + strlen(name) + 4); + sprintf(fullname, "<%s.%s", grammar_name, name + 1); + ckd_free(grammar_name); + + return fullname; +} + +/* Extract as rulename everything after the secondlast dot, if existent. + * Because everything before the secondlast dot is the path-specification. */ +static char * +importname2rulename(char *importname) +{ + char *rulename = ckd_salloc(importname); + char *last_dotpos; + char *secondlast_dotpos; + + if ((last_dotpos = strrchr(rulename + 1, '.')) != NULL) { + *last_dotpos = '\0'; + if ((secondlast_dotpos = strrchr(rulename + 1, '.')) != NULL) { + *last_dotpos = '.'; + *secondlast_dotpos = '<'; + secondlast_dotpos = ckd_salloc(secondlast_dotpos); + ckd_free(rulename); + return secondlast_dotpos; + } + else { + *last_dotpos = '.'; + return rulename; + } + } + else { + return rulename; + } +} + +#define NO_NODE -1 +#define RECURSIVE_NODE -2 + +/** + * + * Expand a right-hand-side of a rule (i.e. a single alternate). + * + * @returns the FSG state at the end of this rule, NO_NODE if there's an + * error, and RECURSIVE_NODE if the right-hand-side ended in right-recursion (i.e. + * a link to an earlier FSG state). + */ +static int +expand_rhs(jsgf_t * grammar, jsgf_rule_t * rule, jsgf_rhs_t * rhs, + int rule_entry, int rule_exit) +{ + gnode_t *gn; + int lastnode; + + /* Last node expanded in this sequence. */ + lastnode = rule_entry; + + /* Iterate over atoms in rhs and generate links/nodes */ + for (gn = rhs->atoms; gn; gn = gnode_next(gn)) { + jsgf_atom_t *atom = gnode_ptr(gn); + + if (jsgf_atom_is_rule(atom)) { + jsgf_rule_t *subrule; + char *fullname; + gnode_t *subnode; + jsgf_rule_stack_t *rule_stack_entry = NULL; + + /* Special case for and pseudo-rules + If this is the only atom in the rhs, and it's the + first rhs in the rule, then emit a null transition, + creating an exit state if needed. */ + if (0 == strcmp(atom->name, "")) { + if (gn == rhs->atoms && gnode_next(gn) == NULL) { + if (rule_exit == NO_NODE) { + jsgf_add_link(grammar, atom, + lastnode, grammar->nstate); + rule_exit = lastnode = grammar->nstate; + ++grammar->nstate; + } + else { + jsgf_add_link(grammar, atom, lastnode, rule_exit); + } + } + continue; + } + else if (0 == strcmp(atom->name, "")) { + /* Make this entire RHS unspeakable */ + return NO_NODE; + } + + fullname = jsgf_fullname_from_rule(rule, atom->name); + if (hash_table_lookup + (grammar->rules, fullname, (void **) &subrule) == -1) { + E_ERROR("Undefined rule in RHS: %s\n", fullname); + ckd_free(fullname); + return NO_NODE; + } + ckd_free(fullname); + + /* Look for this subrule in the stack of expanded rules */ + for (subnode = grammar->rulestack; subnode; + subnode = gnode_next(subnode)) { + rule_stack_entry = + (jsgf_rule_stack_t *) gnode_ptr(subnode); + if (rule_stack_entry->rule == subrule) + break; + } + + if (subnode != NULL) { + /* Allow right-recursion only. */ + if (gnode_next(gn) != NULL) { + E_ERROR + ("Only right-recursion is permitted (in %s.%s)\n", + grammar->name, rule->name); + return NO_NODE; + } + /* Add a link back to the beginning of this rule instance */ + E_INFO("Right recursion %s %d => %d\n", atom->name, + lastnode, rule_stack_entry->entry); + jsgf_add_link(grammar, atom, lastnode, + rule_stack_entry->entry); + + /* Let our caller know that this rhs didn't reach an + end state. */ + lastnode = RECURSIVE_NODE; + } + else { + /* If this is the last atom in this rhs, link its + expansion to the parent rule's exit state. + Otherwise, create a new exit state for it. */ + int subruleexit = NO_NODE; + if (gnode_next(gn) == NULL && rule_exit >= 0) + subruleexit = rule_exit; + + /* Expand the subrule */ + lastnode = + expand_rule(grammar, subrule, lastnode, subruleexit); + + if (lastnode == NO_NODE) + return NO_NODE; + } + } + else { + /* An exit-state is created if this isn't the last atom + in the rhs, or if the containing rule doesn't have an + exit state yet. + Otherwise, the rhs's exit state becomes the containing + rule's exit state. */ + int exitstate; + if (gnode_next(gn) == NULL && rule_exit >= 0) { + exitstate = rule_exit; + } + else { + exitstate = grammar->nstate; + ++grammar->nstate; + } + + /* Add a link for this token */ + jsgf_add_link(grammar, atom, lastnode, exitstate); + lastnode = exitstate; + } + } + + return lastnode; +} + +static int +expand_rule(jsgf_t * grammar, jsgf_rule_t * rule, int rule_entry, + int rule_exit) +{ + jsgf_rule_stack_t *rule_stack_entry; + jsgf_rhs_t *rhs; + + /* Push this rule onto the stack */ + rule_stack_entry = + (jsgf_rule_stack_t *) ckd_calloc(1, sizeof(jsgf_rule_stack_t)); + rule_stack_entry->rule = rule; + rule_stack_entry->entry = rule_entry; + grammar->rulestack = glist_add_ptr(grammar->rulestack, + rule_stack_entry); + + for (rhs = rule->rhs; rhs; rhs = rhs->alt) { + int lastnode; + + lastnode = expand_rhs(grammar, rule, rhs, rule_entry, rule_exit); + + if (lastnode == NO_NODE) { + return NO_NODE; + } + else if (lastnode == RECURSIVE_NODE) { + /* The rhs ended with right-recursion, i.e. a transition to + an earlier state. Nothing needs to happen at this level. */ + ; + } + else if (rule_exit == NO_NODE) { + /* If this rule doesn't have an exit state yet, use the exit + state of its first right-hand-side. + All other right-hand-sides will use this exit state. */ + assert(lastnode >= 0); + rule_exit = lastnode; + } + } + + /* If no exit-state was created, use the entry-state. */ + if (rule_exit == NO_NODE) { + rule_exit = rule_entry; + } + + /* Pop this rule from the rule stack */ + ckd_free(gnode_ptr(grammar->rulestack)); + grammar->rulestack = gnode_free(grammar->rulestack, NULL); + + return rule_exit; +} + +jsgf_rule_iter_t * +jsgf_rule_iter(jsgf_t * grammar) +{ + return hash_table_iter(grammar->rules); +} + +jsgf_rule_t * +jsgf_get_rule(jsgf_t * grammar, char const *name) +{ + void *val; + char *fullname; + + fullname = string_join("<", name, ">", NULL); + if (hash_table_lookup(grammar->rules, fullname, &val) < 0) { + ckd_free(fullname); + return NULL; + } + ckd_free(fullname); + return (jsgf_rule_t *) val; +} + +jsgf_rule_t * +jsgf_get_public_rule(jsgf_t * grammar) +{ + jsgf_rule_iter_t *itor; + jsgf_rule_t *public_rule = NULL; + + for (itor = jsgf_rule_iter(grammar); itor; + itor = jsgf_rule_iter_next(itor)) { + jsgf_rule_t *rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + const char *rule_name = jsgf_rule_name(rule); + char *dot_pos; + if ((dot_pos = strrchr(rule_name + 1, '.')) == NULL) { + public_rule = rule; + jsgf_rule_iter_free(itor); + break; + } + if (0 == + strncmp(rule_name + 1, jsgf_grammar_name(grammar), + dot_pos - rule_name - 1)) { + public_rule = rule; + jsgf_rule_iter_free(itor); + break; + } + } + } + return public_rule; +} + +char const * +jsgf_rule_name(jsgf_rule_t * rule) +{ + return rule->name; +} + +int +jsgf_rule_public(jsgf_rule_t * rule) +{ + return rule->is_public; +} + +static fsg_model_t * +jsgf_build_fsg_internal(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw, int do_closure) +{ + fsg_model_t *fsg; + glist_t nulls; + gnode_t *gn; + int rule_entry, rule_exit; + + if (grammar == NULL || rule == NULL) + return NULL; + + /* Clear previous links */ + for (gn = grammar->links; gn; gn = gnode_next(gn)) { + ckd_free(gnode_ptr(gn)); + } + glist_free(grammar->links); + grammar->links = NULL; + grammar->nstate = 0; + + /* Create the top-level entry state, and expand the + top-level rule. */ + rule_entry = grammar->nstate++; + rule_exit = expand_rule(grammar, rule, rule_entry, NO_NODE); + + /* If no exit-state was created, create one. */ + if (rule_exit == NO_NODE) { + rule_exit = grammar->nstate++; + jsgf_add_link(grammar, NULL, rule_entry, rule_exit); + } + + fsg = fsg_model_init(rule->name, lmath, lw, grammar->nstate); + fsg->start_state = rule_entry; + fsg->final_state = rule_exit; + grammar->links = glist_reverse(grammar->links); + for (gn = grammar->links; gn; gn = gnode_next(gn)) { + jsgf_link_t *link = gnode_ptr(gn); + + if (link->atom) { + if (jsgf_atom_is_rule(link->atom)) { + fsg_model_null_trans_add(fsg, link->from, link->to, + logmath_log(lmath, + link->atom->weight)); + } + else { + int wid = fsg_model_word_add(fsg, link->atom->name); + fsg_model_trans_add(fsg, link->from, link->to, + logmath_log(lmath, link->atom->weight), + wid); + } + } + else { + fsg_model_null_trans_add(fsg, link->from, link->to, 0); + } + } + if (do_closure) { + nulls = fsg_model_null_trans_closure(fsg, NULL); + glist_free(nulls); + } + + return fsg; +} + +fsg_model_t * +jsgf_build_fsg(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw) +{ + return jsgf_build_fsg_internal(grammar, rule, lmath, lw, TRUE); +} + +fsg_model_t * +jsgf_build_fsg_raw(jsgf_t * grammar, jsgf_rule_t * rule, + logmath_t * lmath, float32 lw) +{ + return jsgf_build_fsg_internal(grammar, rule, lmath, lw, FALSE); +} + +fsg_model_t * +jsgf_read_file(const char *file, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + jsgf_rule_t *rule; + jsgf_t *jsgf; + jsgf_rule_iter_t *itor; + + if ((jsgf = jsgf_parse_file(file, NULL)) == NULL) { + E_ERROR("Error parsing file: %s\n", file); + return NULL; + } + + rule = NULL; + for (itor = jsgf_rule_iter(jsgf); itor; + itor = jsgf_rule_iter_next(itor)) { + rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + jsgf_rule_iter_free(itor); + break; + } + } + if (rule == NULL) { + E_ERROR("No public rules found in %s\n", file); + return NULL; + } + fsg = jsgf_build_fsg(jsgf, rule, lmath, lw); + jsgf_grammar_free(jsgf); + return fsg; +} + +fsg_model_t * +jsgf_read_string(const char *string, logmath_t * lmath, float32 lw) +{ + fsg_model_t *fsg; + jsgf_rule_t *rule; + jsgf_t *jsgf; + jsgf_rule_iter_t *itor; + + if ((jsgf = jsgf_parse_string(string, NULL)) == NULL) { + E_ERROR("Error parsing input string\n"); + return NULL; + } + + rule = NULL; + for (itor = jsgf_rule_iter(jsgf); itor; + itor = jsgf_rule_iter_next(itor)) { + rule = jsgf_rule_iter_rule(itor); + if (jsgf_rule_public(rule)) { + jsgf_rule_iter_free(itor); + break; + } + } + if (rule == NULL) { + jsgf_grammar_free(jsgf); + E_ERROR("No public rules found in input string\n"); + return NULL; + } + fsg = jsgf_build_fsg(jsgf, rule, lmath, lw); + jsgf_grammar_free(jsgf); + return fsg; +} + + +int +jsgf_write_fsg(jsgf_t * grammar, jsgf_rule_t * rule, FILE * outfh) +{ + fsg_model_t *fsg; + logmath_t *lmath = logmath_init(1.0001, 0, 0); + + if ((fsg = jsgf_build_fsg_raw(grammar, rule, lmath, 1.0)) == NULL) + goto error_out; + + fsg_model_write(fsg, outfh); + logmath_free(lmath); + return 0; + + error_out: + logmath_free(lmath); + return -1; +} + +jsgf_rule_t * +jsgf_define_rule(jsgf_t * jsgf, char *name, jsgf_rhs_t * rhs, + int is_public) +{ + jsgf_rule_t *rule; + void *val; + + if (name == NULL) { + name = ckd_malloc(strlen(jsgf->name) + 16); + sprintf(name, "<%s.g%05d>", jsgf->name, + hash_table_inuse(jsgf->rules)); + } + else { + char *newname; + + newname = jsgf_fullname(jsgf, name); + name = newname; + } + + rule = ckd_calloc(1, sizeof(*rule)); + rule->refcnt = 1; + rule->name = ckd_salloc(name); + rule->rhs = rhs; + rule->is_public = is_public; + + E_INFO("Defined rule: %s%s\n", + rule->is_public ? "PUBLIC " : "", rule->name); + val = hash_table_enter(jsgf->rules, name, rule); + if (val != (void *) rule) { + E_WARN("Multiply defined symbol: %s\n", name); + } + return rule; +} + +jsgf_rule_t * +jsgf_rule_retain(jsgf_rule_t * rule) +{ + ++rule->refcnt; + return rule; +} + +int +jsgf_rule_free(jsgf_rule_t * rule) +{ + if (rule == NULL) + return 0; + if (--rule->refcnt > 0) + return rule->refcnt; + jsgf_rhs_free(rule->rhs); + ckd_free(rule->name); + ckd_free(rule); + return 0; +} + + +/* FIXME: This should go in libsphinxutil */ +static char * +path_list_search(glist_t paths, char *path) +{ + gnode_t *gn; + + for (gn = paths; gn; gn = gnode_next(gn)) { + char *fullpath; + FILE *tmp; + + fullpath = string_join(gnode_ptr(gn), "/", path, NULL); + tmp = fopen(fullpath, "r"); + if (tmp != NULL) { + fclose(tmp); + return fullpath; + } + else { + ckd_free(fullpath); + } + } + return NULL; +} + +jsgf_rule_t * +jsgf_import_rule(jsgf_t * jsgf, char *name) +{ + char *c, *path, *newpath; + size_t namelen, packlen; + void *val; + jsgf_t *imp; + int import_all; + + /* Trim the leading and trailing <> */ + namelen = strlen(name); + path = ckd_malloc(namelen - 2 + 6); /* room for a trailing .gram */ + strcpy(path, name + 1); + /* Split off the first part of the name */ + c = strrchr(path, '.'); + if (c == NULL) { + E_ERROR("Imported rule is not qualified: %s\n", name); + ckd_free(path); + return NULL; + } + packlen = c - path; + *c = '\0'; + + /* Look for import foo.* */ + import_all = (strlen(name) > 2 + && 0 == strcmp(name + namelen - 3, ".*>")); + + /* Construct a filename. */ + for (c = path; *c; ++c) + if (*c == '.') + *c = '/'; + strcat(path, ".gram"); + newpath = path_list_search(jsgf->searchpath, path); + if (newpath == NULL) { + E_ERROR("Failed to find grammar %s\n", path); + ckd_free(path); + return NULL; + } + ckd_free(path); + + path = newpath; + E_INFO("Importing %s from %s to %s\n", name, path, jsgf->name); + + /* FIXME: Also, we need to make sure that path is fully qualified + * here, by adding any prefixes from jsgf->name to it. */ + /* See if we have parsed it already */ + if (hash_table_lookup(jsgf->imports, path, &val) == 0) { + E_INFO("Already imported %s\n", path); + imp = val; + ckd_free(path); + } + else { + /* If not, parse it. */ + imp = jsgf_parse_file(path, jsgf); + val = hash_table_enter(jsgf->imports, path, imp); + if (val != (void *) imp) { + E_WARN("Multiply imported file: %s\n", path); + } + } + if (imp != NULL) { + hash_iter_t *itor; + /* Look for public rules matching rulename. */ + for (itor = hash_table_iter(imp->rules); itor; + itor = hash_table_iter_next(itor)) { + hash_entry_t *he = itor->ent; + jsgf_rule_t *rule = hash_entry_val(he); + int rule_matches; + char *rule_name = importname2rulename(name); + + if (import_all) { + /* Match package name (symbol table is shared) */ + rule_matches = + !strncmp(rule_name, rule->name, packlen + 1); + } + else { + /* Exact match */ + rule_matches = !strcmp(rule_name, rule->name); + } + ckd_free(rule_name); + if (rule->is_public && rule_matches) { + void *val; + char *newname; + + /* Link this rule into the current namespace. */ + c = strrchr(rule->name, '.'); + assert(c != NULL); + newname = jsgf_fullname(jsgf, c); + + E_INFO("Imported %s\n", newname); + val = hash_table_enter(jsgf->rules, newname, + jsgf_rule_retain(rule)); + if (val != (void *) rule) { + E_WARN("Multiply defined symbol: %s\n", newname); + } + if (!import_all) { + hash_table_iter_free(itor); + return rule; + } + } + } + } + + return NULL; +} + +static void +jsgf_set_search_path(jsgf_t * jsgf, const char *filename) +{ + char *jsgf_path; + +#if !defined(_WIN32_WCE) + if ((jsgf_path = getenv("JSGF_PATH")) != NULL) { + char *word, *c; + /* FIXME: This should be a function in libsphinxbase. */ + word = jsgf_path = ckd_salloc(jsgf_path); + while ((c = strchr(word, ':'))) { + *c = '\0'; + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, word); + word = c + 1; + } + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, word); + jsgf->searchpath = glist_reverse(jsgf->searchpath); + return; + } +#endif + + if (!filename) { + jsgf->searchpath = + glist_add_ptr(jsgf->searchpath, ckd_salloc(".")); + return; + } + + jsgf_path = ckd_salloc(filename); + path2dirname(filename, jsgf_path); + jsgf->searchpath = glist_add_ptr(jsgf->searchpath, jsgf_path); +} + +jsgf_t * +jsgf_parse_file(const char *filename, jsgf_t * parent) +{ + yyscan_t yyscanner; + jsgf_t *jsgf; + int yyrv; + FILE *in = NULL; + + yylex_init(&yyscanner); + if (filename == NULL) { + yyset_in(stdin, yyscanner); + } + else { + in = fopen(filename, "r"); + if (in == NULL) { + E_ERROR_SYSTEM("Failed to open %s for parsing", filename); + return NULL; + } + yyset_in(in, yyscanner); + } + + jsgf = jsgf_grammar_new(parent); + + if (!parent) + jsgf_set_search_path(jsgf, filename); + + yyrv = yyparse(yyscanner, jsgf); + if (yyrv != 0) { + E_ERROR("Failed to parse JSGF grammar from '%s'\n", + filename ? filename : "(stdin)"); + jsgf_grammar_free(jsgf); + yylex_destroy(yyscanner); + return NULL; + } + if (in) + fclose(in); + yylex_destroy(yyscanner); + + return jsgf; +} + +jsgf_t * +jsgf_parse_string(const char *string, jsgf_t * parent) +{ + yyscan_t yyscanner; + jsgf_t *jsgf; + int yyrv; + YY_BUFFER_STATE buf; + + yylex_init(&yyscanner); + buf = yy_scan_string(string, yyscanner); + + jsgf = jsgf_grammar_new(parent); + if (!parent) + jsgf_set_search_path(jsgf, NULL); + + yyrv = yyparse(yyscanner, jsgf); + if (yyrv != 0) { + E_ERROR("Failed to parse JSGF grammar from input string\n"); + jsgf_grammar_free(jsgf); + yy_delete_buffer(buf, yyscanner); + yylex_destroy(yyscanner); + return NULL; + } + yy_delete_buffer(buf, yyscanner); + yylex_destroy(yyscanner); + + return jsgf; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h new file mode 100644 index 0000000..a5cbc98 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h @@ -0,0 +1,140 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __JSGF_INTERNAL_H__ +#define __JSGF_INTERNAL_H__ + +/** + * @file jsgf_internal.h Internal definitions for JSGF grammar compiler + */ + +#include + +#include +#include +#include +#include +#include +#include + + +/* Flex uses strdup which is missing on WinCE */ +#if defined(_WIN32) || defined(_WIN32_WCE) +#define strdup _strdup +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +/* Fool Emacs. */ +} +#endif + +#define YY_NO_INPUT /* Silence a compiler warning. */ + +typedef struct jsgf_rhs_s jsgf_rhs_t; +typedef struct jsgf_atom_s jsgf_atom_t; +typedef struct jsgf_link_s jsgf_link_t; +typedef struct jsgf_rule_stack_s jsgf_rule_stack_t; + +struct jsgf_s { + char *version; /**< JSGF version (from header) */ + char *charset; /**< JSGF charset (default UTF-8) */ + char *locale; /**< JSGF locale (default C) */ + char *name; /**< Grammar name */ + + hash_table_t *rules; /**< Defined or imported rules in this grammar. */ + hash_table_t *imports; /**< Pointers to imported grammars. */ + jsgf_t *parent; /**< Parent grammar (if this is an imported one) */ + glist_t searchpath; /**< List of directories to search for grammars. */ + + /* Scratch variables for FSG conversion. */ + int nstate; /**< Number of generated states. */ + glist_t links; /**< Generated FSG links. */ + glist_t rulestack; /**< Stack of currently expanded rules. */ +}; + +/* A type to keep track of the stack of rules currently being expanded. */ +struct jsgf_rule_stack_s { + jsgf_rule_t *rule; /**< The rule being expanded */ + int entry; /**< The entry-state for this expansion */ +}; + +struct jsgf_rule_s { + int refcnt; /**< Reference count. */ + char *name; /**< Rule name (NULL for an alternation/grouping) */ + int is_public; /**< Is this rule marked 'public'? */ + jsgf_rhs_t *rhs; /**< Expansion */ +}; + +struct jsgf_rhs_s { + glist_t atoms; /**< Sequence of items */ + jsgf_rhs_t *alt; /**< Linked list of alternates */ +}; + +struct jsgf_atom_s { + char *name; /**< Rule or token name */ + glist_t tags; /**< Tags, if any (glist_t of char *) */ + float weight; /**< Weight (default 1) */ +}; + +struct jsgf_link_s { + jsgf_atom_t *atom; /**< Name, tags, weight */ + int from; /**< From state */ + int to; /**< To state */ +}; + +#define jsgf_atom_is_rule(atom) ((atom)->name[0] == '<') + +void jsgf_add_link(jsgf_t *grammar, jsgf_atom_t *atom, int from, int to); +jsgf_atom_t *jsgf_atom_new(char *name, float weight); +jsgf_atom_t *jsgf_kleene_new(jsgf_t *jsgf, jsgf_atom_t *atom, int plus); +jsgf_rule_t *jsgf_optional_new(jsgf_t *jsgf, jsgf_rhs_t *exp); +jsgf_rule_t *jsgf_define_rule(jsgf_t *jsgf, char *name, jsgf_rhs_t *rhs, int is_public); +jsgf_rule_t *jsgf_import_rule(jsgf_t *jsgf, char *name); + +int jsgf_atom_free(jsgf_atom_t *atom); +int jsgf_rule_free(jsgf_rule_t *rule); +jsgf_rule_t *jsgf_rule_retain(jsgf_rule_t *rule); + +#ifdef __cplusplus +} +#endif + + +#endif /* __JSGF_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c new file mode 100644 index 0000000..9314afb --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c @@ -0,0 +1,1800 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.4.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 37 "jsgf_parser.y" + +#define YYERROR_VERBOSE + +#include +#include + +#include +#include +#include + +#include "jsgf_internal.h" +#include "jsgf_parser.h" +#include "jsgf_scanner.h" + +/* Suppress warnings from generated code */ +#if defined _MSC_VER +#pragma warning(disable: 4273) +#endif + +void yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s); + + + +/* Line 189 of yacc.c */ +#line 97 "jsgf_parser.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + HEADER = 258, + GRAMMAR = 259, + IMPORT = 260, + PUBLIC = 261, + TOKEN = 262, + RULENAME = 263, + TAG = 264, + WEIGHT = 265 + }; +#endif +/* Tokens. */ +#define HEADER 258 +#define GRAMMAR 259 +#define IMPORT 260 +#define PUBLIC 261 +#define TOKEN 262 +#define RULENAME 263 +#define TAG 264 +#define WEIGHT 265 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 214 of yacc.c */ +#line 65 "jsgf_parser.y" + + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; + + + +/* Line 214 of yacc.c */ +#line 163 "jsgf_parser.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 264 of yacc.c */ +#line 175 "jsgf_parser.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 7 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 54 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 20 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 16 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 33 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 58 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 265 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 14, 15, 18, 19, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, + 2, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 16, 2, 17, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 5, 8, 12, 15, 18, 22, 27, + 33, 37, 39, 42, 46, 48, 51, 56, 62, 64, + 68, 70, 73, 75, 78, 80, 83, 87, 91, 93, + 95, 97, 99, 102 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 21, 0, -1, 22, -1, 22, 27, -1, 22, 25, + 27, -1, 23, 24, -1, 3, 11, -1, 3, 7, + 11, -1, 3, 7, 7, 11, -1, 3, 7, 7, + 7, 11, -1, 4, 7, 11, -1, 26, -1, 25, + 26, -1, 5, 8, 11, -1, 28, -1, 27, 28, + -1, 8, 12, 29, 11, -1, 6, 8, 12, 29, + 11, -1, 30, -1, 29, 13, 30, -1, 31, -1, + 30, 31, -1, 32, -1, 31, 9, -1, 35, -1, + 10, 35, -1, 14, 29, 15, -1, 16, 29, 17, + -1, 7, -1, 8, -1, 33, -1, 34, -1, 35, + 18, -1, 35, 19, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 82, 82, 83, 84, 87, 90, 91, 92, 93, + 97, 100, 101, 104, 107, 108, 111, 112, 115, 116, + 121, 123, 127, 128, 132, 133, 136, 139, 142, 143, + 144, 145, 146, 147 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "HEADER", "GRAMMAR", "IMPORT", "PUBLIC", + "TOKEN", "RULENAME", "TAG", "WEIGHT", "';'", "'='", "'|'", "'('", "')'", + "'['", "']'", "'*'", "'+'", "$accept", "grammar", "header", + "jsgf_header", "grammar_header", "import_header", "import_statement", + "rule_list", "rule", "alternate_list", "rule_expansion", + "tagged_rule_item", "rule_item", "rule_group", "rule_optional", + "rule_atom", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 59, 61, 124, 40, 41, 91, 93, 42, 43 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 20, 21, 21, 21, 22, 23, 23, 23, 23, + 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, + 30, 30, 31, 31, 32, 32, 33, 34, 35, 35, + 35, 35, 35, 35 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 2, 3, 2, 2, 3, 4, 5, + 3, 1, 2, 3, 1, 2, 4, 5, 1, 3, + 1, 2, 1, 2, 1, 2, 3, 3, 1, 1, + 1, 1, 2, 2 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 0, 0, 2, 0, 0, 6, 1, 0, 0, + 0, 0, 11, 3, 14, 0, 5, 0, 7, 0, + 0, 0, 12, 4, 15, 0, 0, 8, 13, 0, + 28, 29, 0, 0, 0, 0, 18, 20, 22, 30, + 31, 24, 10, 9, 0, 25, 0, 0, 16, 0, + 21, 23, 32, 33, 17, 26, 27, 19 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 2, 3, 4, 16, 11, 12, 13, 14, 35, + 36, 37, 38, 39, 40, 41 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -37 +static const yytype_int8 yypact[] = +{ + -1, -2, 36, 22, 35, 8, -37, -37, 32, 33, + 30, 22, -37, 17, -37, 37, -37, 13, -37, 34, + 31, -4, -37, 17, -37, 38, 39, -37, -37, -4, + -37, -37, 0, -4, -4, 18, -4, 42, -37, -37, + -37, 19, -37, -37, 21, 19, 20, 9, -37, -4, + 42, -37, -37, -37, -37, -37, -37, -4 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -37, -37, -37, -37, -37, -37, 41, 43, -12, -16, + -3, -36, -37, -37, -37, 15 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] = +{ + 50, 24, 1, 30, 31, 5, 32, 30, 31, 6, + 33, 24, 34, 44, 33, 17, 34, 46, 47, 18, + 26, 50, 49, 9, 27, 10, 56, 8, 9, 48, + 10, 49, 54, 49, 49, 55, 7, 52, 53, 15, + 19, 20, 21, 29, 25, 28, 57, 45, 0, 42, + 43, 51, 22, 0, 23 +}; + +static const yytype_int8 yycheck[] = +{ + 36, 13, 3, 7, 8, 7, 10, 7, 8, 11, + 14, 23, 16, 29, 14, 7, 16, 33, 34, 11, + 7, 57, 13, 6, 11, 8, 17, 5, 6, 11, + 8, 13, 11, 13, 13, 15, 0, 18, 19, 4, + 8, 8, 12, 12, 7, 11, 49, 32, -1, 11, + 11, 9, 11, -1, 11 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 21, 22, 23, 7, 11, 0, 5, 6, + 8, 25, 26, 27, 28, 4, 24, 7, 11, 8, + 8, 12, 26, 27, 28, 7, 7, 11, 11, 12, + 7, 8, 10, 14, 16, 29, 30, 31, 32, 33, + 34, 35, 11, 11, 29, 35, 29, 29, 11, 13, + 31, 9, 18, 19, 11, 15, 17, 30 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (yyscanner, jsgf, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, yyscanner) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, yyscanner, jsgf); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + if (!yyvaluep) + return; + YYUSE (yyscanner); + YYUSE (jsgf); +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep, yyscanner, jsgf); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule, void* yyscanner, jsgf_t *jsgf) +#else +static void +yy_reduce_print (yyvsp, yyrule, yyscanner, jsgf) + YYSTYPE *yyvsp; + int yyrule; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , yyscanner, jsgf); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule, yyscanner, jsgf); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, void* yyscanner, jsgf_t *jsgf) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, yyscanner, jsgf) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + void* yyscanner; + jsgf_t *jsgf; +#endif +{ + YYUSE (yyvaluep); + YYUSE (yyscanner); + YYUSE (jsgf); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void* yyscanner, jsgf_t *jsgf); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void* yyscanner, jsgf_t *jsgf) +#else +int +yyparse (yyscanner, jsgf) + void* yyscanner; + jsgf_t *jsgf; +#endif +#endif +{ +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 5: + +/* Line 1455 of yacc.c */ +#line 87 "jsgf_parser.y" + { jsgf->name = (yyvsp[(2) - (2)].name); } + break; + + case 7: + +/* Line 1455 of yacc.c */ +#line 91 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (3)].name); } + break; + + case 8: + +/* Line 1455 of yacc.c */ +#line 92 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (4)].name); jsgf->charset = (yyvsp[(3) - (4)].name); } + break; + + case 9: + +/* Line 1455 of yacc.c */ +#line 93 "jsgf_parser.y" + { jsgf->version = (yyvsp[(2) - (5)].name); jsgf->charset = (yyvsp[(3) - (5)].name); + jsgf->locale = (yyvsp[(4) - (5)].name); } + break; + + case 10: + +/* Line 1455 of yacc.c */ +#line 97 "jsgf_parser.y" + { (yyval.name) = (yyvsp[(2) - (3)].name); } + break; + + case 13: + +/* Line 1455 of yacc.c */ +#line 104 "jsgf_parser.y" + { jsgf_import_rule(jsgf, (yyvsp[(2) - (3)].name)); ckd_free((yyvsp[(2) - (3)].name)); } + break; + + case 16: + +/* Line 1455 of yacc.c */ +#line 111 "jsgf_parser.y" + { jsgf_define_rule(jsgf, (yyvsp[(1) - (4)].name), (yyvsp[(3) - (4)].rhs), 0); ckd_free((yyvsp[(1) - (4)].name)); } + break; + + case 17: + +/* Line 1455 of yacc.c */ +#line 112 "jsgf_parser.y" + { jsgf_define_rule(jsgf, (yyvsp[(2) - (5)].name), (yyvsp[(4) - (5)].rhs), 1); ckd_free((yyvsp[(2) - (5)].name)); } + break; + + case 18: + +/* Line 1455 of yacc.c */ +#line 115 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(1) - (1)].rhs); (yyval.rhs)->atoms = glist_reverse((yyval.rhs)->atoms); } + break; + + case 19: + +/* Line 1455 of yacc.c */ +#line 116 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(3) - (3)].rhs); + (yyval.rhs)->atoms = glist_reverse((yyval.rhs)->atoms); + (yyval.rhs)->alt = (yyvsp[(1) - (3)].rhs); } + break; + + case 20: + +/* Line 1455 of yacc.c */ +#line 121 "jsgf_parser.y" + { (yyval.rhs) = ckd_calloc(1, sizeof(*(yyval.rhs))); + (yyval.rhs)->atoms = glist_add_ptr((yyval.rhs)->atoms, (yyvsp[(1) - (1)].atom)); } + break; + + case 21: + +/* Line 1455 of yacc.c */ +#line 123 "jsgf_parser.y" + { (yyval.rhs) = (yyvsp[(1) - (2)].rhs); + (yyval.rhs)->atoms = glist_add_ptr((yyval.rhs)->atoms, (yyvsp[(2) - (2)].atom)); } + break; + + case 23: + +/* Line 1455 of yacc.c */ +#line 128 "jsgf_parser.y" + { (yyval.atom) = (yyvsp[(1) - (2)].atom); + (yyval.atom)->tags = glist_add_ptr((yyval.atom)->tags, (yyvsp[(2) - (2)].name)); } + break; + + case 25: + +/* Line 1455 of yacc.c */ +#line 133 "jsgf_parser.y" + { (yyval.atom) = (yyvsp[(2) - (2)].atom); (yyval.atom)->weight = (yyvsp[(1) - (2)].weight); } + break; + + case 26: + +/* Line 1455 of yacc.c */ +#line 136 "jsgf_parser.y" + { (yyval.rule) = jsgf_define_rule(jsgf, NULL, (yyvsp[(2) - (3)].rhs), 0); } + break; + + case 27: + +/* Line 1455 of yacc.c */ +#line 139 "jsgf_parser.y" + { (yyval.rule) = jsgf_optional_new(jsgf, (yyvsp[(2) - (3)].rhs)); } + break; + + case 28: + +/* Line 1455 of yacc.c */ +#line 142 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].name), 1.0); ckd_free((yyvsp[(1) - (1)].name)); } + break; + + case 29: + +/* Line 1455 of yacc.c */ +#line 143 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].name), 1.0); ckd_free((yyvsp[(1) - (1)].name)); } + break; + + case 30: + +/* Line 1455 of yacc.c */ +#line 144 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].rule)->name, 1.0); } + break; + + case 31: + +/* Line 1455 of yacc.c */ +#line 145 "jsgf_parser.y" + { (yyval.atom) = jsgf_atom_new((yyvsp[(1) - (1)].rule)->name, 1.0); } + break; + + case 32: + +/* Line 1455 of yacc.c */ +#line 146 "jsgf_parser.y" + { (yyval.atom) = jsgf_kleene_new(jsgf, (yyvsp[(1) - (2)].atom), 0); } + break; + + case 33: + +/* Line 1455 of yacc.c */ +#line 147 "jsgf_parser.y" + { (yyval.atom) = jsgf_kleene_new(jsgf, (yyvsp[(1) - (2)].atom), 1); } + break; + + + +/* Line 1455 of yacc.c */ +#line 1580 "jsgf_parser.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (yyscanner, jsgf, YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yyscanner, jsgf, yymsg); + } + else + { + yyerror (yyscanner, jsgf, YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, yyscanner, jsgf); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp, yyscanner, jsgf); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (yyscanner, jsgf, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, yyscanner, jsgf); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp, yyscanner, jsgf); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + +/* Line 1675 of yacc.c */ +#line 150 "jsgf_parser.y" + + +void +yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s) +{ + (void)jsgf; + E_ERROR("%s at line %d current token '%s'\n", s, yyget_lineno(lex), yyget_text(lex)); +} + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h new file mode 100644 index 0000000..95f68e3 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h @@ -0,0 +1,90 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + HEADER = 258, + GRAMMAR = 259, + IMPORT = 260, + PUBLIC = 261, + TOKEN = 262, + RULENAME = 263, + TAG = 264, + WEIGHT = 265 + }; +#endif +/* Tokens. */ +#define HEADER 258 +#define GRAMMAR 259 +#define IMPORT 260 +#define PUBLIC 261 +#define TOKEN 262 +#define RULENAME 263 +#define TAG 264 +#define WEIGHT 265 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 1676 of yacc.c */ +#line 65 "jsgf_parser.y" + + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; + + + +/* Line 1676 of yacc.c */ +#line 82 "jsgf_parser.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y new file mode 100644 index 0000000..eedaa76 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y @@ -0,0 +1,156 @@ +/* -*- c-basic-offset:4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +%{ +#define YYERROR_VERBOSE + +#include +#include + +#include +#include +#include + +#include "jsgf_internal.h" +#include "jsgf_parser.h" +#include "jsgf_scanner.h" + +/* Suppress warnings from generated code */ +#if defined _MSC_VER +#pragma warning(disable: 4273) +#endif + +void yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s); + +%} + +%pure-parser +%lex-param { void* yyscanner } +%parse-param { void* yyscanner } +%parse-param { jsgf_t *jsgf } + +%union { + char *name; + float weight; + jsgf_rule_t *rule; + jsgf_rhs_t *rhs; + jsgf_atom_t *atom; +} + +%token HEADER GRAMMAR IMPORT PUBLIC +%token TOKEN RULENAME TAG +%token WEIGHT +%type rule_atom rule_item tagged_rule_item +%type rule_expansion alternate_list +%type grammar_header +%type rule_group rule_optional +%% + +grammar: header + | header rule_list + | header import_header rule_list + ; + +header: jsgf_header grammar_header { jsgf->name = $2; } + ; + +jsgf_header: HEADER ';' + | HEADER TOKEN ';' { jsgf->version = $2; } + | HEADER TOKEN TOKEN ';' { jsgf->version = $2; jsgf->charset = $3; } + | HEADER TOKEN TOKEN TOKEN ';' { jsgf->version = $2; jsgf->charset = $3; + jsgf->locale = $4; } + ; + +grammar_header: GRAMMAR TOKEN ';' { $$ = $2; } + ; + +import_header: import_statement + | import_header import_statement + ; + +import_statement: IMPORT RULENAME ';' { jsgf_import_rule(jsgf, $2); ckd_free($2); } + ; + +rule_list: rule + | rule_list rule + ; + +rule: RULENAME '=' alternate_list ';' { jsgf_define_rule(jsgf, $1, $3, 0); ckd_free($1); } +| PUBLIC RULENAME '=' alternate_list ';' { jsgf_define_rule(jsgf, $2, $4, 1); ckd_free($2); } + ; + +alternate_list: rule_expansion { $$ = $1; $$->atoms = glist_reverse($$->atoms); } + | alternate_list '|' rule_expansion { $$ = $3; + $$->atoms = glist_reverse($$->atoms); + $$->alt = $1; } + ; + +rule_expansion: tagged_rule_item { $$ = ckd_calloc(1, sizeof(*$$)); + $$->atoms = glist_add_ptr($$->atoms, $1); } + | rule_expansion tagged_rule_item { $$ = $1; + $$->atoms = glist_add_ptr($$->atoms, $2); } + ; + +tagged_rule_item: rule_item + | tagged_rule_item TAG { $$ = $1; + $$->tags = glist_add_ptr($$->tags, $2); } + ; + +rule_item: rule_atom + | WEIGHT rule_atom { $$ = $2; $$->weight = $1; } + ; + +rule_group: '(' alternate_list ')' { $$ = jsgf_define_rule(jsgf, NULL, $2, 0); } + ; + +rule_optional: '[' alternate_list ']' { $$ = jsgf_optional_new(jsgf, $2); } + ; + +rule_atom: TOKEN { $$ = jsgf_atom_new($1, 1.0); ckd_free($1); } + | RULENAME { $$ = jsgf_atom_new($1, 1.0); ckd_free($1); } + | rule_group { $$ = jsgf_atom_new($1->name, 1.0); } + | rule_optional { $$ = jsgf_atom_new($1->name, 1.0); } + | rule_atom '*' { $$ = jsgf_kleene_new(jsgf, $1, 0); } + | rule_atom '+' { $$ = jsgf_kleene_new(jsgf, $1, 1); } + ; + +%% + +void +yyerror(yyscan_t lex, jsgf_t *jsgf, const char *s) +{ + E_ERROR("%s at line %d current token '%s'\n", s, yyget_lineno(lex), yyget_text(lex)); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c new file mode 100644 index 0000000..5123fa8 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c @@ -0,0 +1,2221 @@ +#line 2 "jsgf_scanner.c" + +#line 4 "jsgf_scanner.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 1 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yyg->yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ,yyscanner ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl )\ + if ( yytext[yyl] == '\n' )\ + --yylineno;\ + }while(0) + #define YY_LINENO_REWIND_TO(dst) \ + do {\ + const char *p;\ + for ( p = yy_cp-1; p >= (dst); --p)\ + if ( *p == '\n' )\ + --yylineno;\ + }while(0) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ + ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void yypop_buffer_state (yyscan_t yyscanner ); + +static void yyensure_buffer_stack (yyscan_t yyscanner ); +static void yy_load_buffer_state (yyscan_t yyscanner ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void yyfree (void * ,yyscan_t yyscanner ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define yywrap(yyscanner) (/*CONSTCOND*/1) +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +typedef int yy_state_type; + +#define yytext_ptr yytext_r + +static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); +static int yy_get_next_buffer (yyscan_t yyscanner ); +static void yynoreturn yy_fatal_error (yyconst char* msg ,yyscan_t yyscanner ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yyg->yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yyg->yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 22 +#define YY_END_OF_BUFFER 23 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[98] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 23, 22, + 1, 22, 22, 22, 22, 22, 22, 22, 5, 1, + 5, 17, 1, 17, 21, 21, 18, 21, 21, 9, + 1, 9, 0, 3, 0, 0, 0, 0, 0, 0, + 4, 17, 17, 0, 17, 17, 7, 0, 20, 0, + 0, 0, 0, 0, 16, 8, 0, 0, 2, 14, + 0, 0, 0, 0, 19, 0, 17, 0, 17, 17, + 0, 0, 6, 20, 0, 15, 0, 0, 16, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 10, 0, + 0, 0, 0, 12, 13, 11, 0 + + } ; + +static yyconst YY_CHAR yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 5, 1, 1, 1, 1, 6, + 6, 7, 6, 1, 8, 9, 10, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 1, 12, 13, + 6, 14, 1, 1, 1, 1, 1, 1, 1, 15, + 16, 1, 1, 17, 1, 1, 1, 1, 1, 1, + 1, 1, 18, 1, 1, 1, 1, 1, 1, 1, + 6, 19, 6, 1, 1, 1, 20, 21, 22, 1, + + 23, 1, 24, 1, 25, 1, 1, 26, 27, 1, + 28, 29, 1, 30, 1, 31, 32, 1, 1, 1, + 1, 1, 33, 6, 34, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 35, 1, 1, 1, + 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst YY_CHAR yy_meta[38] = + { 0, + 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, + 1, 2, 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 1, 1, 1 + } ; + +static yyconst flex_uint16_t yy_base[113] = + { 0, + 0, 36, 4, 12, 72, 105, 14, 20, 135, 312, + 312, 117, 2, 0, 103, 105, 99, 95, 312, 312, + 119, 0, 312, 138, 312, 21, 312, 0, 1, 312, + 312, 118, 109, 312, 123, 111, 104, 94, 101, 85, + 312, 0, 171, 14, 0, 204, 312, 109, 113, 41, + 106, 96, 21, 23, 312, 312, 88, 98, 312, 312, + 73, 71, 70, 89, 312, 44, 0, 39, 0, 237, + 43, 90, 312, 312, 57, 312, 37, 69, 43, 77, + 64, 57, 58, 64, 76, 94, 79, 59, 312, 39, + 14, 14, 4, 312, 312, 312, 312, 271, 274, 277, + + 280, 283, 0, 285, 288, 290, 293, 296, 299, 302, + 305, 308 + } ; + +static yyconst flex_int16_t yy_def[113] = + { 0, + 98, 98, 99, 99, 100, 100, 101, 101, 97, 97, + 97, 97, 97, 102, 97, 97, 97, 97, 97, 97, + 97, 103, 97, 104, 97, 97, 97, 105, 106, 97, + 97, 97, 97, 97, 107, 102, 97, 97, 97, 97, + 97, 103, 104, 108, 103, 109, 97, 97, 110, 97, + 97, 105, 106, 111, 97, 97, 97, 107, 97, 97, + 97, 97, 97, 97, 97, 112, 43, 108, 43, 109, + 97, 110, 97, 97, 97, 97, 106, 111, 106, 97, + 97, 97, 97, 97, 108, 112, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, + + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97 + } ; + +static yyconst flex_uint16_t yy_nxt[350] = + { 0, + 42, 11, 11, 97, 12, 20, 11, 97, 34, 13, + 21, 35, 14, 20, 11, 31, 11, 65, 21, 54, + 32, 31, 11, 15, 16, 53, 32, 47, 17, 48, + 49, 50, 66, 96, 55, 95, 18, 11, 11, 54, + 12, 78, 65, 51, 94, 13, 44, 85, 14, 48, + 74, 50, 74, 87, 55, 54, 79, 66, 93, 15, + 16, 54, 86, 51, 17, 51, 74, 88, 74, 88, + 55, 53, 18, 23, 11, 24, 55, 25, 25, 65, + 33, 26, 92, 27, 28, 25, 91, 78, 74, 87, + 90, 89, 73, 84, 66, 83, 44, 85, 82, 81, + + 59, 51, 79, 80, 29, 25, 23, 11, 24, 76, + 25, 25, 86, 75, 26, 73, 27, 28, 25, 71, + 64, 63, 62, 61, 60, 59, 57, 56, 41, 40, + 39, 38, 37, 33, 97, 97, 97, 29, 25, 44, + 44, 45, 97, 44, 44, 97, 97, 44, 97, 44, + 44, 44, 97, 97, 97, 97, 46, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 44, 44, 44, 44, 45, 97, 44, 44, 97, 97, + 44, 97, 44, 44, 44, 97, 97, 97, 97, 46, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + + 97, 97, 97, 44, 44, 68, 44, 69, 97, 68, + 68, 97, 97, 68, 97, 68, 68, 68, 97, 97, + 97, 97, 70, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 68, 68, 68, 44, + 69, 97, 68, 68, 97, 97, 68, 97, 68, 68, + 68, 97, 97, 97, 97, 70, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 68, + 68, 10, 10, 10, 19, 19, 19, 22, 22, 22, + 30, 30, 30, 36, 36, 43, 43, 43, 52, 52, + 53, 53, 53, 58, 58, 58, 44, 44, 44, 67, + + 67, 67, 72, 72, 72, 77, 77, 77, 68, 68, + 68, 9, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97 + } ; + +static yyconst flex_int16_t yy_chk[350] = + { 0, + 103, 1, 1, 0, 1, 3, 3, 0, 13, 1, + 3, 13, 1, 4, 4, 7, 7, 44, 4, 29, + 7, 8, 8, 1, 1, 54, 8, 26, 1, 26, + 26, 26, 44, 93, 29, 92, 1, 2, 2, 53, + 2, 54, 68, 26, 91, 2, 66, 66, 2, 50, + 50, 50, 71, 71, 53, 77, 54, 68, 90, 2, + 2, 79, 66, 50, 2, 71, 75, 75, 88, 88, + 77, 78, 2, 5, 5, 5, 79, 5, 5, 85, + 84, 5, 83, 5, 5, 5, 82, 78, 87, 87, + 81, 80, 72, 64, 85, 63, 86, 86, 62, 61, + + 58, 87, 78, 57, 5, 5, 6, 6, 6, 52, + 6, 6, 86, 51, 6, 49, 6, 6, 6, 48, + 40, 39, 38, 37, 36, 35, 33, 32, 21, 18, + 17, 16, 15, 12, 9, 0, 0, 6, 6, 24, + 24, 24, 0, 24, 24, 0, 0, 24, 0, 24, + 24, 24, 0, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 24, 43, 43, 43, 0, 43, 43, 0, 0, + 43, 0, 43, 43, 43, 0, 0, 0, 0, 43, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 43, 43, 46, 46, 46, 0, 46, + 46, 0, 0, 46, 0, 46, 46, 46, 0, 0, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 46, 70, 70, + 70, 0, 70, 70, 0, 0, 70, 0, 70, 70, + 70, 0, 0, 0, 0, 70, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, + 70, 98, 98, 98, 99, 99, 99, 100, 100, 100, + 101, 101, 101, 102, 102, 104, 104, 104, 105, 105, + 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, + + 109, 109, 110, 110, 110, 111, 111, 111, 112, 112, + 112, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97 + } ; + +/* Table of booleans, true if rule could match eol. */ +static yyconst flex_int32_t yy_rule_can_match_eol[23] = + { 0, +1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, + 0, 0, 0, }; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +#line 1 "_jsgf_scanner.l" +/* -*- mode: text -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* YOU MUST USE FLEX 2.6.1 OR NEWER TO PROCESS THIS FILE!!! */ +#line 39 "_jsgf_scanner.l" + +#include "jsgf_internal.h" +#include "jsgf_parser.h" + +#define YY_NO_UNISTD_H 1 + + + +#line 612 "jsgf_scanner.c" + +#define INITIAL 0 +#define COMMENT 1 +#define DECL 2 +#define DECLCOMMENT 3 + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t + { + + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yy_flex_debug_r; + + char *yytext_r; + int yy_more_flag; + int yy_more_len; + + YYSTYPE * yylval_r; + + }; /* end struct yyguts_t */ + +static int yy_init_globals (yyscan_t yyscanner ); + + /* This must go here because YYSTYPE and YYLTYPE are included + * from bison output in section 1.*/ + # define yylval yyg->yylval_r + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (yyscan_t yyscanner ); + +int yyget_debug (yyscan_t yyscanner ); + +void yyset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *yyget_in (yyscan_t yyscanner ); + +void yyset_in (FILE * _in_str ,yyscan_t yyscanner ); + +FILE *yyget_out (yyscan_t yyscanner ); + +void yyset_out (FILE * _out_str ,yyscan_t yyscanner ); + + int yyget_leng (yyscan_t yyscanner ); + +char *yyget_text (yyscan_t yyscanner ); + +int yyget_lineno (yyscan_t yyscanner ); + +void yyset_lineno (int _line_number ,yyscan_t yyscanner ); + +int yyget_column (yyscan_t yyscanner ); + +void yyset_column (int _column_no ,yyscan_t yyscanner ); + +YYSTYPE * yyget_lval (yyscan_t yyscanner ); + +void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (yyscan_t yyscanner ); +#else +extern int yywrap (yyscan_t yyscanner ); +#endif +#endif + +#ifndef YY_NO_UNPUT + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (yyscan_t yyscanner ); +#else +static int input (yyscan_t yyscanner ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < (size_t)max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ + (YYSTYPE * yylval_param ,yyscan_t yyscanner); + +#define YY_DECL int yylex \ + (YYSTYPE * yylval_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK /*LINTED*/break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yylval = yylval_param; + + if ( !yyg->yy_init ) + { + yyg->yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yyg->yy_start ) + yyg->yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + yy_load_buffer_state(yyscanner ); + } + + { +#line 59 "_jsgf_scanner.l" + + +#line 883 "jsgf_scanner.c" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + { + yy_cp = yyg->yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yyg->yy_start; +yy_match: + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + ++yy_cp; + } + while ( yy_current_state != 97 ); + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + yy_size_t yyl; + for ( yyl = 0; yyl < (yy_size_t)yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + + do{ yylineno++; + yycolumn=0; + }while(0) +; + } + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yyg->yy_hold_char; + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +#line 61 "_jsgf_scanner.l" +; /* ignore whitespace */ + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 62 "_jsgf_scanner.l" +; /* single-line comments */ + YY_BREAK +case 3: +YY_RULE_SETUP +#line 63 "_jsgf_scanner.l" +{ BEGIN(COMMENT); } /* C-style comments */ + YY_BREAK +case 4: +YY_RULE_SETUP +#line 64 "_jsgf_scanner.l" +{ BEGIN(INITIAL); } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 65 "_jsgf_scanner.l" +; /* Ignore stuff in comment mode */ + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 67 "_jsgf_scanner.l" +; /* single-line comments inside decl */ + YY_BREAK +case 7: +YY_RULE_SETUP +#line 68 "_jsgf_scanner.l" +{ BEGIN(DECLCOMMENT); } /* C-style comments inside decl */ + YY_BREAK +case 8: +YY_RULE_SETUP +#line 69 "_jsgf_scanner.l" +{ BEGIN(DECL); } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 70 "_jsgf_scanner.l" +; /* Ignore stuff in comment mode */ + YY_BREAK +case 10: +YY_RULE_SETUP +#line 72 "_jsgf_scanner.l" +{BEGIN(DECL); return HEADER;} + YY_BREAK +case 11: +YY_RULE_SETUP +#line 73 "_jsgf_scanner.l" +{BEGIN(DECL); return GRAMMAR;} + YY_BREAK +case 12: +YY_RULE_SETUP +#line 74 "_jsgf_scanner.l" +{BEGIN(DECL); return IMPORT;} + YY_BREAK +case 13: +YY_RULE_SETUP +#line 75 "_jsgf_scanner.l" +{BEGIN(DECL); return PUBLIC;} + YY_BREAK +case 14: +/* rule 14 can match eol */ +YY_RULE_SETUP +#line 77 "_jsgf_scanner.l" +{ BEGIN(DECL); yylval->name = strdup(yytext); return RULENAME; } + YY_BREAK +case 15: +/* rule 15 can match eol */ +YY_RULE_SETUP +#line 78 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return RULENAME; } + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 80 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TAG; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 81 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TOKEN; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 82 "_jsgf_scanner.l" +{ BEGIN(INITIAL); return yytext[0]; } + YY_BREAK +case 19: +/* rule 19 can match eol */ +YY_RULE_SETUP +#line 83 "_jsgf_scanner.l" +{ yylval->name = strdup(yytext); return TOKEN; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 84 "_jsgf_scanner.l" +{ yylval->weight = atof_c(yytext+1); return WEIGHT; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 85 "_jsgf_scanner.l" +return yytext[0]; /* Single-character tokens */ + YY_BREAK +case 22: +YY_RULE_SETUP +#line 87 "_jsgf_scanner.l" +ECHO; + YY_BREAK +#line 1065 "jsgf_scanner.c" +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMENT): +case YY_STATE_EOF(DECL): +case YY_STATE_EOF(DECLCOMMENT): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); + + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_END_OF_FILE: + { + yyg->yy_did_buffer_switch_on_eof = 0; + + if ( yywrap(yyscanner ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = + yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = yyg->yytext_ptr; + yy_size_t number_to_move, i; + int ret_val; + + if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (yy_size_t) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) (yyg->yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + yyg->yy_n_chars, num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if ( yyg->yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ,yyscanner); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((int) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (yyscan_t yyscanner) +{ + yy_state_type yy_current_state; + char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_current_state = yyg->yy_start; + + for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) +{ + int yy_is_jam; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + char *yy_cp = yyg->yy_c_buf_p; + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 98 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + yy_is_jam = (yy_current_state == 97); + + (void)yyg; + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_UNPUT + +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (yyscan_t yyscanner) +#else + static int input (yyscan_t yyscanner) +#endif + +{ + int c; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + *yyg->yy_c_buf_p = yyg->yy_hold_char; + + if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yyg->yy_c_buf_p - yyg->yytext_ptr; + ++yyg->yy_c_buf_p; + + switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ,yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap(yyscanner ) ) + return 0; + + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(yyscanner); +#else + return input(yyscanner); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; + + if ( c == '\n' ) + + do{ yylineno++; + yycolumn=0; + }while(0) +; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * @param yyscanner The scanner object. + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); + yy_load_buffer_state(yyscanner ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (yyscanner); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state(yyscanner ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void yy_load_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + yyg->yy_hold_char = *yyg->yy_c_buf_p; +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * @param yyscanner The scanner object. + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = (yy_size_t)size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ,yyscanner ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ,yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * @param yyscanner The scanner object. + */ + void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ,yyscanner ); + + yyfree((void *) b ,yyscanner ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) + +{ + int oerrno = errno; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_flush_buffer(b ,yyscanner); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * @param yyscanner The scanner object. + */ + void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state(yyscanner ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * @param yyscanner The scanner object. + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(yyscanner); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + yyg->yy_buffer_stack_top++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * @param yyscanner The scanner object. + */ +void yypop_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) + --yyg->yy_buffer_stack_top; + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (yyscan_t yyscanner) +{ + int num_to_alloc; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (!yyg->yy_buffer_stack) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc + (yyg->yy_buffer_stack, + num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->yy_buffer_stack_max = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return NULL; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ,yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr , yyscan_t yyscanner) +{ + + return yy_scan_bytes(yystr,(int) strlen(yystr) ,yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + yy_size_t i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) _yybytes_len + 2; + buf = (char *) yyalloc(n ,yyscanner ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < (yy_size_t)_yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ,yyscanner); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int yyget_lineno (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int yyget_column (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_in (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_out (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +int yyget_leng (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *yyget_text (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yytext; +} + +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * @param yyscanner The scanner object. + */ +void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined ; +} + +/** Set the current line number. + * @param _line_number line number + * @param yyscanner The scanner object. + */ +void yyset_lineno (int _line_number , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); + + yylineno = _line_number; +} + +/** Set the current column. + * @param _column_no column number + * @param yyscanner The scanner object. + */ +void yyset_column (int _column_no , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + YY_FATAL_ERROR( "yyset_column called with no buffer" ); + + yycolumn = _column_no; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param _in_str A readable stream. + * @param yyscanner The scanner object. + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyout = _out_str ; +} + +int yyget_debug (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yy_flex_debug; +} + +void yyset_debug (int _bdebug , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yy_flex_debug = _bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +YYSTYPE * yyget_lval (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yylval; +} + +void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yylval = yylval_param; +} + +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ + +int yylex_init(yyscan_t* ptr_yy_globals) + +{ + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ + +int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) + +{ + struct yyguts_t dummy_yyguts; + + yyset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + yyset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = NULL; + yyg->yy_init = 0; + yyg->yy_start = 0; + + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(yyscanner); + } + + /* Destroy the stack itself. */ + yyfree(yyg->yy_buffer_stack ,yyscanner); + yyg->yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + yyfree(yyg->yy_start_stack ,yyscanner ); + yyg->yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( yyscanner); + + /* Destroy the main struct (reentrant only). */ + yyfree ( yyscanner , yyscanner ); + yyscanner = NULL; + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + return malloc(size); +} + +void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 87 "_jsgf_scanner.l" + + + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h new file mode 100644 index 0000000..8ccc56e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h @@ -0,0 +1,342 @@ +#ifndef yyHEADER_H +#define yyHEADER_H 1 +#define yyIN_HEADER 1 + +#line 6 "jsgf_scanner.h" + +#line 8 "jsgf_scanner.h" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 1 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +void yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void yypop_buffer_state (yyscan_t yyscanner ); + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void yyfree (void * ,yyscan_t yyscanner ); + +/* Begin user sect3 */ + +#define yywrap(yyscanner) (/*CONSTCOND*/1) +#define YY_SKIP_YYWRAP + +#define yytext_ptr yytext_r + +#ifdef YY_HEADER_EXPORT_START_CONDITIONS +#define INITIAL 0 +#define COMMENT 1 +#define DECL 2 +#define DECLCOMMENT 3 + +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (yyscan_t yyscanner ); + +int yyget_debug (yyscan_t yyscanner ); + +void yyset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *yyget_in (yyscan_t yyscanner ); + +void yyset_in (FILE * _in_str ,yyscan_t yyscanner ); + +FILE *yyget_out (yyscan_t yyscanner ); + +void yyset_out (FILE * _out_str ,yyscan_t yyscanner ); + + int yyget_leng (yyscan_t yyscanner ); + +char *yyget_text (yyscan_t yyscanner ); + +int yyget_lineno (yyscan_t yyscanner ); + +void yyset_lineno (int _line_number ,yyscan_t yyscanner ); + +int yyget_column (yyscan_t yyscanner ); + +void yyset_column (int _column_no ,yyscan_t yyscanner ); + +YYSTYPE * yyget_lval (yyscan_t yyscanner ); + +void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (yyscan_t yyscanner ); +#else +extern int yywrap (yyscan_t yyscanner ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ + (YYSTYPE * yylval_param ,yyscan_t yyscanner); + +#define YY_DECL int yylex \ + (YYSTYPE * yylval_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif + +#line 87 "_jsgf_scanner.l" + + +#line 341 "jsgf_scanner.h" +#undef yyIN_HEADER +#endif /* yyHEADER_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c new file mode 100644 index 0000000..f91dc89 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c @@ -0,0 +1,914 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "lm_trie.h" +#include "lm_trie_quant.h" + +static void lm_trie_alloc_ngram(lm_trie_t * trie, uint32 * counts, int order); + +static uint32 +base_size(uint32 entries, uint32 max_vocab, uint8 remaining_bits) +{ + uint8 total_bits = bitarr_required_bits(max_vocab) + remaining_bits; + /* Extra entry for next pointer at the end. + * +7 then / 8 to round up bits and convert to bytes + * +sizeof(uint64) so that ReadInt57 etc don't go segfault. + * Note that this waste is O(order), not O(number of ngrams).*/ + return ((1 + entries) * total_bits + 7) / 8 + sizeof(uint64); +} + +uint32 +middle_size(uint8 quant_bits, uint32 entries, uint32 max_vocab, + uint32 max_ptr) +{ + return base_size(entries, max_vocab, + quant_bits + bitarr_required_bits(max_ptr)); +} + +uint32 +longest_size(uint8 quant_bits, uint32 entries, uint32 max_vocab) +{ + return base_size(entries, max_vocab, quant_bits); +} + +static void +base_init(base_t * base, void *base_mem, uint32 max_vocab, + uint8 remaining_bits) +{ + base->word_bits = bitarr_required_bits(max_vocab); + base->word_mask = (1U << base->word_bits) - 1U; + if (base->word_bits > 25) + E_ERROR + ("Sorry, word indices more than %d are not implemented. Edit util/bit_packing.hh and fix the bit packing functions\n", + (1U << 25)); + base->total_bits = base->word_bits + remaining_bits; + + base->base = (uint8 *) base_mem; + base->insert_index = 0; + base->max_vocab = max_vocab; +} + +void +middle_init(middle_t * middle, void *base_mem, uint8 quant_bits, + uint32 entries, uint32 max_vocab, uint32 max_next, + void *next_source) +{ + middle->quant_bits = quant_bits; + bitarr_mask_from_max(&middle->next_mask, max_next); + middle->next_source = next_source; + if (entries + 1 >= (1U << 25) || (max_next >= (1U << 25))) + E_ERROR + ("Sorry, this does not support more than %d n-grams of a particular order. Edit util/bit_packing.hh and fix the bit packing functions\n", + (1U << 25)); + base_init(&middle->base, base_mem, max_vocab, + quant_bits + middle->next_mask.bits); +} + +void +longest_init(longest_t * longest, void *base_mem, uint8 quant_bits, + uint32 max_vocab) +{ + base_init(&longest->base, base_mem, max_vocab, quant_bits); +} + +static bitarr_address_t +middle_insert(middle_t * middle, uint32 word, int order, int max_order) +{ + uint32 at_pointer; + uint32 next; + bitarr_address_t address; + assert(word <= middle->base.word_mask); + address.base = middle->base.base; + address.offset = middle->base.insert_index * middle->base.total_bits; + bitarr_write_int25(address, middle->base.word_bits, word); + address.offset += middle->base.word_bits; + at_pointer = address.offset; + address.offset += middle->quant_bits; + if (order == max_order - 1) { + next = ((longest_t *) middle->next_source)->base.insert_index; + } + else { + next = ((middle_t *) middle->next_source)->base.insert_index; + } + + bitarr_write_int25(address, middle->next_mask.bits, next); + middle->base.insert_index++; + address.offset = at_pointer; + return address; +} + +static bitarr_address_t +longest_insert(longest_t * longest, uint32 index) +{ + bitarr_address_t address; + assert(index <= longest->base.word_mask); + address.base = longest->base.base; + address.offset = longest->base.insert_index * longest->base.total_bits; + bitarr_write_int25(address, longest->base.word_bits, index); + address.offset += longest->base.word_bits; + longest->base.insert_index++; + return address; +} + +static void +middle_finish_loading(middle_t * middle, uint32 next_end) +{ + bitarr_address_t address; + address.base = middle->base.base; + address.offset = + (middle->base.insert_index + 1) * middle->base.total_bits - + middle->next_mask.bits; + bitarr_write_int25(address, middle->next_mask.bits, next_end); +} + +static uint32 +unigram_next(lm_trie_t * trie, int order) +{ + return order == + 2 ? trie->longest->base.insert_index : trie->middle_begin->base. + insert_index; +} + +void +lm_trie_fix_counts(ngram_raw_t ** raw_ngrams, uint32 * counts, + uint32 * fixed_counts, int order) +{ + priority_queue_t *ngrams = + priority_queue_create(order - 1, &ngram_ord_comparator); + uint32 raw_ngram_ptrs[NGRAM_MAX_ORDER - 1]; + uint32 words[NGRAM_MAX_ORDER]; + int i; + + memset(words, -1, sizeof(words)); + memcpy(fixed_counts, counts, order * sizeof(*fixed_counts)); + for (i = 2; i <= order; i++) { + ngram_raw_t *tmp_ngram; + + if (counts[i - 1] <= 0) + continue; + + raw_ngram_ptrs[i - 2] = 0; + + tmp_ngram = + (ngram_raw_t *) ckd_calloc(1, sizeof(*tmp_ngram)); + *tmp_ngram = raw_ngrams[i - 2][0]; + tmp_ngram->order = i; + priority_queue_add(ngrams, tmp_ngram); + } + + for (;;) { + int32 to_increment = TRUE; + ngram_raw_t *top; + if (priority_queue_size(ngrams) == 0) { + break; + } + top = (ngram_raw_t *) priority_queue_poll(ngrams); + if (top->order == 2) { + memcpy(words, top->words, 2 * sizeof(*words)); + } + else { + for (i = 0; (uint32)i < top->order - 1; i++) { + if (words[i] != top->words[i]) { + int num; + num = (i == 0) ? 1 : i; + memcpy(words, top->words, + (num + 1) * sizeof(*words)); + fixed_counts[num]++; + to_increment = FALSE; + break; + } + } + words[top->order - 1] = top->words[top->order - 1]; + } + if (to_increment) { + raw_ngram_ptrs[top->order - 2]++; + } + if (raw_ngram_ptrs[top->order - 2] < counts[top->order - 1]) { + *top = raw_ngrams[top->order - 2][raw_ngram_ptrs[top->order - 2]]; + priority_queue_add(ngrams, top); + } + else { + ckd_free(top); + } + } + + assert(priority_queue_size(ngrams) == 0); + priority_queue_free(ngrams, NULL); +} + + +static void +recursive_insert(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, + uint32 * counts, int order) +{ + uint32 unigram_idx = 0; + uint32 *words; + float *probs; + const uint32 unigram_count = (uint32) counts[0]; + priority_queue_t *ngrams = + priority_queue_create(order, &ngram_ord_comparator); + ngram_raw_t *ngram; + uint32 *raw_ngrams_ptr; + int i; + + words = (uint32 *) ckd_calloc(order, sizeof(*words)); + probs = (float *) ckd_calloc(order - 1, sizeof(*probs)); + ngram = (ngram_raw_t *) ckd_calloc(1, sizeof(*ngram)); + ngram->order = 1; + ngram->words = &unigram_idx; + priority_queue_add(ngrams, ngram); + raw_ngrams_ptr = + (uint32 *) ckd_calloc(order - 1, sizeof(*raw_ngrams_ptr)); + for (i = 2; i <= order; ++i) { + ngram_raw_t *tmp_ngram; + + if (counts[i - 1] <= 0) + continue; + + raw_ngrams_ptr[i - 2] = 0; + tmp_ngram = + (ngram_raw_t *) ckd_calloc(1, sizeof(*tmp_ngram)); + *tmp_ngram = raw_ngrams[i - 2][0]; + tmp_ngram->order = i; + + priority_queue_add(ngrams, tmp_ngram); + } + + for (;;) { + ngram_raw_t *top = + (ngram_raw_t *) priority_queue_poll(ngrams); + + if (top->order == 1) { + trie->unigrams[unigram_idx].next = unigram_next(trie, order); + words[0] = unigram_idx; + probs[0] = trie->unigrams[unigram_idx].prob; + if (++unigram_idx == unigram_count + 1) { + ckd_free(top); + break; + } + priority_queue_add(ngrams, top); + } + else { + for (i = 0; (uint32)i < top->order - 1; i++) { + if (words[i] != top->words[i]) { + /* need to insert dummy suffixes to make ngram of higher order reachable */ + int j; + assert(i > 0); /* unigrams are not pruned without removing ngrams that contains them */ + for (j = i; (uint32)j < top->order - 1; j++) { + middle_t *middle = &trie->middle_begin[j - 1]; + bitarr_address_t address = + middle_insert(middle, top->words[j], + j + 1, order); + /* calculate prob for blank */ + float calc_prob = + probs[j - 1] + + trie->unigrams[top->words[j]].bo; + probs[j] = calc_prob; + lm_trie_quant_mwrite(trie->quant, address, j - 1, + calc_prob, 0.0f); + } + } + } + memcpy(words, top->words, + top->order * sizeof(*words)); + if (top->order == (uint32)order) { + bitarr_address_t address = + longest_insert(trie->longest, + top->words[top->order - 1]); + lm_trie_quant_lwrite(trie->quant, address, top->prob); + } + else { + middle_t *middle = &trie->middle_begin[top->order - 2]; + bitarr_address_t address = + middle_insert(middle, + top->words[top->order - 1], + top->order, order); + /* write prob and backoff */ + probs[top->order - 1] = top->prob; + lm_trie_quant_mwrite(trie->quant, address, top->order - 2, + top->prob, top->backoff); + } + raw_ngrams_ptr[top->order - 2]++; + if (raw_ngrams_ptr[top->order - 2] < counts[top->order - 1]) { + *top = raw_ngrams[top->order - + 2][raw_ngrams_ptr[top->order - 2]]; + + priority_queue_add(ngrams, top); + } + else { + ckd_free(top); + } + } + } + assert(priority_queue_size(ngrams) == 0); + priority_queue_free(ngrams, NULL); + ckd_free(raw_ngrams_ptr); + ckd_free(words); + ckd_free(probs); +} + +static lm_trie_t * +lm_trie_init(uint32 unigram_count) +{ + lm_trie_t *trie; + + trie = (lm_trie_t *) ckd_calloc(1, sizeof(*trie)); + memset(trie->hist_cache, -1, sizeof(trie->hist_cache)); /* prepare request history */ + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + trie->unigrams = + (unigram_t *) ckd_calloc((unigram_count + 1), + sizeof(*trie->unigrams)); + trie->ngram_mem = NULL; + return trie; +} + +lm_trie_t * +lm_trie_create(uint32 unigram_count, int order) +{ + lm_trie_t *trie = lm_trie_init(unigram_count); + trie->quant = + (order > 1) ? lm_trie_quant_create(order) : 0; + return trie; +} + +static size_t +lm_trie_read_ug(lm_trie_t * trie, uint32 * counts, FILE * fp) +{ + size_t rv = fread(trie->unigrams, sizeof(*trie->unigrams), + (counts[0] + 1), fp); + if (SWAP_LM_TRIE) { + int i; + for (i = 0; (uint32)i < counts[0] + 1; ++i) { + SWAP_FLOAT32(&trie->unigrams[i].prob); + SWAP_FLOAT32(&trie->unigrams[i].bo); + SWAP_INT32(&trie->unigrams[i].next); + } + } + return rv; +} + +lm_trie_t * +lm_trie_read_bin(uint32 * counts, int order, FILE * fp) +{ + lm_trie_t *trie = lm_trie_init(counts[0]); + trie->quant = (order > 1) ? lm_trie_quant_read_bin(fp, order) : NULL; + E_INFO("pos after quant: %ld\n", ftell(fp)); + lm_trie_read_ug(trie, counts, fp); + E_INFO("pos after ug: %ld\n", ftell(fp)); + if (order > 1) { + lm_trie_alloc_ngram(trie, counts, order); + fread(trie->ngram_mem, 1, trie->ngram_mem_size, fp); + E_INFO("#ngram_mem: %ld\n", trie->ngram_mem_size); + } + return trie; +} + +static size_t +lm_trie_write_ug(lm_trie_t * trie, uint32 unigram_count, FILE * fp) +{ + if (SWAP_LM_TRIE) { + int i; + for (i = 0; (uint32)i < unigram_count + 1; ++i) { + unigram_t ug = trie->unigrams[i]; + SWAP_FLOAT32(&ug.prob); + SWAP_FLOAT32(&ug.bo); + SWAP_INT32(&ug.next); + if (fwrite(&ug, sizeof(ug), 1, fp) != 1) + return -1; + } + return (size_t)i; + } + else + return fwrite(trie->unigrams, sizeof(*trie->unigrams), + (unigram_count + 1), fp); +} + +void +lm_trie_write_bin(lm_trie_t * trie, uint32 unigram_count, FILE * fp) +{ + + if (trie->quant) + lm_trie_quant_write_bin(trie->quant, fp); + E_INFO("pos after quant: %ld\n", ftell(fp)); + lm_trie_write_ug(trie, unigram_count, fp); + E_INFO("pos after ug: %ld\n", ftell(fp)); + if (trie->ngram_mem) { + fwrite(trie->ngram_mem, 1, trie->ngram_mem_size, fp); + E_INFO("#ngram_mem: %ld\n", trie->ngram_mem_size); + } +} + +void +lm_trie_free(lm_trie_t * trie) +{ + if (trie->ngram_mem) { + ckd_free(trie->ngram_mem); + ckd_free(trie->middle_begin); + ckd_free(trie->longest); + } + if (trie->quant) + lm_trie_quant_free(trie->quant); + ckd_free(trie->unigrams); + ckd_free(trie); +} + +static void +lm_trie_alloc_ngram(lm_trie_t * trie, uint32 * counts, int order) +{ + int i; + uint8 *mem_ptr; + uint8 **middle_starts; + + trie->ngram_mem_size = 0; + for (i = 1; i < order - 1; i++) { + trie->ngram_mem_size += + middle_size(lm_trie_quant_msize(trie->quant), counts[i], + counts[0], counts[i + 1]); + } + trie->ngram_mem_size += + longest_size(lm_trie_quant_lsize(trie->quant), counts[order - 1], + counts[0]); + trie->ngram_mem = + (uint8 *) ckd_calloc(trie->ngram_mem_size, + sizeof(*trie->ngram_mem)); + mem_ptr = trie->ngram_mem; + trie->middle_begin = + (middle_t *) ckd_calloc(order - 2, sizeof(*trie->middle_begin)); + trie->middle_end = trie->middle_begin + (order - 2); + middle_starts = + (uint8 **) ckd_calloc(order - 2, sizeof(*middle_starts)); + for (i = 2; i < order; i++) { + middle_starts[i - 2] = mem_ptr; + mem_ptr += + middle_size(lm_trie_quant_msize(trie->quant), counts[i - 1], + counts[0], counts[i]); + } + trie->longest = (longest_t *) ckd_calloc(1, sizeof(*trie->longest)); + /* Crazy backwards thing so we initialize using pointers to ones that have already been initialized */ + for (i = order - 1; i >= 2; --i) { + middle_t *middle_ptr = &trie->middle_begin[i - 2]; + middle_init(middle_ptr, middle_starts[i - 2], + lm_trie_quant_msize(trie->quant), counts[i - 1], + counts[0], counts[i], + (i == + order - + 1) ? (void *) trie->longest : (void *) &trie-> + middle_begin[i - 1]); + } + ckd_free(middle_starts); + longest_init(trie->longest, mem_ptr, lm_trie_quant_lsize(trie->quant), + counts[0]); +} + +void +lm_trie_build(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, uint32 * counts, uint32 *out_counts, + int order) +{ + int i; + + lm_trie_fix_counts(raw_ngrams, counts, out_counts, order); + lm_trie_alloc_ngram(trie, out_counts, order); + + if (order > 1) + E_INFO("Training quantizer\n"); + for (i = 2; i < order; i++) { + lm_trie_quant_train(trie->quant, i, counts[i - 1], + raw_ngrams[i - 2]); + } + lm_trie_quant_train_prob(trie->quant, order, counts[order - 1], + raw_ngrams[order - 2]); + + E_INFO("Building LM trie\n"); + recursive_insert(trie, raw_ngrams, counts, order); + /* Set ending offsets so the last entry will be sized properly */ + /* Last entry for unigrams was already set. */ + if (trie->middle_begin != trie->middle_end) { + middle_t *middle_ptr; + for (middle_ptr = trie->middle_begin; + middle_ptr != trie->middle_end - 1; ++middle_ptr) { + middle_t *next_middle_ptr = middle_ptr + 1; + middle_finish_loading(middle_ptr, + next_middle_ptr->base.insert_index); + } + middle_ptr = trie->middle_end - 1; + middle_finish_loading(middle_ptr, + trie->longest->base.insert_index); + } +} + +unigram_t * +unigram_find(unigram_t * u, uint32 word, node_range_t * next) +{ + unigram_t *ptr = &u[word]; + next->begin = ptr->next; + next->end = (ptr + 1)->next; + return ptr; +} + +static size_t +calc_pivot(uint32 off, uint32 range, uint32 width) +{ + return (size_t) ((off * width) / (range + 1)); +} + +static uint8 +uniform_find(void *base, uint8 total_bits, uint8 key_bits, uint32 key_mask, + uint32 before_it, uint32 before_v, + uint32 after_it, uint32 after_v, uint32 key, uint32 * out) +{ + bitarr_address_t address; + address.base = base; + + /* If we look for unigram added later */ + if (key > after_v) + return FALSE; + + while (after_it - before_it > 1) { + uint32 mid; + uint32 pivot = + before_it + (1 + + calc_pivot(key - before_v, after_v - before_v, + after_it - before_it - 1)); + /* access by pivot */ + address.offset = pivot * (uint32) total_bits; + mid = bitarr_read_int25(address, key_bits, key_mask); + if (mid < key) { + before_it = pivot; + before_v = mid; + } + else if (mid > key) { + after_it = pivot; + after_v = mid; + } + else { + *out = pivot; + return TRUE; + } + } + return FALSE; +} + +static bitarr_address_t +middle_find(middle_t * middle, uint32 word, node_range_t * range) +{ + uint32 at_pointer; + bitarr_address_t address; + + /* finding BitPacked with uniform find */ + if (!uniform_find + ((void *) middle->base.base, middle->base.total_bits, + middle->base.word_bits, middle->base.word_mask, range->begin - 1, + 0, range->end, middle->base.max_vocab, word, &at_pointer)) { + address.base = NULL; + address.offset = 0; + return address; + } + + address.base = middle->base.base; + at_pointer *= middle->base.total_bits; + at_pointer += middle->base.word_bits; + address.offset = at_pointer + middle->quant_bits; + range->begin = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset += middle->base.total_bits; + range->end = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset = at_pointer; + + return address; +} + +static bitarr_address_t +longest_find(longest_t * longest, uint32 word, node_range_t * range) +{ + uint32 at_pointer; + bitarr_address_t address; + + /* finding BitPacked with uniform find */ + if (!uniform_find + ((void *) longest->base.base, longest->base.total_bits, + longest->base.word_bits, longest->base.word_mask, + range->begin - 1, 0, range->end, longest->base.max_vocab, word, + &at_pointer)) { + address.base = NULL; + address.offset = 0; + return address; + } + address.base = longest->base.base; + address.offset = + at_pointer * longest->base.total_bits + longest->base.word_bits; + return address; +} + +static float +get_available_prob(lm_trie_t * trie, int32 wid, int32 * hist, + int max_order, int32 n_hist, int32 * n_used) +{ + float prob; + node_range_t node; + bitarr_address_t address; + int order_minus_2; + uint8 independent_left; + int32 *hist_iter, *hist_end; + + *n_used = 1; + prob = unigram_find(trie->unigrams, wid, &node)->prob; + if (n_hist == 0) { + return prob; + } + + /* find ngrams of higher order if any */ + order_minus_2 = 0; + independent_left = (node.begin == node.end); + hist_iter = hist; + hist_end = hist + n_hist; + for (;; order_minus_2++, hist_iter++) { + if (hist_iter == hist_end) + return prob; + if (independent_left) + return prob; + if (order_minus_2 == max_order - 2) + break; + + address = + middle_find(&trie->middle_begin[order_minus_2], *hist_iter, + &node); + independent_left = (address.base == NULL) + || (node.begin == node.end); + + /* didn't find entry */ + if (address.base == NULL) + return prob; + prob = lm_trie_quant_mpread(trie->quant, address, order_minus_2); + *n_used = order_minus_2 + 2; + } + + address = longest_find(trie->longest, *hist_iter, &node); + if (address.base != NULL) { + prob = lm_trie_quant_lpread(trie->quant, address); + *n_used = max_order; + } + return prob; +} + +static float +get_available_backoff(lm_trie_t * trie, int32 start, int32 * hist, + int32 n_hist) +{ + float backoff = 0.0f; + int order_minus_2; + int32 *hist_iter; + node_range_t node; + unigram_t *first_hist = unigram_find(trie->unigrams, hist[0], &node); + if (start <= 1) { + backoff += first_hist->bo; + start = 2; + } + order_minus_2 = start - 2; + for (hist_iter = hist + start - 1; hist_iter < hist + n_hist; + hist_iter++, order_minus_2++) { + bitarr_address_t address = + middle_find(&trie->middle_begin[order_minus_2], *hist_iter, + &node); + if (address.base == NULL) + break; + backoff += + lm_trie_quant_mboread(trie->quant, address, order_minus_2); + } + return backoff; +} + +static float +lm_trie_nobo_score(lm_trie_t * trie, int32 wid, int32 * hist, + int max_order, int32 n_hist, int32 * n_used) +{ + float prob = + get_available_prob(trie, wid, hist, max_order, n_hist, n_used); + if (n_hist < *n_used) + return prob; + return prob + get_available_backoff(trie, *n_used, hist, n_hist); +} + +static float +lm_trie_hist_score(lm_trie_t * trie, int32 wid, int32 * hist, int32 n_hist, + int32 * n_used) +{ + float prob; + int i, j; + node_range_t node; + bitarr_address_t address; + + *n_used = 1; + prob = unigram_find(trie->unigrams, wid, &node)->prob; + if (n_hist == 0) + return prob; + for (i = 0; i < n_hist - 1; i++) { + address = middle_find(&trie->middle_begin[i], hist[i], &node); + if (address.base == NULL) { + for (j = i; j < n_hist; j++) { + prob += trie->backoff_cache[j]; + } + return prob; + } + else { + (*n_used)++; + prob = lm_trie_quant_mpread(trie->quant, address, i); + } + } + address = longest_find(trie->longest, hist[n_hist - 1], &node); + if (address.base == NULL) { + return prob + trie->backoff_cache[n_hist - 1]; + } + else { + (*n_used)++; + return lm_trie_quant_lpread(trie->quant, address); + } +} + +static uint8 +history_matches(int32 * hist, int32 * prev_hist, int32 n_hist) +{ + int i; + for (i = 0; i < n_hist; i++) { + if (hist[i] != prev_hist[i]) { + return FALSE; + } + } + return TRUE; +} + +static void +update_backoff(lm_trie_t * trie, int32 * hist, int32 n_hist) +{ + int i; + node_range_t node; + bitarr_address_t address; + + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + trie->backoff_cache[0] = unigram_find(trie->unigrams, hist[0], &node)->bo; + for (i = 1; i < n_hist; i++) { + address = middle_find(&trie->middle_begin[i - 1], hist[i], &node); + if (address.base == NULL) { + break; + } + trie->backoff_cache[i] = + lm_trie_quant_mboread(trie->quant, address, i - 1); + } + memcpy(trie->hist_cache, hist, n_hist * sizeof(*hist)); +} + +float +lm_trie_score(lm_trie_t * trie, int order, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + if (n_hist < order - 1) { + return lm_trie_nobo_score(trie, wid, hist, order, n_hist, n_used); + } + else { + assert(n_hist == order - 1); + if (!history_matches(hist, (int32 *) trie->hist_cache, n_hist)) { + update_backoff(trie, hist, n_hist); + } + return lm_trie_hist_score(trie, wid, hist, n_hist, n_used); + } +} + +void +lm_trie_fill_raw_ngram(lm_trie_t * trie, + ngram_raw_t * raw_ngrams, uint32 * raw_ngram_idx, + uint32 * counts, node_range_t range, uint32 * hist, + int n_hist, int order, int max_order) +{ + if (n_hist > 0 && range.begin == range.end) { + return; + } + if (n_hist == 0) { + uint32 i; + for (i = 0; i < counts[0]; i++) { + node_range_t node; + unigram_find(trie->unigrams, i, &node); + hist[0] = i; + lm_trie_fill_raw_ngram(trie, raw_ngrams, raw_ngram_idx, counts, + node, hist, 1, order, max_order); + } + } + else if (n_hist < order - 1) { + uint32 ptr; + node_range_t node; + bitarr_address_t address; + uint32 new_word; + middle_t *middle = &trie->middle_begin[n_hist - 1]; + for (ptr = range.begin; ptr < range.end; ptr++) { + address.base = middle->base.base; + address.offset = ptr * middle->base.total_bits; + new_word = + bitarr_read_int25(address, middle->base.word_bits, + middle->base.word_mask); + hist[n_hist] = new_word; + address.offset += middle->base.word_bits + middle->quant_bits; + node.begin = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + address.offset = + (ptr + 1) * middle->base.total_bits + + middle->base.word_bits + middle->quant_bits; + node.end = + bitarr_read_int25(address, middle->next_mask.bits, + middle->next_mask.mask); + lm_trie_fill_raw_ngram(trie, raw_ngrams, raw_ngram_idx, counts, + node, hist, n_hist + 1, order, max_order); + } + } + else { + bitarr_address_t address; + uint32 ptr; + float prob, backoff; + int i; + assert(n_hist == order - 1); + for (ptr = range.begin; ptr < range.end; ptr++) { + ngram_raw_t *raw_ngram = &raw_ngrams[*raw_ngram_idx]; + if (order == max_order) { + longest_t *longest = trie->longest; + address.base = longest->base.base; + address.offset = ptr * longest->base.total_bits; + hist[n_hist] = + bitarr_read_int25(address, longest->base.word_bits, + longest->base.word_mask); + address.offset += longest->base.word_bits; + prob = lm_trie_quant_lpread(trie->quant, address); + } + else { + middle_t *middle = &trie->middle_begin[n_hist - 1]; + address.base = middle->base.base; + address.offset = ptr * middle->base.total_bits; + hist[n_hist] = + bitarr_read_int25(address, middle->base.word_bits, + middle->base.word_mask); + address.offset += middle->base.word_bits; + prob = + lm_trie_quant_mpread(trie->quant, address, n_hist - 1); + backoff = + lm_trie_quant_mboread(trie->quant, address, + n_hist - 1); + raw_ngram->backoff = backoff; + } + raw_ngram->prob = prob; + raw_ngram->words = + (uint32 *) ckd_calloc(order, sizeof(*raw_ngram->words)); + for (i = 0; i <= n_hist; i++) { + raw_ngram->words[i] = hist[n_hist - i]; + } + (*raw_ngram_idx)++; + } + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h new file mode 100644 index 0000000..d39df6c --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h @@ -0,0 +1,114 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __LM_TRIE_H__ +#define __LM_TRIE_H__ + +#include +#include + +#include "ngram_model_internal.h" +#include "lm_trie_quant.h" + +typedef struct unigram_s { + float prob; + float bo; + uint32 next; +} unigram_t; + +typedef struct node_range_s { + uint32 begin; + uint32 end; +} node_range_t; + +typedef struct base_s { + uint8 word_bits; + uint8 total_bits; + uint32 word_mask; + uint8 *base; + uint32 insert_index; + uint32 max_vocab; +} base_t; + +typedef struct middle_s { + base_t base; + bitarr_mask_t next_mask; + uint8 quant_bits; + void *next_source; +} middle_t; + +typedef struct longest_s { + base_t base; + uint8 quant_bits; +} longest_t; + +typedef struct lm_trie_s { + uint8 *ngram_mem; /*<< This appears to be a bitarr.h bit array */ + size_t ngram_mem_size; + unigram_t *unigrams; + middle_t *middle_begin; + middle_t *middle_end; + longest_t *longest; + lm_trie_quant_t *quant; + + float backoff_cache[NGRAM_MAX_ORDER]; + uint32 hist_cache[NGRAM_MAX_ORDER - 1]; +} lm_trie_t; + +/** + * Creates lm_trie structure. Fills it if binary file with correspondent data is provided + */ +lm_trie_t *lm_trie_create(uint32 unigram_count, int order); + +lm_trie_t *lm_trie_read_bin(uint32 * counts, int order, FILE * fp); + +void lm_trie_write_bin(lm_trie_t * trie, uint32 unigram_count, FILE * fp); + +void lm_trie_free(lm_trie_t * trie); + +void lm_trie_build(lm_trie_t * trie, ngram_raw_t ** raw_ngrams, + uint32 * counts, uint32 *out_counts, int order); + +void lm_trie_fill_raw_ngram(lm_trie_t * trie, + ngram_raw_t * raw_ngrams, uint32 * raw_ngram_idx, + uint32 * counts, node_range_t range, uint32 * hist, + int n_hist, int order, int max_order); + +float lm_trie_score(lm_trie_t * trie, int order, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used); + +#endif /* __LM_TRIE_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c new file mode 100644 index 0000000..4c14ff7 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c @@ -0,0 +1,353 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include +#include +#include +#include + +#include "ngram_model_internal.h" +#include "lm_trie_quant.h" + +/* FIXME: WTF, no, that's not how this works!!! */ +#define FLOAT_INF (0x7f800000) + +typedef struct bins_s { + float32 *begin; + const float32 *end; +} bins_t; + +struct lm_trie_quant_s { + bins_t tables[NGRAM_MAX_ORDER - 1][2]; + bins_t *longest; + float32 *values; + size_t nvalues; + uint8 prob_bits; + uint8 bo_bits; + uint32 prob_mask; + uint32 bo_mask; +}; + +static void +bins_create(bins_t * bins, uint8 bits, float32 *begin) +{ + bins->begin = begin; + bins->end = bins->begin + (1ULL << bits); +} + +static float32 * +lower_bound(float32 *first, const float32 *last, float32 val) +{ + int count, step; + float32 *it; + + count = last - first; + while (count > 0) { + it = first; + step = count / 2; + it += step; + if (*it < val) { + first = ++it; + count -= step + 1; + } + else { + count = step; + } + } + return first; +} + +static uint64 +bins_encode(bins_t * bins, float32 value) +{ + float32 *above = lower_bound(bins->begin, bins->end, value); + if (above == bins->begin) + return 0; + if (above == bins->end) + return bins->end - bins->begin - 1; + return above - bins->begin - (value - *(above - 1) < *above - value); +} + +static float32 +bins_decode(bins_t * bins, size_t off) +{ + return bins->begin[off]; +} + +static size_t +quant_size(int order) +{ + int prob_bits = 16; + int bo_bits = 16; + size_t longest_table = (1U << prob_bits); + size_t middle_table = (1U << bo_bits) + longest_table; + /* unigrams are currently not quantized so no need for a table. */ + return (order - 2) * middle_table + longest_table; +} + +lm_trie_quant_t * +lm_trie_quant_create(int order) +{ + float32 *start; + int i; + lm_trie_quant_t *quant = + (lm_trie_quant_t *) ckd_calloc(1, sizeof(*quant)); + quant->nvalues = quant_size(order); + quant->values = + (float32 *) ckd_calloc(quant->nvalues, sizeof(*quant->values)); + + quant->prob_bits = 16; + quant->bo_bits = 16; + quant->prob_mask = (1U << quant->prob_bits) - 1; + quant->bo_mask = (1U << quant->bo_bits) - 1; + + start = (float32 *) (quant->values); + for (i = 0; i < order - 2; i++) { + bins_create(&quant->tables[i][0], quant->prob_bits, start); + start += (1ULL << quant->prob_bits); + bins_create(&quant->tables[i][1], quant->bo_bits, start); + start += (1ULL << quant->bo_bits); + } + bins_create(&quant->tables[order - 2][0], quant->prob_bits, start); + quant->longest = &quant->tables[order - 2][0]; + return quant; +} + + +lm_trie_quant_t * +lm_trie_quant_read_bin(FILE * fp, int order) +{ + int dummy; + lm_trie_quant_t *quant; + + fread(&dummy, sizeof(dummy), 1, fp); + quant = lm_trie_quant_create(order); + if (fread(quant->values, sizeof(*quant->values), + quant->nvalues, fp) != quant->nvalues) { + E_ERROR("Failed to read %d quantization values\n", + quant->nvalues); + lm_trie_quant_free(quant); + return NULL; + } + if (SWAP_LM_TRIE) { + size_t i; + for (i = 0; i < quant->nvalues; ++i) + SWAP_FLOAT32(&quant->values[i]); + } + + return quant; +} + +void +lm_trie_quant_write_bin(lm_trie_quant_t * quant, FILE * fp) +{ + /* Before it was quantization type */ + int dummy = 1; + fwrite(&dummy, sizeof(dummy), 1, fp); + if (SWAP_LM_TRIE) { + size_t i; + for (i = 0; i < quant->nvalues; ++i) { + float32 value = quant->values[i]; + SWAP_FLOAT32(&value); + if (fwrite(&value, sizeof(value), 1, fp) != 1) { + E_ERROR("Failed to write quantization value\n"); + return; /* WTF, FIXME */ + } + } + } + else { + if (fwrite(quant->values, sizeof(*quant->values), + quant->nvalues, fp) != quant->nvalues) { + E_ERROR("Failed to write %d quantization values\n", + quant->nvalues); + } + } +} + +void +lm_trie_quant_free(lm_trie_quant_t * quant) +{ + if (quant->values) + ckd_free(quant->values); + ckd_free(quant); +} + +uint8 +lm_trie_quant_msize(lm_trie_quant_t * quant) +{ + (void)quant; + return 32; +} + +uint8 +lm_trie_quant_lsize(lm_trie_quant_t * quant) +{ + (void)quant; + return 16; +} + +static int +weights_comparator(const void *a, const void *b) +{ + return (int) (*(float32 *) a - *(float32 *) b); +} + +static void +make_bins(float32 *values, uint32 values_num, float32 *centers, uint32 bins) +{ + float32 *finish, *start; + uint32 i; + + qsort(values, values_num, sizeof(*values), &weights_comparator); + start = values; + for (i = 0; i < bins; i++, centers++, start = finish) { + finish = values + (size_t) ((uint64) values_num * (i + 1) / bins); + if (finish == start) { + /* zero length bucket. */ + *centers = i ? *(centers - 1) : -FLOAT_INF; + } + else { + float32 sum = 0.0f; + float32 *ptr; + for (ptr = start; ptr != finish; ptr++) { + sum += *ptr; + } + *centers = sum / (float32) (finish - start); + } + } +} + +void +lm_trie_quant_train(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams) +{ + float32 *probs; + float32 *backoffs; + float32 *centers; + uint32 backoff_num; + uint32 prob_num; + ngram_raw_t *raw_ngrams_end; + + probs = (float32 *) ckd_calloc(counts, sizeof(*probs)); + backoffs = (float32 *) ckd_calloc(counts, sizeof(*backoffs)); + raw_ngrams_end = raw_ngrams + counts; + + for (backoff_num = 0, prob_num = 0; raw_ngrams != raw_ngrams_end; + raw_ngrams++) { + probs[prob_num++] = raw_ngrams->prob; + backoffs[backoff_num++] = raw_ngrams->backoff; + } + + make_bins(probs, prob_num, quant->tables[order - 2][0].begin, + 1ULL << quant->prob_bits); + centers = quant->tables[order - 2][1].begin; + make_bins(backoffs, backoff_num, centers, (1ULL << quant->bo_bits)); + ckd_free(probs); + ckd_free(backoffs); +} + +void +lm_trie_quant_train_prob(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams) +{ + float32 *probs; + uint32 prob_num; + ngram_raw_t *raw_ngrams_end; + + probs = (float32 *) ckd_calloc(counts, sizeof(*probs)); + raw_ngrams_end = raw_ngrams + counts; + + for (prob_num = 0; raw_ngrams != raw_ngrams_end; raw_ngrams++) { + probs[prob_num++] = raw_ngrams->prob; + } + + make_bins(probs, prob_num, quant->tables[order - 2][0].begin, + 1ULL << quant->prob_bits); + ckd_free(probs); +} + +void +lm_trie_quant_mwrite(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2, float32 prob, float32 backoff) +{ + bitarr_write_int57(address, quant->prob_bits + quant->bo_bits, + (uint64) ((bins_encode + (&quant->tables[order_minus_2][0], + prob) << quant-> + bo_bits) | bins_encode(&quant-> + tables + [order_minus_2] + [1], + backoff))); +} + +void +lm_trie_quant_lwrite(lm_trie_quant_t * quant, bitarr_address_t address, + float32 prob) +{ + bitarr_write_int25(address, quant->prob_bits, + (uint32) bins_encode(quant->longest, prob)); +} + +float32 +lm_trie_quant_mboread(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2) +{ + return bins_decode(&quant->tables[order_minus_2][1], + bitarr_read_int25(address, quant->bo_bits, + quant->bo_mask)); +} + +float32 +lm_trie_quant_mpread(lm_trie_quant_t * quant, bitarr_address_t address, + int order_minus_2) +{ + address.offset += quant->bo_bits; + return bins_decode(&quant->tables[order_minus_2][0], + bitarr_read_int25(address, quant->prob_bits, + quant->prob_mask)); +} + +float32 +lm_trie_quant_lpread(lm_trie_quant_t * quant, bitarr_address_t address) +{ + return bins_decode(quant->longest, + bitarr_read_int25(address, quant->prob_bits, + quant->prob_mask)); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h new file mode 100644 index 0000000..2ccbb66 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h @@ -0,0 +1,134 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef __LM_TRIE_QUANT_H__ +#define __LM_TRIE_QUANT_H__ + +#include + +#include "ngrams_raw.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#if defined(DEBUG_ENDIAN) || defined(WORDS_BIGENDIAN) +/* For some reason nobody ever considered the endianness of + this file. I declare it to be canonically little-endian. */ +#define SWAP_LM_TRIE 1 +#else +#define SWAP_LM_TRIE 0 +#endif + + +typedef struct lm_trie_quant_s lm_trie_quant_t; + +/** + * Create qunatizing + */ +lm_trie_quant_t *lm_trie_quant_create(int order); + +/** + * Write quant data to binary file + */ +lm_trie_quant_t *lm_trie_quant_read_bin(FILE * fp, int order); + +/** + * Write quant data to binary file + */ +void lm_trie_quant_write_bin(lm_trie_quant_t * quant, FILE * fp); + +/** + * Free quant + */ +void lm_trie_quant_free(lm_trie_quant_t * quant); + +/** + * Memory required for storing weights of middle-order ngrams. + * Both backoff and probability should be stored + */ +uint8 lm_trie_quant_msize(lm_trie_quant_t * quant); + +/** + * Memory required for storing weights of largest-order ngrams. + * Only probability should be stored + */ +uint8 lm_trie_quant_lsize(lm_trie_quant_t * quant); + +/** + * Trains prob and backoff quantizer for specified ngram order on provided raw ngram list + */ +void lm_trie_quant_train(lm_trie_quant_t * quant, int order, uint32 counts, + ngram_raw_t * raw_ngrams); + +/** + * Trains only prob quantizer for specified ngram order on provided raw ngram list + */ +void lm_trie_quant_train_prob(lm_trie_quant_t * quant, int order, + uint32 counts, ngram_raw_t * raw_ngrams); + +/** + * Writes specified weight for middle-order ngram. Quantize it if needed + */ +void lm_trie_quant_mwrite(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2, + float prob, float backoff); + +/** + * Writes specified weight for largest-order ngram. Quantize it if needed + */ +void lm_trie_quant_lwrite(lm_trie_quant_t * quant, + bitarr_address_t address, float prob); + +/** + * Reads and decodes if needed backoff for middle-order ngram + */ +float lm_trie_quant_mboread(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2); + +/** + * Reads and decodes if needed prob for middle-order ngram + */ +float lm_trie_quant_mpread(lm_trie_quant_t * quant, + bitarr_address_t address, int order_minus_2); + +/** + * Reads and decodes if needed prob for largest-order ngram + */ +float lm_trie_quant_lpread(lm_trie_quant_t * quant, + bitarr_address_t address); + +#endif /* __LM_TRIE_QUANT_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c new file mode 100644 index 0000000..5e4f285 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c @@ -0,0 +1,1063 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * \file ngram_model.c N-Gram language models. + * + * Author: David Huggins-Daines, much code taken from sphinx3/src/libs3decoder/liblm + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "sphinxbase/ngram_model.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/filename.h" +#include "sphinxbase/pio.h" +#include "sphinxbase/err.h" +#include "sphinxbase/logmath.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/case.h" + +#include "ngram_model_internal.h" +#include "ngram_model_trie.h" + +ngram_file_type_t +ngram_file_name_to_type(const char *file_name) +{ + const char *ext; + + ext = strrchr(file_name, '.'); + if (ext == NULL) { + return NGRAM_INVALID; + } + if (0 == strcmp_nocase(ext, ".gz")) { + while (--ext >= file_name) { + if (*ext == '.') + break; + } + if (ext < file_name) { + return NGRAM_INVALID; + } + } + else if (0 == strcmp_nocase(ext, ".bz2")) { + while (--ext >= file_name) { + if (*ext == '.') + break; + } + if (ext < file_name) { + return NGRAM_INVALID; + } + } + /* We use strncmp because there might be a .gz on the end. */ + if (0 == strncmp_nocase(ext, ".ARPA", 5)) + return NGRAM_ARPA; + if (0 == strncmp_nocase(ext, ".DMP", 4) + || 0 == strncmp_nocase(ext, ".BIN", 4)) + return NGRAM_BIN; + return NGRAM_INVALID; +} + +ngram_file_type_t +ngram_str_to_type(const char *str_name) +{ + if (0 == strcmp_nocase(str_name, "arpa")) + return NGRAM_ARPA; + if (0 == strcmp_nocase(str_name, "dmp") + || 0 == strcmp_nocase(str_name, "bin")) + return NGRAM_BIN; + return NGRAM_INVALID; +} + +char const * +ngram_type_to_str(int type) +{ + switch (type) { + case NGRAM_ARPA: + return "arpa"; + case NGRAM_BIN: + return "dmp/bin"; + default: + return NULL; + } +} + + +ngram_model_t * +ngram_model_read(cmd_ln_t * config, + const char *file_name, + ngram_file_type_t file_type, logmath_t * lmath) +{ + ngram_model_t *model = NULL; + switch (file_type) { + case NGRAM_AUTO:{ + if ((model = + ngram_model_trie_read_bin(config, file_name, + lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_arpa(config, file_name, + lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_dmp(config, file_name, + lmath)) != NULL) + break; + return NULL; + } + case NGRAM_ARPA: + model = ngram_model_trie_read_arpa(config, file_name, lmath); + break; + case NGRAM_BIN: + if ((model = + ngram_model_trie_read_bin(config, file_name, lmath)) != NULL) + break; + if ((model = + ngram_model_trie_read_dmp(config, file_name, lmath)) != NULL) + break; + return NULL; + default: + E_ERROR("language model file type not supported\n"); + return NULL; + } + + /* Now set weights based on config if present. */ + if (config) { + float32 lw = 1.0; + float32 wip = 1.0; + + if (cmd_ln_exists_r(config, "-lw")) + lw = cmd_ln_float32_r(config, "-lw"); + if (cmd_ln_exists_r(config, "-wip")) + wip = cmd_ln_float32_r(config, "-wip"); + + ngram_model_apply_weights(model, lw, wip); + } + + return model; +} + +int +ngram_model_write(ngram_model_t * model, const char *file_name, + ngram_file_type_t file_type) +{ + switch (file_type) { + case NGRAM_AUTO:{ + file_type = ngram_file_name_to_type(file_name); + /* Default to ARPA (catches .lm and other things) */ + if (file_type == NGRAM_INVALID) + file_type = NGRAM_ARPA; + return ngram_model_write(model, file_name, file_type); + } + case NGRAM_ARPA: + return ngram_model_trie_write_arpa(model, file_name); + case NGRAM_BIN: + return ngram_model_trie_write_bin(model, file_name); + default: + E_ERROR("language model file type not supported\n"); + return -1; + } + E_ERROR("language model file type not supported\n"); + return -1; +} + +int32 +ngram_model_init(ngram_model_t * base, + ngram_funcs_t * funcs, + logmath_t * lmath, int32 n, int32 n_unigram) +{ + base->refcount = 1; + base->funcs = funcs; + base->n = n; + /* If this was previously initialized... */ + if (base->n_counts == NULL) + base->n_counts = (uint32 *) ckd_calloc(n, sizeof(*base->n_counts)); + /* Don't reset weights if logmath object hasn't changed. */ + if (base->lmath != lmath) { + /* Set default values for weights. */ + base->lw = 1.0; + base->log_wip = 0; /* i.e. 1.0 */ + base->log_zero = logmath_get_zero(lmath); + base->lmath = lmath; + } + /* Allocate or reallocate space for word strings. */ + if (base->word_str) { + /* Free all previous word strings if they were allocated. */ + if (base->writable) { + int32 i; + for (i = 0; i < base->n_words; ++i) { + ckd_free(base->word_str[i]); + base->word_str[i] = NULL; + } + } + base->word_str = + (char **) ckd_realloc(base->word_str, + n_unigram * sizeof(char *)); + } + else { + base->word_str = (char **) ckd_calloc(n_unigram, sizeof(char *)); + } + /* NOTE: They are no longer case-insensitive since we are allowing + * other encodings for word strings. Beware. */ + if (base->wid) + hash_table_empty(base->wid); + else + base->wid = hash_table_new(n_unigram, FALSE); + base->n_counts[0] = base->n_1g_alloc = base->n_words = n_unigram; + + return 0; +} + +ngram_model_t * +ngram_model_retain(ngram_model_t * model) +{ + ++model->refcount; + return model; +} + +void +ngram_model_flush(ngram_model_t * model) +{ + if (model->funcs && model->funcs->flush) + (*model->funcs->flush) (model); +} + +int +ngram_model_free(ngram_model_t * model) +{ + int i; + + if (model == NULL) + return 0; + if (--model->refcount > 0) + return model->refcount; + if (model->funcs && model->funcs->free) + (*model->funcs->free) (model); + if (model->writable) { + /* Free all words. */ + for (i = 0; i < model->n_words; ++i) { + ckd_free(model->word_str[i]); + } + } + else { + /* Free all class words. */ + for (i = 0; i < model->n_classes; ++i) { + ngram_class_t *lmclass; + int32 j; + + lmclass = model->classes[i]; + for (j = 0; j < lmclass->n_words; ++j) { + ckd_free(model->word_str[lmclass->start_wid + j]); + } + for (j = 0; j < lmclass->n_hash; ++j) { + if (lmclass->nword_hash[j].wid != -1) { + ckd_free(model->word_str[lmclass->nword_hash[j].wid]); + } + } + } + } + for (i = 0; i < model->n_classes; ++i) { + ngram_class_free(model->classes[i]); + } + ckd_free(model->classes); + hash_table_free(model->wid); + ckd_free(model->word_str); + ckd_free(model->n_counts); + ckd_free(model); + return 0; +} + +int +ngram_model_casefold(ngram_model_t * model, int kase) +{ + int writable, i; + hash_table_t *new_wid; + + /* Were word strings already allocated? */ + writable = model->writable; + /* Either way, we are going to allocate some word strings. */ + model->writable = TRUE; + + /* And, don't forget, we need to rebuild the word to unigram ID + * mapping. */ + new_wid = hash_table_new(model->n_words, FALSE); + for (i = 0; i < model->n_words; ++i) { + char *outstr; + if (writable) { + outstr = model->word_str[i]; + } + else { + outstr = ckd_salloc(model->word_str[i]); + } + /* Don't case-fold or [classes] */ + if (outstr[0] == '<' || outstr[0] == '[') { + } + else { + switch (kase) { + case NGRAM_UPPER: + ucase(outstr); + break; + case NGRAM_LOWER: + lcase(outstr); + break; + default: + ; + } + } + model->word_str[i] = outstr; + + /* Now update the hash table. We might have terrible + * collisions here, so warn about them. */ + if (hash_table_enter_int32(new_wid, model->word_str[i], i) != i) { + E_WARN("Duplicate word in dictionary after conversion: %s\n", + model->word_str[i]); + } + } + /* Swap out the hash table. */ + hash_table_free(model->wid); + model->wid = new_wid; + return 0; +} + +int +ngram_model_apply_weights(ngram_model_t * model, float32 lw, float32 wip) +{ + return (*model->funcs->apply_weights) (model, lw, wip); +} + +float32 +ngram_model_get_weights(ngram_model_t * model, int32 * out_log_wip) +{ + if (out_log_wip) + *out_log_wip = model->log_wip; + return model->lw; +} + + +int32 +ngram_ng_score(ngram_model_t * model, int32 wid, int32 * history, + int32 n_hist, int32 * n_used) +{ + int32 score, class_weight = 0; + int i; + + /* Closed vocabulary, OOV word probability is zero */ + if (wid == NGRAM_INVALID_WID) + return model->log_zero; + + /* "Declassify" wid and history */ + if (NGRAM_IS_CLASSWID(wid)) { + ngram_class_t *lmclass = model->classes[NGRAM_CLASSID(wid)]; + + class_weight = ngram_class_prob(lmclass, wid); + if (class_weight == 1) /* Meaning, not found in class. */ + return model->log_zero; + wid = lmclass->tag_wid; + } + for (i = 0; i < n_hist; ++i) { + if (history[i] != NGRAM_INVALID_WID + && NGRAM_IS_CLASSWID(history[i])) + history[i] = + model->classes[NGRAM_CLASSID(history[i])]->tag_wid; + } + score = (*model->funcs->score) (model, wid, history, n_hist, n_used); + + /* Multiply by unigram in-class weight. */ + return score + class_weight; +} + +int32 +ngram_score(ngram_model_t * model, const char *word, ...) +{ + va_list history; + const char *hword; + int32 *histid; + int32 n_hist; + int32 n_used; + int32 prob; + + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) + ++n_hist; + va_end(history); + + histid = ckd_calloc(n_hist, sizeof(*histid)); + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) { + histid[n_hist] = ngram_wid(model, hword); + ++n_hist; + } + va_end(history); + + prob = ngram_ng_score(model, ngram_wid(model, word), + histid, n_hist, &n_used); + ckd_free(histid); + return prob; +} + +int32 +ngram_tg_score(ngram_model_t * model, int32 w3, int32 w2, int32 w1, + int32 * n_used) +{ + int32 hist[2]; + hist[0] = w2; + hist[1] = w1; + return ngram_ng_score(model, w3, hist, 2, n_used); +} + +int32 +ngram_bg_score(ngram_model_t * model, int32 w2, int32 w1, int32 * n_used) +{ + return ngram_ng_score(model, w2, &w1, 1, n_used); +} + +int32 +ngram_ng_prob(ngram_model_t * model, int32 wid, int32 * history, + int32 n_hist, int32 * n_used) +{ + int32 prob, class_weight = 0; + int i; + + /* Closed vocabulary, OOV word probability is zero */ + if (wid == NGRAM_INVALID_WID) + return model->log_zero; + + /* "Declassify" wid and history */ + if (NGRAM_IS_CLASSWID(wid)) { + ngram_class_t *lmclass = model->classes[NGRAM_CLASSID(wid)]; + + class_weight = ngram_class_prob(lmclass, wid); + if (class_weight == 1) /* Meaning, not found in class. */ + return class_weight; + wid = lmclass->tag_wid; + } + for (i = 0; i < n_hist; ++i) { + if (history[i] != NGRAM_INVALID_WID + && NGRAM_IS_CLASSWID(history[i])) + history[i] = + model->classes[NGRAM_CLASSID(history[i])]->tag_wid; + } + prob = (*model->funcs->raw_score) (model, wid, history, + n_hist, n_used); + /* Multiply by unigram in-class weight. */ + return prob + class_weight; +} + +int32 +ngram_probv(ngram_model_t * model, const char *word, ...) +{ + va_list history; + const char *hword; + int32 *histid; + int32 n_hist; + int32 n_used; + int32 prob; + + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) + ++n_hist; + va_end(history); + + histid = ckd_calloc(n_hist, sizeof(*histid)); + va_start(history, word); + n_hist = 0; + while ((hword = va_arg(history, const char *)) != NULL) { + histid[n_hist] = ngram_wid(model, hword); + ++n_hist; + } + va_end(history); + + prob = ngram_ng_prob(model, ngram_wid(model, word), + histid, n_hist, &n_used); + ckd_free(histid); + return prob; +} + +int32 +ngram_prob(ngram_model_t * model, const char* const *words, int32 n) +{ + int32 *ctx_id; + int32 nused; + int32 prob; + int32 wid; + uint32 i; + + ctx_id = (int32 *) ckd_calloc(n - 1, sizeof(*ctx_id)); + for (i = 1; i < (uint32) n; ++i) + ctx_id[i - 1] = ngram_wid(model, words[i]); + + wid = ngram_wid(model, *words); + prob = ngram_ng_prob(model, wid, ctx_id, n - 1, &nused); + ckd_free(ctx_id); + + return prob; +} + +int32 +ngram_score_to_prob(ngram_model_t * base, int32 score) +{ + int32 prob; + + /* Undo insertion penalty. */ + prob = score - base->log_wip; + /* Undo language weight. */ + prob = (int32) (prob / base->lw); + + return prob; +} + +int32 +ngram_unknown_wid(ngram_model_t * model) +{ + int32 val; + + /* FIXME: This could be memoized for speed if necessary. */ + /* Look up , if not found return NGRAM_INVALID_WID. */ + if (hash_table_lookup_int32(model->wid, "", &val) == -1) + return NGRAM_INVALID_WID; + else + return val; +} + +int32 +ngram_zero(ngram_model_t * model) +{ + return model->log_zero; +} + +int32 +ngram_model_get_size(ngram_model_t * model) +{ + if (model != NULL) + return model->n; + return 0; +} + +uint32 const * +ngram_model_get_counts(ngram_model_t * model) +{ + if (model != NULL) + return model->n_counts; + return NULL; +} + +int32 +ngram_wid(ngram_model_t * model, const char *word) +{ + int32 val; + + if (hash_table_lookup_int32(model->wid, word, &val) == -1) + return ngram_unknown_wid(model); + else + return val; +} + +const char * +ngram_word(ngram_model_t * model, int32 wid) +{ + /* Remove any class tag */ + wid = NGRAM_BASEWID(wid); + if (wid >= model->n_words) + return NULL; + return model->word_str[wid]; +} + +/** + * Add a word to the word string and ID mapping. + */ +int32 +ngram_add_word_internal(ngram_model_t * model, + const char *word, int32 classid) +{ + + /* Check for hash collisions. */ + int32 wid; + if (hash_table_lookup_int32(model->wid, word, &wid) == 0) { + E_WARN("Omit duplicate word '%s'\n", word); + return wid; + } + + /* Take the next available word ID */ + wid = model->n_words; + if (classid >= 0) { + wid = NGRAM_CLASSWID(wid, classid); + } + + /* Reallocate word_str if necessary. */ + if (model->n_words >= model->n_1g_alloc) { + model->n_1g_alloc += UG_ALLOC_STEP; + model->word_str = ckd_realloc(model->word_str, + sizeof(*model->word_str) * + model->n_1g_alloc); + } + /* Add the word string in the appropriate manner. */ + /* Class words are always dynamically allocated. */ + model->word_str[model->n_words] = ckd_salloc(word); + /* Now enter it into the hash table. */ + if (hash_table_enter_int32 + (model->wid, model->word_str[model->n_words], wid) != wid) { + E_ERROR + ("Hash insertion failed for word %s => %p (should not happen)\n", + model->word_str[model->n_words], (void *) (long) (wid)); + } + /* Increment number of words. */ + ++model->n_words; + return wid; +} + +int32 +ngram_model_add_word(ngram_model_t * model, + const char *word, float32 weight) +{ + int32 wid, prob = model->log_zero; + + /* If we add word to unwritable model, we need to make it writable */ + if (!model->writable) { + E_WARN("Can't add word '%s' to read-only language model. " + "Disable mmap with '-mmap no' to make it writable\n", word); + return -1; + } + + wid = ngram_add_word_internal(model, word, -1); + if (wid == NGRAM_INVALID_WID) + return wid; + + /* Do what needs to be done to add the word to the unigram. */ + if (model->funcs && model->funcs->add_ug) + prob = + (*model->funcs->add_ug) (model, wid, + logmath_log(model->lmath, weight)); + if (prob == 0) + return -1; + + return wid; +} + +ngram_class_t * +ngram_class_new(ngram_model_t * model, int32 tag_wid, int32 start_wid, + glist_t classwords) +{ + ngram_class_t *lmclass; + gnode_t *gn; + float32 tprob; + int i; + + lmclass = ckd_calloc(1, sizeof(*lmclass)); + lmclass->tag_wid = tag_wid; + /* wid_base is the wid (minus class tag) of the first word in the list. */ + lmclass->start_wid = start_wid; + lmclass->n_words = glist_count(classwords); + lmclass->prob1 = ckd_calloc(lmclass->n_words, sizeof(*lmclass->prob1)); + lmclass->nword_hash = NULL; + lmclass->n_hash = 0; + tprob = 0.0; + for (gn = classwords; gn; gn = gnode_next(gn)) { + tprob += gnode_float32(gn); + } + if (tprob > 1.1 || tprob < 0.9) { + E_INFO("Total class probability is %f, will normalize\n", tprob); + for (gn = classwords; gn; gn = gnode_next(gn)) { + gn->data.fl /= tprob; + } + } + for (i = 0, gn = classwords; gn; ++i, gn = gnode_next(gn)) { + lmclass->prob1[i] = logmath_log(model->lmath, gnode_float32(gn)); + } + + return lmclass; +} + +int32 +ngram_class_add_word(ngram_class_t * lmclass, int32 wid, int32 lweight) +{ + int32 hash; + + if (lmclass->nword_hash == NULL) { + /* Initialize everything in it to -1 */ + lmclass->nword_hash = + ckd_malloc(NGRAM_HASH_SIZE * sizeof(*lmclass->nword_hash)); + memset(lmclass->nword_hash, 0xff, + NGRAM_HASH_SIZE * sizeof(*lmclass->nword_hash)); + lmclass->n_hash = NGRAM_HASH_SIZE; + lmclass->n_hash_inuse = 0; + } + /* Stupidest possible hash function. This will work pretty well + * when this function is called repeatedly with contiguous word + * IDs, though... */ + hash = wid & (lmclass->n_hash - 1); + if (lmclass->nword_hash[hash].wid == -1) { + /* Good, no collision. */ + lmclass->nword_hash[hash].wid = wid; + lmclass->nword_hash[hash].prob1 = lweight; + ++lmclass->n_hash_inuse; + return hash; + } + else { + int32 next; /**< Next available bucket. */ + /* Collision... Find the end of the hash chain. */ + while (lmclass->nword_hash[hash].next != -1) + hash = lmclass->nword_hash[hash].next; + assert(hash != -1); + /* Does we has any more bukkit? */ + if (lmclass->n_hash_inuse == lmclass->n_hash) { + /* Oh noes! Ok, we makes more. */ + lmclass->nword_hash = ckd_realloc(lmclass->nword_hash, + lmclass->n_hash * 2 * + sizeof(*lmclass-> + nword_hash)); + memset(lmclass->nword_hash + lmclass->n_hash, 0xff, + lmclass->n_hash * sizeof(*lmclass->nword_hash)); + /* Just use the next allocated one (easy) */ + next = lmclass->n_hash; + lmclass->n_hash *= 2; + } + else { + /* Look for any available bucket. We hope this doesn't happen. */ + for (next = 0; next < lmclass->n_hash; ++next) + if (lmclass->nword_hash[next].wid == -1) + break; + /* This should absolutely not happen. */ + assert(next != lmclass->n_hash); + } + lmclass->nword_hash[next].wid = wid; + lmclass->nword_hash[next].prob1 = lweight; + lmclass->nword_hash[hash].next = next; + ++lmclass->n_hash_inuse; + return next; + } +} + +void +ngram_class_free(ngram_class_t * lmclass) +{ + ckd_free(lmclass->nword_hash); + ckd_free(lmclass->prob1); + ckd_free(lmclass); +} + +int32 +ngram_model_add_class_word(ngram_model_t * model, + const char *classname, + const char *word, float32 weight) +{ + ngram_class_t *lmclass; + int32 classid, tag_wid, wid, i, scale; + float32 fprob; + + /* Find the class corresponding to classname. Linear search + * probably okay here since there won't be very many classes, and + * this doesn't have to be fast. */ + tag_wid = ngram_wid(model, classname); + if (tag_wid == NGRAM_INVALID_WID) { + E_ERROR("No such word or class tag: %s\n", classname); + return tag_wid; + } + for (classid = 0; classid < model->n_classes; ++classid) { + if (model->classes[classid]->tag_wid == tag_wid) + break; + } + /* Hmm, no such class. It's probably not a good idea to create one. */ + if (classid == model->n_classes) { + E_ERROR + ("Word %s is not a class tag (call ngram_model_add_class() first)\n", + classname); + return NGRAM_INVALID_WID; + } + lmclass = model->classes[classid]; + + /* Add this word to the model's set of words. */ + wid = ngram_add_word_internal(model, word, classid); + if (wid == NGRAM_INVALID_WID) + return wid; + + /* This is the fixed probability of the new word. */ + fprob = weight * 1.0f / (lmclass->n_words + lmclass->n_hash_inuse + 1); + /* Now normalize everything else to fit it in. This is + * accomplished by simply scaling all the other probabilities + * by (1-fprob). */ + scale = logmath_log(model->lmath, 1.0 - fprob); + for (i = 0; i < lmclass->n_words; ++i) + lmclass->prob1[i] += scale; + for (i = 0; i < lmclass->n_hash; ++i) + if (lmclass->nword_hash[i].wid != -1) + lmclass->nword_hash[i].prob1 += scale; + + /* Now add it to the class hash table. */ + return ngram_class_add_word(lmclass, wid, + logmath_log(model->lmath, fprob)); +} + +int32 +ngram_model_add_class(ngram_model_t * model, + const char *classname, + float32 classweight, + char **words, const float32 * weights, int32 n_words) +{ + ngram_class_t *lmclass; + glist_t classwords = NULL; + int32 i, start_wid = -1; + int32 classid, tag_wid; + + /* Check if classname already exists in model. If not, add it. */ + if ((tag_wid = + ngram_wid(model, classname)) == ngram_unknown_wid(model)) { + tag_wid = ngram_model_add_word(model, classname, classweight); + if (tag_wid == NGRAM_INVALID_WID) + return -1; + } + + if (model->n_classes == 128) { + E_ERROR("Number of classes cannot exceed 128 (sorry)\n"); + return -1; + } + classid = model->n_classes; + for (i = 0; i < n_words; ++i) { + int32 wid; + + wid = ngram_add_word_internal(model, words[i], classid); + if (wid == NGRAM_INVALID_WID) + return -1; + if (start_wid == -1) + start_wid = NGRAM_BASEWID(wid); + classwords = glist_add_float32(classwords, weights[i]); + } + classwords = glist_reverse(classwords); + lmclass = ngram_class_new(model, tag_wid, start_wid, classwords); + glist_free(classwords); + if (lmclass == NULL) + return -1; + + ++model->n_classes; + if (model->classes == NULL) + model->classes = ckd_calloc(1, sizeof(*model->classes)); + else + model->classes = ckd_realloc(model->classes, + model->n_classes * + sizeof(*model->classes)); + model->classes[classid] = lmclass; + return classid; +} + +int32 +ngram_class_prob(ngram_class_t * lmclass, int32 wid) +{ + int32 base_wid = NGRAM_BASEWID(wid); + + if (base_wid < lmclass->start_wid + || base_wid > lmclass->start_wid + lmclass->n_words) { + int32 hash; + + /* Look it up in the hash table. */ + hash = wid & (lmclass->n_hash - 1); + while (hash != -1 && lmclass->nword_hash[hash].wid != wid) + hash = lmclass->nword_hash[hash].next; + if (hash == -1) + return 1; + return lmclass->nword_hash[hash].prob1; + } + else { + return lmclass->prob1[base_wid - lmclass->start_wid]; + } +} + +int32 +read_classdef_file(hash_table_t * classes, const char *file_name) +{ + FILE *fp; + int32 is_pipe; + int inclass; /**< Are we currently reading a list of class words? */ + int32 rv = -1; + gnode_t *gn; + glist_t classwords = NULL; + glist_t classprobs = NULL; + char *classname = NULL; + + if ((fp = fopen_comp(file_name, "r", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", file_name); + return -1; + } + + inclass = FALSE; + while (!feof(fp)) { + char line[512]; + char *wptr[2]; + int n_words; + + if (fgets(line, sizeof(line), fp) == NULL) + break; + + n_words = str2words(line, wptr, 2); + if (n_words <= 0) + continue; + + if (inclass) { + /* Look for an end of class marker. */ + if (n_words == 2 && 0 == strcmp(wptr[0], "END")) { + classdef_t *classdef; + gnode_t *word, *weight; + int32 i; + + if (classname == NULL || 0 != strcmp(wptr[1], classname)) + goto error_out; + inclass = FALSE; + + /* Construct a class from the list of words collected. */ + classdef = ckd_calloc(1, sizeof(*classdef)); + classwords = glist_reverse(classwords); + classprobs = glist_reverse(classprobs); + classdef->n_words = glist_count(classwords); + classdef->words = ckd_calloc(classdef->n_words, + sizeof(*classdef->words)); + classdef->weights = ckd_calloc(classdef->n_words, + sizeof(*classdef->weights)); + word = classwords; + weight = classprobs; + for (i = 0; i < classdef->n_words; ++i) { + classdef->words[i] = gnode_ptr(word); + classdef->weights[i] = gnode_float32(weight); + word = gnode_next(word); + weight = gnode_next(weight); + } + + /* Add this class to the hash table. */ + if (hash_table_enter(classes, classname, classdef) != + classdef) { + classdef_free(classdef); + goto error_out; + } + + /* Reset everything. */ + glist_free(classwords); + glist_free(classprobs); + classwords = NULL; + classprobs = NULL; + classname = NULL; + } + else { + float32 fprob; + + if (n_words == 2) + fprob = atof_c(wptr[1]); + else + fprob = 1.0f; + /* Add it to the list of words for this class. */ + classwords = + glist_add_ptr(classwords, ckd_salloc(wptr[0])); + classprobs = glist_add_float32(classprobs, fprob); + } + } + else { + /* Start a new LM class if the LMCLASS marker is seen */ + if (n_words == 2 && 0 == strcmp(wptr[0], "LMCLASS")) { + if (inclass) + goto error_out; + inclass = TRUE; + classname = ckd_salloc(wptr[1]); + } + /* Otherwise, just ignore whatever junk we got */ + } + } + rv = 0; /* Success. */ + + error_out: + /* Free all the stuff we might have allocated. */ + fclose_comp(fp, is_pipe); + for (gn = classwords; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(classwords); + glist_free(classprobs); + ckd_free(classname); + + return rv; +} + +void +classdef_free(classdef_t * classdef) +{ + int32 i; + for (i = 0; i < classdef->n_words; ++i) + ckd_free(classdef->words[i]); + ckd_free(classdef->words); + ckd_free(classdef->weights); + ckd_free(classdef); +} + + +int32 +ngram_model_read_classdef(ngram_model_t * model, const char *file_name) +{ + hash_table_t *classes; + glist_t hl = NULL; + gnode_t *gn; + int32 rv = -1; + + classes = hash_table_new(0, FALSE); + if (read_classdef_file(classes, file_name) < 0) { + hash_table_free(classes); + return -1; + } + + /* Create a new class in the language model for each classdef. */ + hl = hash_table_tolist(classes, NULL); + for (gn = hl; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + classdef_t *classdef = he->val; + + if (ngram_model_add_class(model, he->key, 1.0, + classdef->words, + classdef->weights, + classdef->n_words) < 0) + goto error_out; + } + rv = 0; + + error_out: + for (gn = hl; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + ckd_free((char *) he->key); + classdef_free(he->val); + } + glist_free(hl); + hash_table_free(classes); + return rv; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h new file mode 100644 index 0000000..4561678 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h @@ -0,0 +1,197 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * \file ngram_model_internal.h Internal structures for N-Gram models + * + * Author: David Huggins-Daines + */ + +#ifndef __NGRAM_MODEL_INTERNAL_H__ +#define __NGRAM_MODEL_INTERNAL_H__ + +#include "sphinxbase/ngram_model.h" +#include "sphinxbase/hash_table.h" + +/** + * Common implementation of ngram_model_t. + * + * The details of bigram, trigram, and higher-order N-gram storage, if any, can + * vary somewhat depending on the file format in use. + */ +struct ngram_model_s { + int refcount; /**< Reference count */ + uint32 *n_counts; /**< Counts for 1, 2, 3, ... grams */ + int32 n_1g_alloc; /**< Number of allocated word strings (for new word addition) */ + int32 n_words; /**< Number of actual word strings (NOT the same as the + number of unigrams, due to class words). */ + + uint8 n; /**< This is an n-gram model (1, 2, 3, ...). */ + uint8 n_classes; /**< Number of classes (maximum 128) */ + uint8 writable; /**< Are word strings writable? */ + uint8 flags; /**< Any other flags we might care about + (FIXME: Merge this and writable) */ + logmath_t *lmath; /**< Log-math object */ + float32 lw; /**< Language model scaling factor */ + int32 log_wip; /**< Log of word insertion penalty */ + int32 log_zero; /**< Zero probability, cached here for quick lookup */ + char **word_str; /**< Unigram names */ + hash_table_t *wid; /**< Mapping of unigram names to word IDs. */ + int32 *tmp_wids; /**< Temporary array of word IDs for ngram_model_get_ngram() */ + struct ngram_class_s **classes; /**< Word class definitions. */ + struct ngram_funcs_s *funcs; /**< Implementation-specific methods. */ +}; + +/** + * Implementation of ngram_class_t. + */ +struct ngram_class_s { + int32 tag_wid; /**< Base word ID for this class tag */ + int32 start_wid; /**< Starting base word ID for this class' words */ + int32 n_words; /**< Number of base words for this class */ + int32 *prob1; /**< Probability table for base words */ + /** + * Custom hash table for additional words. + */ + struct ngram_hash_s { + int32 wid; /**< Word ID of this bucket */ + int32 prob1; /**< Probability for this word */ + int32 next; /**< Index of next bucket (or -1 for no collision) */ + } *nword_hash; + int32 n_hash; /**< Number of buckets in nword_hash (power of 2) */ + int32 n_hash_inuse; /**< Number of words in nword_hash */ +}; + +#define NGRAM_MAX_ORDER 5 + +#define NGRAM_HASH_SIZE 128 + +#define NGRAM_BASEWID(wid) ((wid)&0xffffff) +#define NGRAM_CLASSID(wid) (((wid)>>24) & 0x7f) +#define NGRAM_CLASSWID(wid,classid) (((classid)<<24) | 0x80000000 | (wid)) +#define NGRAM_IS_CLASSWID(wid) ((wid)&0x80000000) + +#define UG_ALLOC_STEP 10 + +/** Implementation-specific functions for operating on ngram_model_t objects */ +typedef struct ngram_funcs_s { + /** + * Implementation-specific function for freeing an ngram_model_t. + */ + void (*free) (ngram_model_t * model); + /** + * Implementation-specific function for applying language model weights. + */ + int (*apply_weights) (ngram_model_t * model, float32 lw, float32 wip); + /** + * Implementation-specific function for querying language model score. + */ + int32(*score) (ngram_model_t * model, + int32 wid, + int32 * history, int32 n_hist, int32 * n_used); + /** + * Implementation-specific function for querying raw language + * model probability. + */ + int32(*raw_score) (ngram_model_t * model, + int32 wid, + int32 * history, int32 n_hist, int32 * n_used); + /** + * Implementation-specific function for adding unigrams. + * + * This function updates the internal structures of a language + * model to add the given unigram with the given weight (defined + * as a log-factor applied to the uniform distribution). This + * includes reallocating or otherwise resizing the set of unigrams. + * + * @return The language model score (not raw log-probability) of + * the new word, or 0 for failure. + */ + int32(*add_ug) (ngram_model_t * model, int32 wid, int32 lweight); + + /** + * Implementation-specific function for purging N-Gram cache + */ + void (*flush) (ngram_model_t * model); +} ngram_funcs_t; + +/** + * One class definition from a classdef file. + */ +typedef struct classdef_s { + char **words; + float32 *weights; + int32 n_words; +} classdef_t; + +/** + * Initialize the base ngram_model_t structure. + */ +int32 +ngram_model_init(ngram_model_t * model, + ngram_funcs_t * funcs, + logmath_t * lmath, int32 n, int32 n_unigram); + +/** + * Read a probdef file. + */ +int32 read_classdef_file(hash_table_t * classes, + const char *classdef_file); + +/** + * Free a class definition. + */ +void classdef_free(classdef_t * classdef); + +/** + * Allocate and initialize an N-Gram class. + */ +ngram_class_t *ngram_class_new(ngram_model_t * model, int32 tag_wid, + int32 start_wid, glist_t classwords); + +/** + * Deallocate an N-Gram class. + */ +void ngram_class_free(ngram_class_t * lmclass); + +/** + * Get the in-class log probability for a word in an N-Gram class. + * + * @return This probability, or 1 if word not found. + */ +int32 ngram_class_prob(ngram_class_t * lmclass, int32 wid); + +#endif /* __NGRAM_MODEL_INTERNAL_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c new file mode 100644 index 0000000..c3ff134 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c @@ -0,0 +1,868 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ngram_model_set.c Set of language models. + * @author David Huggins-Daines + */ + +#include +#include + +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/filename.h" + +#include "ngram_model_set.h" + +static ngram_funcs_t ngram_model_set_funcs; + +static int +my_compare(const void *a, const void *b) +{ + /* Make sure floats to the beginning. */ + if (strcmp(*(char *const *) a, "") == 0) + return -1; + else if (strcmp(*(char *const *) b, "") == 0) + return 1; + else + return strcmp(*(char *const *) a, *(char *const *) b); +} + +static void +build_widmap(ngram_model_t * base, logmath_t * lmath, int32 n) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_t **models = set->lms; + hash_table_t *vocab; + glist_t hlist; + gnode_t *gn; + int32 i; + + /* Construct a merged vocabulary and a set of word-ID mappings. */ + vocab = hash_table_new(models[0]->n_words, FALSE); + /* Create the set of merged words. */ + for (i = 0; i < set->n_models; ++i) { + int32 j; + for (j = 0; j < models[i]->n_words; ++j) { + /* Ignore collisions. */ + (void) hash_table_enter_int32(vocab, models[i]->word_str[j], + j); + } + } + /* Create the array of words, then sort it. */ + if (hash_table_lookup(vocab, "", NULL) != 0) + (void) hash_table_enter_int32(vocab, "", 0); + /* Now we know the number of unigrams, initialize the base model. */ + ngram_model_init(base, &ngram_model_set_funcs, lmath, n, + hash_table_inuse(vocab)); + base->writable = FALSE; /* We will reuse the pointers from the submodels. */ + i = 0; + hlist = hash_table_tolist(vocab, NULL); + for (gn = hlist; gn; gn = gnode_next(gn)) { + hash_entry_t *ent = gnode_ptr(gn); + base->word_str[i++] = (char *) ent->key; + } + glist_free(hlist); + qsort(base->word_str, base->n_words, sizeof(*base->word_str), + my_compare); + + /* Now create the word ID mappings. */ + if (set->widmap) + ckd_free_2d((void **) set->widmap); + set->widmap = (int32 **) ckd_calloc_2d(base->n_words, set->n_models, + sizeof(**set->widmap)); + for (i = 0; i < base->n_words; ++i) { + int32 j; + /* Also create the master wid mapping. */ + (void) hash_table_enter_int32(base->wid, base->word_str[i], i); + /* printf("%s: %d => ", base->word_str[i], i); */ + for (j = 0; j < set->n_models; ++j) { + set->widmap[i][j] = ngram_wid(models[j], base->word_str[i]); + /* printf("%d ", set->widmap[i][j]); */ + } + /* printf("\n"); */ + } + hash_table_free(vocab); +} + +ngram_model_t * +ngram_model_set_init(cmd_ln_t * config, + ngram_model_t ** models, + char **names, const float32 * weights, int32 n_models) +{ + ngram_model_set_t *model; + ngram_model_t *base; + logmath_t *lmath; + int32 i, n; + + (void)config; + if (n_models == 0) /* WTF */ + return NULL; + + /* Do consistency checking on the models. They must all use the + * same logbase and shift. */ + lmath = models[0]->lmath; + for (i = 1; i < n_models; ++i) { + if (logmath_get_base(models[i]->lmath) != logmath_get_base(lmath) + || logmath_get_shift(models[i]->lmath) != + logmath_get_shift(lmath)) { + E_ERROR + ("Log-math parameters don't match, will not create LM set\n"); + return NULL; + } + } + + /* Allocate the combined model, initialize it. */ + model = ckd_calloc(1, sizeof(*model)); + base = &model->base; + model->n_models = n_models; + model->lms = ckd_calloc(n_models, sizeof(*model->lms)); + model->names = ckd_calloc(n_models, sizeof(*model->names)); + /* Initialize weights to a uniform distribution */ + model->lweights = ckd_calloc(n_models, sizeof(*model->lweights)); + { + int32 uniform = logmath_log(lmath, 1.0 / n_models); + for (i = 0; i < n_models; ++i) + model->lweights[i] = uniform; + } + /* Default to interpolate if weights were given. */ + if (weights) + model->cur = -1; + + n = 0; + for (i = 0; i < n_models; ++i) { + model->lms[i] = ngram_model_retain(models[i]); + model->names[i] = ckd_salloc(names[i]); + if (weights) + model->lweights[i] = logmath_log(lmath, weights[i]); + /* N is the maximum of all merged models. */ + if (models[i]->n > n) + n = models[i]->n; + } + /* Allocate the history mapping table. */ + model->maphist = ckd_calloc(n - 1, sizeof(*model->maphist)); + + /* Now build the word-ID mapping and merged vocabulary. */ + build_widmap(base, lmath, n); + return base; +} + +ngram_model_t * +ngram_model_set_read(cmd_ln_t * config, + const char *lmctlfile, logmath_t * lmath) +{ + FILE *ctlfp; + glist_t lms = NULL; + glist_t lmnames = NULL; + __BIGSTACKVARIABLE__ char str[1024]; + ngram_model_t *set = NULL; + hash_table_t *classes; + char *basedir, *c; + + /* Read all the class definition files to accumulate a mapping of + * classnames to definitions. */ + classes = hash_table_new(0, FALSE); + if ((ctlfp = fopen(lmctlfile, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open %s", lmctlfile); + return NULL; + } + + /* Try to find the base directory to append to relative paths in + * the lmctl file. */ + if ((c = strrchr(lmctlfile, '/')) || (c = strrchr(lmctlfile, '\\'))) { + /* Include the trailing slash. */ + basedir = ckd_calloc(c - lmctlfile + 2, 1); + memcpy(basedir, lmctlfile, c - lmctlfile + 1); + } + else { + basedir = NULL; + } + E_INFO("Reading LM control file '%s'\n", lmctlfile); + if (basedir) + E_INFO("Will prepend '%s' to unqualified paths\n", basedir); + + if (fscanf(ctlfp, "%1023s", str) == 1) { + if (strcmp(str, "{") == 0) { + /* Load LMclass files */ + while ((fscanf(ctlfp, "%1023s", str) == 1) + && (strcmp(str, "}") != 0)) { + char *deffile; + if (basedir && !path_is_absolute(str)) + deffile = string_join(basedir, str, NULL); + else + deffile = ckd_salloc(str); + E_INFO("Reading classdef from '%s'\n", deffile); + if (read_classdef_file(classes, deffile) < 0) { + ckd_free(deffile); + goto error_out; + } + ckd_free(deffile); + } + + if (strcmp(str, "}") != 0) { + E_ERROR("Unexpected EOF in %s\n", lmctlfile); + goto error_out; + } + + /* This might be the first LM name. */ + if (fscanf(ctlfp, "%1023s", str) != 1) + str[0] = '\0'; + } + } + else + str[0] = '\0'; + + /* Read in one LM at a time and add classes to them as necessary. */ + while (str[0] != '\0') { + char *lmfile; + ngram_model_t *lm; + + if (basedir && str[0] != '/' && str[0] != '\\') + lmfile = string_join(basedir, str, NULL); + else + lmfile = ckd_salloc(str); + E_INFO("Reading lm from '%s'\n", lmfile); + lm = ngram_model_read(config, lmfile, NGRAM_AUTO, lmath); + if (lm == NULL) { + ckd_free(lmfile); + goto error_out; + } + if (fscanf(ctlfp, "%1023s", str) != 1) { + E_ERROR("LMname missing after LMFileName '%s'\n", lmfile); + ckd_free(lmfile); + goto error_out; + } + ckd_free(lmfile); + lms = glist_add_ptr(lms, lm); + lmnames = glist_add_ptr(lmnames, ckd_salloc(str)); + + if (fscanf(ctlfp, "%1023s", str) == 1) { + if (strcmp(str, "{") == 0) { + /* LM uses classes; read their names */ + while ((fscanf(ctlfp, "%1023s", str) == 1) && + (strcmp(str, "}") != 0)) { + void *val; + classdef_t *classdef; + + if (hash_table_lookup(classes, str, &val) == -1) { + E_ERROR("Unknown class %s in control file\n", str); + goto error_out; + } + classdef = val; + if (ngram_model_add_class(lm, str, 1.0, + classdef->words, + classdef->weights, + classdef->n_words) < 0) { + goto error_out; + } + E_INFO("Added class %s containing %d words\n", + str, classdef->n_words); + } + if (strcmp(str, "}") != 0) { + E_ERROR("Unexpected EOF in %s\n", lmctlfile); + goto error_out; + } + if (fscanf(ctlfp, "%1023s", str) != 1) + str[0] = '\0'; + } + } + else + str[0] = '\0'; + } + fclose(ctlfp); + + /* Now construct arrays out of lms and lmnames, and build an + * ngram_model_set. */ + lms = glist_reverse(lms); + lmnames = glist_reverse(lmnames); + { + int32 n_models; + ngram_model_t **lm_array; + char **name_array; + gnode_t *lm_node, *name_node; + int32 i; + + n_models = glist_count(lms); + lm_array = ckd_calloc(n_models, sizeof(*lm_array)); + name_array = ckd_calloc(n_models, sizeof(*name_array)); + lm_node = lms; + name_node = lmnames; + for (i = 0; i < n_models; ++i) { + lm_array[i] = gnode_ptr(lm_node); + name_array[i] = gnode_ptr(name_node); + lm_node = gnode_next(lm_node); + name_node = gnode_next(name_node); + } + set = ngram_model_set_init(config, lm_array, name_array, + NULL, n_models); + + for (i = 0; i < n_models; ++i) { + ngram_model_free(lm_array[i]); + } + ckd_free(lm_array); + ckd_free(name_array); + } + error_out: + { + gnode_t *gn; + glist_t hlist; + + if (set == NULL) { + for (gn = lms; gn; gn = gnode_next(gn)) { + ngram_model_free(gnode_ptr(gn)); + } + } + glist_free(lms); + for (gn = lmnames; gn; gn = gnode_next(gn)) { + ckd_free(gnode_ptr(gn)); + } + glist_free(lmnames); + hlist = hash_table_tolist(classes, NULL); + for (gn = hlist; gn; gn = gnode_next(gn)) { + hash_entry_t *he = gnode_ptr(gn); + ckd_free((char *) he->key); + classdef_free(he->val); + } + glist_free(hlist); + hash_table_free(classes); + ckd_free(basedir); + } + return set; +} + +int32 +ngram_model_set_count(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + return set->n_models; +} + +ngram_model_set_iter_t * +ngram_model_set_iter(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_set_iter_t *itor; + + if (set == NULL || set->n_models == 0) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + itor->set = set; + return itor; +} + +ngram_model_set_iter_t * +ngram_model_set_iter_next(ngram_model_set_iter_t * itor) +{ + if (++itor->cur == itor->set->n_models) { + ngram_model_set_iter_free(itor); + return NULL; + } + return itor; +} + +void +ngram_model_set_iter_free(ngram_model_set_iter_t * itor) +{ + ckd_free(itor); +} + +ngram_model_t * +ngram_model_set_iter_model(ngram_model_set_iter_t * itor, + char const **lmname) +{ + if (lmname) + *lmname = itor->set->names[itor->cur]; + return itor->set->lms[itor->cur]; +} + +ngram_model_t * +ngram_model_set_lookup(ngram_model_t * base, const char *name) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + if (name == NULL) { + if (set->cur == -1) + return NULL; + else + return set->lms[set->cur]; + } + + /* There probably won't be very many submodels. */ + for (i = 0; i < set->n_models; ++i) + if (0 == strcmp(set->names[i], name)) + break; + if (i == set->n_models) + return NULL; + return set->lms[i]; +} + +ngram_model_t * +ngram_model_set_select(ngram_model_t * base, const char *name) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* There probably won't be very many submodels. */ + for (i = 0; i < set->n_models; ++i) + if (0 == strcmp(set->names[i], name)) + break; + if (i == set->n_models) + return NULL; + set->cur = i; + return set->lms[set->cur]; +} + +const char * +ngram_model_set_current(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set->cur == -1) + return NULL; + else + return set->names[set->cur]; +} + +int32 +ngram_model_set_current_wid(ngram_model_t * base, int32 set_wid) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set->cur == -1 || set_wid >= base->n_words) + return NGRAM_INVALID_WID; + else + return set->widmap[set_wid][set->cur]; +} + +int32 +ngram_model_set_known_wid(ngram_model_t * base, int32 set_wid) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + if (set_wid >= base->n_words) + return FALSE; + else if (set->cur == -1) { + int32 i; + for (i = 0; i < set->n_models; ++i) { + if (set->widmap[set_wid][i] != ngram_unknown_wid(set->lms[i])) + return TRUE; + } + return FALSE; + } + else + return (set->widmap[set_wid][set->cur] + != ngram_unknown_wid(set->lms[set->cur])); +} + +ngram_model_t * +ngram_model_set_interp(ngram_model_t * base, + const char **names, const float32 * weights) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + + /* If we have a set of weights here, then set them. */ + if (names && weights) { + int32 i, j; + + /* We hope there aren't many models. */ + for (i = 0; i < set->n_models; ++i) { + for (j = 0; j < set->n_models; ++j) + if (0 == strcmp(names[i], set->names[j])) + break; + if (j == set->n_models) { + E_ERROR("Unknown LM name %s\n", names[i]); + return NULL; + } + set->lweights[j] = logmath_log(base->lmath, weights[i]); + } + } + else if (weights) { + memcpy(set->lweights, weights, + set->n_models * sizeof(*set->lweights)); + } + /* Otherwise just enable existing weights. */ + set->cur = -1; + return base; +} + +ngram_model_t * +ngram_model_set_add(ngram_model_t * base, + ngram_model_t * model, + const char *name, float32 weight, int reuse_widmap) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + float32 fprob; + int32 scale, i; + + /* Add it to the array of lms. */ + ++set->n_models; + set->lms = ckd_realloc(set->lms, set->n_models * sizeof(*set->lms)); + set->lms[set->n_models - 1] = model; + set->names = + ckd_realloc(set->names, set->n_models * sizeof(*set->names)); + set->names[set->n_models - 1] = ckd_salloc(name); + /* Expand the history mapping table if necessary. */ + if (model->n > base->n) { + base->n = model->n; + set->maphist = ckd_realloc(set->maphist, + (model->n - 1) * sizeof(*set->maphist)); + } + + /* Renormalize the interpolation weights. */ + fprob = weight * 1.0f / set->n_models; + set->lweights = ckd_realloc(set->lweights, + set->n_models * sizeof(*set->lweights)); + set->lweights[set->n_models - 1] = logmath_log(base->lmath, fprob); + /* Now normalize everything else to fit it in. This is + * accomplished by simply scaling all the other probabilities + * by (1-fprob). */ + scale = logmath_log(base->lmath, 1.0 - fprob); + for (i = 0; i < set->n_models - 1; ++i) + set->lweights[i] += scale; + + /* Reuse the old word ID mapping if requested. */ + if (reuse_widmap) { + int32 **new_widmap; + + /* Tack another column onto the widmap array. */ + new_widmap = (int32 **) ckd_calloc_2d(base->n_words, set->n_models, + sizeof(**new_widmap)); + for (i = 0; i < base->n_words; ++i) { + /* Copy all the existing mappings. */ + memcpy(new_widmap[i], set->widmap[i], + (set->n_models - 1) * sizeof(**new_widmap)); + /* Create the new mapping. */ + new_widmap[i][set->n_models - 1] = + ngram_wid(model, base->word_str[i]); + } + ckd_free_2d((void **) set->widmap); + set->widmap = new_widmap; + } + else { + build_widmap(base, base->lmath, base->n); + } + return model; +} + +ngram_model_t * +ngram_model_set_remove(ngram_model_t * base, + const char *name, int reuse_widmap) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + ngram_model_t *submodel; + int32 lmidx, scale, n, i; + float32 fprob; + + for (lmidx = 0; lmidx < set->n_models; ++lmidx) + if (0 == strcmp(name, set->names[lmidx])) + break; + if (lmidx == set->n_models) + return NULL; + submodel = set->lms[lmidx]; + + /* Renormalize the interpolation weights by scaling them by + * 1/(1-fprob) */ + fprob = (float32) logmath_exp(base->lmath, set->lweights[lmidx]); + scale = logmath_log(base->lmath, 1.0 - fprob); + + /* Remove it from the array of lms, renormalize remaining weights, + * and recalcluate n. */ + --set->n_models; + n = 0; + ckd_free(set->names[lmidx]); + set->names[lmidx] = NULL; + for (i = 0; i < set->n_models; ++i) { + if (i >= lmidx) { + set->lms[i] = set->lms[i + 1]; + set->names[i] = set->names[i + 1]; + set->lweights[i] = set->lweights[i + 1]; + } + set->lweights[i] -= scale; + if (set->lms[i]->n > n) + n = set->lms[i]->n; + } + /* There's no need to shrink these arrays. */ + set->lms[set->n_models] = NULL; + set->lweights[set->n_models] = base->log_zero; + /* No need to shrink maphist either. */ + + /* Reuse the existing word ID mapping if requested. */ + if (reuse_widmap) { + /* Just go through and shrink each row. */ + for (i = 0; i < base->n_words; ++i) { + memmove(set->widmap[i] + lmidx, set->widmap[i] + lmidx + 1, + (set->n_models - lmidx) * sizeof(**set->widmap)); + } + } + else { + build_widmap(base, base->lmath, n); + } + return submodel; +} + +void +ngram_model_set_map_words(ngram_model_t * base, + const char **words, int32 n_words) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* Recreate the word mapping. */ + if (base->writable) { + for (i = 0; i < base->n_words; ++i) { + ckd_free(base->word_str[i]); + } + } + ckd_free(base->word_str); + ckd_free_2d((void **) set->widmap); + base->writable = TRUE; + base->n_words = base->n_1g_alloc = n_words; + base->word_str = ckd_calloc(n_words, sizeof(*base->word_str)); + set->widmap = + (int32 **) ckd_calloc_2d(n_words, set->n_models, + sizeof(**set->widmap)); + hash_table_empty(base->wid); + for (i = 0; i < n_words; ++i) { + int32 j; + base->word_str[i] = ckd_salloc(words[i]); + (void) hash_table_enter_int32(base->wid, base->word_str[i], i); + for (j = 0; j < set->n_models; ++j) { + set->widmap[i][j] = ngram_wid(set->lms[j], base->word_str[i]); + } + } +} + +static int +ngram_model_set_apply_weights(ngram_model_t * base, float32 lw, + float32 wip) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + /* Apply weights to each sub-model. */ + for (i = 0; i < set->n_models; ++i) + ngram_model_apply_weights(set->lms[i], lw, wip); + return 0; +} + +static int32 +ngram_model_set_score(ngram_model_t * base, int32 wid, + int32 * history, int32 n_hist, int32 * n_used) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 mapwid; + int32 score; + int32 i; + + /* Truncate the history. */ + if (n_hist > base->n - 1) + n_hist = base->n - 1; + + /* Interpolate if there is no current. */ + if (set->cur == -1) { + score = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 j; + /* Map word and history IDs for each model. */ + mapwid = set->widmap[wid][i]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][i]; + } + score = logmath_add(base->lmath, score, + set->lweights[i] + + ngram_ng_score(set->lms[i], + mapwid, set->maphist, + n_hist, n_used)); + } + } + else { + int32 j; + /* Map word and history IDs (FIXME: do this in a function?) */ + mapwid = set->widmap[wid][set->cur]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][set->cur]; + } + score = ngram_ng_score(set->lms[set->cur], + mapwid, set->maphist, n_hist, n_used); + } + + return score; +} + +static int32 +ngram_model_set_raw_score(ngram_model_t * base, int32 wid, + int32 * history, int32 n_hist, int32 * n_used) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 mapwid; + int32 score; + int32 i; + + /* Truncate the history. */ + if (n_hist > base->n - 1) + n_hist = base->n - 1; + + /* Interpolate if there is no current. */ + if (set->cur == -1) { + score = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 j; + /* Map word and history IDs for each model. */ + mapwid = set->widmap[wid][i]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][i]; + } + score = logmath_add(base->lmath, score, + set->lweights[i] + + ngram_ng_prob(set->lms[i], + mapwid, set->maphist, n_hist, + n_used)); + } + } + else { + int32 j; + /* Map word and history IDs (FIXME: do this in a function?) */ + mapwid = set->widmap[wid][set->cur]; + for (j = 0; j < n_hist; ++j) { + if (history[j] == NGRAM_INVALID_WID) + set->maphist[j] = NGRAM_INVALID_WID; + else + set->maphist[j] = set->widmap[history[j]][set->cur]; + } + score = ngram_ng_prob(set->lms[set->cur], + mapwid, set->maphist, n_hist, n_used); + } + + return score; +} + +static int32 +ngram_model_set_add_ug(ngram_model_t * base, int32 wid, int32 lweight) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 *newwid; + int32 i, prob; + + /* At this point the word has already been added to the master + model and we have a new word ID for it. Add it to active + submodels and track the word IDs. */ + newwid = ckd_calloc(set->n_models, sizeof(*newwid)); + prob = base->log_zero; + for (i = 0; i < set->n_models; ++i) { + int32 wprob, n_hist; + + /* Only add to active models. */ + if (set->cur == -1 || set->cur == i) { + /* Did this word already exist? */ + newwid[i] = ngram_wid(set->lms[i], base->word_str[wid]); + if (newwid[i] == NGRAM_INVALID_WID) { + /* Add it to the submodel. */ + newwid[i] = + ngram_model_add_word(set->lms[i], base->word_str[wid], + (float32) logmath_exp(base->lmath, + lweight)); + if (newwid[i] == NGRAM_INVALID_WID) { + ckd_free(newwid); + return base->log_zero; + } + } + /* Now get the unigram probability for the new word and either + * interpolate it or use it (if this is the current model). */ + wprob = + ngram_ng_prob(set->lms[i], newwid[i], NULL, 0, &n_hist); + if (set->cur == i) + prob = wprob; + else if (set->cur == -1) + prob = + logmath_add(base->lmath, prob, + set->lweights[i] + wprob); + } + else { + newwid[i] = NGRAM_INVALID_WID; + } + } + /* Okay we have the word IDs for this in all the submodels. Now + do some complicated memory mangling to add this to the + widmap. */ + set->widmap = + ckd_realloc(set->widmap, base->n_words * sizeof(*set->widmap)); + set->widmap[0] = + ckd_realloc(set->widmap[0], + base->n_words * set->n_models * sizeof(**set->widmap)); + for (i = 0; i < base->n_words; ++i) + set->widmap[i] = set->widmap[0] + i * set->n_models; + memcpy(set->widmap[wid], newwid, set->n_models * sizeof(*newwid)); + ckd_free(newwid); + return prob; +} + +static void +ngram_model_set_free(ngram_model_t * base) +{ + ngram_model_set_t *set = (ngram_model_set_t *) base; + int32 i; + + for (i = 0; i < set->n_models; ++i) + ngram_model_free(set->lms[i]); + ckd_free(set->lms); + for (i = 0; i < set->n_models; ++i) + ckd_free(set->names[i]); + ckd_free(set->names); + ckd_free(set->lweights); + ckd_free(set->maphist); + ckd_free_2d((void **) set->widmap); +} + +static ngram_funcs_t ngram_model_set_funcs = { + ngram_model_set_free, /* free */ + ngram_model_set_apply_weights, /* apply_weights */ + ngram_model_set_score, /* score */ + ngram_model_set_raw_score, /* raw_score */ + ngram_model_set_add_ug, /* add_ug */ + NULL /* flush */ +}; diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h new file mode 100644 index 0000000..09fbdab --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h @@ -0,0 +1,70 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ngram_model_set.h Set of language models. + * @author David Huggins-Daines + */ + +#ifndef __NGRAM_MODEL_SET_H__ +#define __NGRAM_MODEL_SET_H__ + +#include "ngram_model_internal.h" + +/** + * Subclass of ngram_model for grouping language models. + */ +typedef struct ngram_model_set_s { + ngram_model_t base; /**< Base ngram_model_t structure. */ + + int32 n_models; /**< Number of models in this set. */ + int32 cur; /**< Currently selected model, or -1 for none. */ + ngram_model_t **lms; /**< Language models in this set. */ + char **names; /**< Names for language models. */ + int32 *lweights; /**< Log interpolation weights. */ + int32 **widmap; /**< Word ID mapping for submodels. */ + int32 *maphist; /**< Word ID mapping for N-Gram history. */ +} ngram_model_set_t; + +/** + * Iterator over a model set. + */ +struct ngram_model_set_iter_s { + ngram_model_set_t *set; + int32 cur; +}; + +#endif /* __NGRAM_MODEL_SET_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c new file mode 100644 index 0000000..1e79ac3 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c @@ -0,0 +1,711 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "ngram_model_trie.h" + +static const char trie_hdr[] = "Trie Language Model"; +static const char dmp_hdr[] = "Darpa Trigram LM"; +static ngram_funcs_t ngram_model_trie_funcs; + +/* + * Read and return #unigrams, #bigrams, #trigrams as stated in input file. + */ +static int +read_counts_arpa(lineiter_t ** li, uint32 * counts, int *order) +{ + int32 ngram, prev_ngram; + uint32 ngram_cnt; + + /* skip file until past the '\data\' marker */ + while (*li) { + if (strcmp((*li)->buf, "\\data\\") == 0) + break; + *li = lineiter_next(*li); + } + + if (*li == NULL || strcmp((*li)->buf, "\\data\\") != 0) { + E_INFO("No \\data\\ mark in LM file\n"); + return -1; + } + + prev_ngram = 0; + *order = 0; + while ((*li = lineiter_next(*li))) { + if (sscanf((*li)->buf, "ngram %d=%d", &ngram, &ngram_cnt) != 2) + break; + if (ngram != prev_ngram + 1) { + E_ERROR + ("Ngram counts in LM file is not in order. %d goes after %d\n", + ngram, prev_ngram); + return -1; + } + prev_ngram = ngram; + counts[*order] = ngram_cnt; + (*order)++; + } + + if (*li == NULL) { + E_ERROR("EOF while reading ngram counts\n"); + return -1; + } + + return 0; +} + +static int +read_1grams_arpa(lineiter_t ** li, uint32 count, ngram_model_t * base, + unigram_t * unigrams) +{ + uint32 i; + int n; + int n_parts; + char *wptr[3]; + + while (*li && strcmp((*li)->buf, "\\1-grams:") != 0) { + *li = lineiter_next(*li); + } + if (*li == NULL) { + E_ERROR_SYSTEM("Failed to read \\1-grams: mark"); + return -1; + } + + n_parts = 2; + for (i = 0; i < count; i++) { + unigram_t *unigram; + + *li = lineiter_next(*li); + if (*li == NULL) { + E_ERROR + ("Unexpected end of ARPA file. Failed to read unigram %d\n", + i + 1); + return -1; + } + if ((n = str2words((*li)->buf, wptr, 3)) < n_parts) { + E_ERROR("Format error at line %d, Failed to read unigrams\n", (*li)->lineno); + return -1; + } + + unigram = &unigrams[i]; + unigram->prob = + logmath_log10_to_log_float(base->lmath, atof_c(wptr[0])); + if (unigram->prob > 0) { + E_WARN("Unigram '%s' has positive probability\n", wptr[1]); + unigram->prob = 0; + } + if (n == n_parts + 1) { + unigram->bo = + logmath_log10_to_log_float(base->lmath, + atof_c(wptr[2])); + } + else { + unigram->bo = 0.0f; + } + + /* TODO: classify float with fpclassify and warn if bad value occurred */ + base->word_str[i] = ckd_salloc(wptr[1]); + } + + /* fill hash-table that maps unigram names to their word ids */ + for (i = 0; i < count; i++) { + if ((hash_table_enter + (base->wid, base->word_str[i], + (void *) (long) i)) != (void *) (long) i) { + E_WARN("Duplicate word in dictionary: %s\n", + base->word_str[i]); + } + } + return 0; +} + +ngram_model_t * +ngram_model_trie_read_arpa(cmd_ln_t * config, + const char *path, logmath_t * lmath) +{ + FILE *fp; + lineiter_t *li; + ngram_model_trie_t *model; + ngram_model_t *base; + ngram_raw_t **raw_ngrams; + int32 is_pipe; + uint32 counts[NGRAM_MAX_ORDER]; + int order; + int i; + + (void)config; + E_INFO("Trying to read LM in arpa format\n"); + if ((fp = fopen_comp(path, "r", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", path); + return NULL; + } + + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + li = lineiter_start_clean(fp); + /* Read n-gram counts from file */ + if (read_counts_arpa(&li, counts, &order) == -1) { + ckd_free(model); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + + E_INFO("LM of order %d\n", order); + for (i = 0; i < order; i++) { + E_INFO("#%d-grams: %d\n", i + 1, counts[i]); + } + + base = &model->base; + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + base->writable = TRUE; + + model->trie = lm_trie_create(counts[0], order); + if (read_1grams_arpa(&li, counts[0], base, model->trie->unigrams) < 0) { + ngram_model_free(base); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + + if (order > 1) { + raw_ngrams = + ngrams_raw_read_arpa(&li, base->lmath, counts, order, + base->wid); + if (raw_ngrams == NULL) { + ngram_model_free(base); + lineiter_free(li); + fclose_comp(fp, is_pipe); + return NULL; + } + lm_trie_build(model->trie, raw_ngrams, counts, base->n_counts, order); + ngrams_raw_free(raw_ngrams, counts, order); + } + + lineiter_free(li); + fclose_comp(fp, is_pipe); + + return base; +} + +int +ngram_model_trie_write_arpa(ngram_model_t * base, const char *path) +{ + int i; + uint32 j; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + FILE *fp = fopen(path, "w"); + if (!fp) { + E_ERROR("Unable to open %s to write arpa LM from trie\n", path); + return -1; + } + fprintf(fp, + "This is an ARPA-format language model file, generated by CMU Sphinx\n"); + /* Write N-gram counts. */ + fprintf(fp, "\\data\\\n"); + for (i = 0; i < base->n; ++i) { + fprintf(fp, "ngram %d=%d\n", i + 1, base->n_counts[i]); + } + /* Write 1-grams */ + fprintf(fp, "\n\\1-grams:\n"); + for (j = 0; j < base->n_counts[0]; j++) { + unigram_t *unigram = &model->trie->unigrams[j]; + fprintf(fp, "%.4f\t%s", + logmath_log_float_to_log10(base->lmath, unigram->prob), + base->word_str[j]); + if (base->n > 1) { + fprintf(fp, "\t%.4f", + logmath_log_float_to_log10(base->lmath, unigram->bo)); + } + fprintf(fp, "\n"); + } + /* Write ngrams */ + if (base->n > 1) { + for (i = 2; i <= base->n; ++i) { + ngram_raw_t *raw_ngrams = + (ngram_raw_t *) ckd_calloc((size_t) base->n_counts[i - 1], + sizeof(*raw_ngrams)); + uint32 raw_ngram_idx; + uint32 j; + uint32 hist[NGRAM_MAX_ORDER]; + node_range_t range; + raw_ngram_idx = 0; + range.begin = range.end = 0; + + /* we need to iterate over a trie here. recursion should do the job */ + lm_trie_fill_raw_ngram(model->trie, raw_ngrams, + &raw_ngram_idx, base->n_counts, range, hist, 0, + i, base->n); + assert(raw_ngram_idx == base->n_counts[i - 1]); + qsort(raw_ngrams, (size_t) base->n_counts[i - 1], + sizeof(ngram_raw_t), &ngram_ord_comparator); + + fprintf(fp, "\n\\%d-grams:\n", i); + for (j = 0; j < base->n_counts[i - 1]; j++) { + int k; + fprintf(fp, "%.4f", logmath_log_float_to_log10(base->lmath, raw_ngrams[j].prob)); + for (k = 0; k < i; k++) { + fprintf(fp, "\t%s", + base->word_str[raw_ngrams[j].words[k]]); + } + ckd_free(raw_ngrams[j].words); + if (i < base->n) { + fprintf(fp, "\t%.4f", logmath_log_float_to_log10(base->lmath, raw_ngrams[j].backoff)); + } + fprintf(fp, "\n"); + } + ckd_free(raw_ngrams); + } + } + fprintf(fp, "\n\\end\\\n"); + return fclose(fp); +} + +static void +read_word_str(ngram_model_t * base, FILE * fp, int do_swap) +{ + int32 k; + uint32 i, j; + char *tmp_word_str; + /* read ascii word strings */ + base->writable = TRUE; + fread(&k, sizeof(k), 1, fp); + if (do_swap) + SWAP_INT32(&k); + E_INFO("#word_str: %d\n", k); + tmp_word_str = (char *) ckd_calloc((size_t) k, 1); + fread(tmp_word_str, 1, (size_t) k, fp); + + /* First make sure string just read contains n_counts[0] words (PARANOIA!!) */ + for (i = 0, j = 0; i < (uint32) k; i++) + if (tmp_word_str[i] == '\0') + j++; + if (j != base->n_counts[0]) { + E_ERROR + ("Error reading word strings (%d doesn't match n_unigrams %d)\n", + j, base->n_counts[0]); + } + + /* Break up string just read into words */ + j = 0; + for (i = 0; i < base->n_counts[0]; i++) { + base->word_str[i] = ckd_salloc(tmp_word_str + j); + if (hash_table_enter(base->wid, base->word_str[i], + (void *) (long) i) != (void *) (long) i) { + E_WARN("Duplicate word in dictionary: %s\n", + base->word_str[i]); + } + j += strlen(base->word_str[i]) + 1; + } + free(tmp_word_str); +} + +ngram_model_t * +ngram_model_trie_read_bin(cmd_ln_t * config, + const char *path, logmath_t * lmath) +{ + int32 is_pipe; + FILE *fp; + size_t hdr_size; + char *hdr; + int cmp_res; + uint8 i, order; + uint32 counts[NGRAM_MAX_ORDER]; + ngram_model_trie_t *model; + ngram_model_t *base; + + (void)config; + E_INFO("Trying to read LM in trie binary format\n"); + if ((fp = fopen_comp(path, "rb", &is_pipe)) == NULL) { + E_ERROR("File %s not found\n", path); + return NULL; + } + hdr_size = strlen(trie_hdr); + hdr = (char *) ckd_calloc(hdr_size + 1, sizeof(*hdr)); + fread(hdr, sizeof(*hdr), hdr_size, fp); + cmp_res = strcmp(hdr, trie_hdr); + ckd_free(hdr); + if (cmp_res) { + E_INFO("Header doesn't match\n"); + fclose_comp(fp, is_pipe); + return NULL; + } + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + base = &model->base; + fread(&order, sizeof(order), 1, fp); + for (i = 0; i < order; i++) { + fread(&counts[i], sizeof(counts[i]), 1, fp); + if (SWAP_LM_TRIE) + SWAP_INT32(&counts[i]); + E_INFO("#%d-grams: %d\n", i + 1, counts[i]); + } + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + for (i = 0; i < order; i++) { + base->n_counts[i] = counts[i]; + } + + model->trie = lm_trie_read_bin(counts, order, fp); + read_word_str(base, fp, SWAP_LM_TRIE); + fclose_comp(fp, is_pipe); + + return base; +} + +static void +write_word_str(FILE * fp, ngram_model_t * model, int do_swap) +{ + int32 k; + uint32 i; + + k = 0; + for (i = 0; i < model->n_counts[0]; i++) + k += strlen(model->word_str[i]) + 1; + E_INFO("#word_str: %d\n", k); + if (do_swap) + SWAP_INT32(&k); + fwrite(&k, sizeof(k), 1, fp); + for (i = 0; i < model->n_counts[0]; i++) + fwrite(model->word_str[i], 1, strlen(model->word_str[i]) + 1, fp); +} + +int +ngram_model_trie_write_bin(ngram_model_t * base, const char *path) +{ + int i; + int32 is_pipe; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + FILE *fp = fopen_comp(path, "wb", &is_pipe); + if (!fp) { + E_ERROR("Unable to open %s to write binary trie LM\n", path); + return -1; + } + + fwrite(trie_hdr, sizeof(*trie_hdr), strlen(trie_hdr), fp); + fwrite(&model->base.n, sizeof(model->base.n), 1, fp); + for (i = 0; i < model->base.n; i++) { + uint32 count = model->base.n_counts[i]; + if (SWAP_LM_TRIE) + SWAP_INT32(&count); + fwrite(&count, sizeof(count), 1, fp); + } + lm_trie_write_bin(model->trie, base->n_counts[0], fp); + write_word_str(fp, base, SWAP_LM_TRIE); + fclose_comp(fp, is_pipe); + return 0; +} + +ngram_model_t * +ngram_model_trie_read_dmp(cmd_ln_t * config, + const char *file_name, logmath_t * lmath) +{ + uint8 do_swap; + int32 is_pipe; + int32 k; + uint32 j; + int32 vn, ts; + int32 count; + uint32 counts[3]; + uint32 *unigram_next; + int order; + char str[1024]; + FILE *fp; + ngram_model_trie_t *model; + ngram_model_t *base; + ngram_raw_t **raw_ngrams; + + (void)config; + E_INFO("Trying to read LM in dmp format\n"); + if ((fp = fopen_comp(file_name, "rb", &is_pipe)) == NULL) { + E_ERROR("Dump file %s not found\n", file_name); + return NULL; + } + + do_swap = FALSE; + fread(&k, sizeof(k), 1, fp); + if (k != strlen(dmp_hdr) + 1) { + SWAP_INT32(&k); + if (k != strlen(dmp_hdr) + 1) { + E_ERROR + ("Wrong magic header size number %x: %s is not a dump file\n", + k, file_name); + return NULL; + } + do_swap = 1; + } + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Cannot read header\n"); + return NULL; + } + if (strncmp(str, dmp_hdr, k) != 0) { + E_ERROR("Wrong header %s: %s is not a dump file\n", dmp_hdr); + return NULL; + } + + if (fread(&k, sizeof(k), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&k); + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Cannot read LM filename in header\n"); + return NULL; + } + + /* read version#, if present (must be <= 0) */ + if (fread(&vn, sizeof(vn), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&vn); + if (vn <= 0) { + /* read and don't compare timestamps (we don't care) */ + if (fread(&ts, sizeof(ts), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&ts); + + /* read and skip format description */ + for (;;) { + if (fread(&k, sizeof(k), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&k); + if (k == 0) + break; + if (fread(str, 1, k, fp) != (size_t) k) { + E_ERROR("Failed to read word\n"); + return NULL; + } + } + /* read model->ucount */ + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[0] = count; + } + else { + counts[0] = vn; + } + /* read model->bcount, tcount */ + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[1] = count; + if (fread(&count, sizeof(count), 1, fp) != 1) + return NULL; + if (do_swap) + SWAP_INT32(&count); + counts[2] = count; + E_INFO("ngrams 1=%d, 2=%d, 3=%d\n", counts[0], counts[1], counts[2]); + + model = (ngram_model_trie_t *) ckd_calloc(1, sizeof(*model)); + base = &model->base; + if (counts[2] > 0) + order = 3; + else if (counts[1] > 0) + order = 2; + else + order = 1; + ngram_model_init(base, &ngram_model_trie_funcs, lmath, order, + (int32) counts[0]); + + model->trie = lm_trie_create(counts[0], order); + + unigram_next = + (uint32 *) ckd_calloc((int32) counts[0] + 1, sizeof(unigram_next)); + for (j = 0; j <= counts[0]; j++) { + int32 bigrams; + int32 mapid; + dmp_weight_t weightp; + dmp_weight_t weightb; + + /* Skip over the mapping ID, we don't care about it. */ + /* Read the weights from actual unigram structure. */ + fread(&mapid, sizeof(int32), 1, fp); + fread(&weightp, sizeof(weightp), 1, fp); + fread(&weightb, sizeof(weightb), 1, fp); + fread(&bigrams, sizeof(int32), 1, fp); + if (do_swap) { + SWAP_INT32(&weightp.l); + SWAP_INT32(&weightb.l); + SWAP_INT32(&bigrams); + } + model->trie->unigrams[j].prob = logmath_log10_to_log_float(lmath, weightp.f); + model->trie->unigrams[j].bo = logmath_log10_to_log_float(lmath, weightb.f); + model->trie->unigrams[j].next = bigrams; + unigram_next[j] = bigrams; + } + + if (order > 1) { + raw_ngrams = + ngrams_raw_read_dmp(fp, lmath, counts, order, unigram_next, + do_swap); + if (raw_ngrams == NULL) { + ngram_model_free(base); + ckd_free(unigram_next); + fclose_comp(fp, is_pipe); + return NULL; + } + lm_trie_build(model->trie, raw_ngrams, counts, base->n_counts, order); + ngrams_raw_free(raw_ngrams, counts, order); + } + + /* Sentinel unigram and bigrams read before */ + ckd_free(unigram_next); + + /* read ascii word strings */ + read_word_str(base, fp, do_swap); + + fclose_comp(fp, is_pipe); + return base; +} + +static void +ngram_model_trie_free(ngram_model_t * base) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + lm_trie_free(model->trie); +} + +static int +trie_apply_weights(ngram_model_t * base, float32 lw, float32 wip) +{ + /* just update weights that are going to be used on score calculation */ + base->lw = lw; + base->log_wip = logmath_log(base->lmath, wip); + return 0; +} + +static int32 +weight_score(ngram_model_t * base, int32 score) +{ + return (int32) (score * base->lw + base->log_wip); +} + +static int32 +ngram_model_trie_raw_score(ngram_model_t * base, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + int32 i; + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + + if (n_hist > model->base.n - 1) + n_hist = model->base.n - 1; + for (i = 0; i < n_hist; i++) { + if (hist[i] < 0) { + n_hist = i; + break; + } + } + + return (int32) lm_trie_score(model->trie, model->base.n, wid, hist, + n_hist, n_used); +} + +static int32 +ngram_model_trie_score(ngram_model_t * base, int32 wid, int32 * hist, + int32 n_hist, int32 * n_used) +{ + return weight_score(base, + ngram_model_trie_raw_score(base, wid, hist, n_hist, + n_used)); +} + +static int32 +lm_trie_add_ug(ngram_model_t * base, int32 wid, int32 lweight) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + + /* This would be very bad if this happened! */ + assert(!NGRAM_IS_CLASSWID(wid)); + + /* Reallocate unigram array. */ + model->trie->unigrams = + (unigram_t *) ckd_realloc(model->trie->unigrams, + sizeof(*model->trie->unigrams) * + (base->n_1g_alloc + 1)); + memset(model->trie->unigrams + (base->n_counts[0] + 1), 0, + (size_t) (base->n_1g_alloc - + base->n_counts[0]) * sizeof(*model->trie->unigrams)); + ++base->n_counts[0]; + lweight += logmath_log(base->lmath, 1.0 / base->n_counts[0]); + model->trie->unigrams[wid + 1].next = model->trie->unigrams[wid].next; + model->trie->unigrams[wid].prob = (float) lweight; + /* This unigram by definition doesn't participate in any bigrams, + * so its backoff weight is undefined and next pointer same as in finish unigram*/ + model->trie->unigrams[wid].bo = 0; + /* Finally, increase the unigram count */ + /* FIXME: Note that this can actually be quite bogus due to the + * presence of class words. If wid falls outside the unigram + * count, increase it to compensate, at the cost of no longer + * really knowing how many unigrams we have :( */ + if ((uint32) wid >= base->n_counts[0]) + base->n_counts[0] = wid + 1; + + return (int32) weight_score(base, lweight); +} + +static void +lm_trie_flush(ngram_model_t * base) +{ + ngram_model_trie_t *model = (ngram_model_trie_t *) base; + lm_trie_t *trie = model->trie; + memset(trie->hist_cache, -1, sizeof(trie->hist_cache)); + memset(trie->backoff_cache, 0, sizeof(trie->backoff_cache)); + return; +} + +static ngram_funcs_t ngram_model_trie_funcs = { + ngram_model_trie_free, /* free */ + trie_apply_weights, /* apply_weights */ + ngram_model_trie_score, /* score */ + ngram_model_trie_raw_score, /* raw_score */ + lm_trie_add_ug, /* add_ug */ + lm_trie_flush /* flush */ +}; diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h new file mode 100644 index 0000000..bc73df6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h @@ -0,0 +1,82 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#ifndef __NGRAM_MODEL_TRIE_H__ +#define __NGRAM_MODEL_TRIE_H__ + +#include +#include + +#include "ngram_model_internal.h" +#include "lm_trie.h" + +typedef struct ngram_model_trie_s { + ngram_model_t base; /**< Base ngram_model_t structure */ + lm_trie_t *trie; /**< Trie structure that stores ngram relations and weights */ +} ngram_model_trie_t; + +/** + * Read N-Gram model from and ARPABO text file and arrange it in trie structure + */ +ngram_model_t *ngram_model_trie_read_arpa(cmd_ln_t * config, + const char *path, + logmath_t * lmath); + +/** + * Write N-Gram model stored in trie structure in ARPABO format + */ +int ngram_model_trie_write_arpa(ngram_model_t * base, const char *path); + +/** + * Read N-Gram model from the binary file and arrange it in a trie structure + */ +ngram_model_t *ngram_model_trie_read_bin(cmd_ln_t * config, + const char *path, + logmath_t * lmath); + +/** + * Write trie to binary file + */ +int ngram_model_trie_write_bin(ngram_model_t * model, const char *path); + +/** + * Read N-Gram model from DMP file and arrange it in trie structure + */ +ngram_model_t *ngram_model_trie_read_dmp(cmd_ln_t * config, + const char *file_name, + logmath_t * lmath); + +#endif /* __NGRAM_MODEL_TRIE_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c new file mode 100644 index 0000000..0ff9f9a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c @@ -0,0 +1,387 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include + +#include +#include +#include +#include +#include + +#include "ngram_model_internal.h" +#include "ngrams_raw.h" + +int +ngram_ord_comparator(const void *a_raw, const void *b_raw) +{ + ngram_raw_t *a = (ngram_raw_t *) a_raw; + ngram_raw_t *b = (ngram_raw_t *) b_raw; + int a_w_ptr = 0; + int b_w_ptr = 0; + while ((uint32)a_w_ptr < a->order && (uint32)b_w_ptr < b->order) { + if (a->words[a_w_ptr] == b->words[b_w_ptr]) { + a_w_ptr++; + b_w_ptr++; + continue; + } + if (a->words[a_w_ptr] < b->words[b_w_ptr]) + return -1; + else + return 1; + } + return a->order - b->order; +} + +static int +ngrams_raw_read_line(lineiter_t *li, hash_table_t *wid, + logmath_t *lmath, int order, int order_max, + ngram_raw_t *raw_ngram) +{ + int n, i; + int words_expected; + char *wptr[NGRAM_MAX_ORDER + 1]; + uint32 *word_out; + + words_expected = order + 1; + if ((n = + str2words(li->buf, wptr, + NGRAM_MAX_ORDER + 1)) < words_expected) { + E_ERROR("Format error; %d-gram ignored at line %d\n", order, li->lineno); + return -1; + } + + raw_ngram->order = order; + + if (order == order_max) { + raw_ngram->prob = atof_c(wptr[0]); + if (raw_ngram->prob > 0) { + E_WARN("%d-gram '%s' has positive probability\n", order, wptr[1]); + raw_ngram->prob = 0.0f; + } + raw_ngram->prob = + logmath_log10_to_log_float(lmath, raw_ngram->prob); + } + else { + float weight, backoff; + + weight = atof_c(wptr[0]); + if (weight > 0) { + E_WARN("%d-gram '%s' has positive probability\n", order, wptr[1]); + raw_ngram->prob = 0.0f; + } + else { + raw_ngram->prob = + logmath_log10_to_log_float(lmath, weight); + } + + if (n == order + 1) { + raw_ngram->backoff = 0.0f; + } + else { + backoff = atof_c(wptr[order + 1]); + raw_ngram->backoff = + logmath_log10_to_log_float(lmath, backoff); + } + } + raw_ngram->words = + (uint32 *) ckd_calloc(order, sizeof(*raw_ngram->words)); + for (word_out = raw_ngram->words + order - 1, i = 1; + word_out >= raw_ngram->words; --word_out, i++) { + hash_table_lookup_int32(wid, wptr[i], (int32 *) word_out); + } + return 0; +} + +static int +ngrams_raw_read_section(ngram_raw_t ** raw_ngrams, lineiter_t ** li, + hash_table_t * wid, logmath_t * lmath, uint32 *count, + int order, int order_max) +{ + char expected_header[20]; + uint32 i, cur; + + sprintf(expected_header, "\\%d-grams:", order); + while (*li && strcmp((*li)->buf, expected_header) != 0) { + *li = lineiter_next(*li); + } + + if (*li == NULL) { + E_ERROR("Failed to find '%s', language model file truncated\n", expected_header); + return -1; + } + + *raw_ngrams = (ngram_raw_t *) ckd_calloc(*count, sizeof(ngram_raw_t)); + for (i = 0, cur = 0; i < *count && *li != NULL; i++) { + *li = lineiter_next(*li); + if (*li == NULL) { + E_ERROR("Unexpected end of ARPA file. Failed to read %d-gram\n", + order); + return -1; + } + if (ngrams_raw_read_line(*li, wid, lmath, order, order_max, + *raw_ngrams + cur) == 0) { + cur++; + } + } + *count = cur; + qsort(*raw_ngrams, *count, sizeof(ngram_raw_t), &ngram_ord_comparator); + return 0; +} + +ngram_raw_t ** +ngrams_raw_read_arpa(lineiter_t ** li, logmath_t * lmath, uint32 * counts, + int order, hash_table_t * wid) +{ + ngram_raw_t **raw_ngrams; + int order_it; + + raw_ngrams = + (ngram_raw_t **) ckd_calloc(order - 1, sizeof(*raw_ngrams)); + + for (order_it = 2; order_it <= order; order_it++) { + if (ngrams_raw_read_section(&raw_ngrams[order_it - 2], li, wid, lmath, + counts + order_it - 1, order_it, order) < 0) + break; + } + + /* Check if we found ARPA end-mark */ + if (*li == NULL) { + E_ERROR("ARPA file ends without end-mark\n"); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } else { + *li = lineiter_next(*li); + if (strcmp((*li)->buf, "\\end\\") != 0) { + E_WARN + ("Finished reading ARPA file. Expecting end mark but found '%s'\n", + (*li)->buf); + } + } + + return raw_ngrams; +} + +static void +read_dmp_weight_array(FILE * fp, logmath_t * lmath, uint8 do_swap, + int32 counts, ngram_raw_t * raw_ngrams, + int weight_idx) +{ + int32 i, k; + dmp_weight_t *tmp_weight_arr; + + fread(&k, sizeof(k), 1, fp); + if (do_swap) + SWAP_INT32(&k); + tmp_weight_arr = + (dmp_weight_t *) ckd_calloc(k, sizeof(*tmp_weight_arr)); + fread(tmp_weight_arr, sizeof(*tmp_weight_arr), k, fp); + for (i = 0; i < k; i++) { + if (do_swap) + SWAP_INT32(&tmp_weight_arr[i].l); + /* Convert values to log. */ + tmp_weight_arr[i].f = + logmath_log10_to_log_float(lmath, tmp_weight_arr[i].f); + } + /* replace indexes with real probs in raw bigrams */ + for (i = 0; i < counts; i++) { + if (weight_idx == 0) { + raw_ngrams[i].prob = + tmp_weight_arr[(int) raw_ngrams[i].prob].f; + } else { + raw_ngrams[i].backoff = + tmp_weight_arr[(int) raw_ngrams[i].backoff].f; + } + } + ckd_free(tmp_weight_arr); +} + +#define BIGRAM_SEGMENT_SIZE 9 + +ngram_raw_t ** +ngrams_raw_read_dmp(FILE * fp, logmath_t * lmath, uint32 * counts, + int order, uint32 * unigram_next, uint8 do_swap) +{ + uint32 j, ngram_idx; + uint16 *bigrams_next; + ngram_raw_t **raw_ngrams = + (ngram_raw_t **) ckd_calloc(order - 1, sizeof(*raw_ngrams)); + + /* read bigrams */ + raw_ngrams[0] = + (ngram_raw_t *) ckd_calloc((size_t) (counts[1] + 1), + sizeof(*raw_ngrams[0])); + bigrams_next = + (uint16 *) ckd_calloc((size_t) (counts[1] + 1), + sizeof(*bigrams_next)); + ngram_idx = 1; + for (j = 0; j <= counts[1]; j++) { + uint16 wid, prob_idx, bo_idx; + ngram_raw_t *raw_ngram = &raw_ngrams[0][j]; + + fread(&wid, sizeof(wid), 1, fp); + if (do_swap) + SWAP_INT16(&wid); + raw_ngram->order = 2; + while (ngram_idx < counts[0] && j == unigram_next[ngram_idx]) { + ngram_idx++; + } + + if (j != counts[1]) { + raw_ngram->words = + (uint32 *) ckd_calloc(2, sizeof(*raw_ngram->words)); + raw_ngram->words[0] = (uint32) wid; + raw_ngram->words[1] = (uint32) ngram_idx - 1; + } + + fread(&prob_idx, sizeof(prob_idx), 1, fp); + fread(&bo_idx, sizeof(bo_idx), 1, fp); + fread(&bigrams_next[j], sizeof(bigrams_next[j]), 1, fp); + if (do_swap) { + SWAP_INT16(&prob_idx); + SWAP_INT16(&bo_idx); + SWAP_INT16(&bigrams_next[j]); + } + + if (j != counts[1]) { + raw_ngram->prob = prob_idx + 0.5f; /* keep index in float. ugly but avoiding using extra memory */ + raw_ngram->backoff = bo_idx + 0.5f; + } + } + + if (ngram_idx < counts[0]) { + E_ERROR("Corrupted model, not enough unigrams %d %d\n", ngram_idx, counts[0]); + ckd_free(bigrams_next); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } + + /* read trigrams */ + if (order > 2) { + raw_ngrams[1] = + (ngram_raw_t *) ckd_calloc((size_t) counts[2], + sizeof(*raw_ngrams[1])); + for (j = 0; j < counts[2]; j++) { + uint16 wid, prob_idx; + ngram_raw_t *raw_ngram = &raw_ngrams[1][j]; + + fread(&wid, sizeof(wid), 1, fp); + fread(&prob_idx, sizeof(prob_idx), 1, fp); + if (do_swap) { + SWAP_INT16(&wid); + SWAP_INT16(&prob_idx); + } + + raw_ngram->order = 3; + raw_ngram->words = + (uint32 *) ckd_calloc(3, sizeof(*raw_ngram->words)); + raw_ngram->words[0] = (uint32) wid; + raw_ngram->prob = prob_idx + 0.5f; /* keep index in float. ugly but avoiding using extra memory */ + } + } + + /* read prob2 */ + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[1], + raw_ngrams[0], 0); + /* read bo2 */ + if (order > 2) { + int32 k; + int32 *tseg_base; + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[1], + raw_ngrams[0], 1); + /* read prob3 */ + read_dmp_weight_array(fp, lmath, do_swap, (int32) counts[2], + raw_ngrams[1], 0); + /* Read tseg_base size and tseg_base to fill trigram's first words */ + fread(&k, sizeof(k), 1, fp); + if (do_swap) + SWAP_INT32(&k); + tseg_base = (int32 *) ckd_calloc(k, sizeof(int32)); + fread(tseg_base, sizeof(int32), k, fp); + if (do_swap) { + for (j = 0; j < (uint32) k; j++) { + SWAP_INT32(&tseg_base[j]); + } + } + ngram_idx = 0; + for (j = 1; j <= counts[1]; j++) { + uint32 next_ngram_idx = + (uint32) (tseg_base[j >> BIGRAM_SEGMENT_SIZE] + + bigrams_next[j]); + while (ngram_idx < next_ngram_idx) { + raw_ngrams[1][ngram_idx].words[1] = + raw_ngrams[0][j - 1].words[0]; + raw_ngrams[1][ngram_idx].words[2] = + raw_ngrams[0][j - 1].words[1]; + ngram_idx++; + } + } + ckd_free(tseg_base); + + if (ngram_idx < counts[2]) { + E_ERROR("Corrupted model, some trigrams have no corresponding bigram\n"); + ckd_free(bigrams_next); + ngrams_raw_free(raw_ngrams, counts, order); + return NULL; + } + } + ckd_free(bigrams_next); + + /* sort raw ngrams for reverse trie */ + qsort(raw_ngrams[0], (size_t) counts[1], sizeof(*raw_ngrams[0]), + &ngram_ord_comparator); + if (order > 2) { + qsort(raw_ngrams[1], (size_t) counts[2], sizeof(*raw_ngrams[1]), + &ngram_ord_comparator); + } + return raw_ngrams; +} + +void +ngrams_raw_free(ngram_raw_t ** raw_ngrams, uint32 * counts, int order) +{ + uint32 num; + int order_it; + + for (order_it = 0; order_it < order - 1; order_it++) { + for (num = 0; num < counts[order_it + 1]; num++) { + ckd_free(raw_ngrams[order_it][num].words); + } + ckd_free(raw_ngrams[order_it]); + } + ckd_free(raw_ngrams); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h new file mode 100644 index 0000000..725d09a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h @@ -0,0 +1,94 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef __NGRAMS_RAW_H__ +#define __NGRAMS_RAW_H__ + +#include +#include +#include +#include +#include + +typedef struct ngram_raw_s { + uint32 *words; /* array of word indexes, length corresponds to ngram order */ + float32 prob; + float32 backoff; + uint32 order; +} ngram_raw_t; + +typedef union { + float32 f; + int32 l; +} dmp_weight_t; + +/** + * Raw ordered ngrams comparator + */ +int ngram_ord_comparator(const void *a_raw, const void *b_raw); + +/** + * Read ngrams of order > 1 from ARPA file + * @param li [in] sphinxbase file line iterator that point to bigram description in ARPA file + * @param wid [in] hashtable that maps string word representation to id + * @param lmath [in] log math used for log convertions + * @param counts [in] amount of ngrams for each order + * @param order [in] maximum order of ngrams + * @return raw ngrams of order bigger than 1 + */ +ngram_raw_t **ngrams_raw_read_arpa(lineiter_t ** li, logmath_t * lmath, + uint32 * counts, int order, + hash_table_t * wid); + +/** + * Reads ngrams of order > 1 from DMP file. + * @param fp [in] file to read from. Position in file corresponds to start of bigram description + * @param lmath [in] log math used for log convertions + * @param counts [in] amount of ngrams for each order + * @param order [in] maximum order of ngrams + * @param unigram_next [in] array of next word pointers for unigrams. Needed to define forst word of bigrams + * @param do_swap [in] wether to do swap of bits + * @return raw ngrams of order bigger than 1 + */ +ngram_raw_t **ngrams_raw_read_dmp(FILE * fp, logmath_t * lmath, + uint32 * counts, int order, + uint32 * unigram_next, uint8 do_swap); + +void ngrams_raw_free(ngram_raw_t ** raw_ngrams, uint32 * counts, + int order); + +#endif /* __LM_NGRAMS_RAW_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c new file mode 100644 index 0000000..c78b0e1 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c @@ -0,0 +1,766 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * mdef.c -- HMM model definition: base (CI) phones and triphones + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * + * 22-Nov-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Imported from s3.2, for supporting s3 format continuous + * acoustic models. + * + * 14-Oct-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added mdef_sseq2sen_active(). + * + * 06-May-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * In mdef_phone_id(), added backing off to silence phone context from filler + * context if original triphone not found. + * + * 30-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added senone-sequence id (ssid) to phone_t and appropriate functions to + * maintain it. Instead, moved state sequence info to mdef_t. + * + * 13-Jul-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Added mdef_phone_str(). + * + * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Allowed mdef_phone_id_nearest to return base phone id if either + * left or right context (or both) is undefined. + * + * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Created. + */ + + +/* + * Major assumptions: + * All phones have same #states, same topology. + * Every phone has exactly one non-emitting, final state--the last one. + * CI phones must appear first in model definition file. + */ + +/* System headers. */ +#include +#include +#include +#include + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include "mdef.h" + + +#define MODEL_DEF_VERSION "0.3" + +static void +ciphone_add(mdef_t * m, char *ci, int p) +{ + assert(p < m->n_ciphone); + + m->ciphone[p].name = (char *) ckd_salloc(ci); /* freed in mdef_free */ + if (hash_table_enter(m->ciphone_ht, m->ciphone[p].name, + (void *)(long)p) != (void *)(long)p) + E_FATAL("hash_table_enter(%s) failed; duplicate CIphone?\n", + m->ciphone[p].name); +} + + +static ph_lc_t * +find_ph_lc(ph_lc_t * lclist, int lc) +{ + ph_lc_t *lcptr; + + for (lcptr = lclist; lcptr && (lcptr->lc != lc); lcptr = lcptr->next); + return lcptr; +} + + +static ph_rc_t * +find_ph_rc(ph_rc_t * rclist, int rc) +{ + ph_rc_t *rcptr; + + for (rcptr = rclist; rcptr && (rcptr->rc != rc); rcptr = rcptr->next); + return rcptr; +} + + +static void +triphone_add(mdef_t * m, + int ci, int lc, int rc, word_posn_t wpos, + int p) +{ + ph_lc_t *lcptr; + ph_rc_t *rcptr; + + assert(p < m->n_phone); + + /* Fill in phone[p] information (state and tmat mappings added later) */ + m->phone[p].ci = ci; + m->phone[p].lc = lc; + m->phone[p].rc = rc; + m->phone[p].wpos = wpos; + + /* Create -> p mapping if not a CI phone */ + if (p >= m->n_ciphone) { + if ((lcptr = find_ph_lc(m->wpos_ci_lclist[wpos][(int) ci], lc)) + == NULL) { + lcptr = (ph_lc_t *) ckd_calloc(1, sizeof(ph_lc_t)); /* freed at mdef_free, I believe */ + lcptr->lc = lc; + lcptr->next = m->wpos_ci_lclist[wpos][(int) ci]; + m->wpos_ci_lclist[wpos][(int) ci] = lcptr; /* This is what needs to be freed */ + } + if ((rcptr = find_ph_rc(lcptr->rclist, rc)) != NULL) { + __BIGSTACKVARIABLE__ char buf[4096]; + + mdef_phone_str(m, rcptr->pid, buf); + E_FATAL("Duplicate triphone: %s\n", buf); + } + + rcptr = (ph_rc_t *) ckd_calloc(1, sizeof(ph_rc_t)); /* freed in mdef_free, I believe */ + rcptr->rc = rc; + rcptr->pid = p; + rcptr->next = lcptr->rclist; + lcptr->rclist = rcptr; + } +} + + +int +mdef_ciphone_id(mdef_t * m, char *ci) +{ + int32 id; + if (hash_table_lookup_int32(m->ciphone_ht, ci, &id) < 0) + return -1; + return id; +} + + +const char * +mdef_ciphone_str(mdef_t * m, int id) +{ + assert(m); + assert((id >= 0) && (id < m->n_ciphone)); + + return (m->ciphone[id].name); +} + + +int +mdef_phone_str(mdef_t * m, int pid, char *buf) +{ + char *wpos_name; + + assert(m); + assert((pid >= 0) && (pid < m->n_phone)); + wpos_name = WPOS_NAME; + + buf[0] = '\0'; + if (pid < m->n_ciphone) + sprintf(buf, "%s", mdef_ciphone_str(m, pid)); + else { + sprintf(buf, "%s %s %s %c", + mdef_ciphone_str(m, m->phone[pid].ci), + mdef_ciphone_str(m, m->phone[pid].lc), + mdef_ciphone_str(m, m->phone[pid].rc), + wpos_name[m->phone[pid].wpos]); + } + return 0; +} + + +int +mdef_phone_id(mdef_t * m, + int ci, int lc, int rc, word_posn_t wpos) +{ + ph_lc_t *lcptr; + ph_rc_t *rcptr; + int newl, newr; + + assert(m); + assert((ci >= 0) && (ci < m->n_ciphone)); + assert((lc >= 0) && (lc < m->n_ciphone)); + assert((rc >= 0) && (rc < m->n_ciphone)); + assert((wpos >= 0) && (wpos < N_WORD_POSN)); + + if (((lcptr = + find_ph_lc(m->wpos_ci_lclist[wpos][(int) ci], lc)) == NULL) + || ((rcptr = find_ph_rc(lcptr->rclist, rc)) == NULL)) { + /* Not found; backoff to silence context if non-silence filler context */ + if (m->sil < 0) + return -1; + + newl = m->ciphone[(int) lc].filler ? m->sil : lc; + newr = m->ciphone[(int) rc].filler ? m->sil : rc; + if ((newl == lc) && (newr == rc)) + return -1; + + return (mdef_phone_id(m, ci, newl, newr, wpos)); + } + + return (rcptr->pid); +} + +int +mdef_is_ciphone(mdef_t * m, int p) +{ + assert(m); + assert((p >= 0) && (p < m->n_phone)); + + return ((p < m->n_ciphone) ? 1 : 0); +} + +int +mdef_is_cisenone(mdef_t * m, int s) +{ + assert(m); + if (s >= m->n_sen) { + return 0; + } + assert(s >= 0); + return ((s == m->cd2cisen[s]) ? 1 : 0); +} + + +/* Parse tmat and state->senone mappings for phone p and fill in structure */ +static void +parse_tmat_senmap(mdef_t * m, char *line, long off, int p) +{ + int32 wlen, n, s; + char *lp; + __BIGSTACKVARIABLE__ char word[1024]; + + lp = line + off; + + /* Read transition matrix id */ + if ((sscanf(lp, "%d%n", &n, &wlen) != 1) || (n < 0)) + E_FATAL("Missing or bad transition matrix id: %s\n", line); + m->phone[p].tmat = n; + if (m->n_tmat <= n) + E_FATAL("tmat-id(%d) > #tmat in header(%d): %s\n", n, m->n_tmat, + line); + lp += wlen; + + /* Read senone mappings for each emitting state */ + for (n = 0; n < m->n_emit_state; n++) { + if ((sscanf(lp, "%d%n", &s, &wlen) != 1) || (s < 0)) + E_FATAL("Missing or bad state[%d]->senone mapping: %s\n", n, + line); + + if ((p < m->n_ciphone) && (m->n_ci_sen <= s)) + E_FATAL("CI-senone-id(%d) > #CI-senones(%d): %s\n", s, + m->n_ci_sen, line); + if (m->n_sen <= s) + E_FATAL("Senone-id(%d) > #senones(%d): %s\n", s, m->n_sen, + line); + + m->sseq[p][n] = s; + lp += wlen; + } + + /* Check for the last non-emitting state N */ + if ((sscanf(lp, "%s%n", word, &wlen) != 1) || (strcmp(word, "N") != 0)) + E_FATAL("Missing non-emitting state spec: %s\n", line); + lp += wlen; + + /* Check for end of line */ + if (sscanf(lp, "%s%n", word, &wlen) == 1) + E_FATAL("Non-empty beyond non-emitting final state: %s\n", line); +} + + +static void +parse_base_line(mdef_t * m, char *line, int p) +{ + int32 wlen, n; + __BIGSTACKVARIABLE__ char word[1024], *lp; + int ci; + + lp = line; + + /* Read base phone name */ + if (sscanf(lp, "%s%n", word, &wlen) != 1) + E_FATAL("Missing base phone name: %s\n", line); + lp += wlen; + + /* Make sure it's not a duplicate */ + ci = mdef_ciphone_id(m, word); + if (ci >= 0) + E_FATAL("Duplicate base phone: %s\n", line); + + /* Add ciphone to ciphone table with id p */ + ciphone_add(m, word, p); + ci = (int) p; + + /* Read and skip "-" for lc, rc, wpos */ + for (n = 0; n < 3; n++) { + if ((sscanf(lp, "%s%n", word, &wlen) != 1) + || (strcmp(word, "-") != 0)) + E_FATAL("Bad context info for base phone: %s\n", line); + lp += wlen; + } + + /* Read filler attribute, if present */ + if (sscanf(lp, "%s%n", word, &wlen) != 1) + E_FATAL("Missing filler attribute field: %s\n", line); + lp += wlen; + if (strcmp(word, "filler") == 0) + m->ciphone[(int) ci].filler = 1; + else if (strcmp(word, "n/a") == 0) + m->ciphone[(int) ci].filler = 0; + else + E_FATAL("Bad filler attribute field: %s\n", line); + + triphone_add(m, ci, -1, -1, WORD_POSN_UNDEFINED, p); + + /* Parse remainder of line: transition matrix and state->senone mappings */ + parse_tmat_senmap(m, line, lp - line, p); +} + + +static void +parse_tri_line(mdef_t * m, char *line, int p) +{ + int32 wlen; + __BIGSTACKVARIABLE__ char word[1024], *lp; + int ci, lc, rc; + word_posn_t wpos = WORD_POSN_BEGIN; + + lp = line; + + /* Read base phone name */ + if (sscanf(lp, "%s%n", word, &wlen) != 1) + E_FATAL("Missing base phone name: %s\n", line); + lp += wlen; + + ci = mdef_ciphone_id(m, word); + if (ci < 0) + E_FATAL("Unknown base phone: %s\n", line); + + /* Read lc */ + if (sscanf(lp, "%s%n", word, &wlen) != 1) + E_FATAL("Missing left context: %s\n", line); + lp += wlen; + lc = mdef_ciphone_id(m, word); + if (lc < 0) + E_FATAL("Unknown left context: %s\n", line); + + /* Read rc */ + if (sscanf(lp, "%s%n", word, &wlen) != 1) + E_FATAL("Missing right context: %s\n", line); + lp += wlen; + rc = mdef_ciphone_id(m, word); + if (rc < 0) + E_FATAL("Unknown right context: %s\n", line); + + /* Read tripone word-position within word */ + if ((sscanf(lp, "%s%n", word, &wlen) != 1) || (word[1] != '\0')) + E_FATAL("Missing or bad word-position spec: %s\n", line); + lp += wlen; + switch (word[0]) { + case 'b': + wpos = WORD_POSN_BEGIN; + break; + case 'e': + wpos = WORD_POSN_END; + break; + case 's': + wpos = WORD_POSN_SINGLE; + break; + case 'i': + wpos = WORD_POSN_INTERNAL; + break; + default: + E_FATAL("Bad word-position spec: %s\n", line); + } + + /* Read filler attribute, if present. Must match base phone attribute */ + if (sscanf(lp, "%s%n", word, &wlen) != 1) + E_FATAL("Missing filler attribute field: %s\n", line); + lp += wlen; + if (((strcmp(word, "filler") == 0) && (m->ciphone[(int) ci].filler)) || + ((strcmp(word, "n/a") == 0) && (!m->ciphone[(int) ci].filler))) { + /* Everything is fine */ + } + else + E_FATAL("Bad filler attribute field: %s\n", line); + + triphone_add(m, ci, lc, rc, wpos, p); + + /* Parse remainder of line: transition matrix and state->senone mappings */ + parse_tmat_senmap(m, line, lp - line, p); +} + + +static void +sseq_compress(mdef_t * m) +{ + hash_table_t *h; + uint16 **sseq; + int32 n_sseq; + int32 p, j, k; + glist_t g; + gnode_t *gn; + hash_entry_t *he; + + k = m->n_emit_state * sizeof(int16); + + h = hash_table_new(m->n_phone, HASH_CASE_YES); + n_sseq = 0; + + /* Identify unique senone-sequence IDs. BUG: tmat-id not being considered!! */ + for (p = 0; p < m->n_phone; p++) { + /* Add senone sequence to hash table */ + if (n_sseq + == (j = hash_table_enter_bkey_int32(h, (char *)m->sseq[p], k, n_sseq))) + n_sseq++; + + m->phone[p].ssid = j; + } + + /* Generate compacted sseq table */ + sseq = ckd_calloc_2d(n_sseq, m->n_emit_state, sizeof(**sseq)); /* freed in mdef_free() */ + + g = hash_table_tolist(h, &j); + assert(j == n_sseq); + + for (gn = g; gn; gn = gnode_next(gn)) { + he = (hash_entry_t *) gnode_ptr(gn); + j = (int32)(long)hash_entry_val(he); + memcpy(sseq[j], hash_entry_key(he), k); + } + glist_free(g); + + /* Free the old, temporary senone sequence table, replace with compacted one */ + ckd_free_2d(m->sseq); + m->sseq = sseq; + m->n_sseq = n_sseq; + + hash_table_free(h); +} + + +static int32 +noncomment_line(char *line, int32 size, FILE * fp) +{ + while (fgets(line, size, fp) != NULL) { + if (line[0] != '#') + return 0; + } + return -1; +} + + +/* + * Initialize phones (ci and triphones) and state->senone mappings from .mdef file. + */ +mdef_t * +mdef_init(char *mdeffile, int32 breport) +{ + FILE *fp; + int32 n_ci, n_tri, n_map, n; + __BIGSTACKVARIABLE__ char tag[1024], buf[1024]; + uint16 **senmap; + int p; + int32 s, ci, cd; + mdef_t *m; + + if (!mdeffile) + E_FATAL("No mdef-file\n"); + + if (breport) + E_INFO("Reading model definition: %s\n", mdeffile); + + m = (mdef_t *) ckd_calloc(1, sizeof(mdef_t)); /* freed in mdef_free */ + + if ((fp = fopen(mdeffile, "r")) == NULL) + E_FATAL_SYSTEM("Failed to open mdef file '%s' for reading", mdeffile); + + if (noncomment_line(buf, sizeof(buf), fp) < 0) + E_FATAL("Empty file: %s\n", mdeffile); + + if (strncmp(buf, "BMDF", 4) == 0 || strncmp(buf, "FDMB", 4) == 0) { + E_INFO + ("Found byte-order mark %.4s, assuming this is a binary mdef file\n", + buf); + fclose(fp); + ckd_free(m); + return NULL; + } + if (strncmp(buf, MODEL_DEF_VERSION, strlen(MODEL_DEF_VERSION)) != 0) + E_FATAL("Version error: Expecing %s, but read %s\n", + MODEL_DEF_VERSION, buf); + + /* Read #base phones, #triphones, #senone mappings defined in header */ + n_ci = -1; + n_tri = -1; + n_map = -1; + m->n_ci_sen = -1; + m->n_sen = -1; + m->n_tmat = -1; + do { + if (noncomment_line(buf, sizeof(buf), fp) < 0) + E_FATAL("Incomplete header\n"); + + if ((sscanf(buf, "%d %s", &n, tag) != 2) || (n < 0)) + E_FATAL("Error in header: %s\n", buf); + + if (strcmp(tag, "n_base") == 0) + n_ci = n; + else if (strcmp(tag, "n_tri") == 0) + n_tri = n; + else if (strcmp(tag, "n_state_map") == 0) + n_map = n; + else if (strcmp(tag, "n_tied_ci_state") == 0) + m->n_ci_sen = n; + else if (strcmp(tag, "n_tied_state") == 0) + m->n_sen = n; + else if (strcmp(tag, "n_tied_tmat") == 0) + m->n_tmat = n; + else + E_FATAL("Unknown header line: %s\n", buf); + } while ((n_ci < 0) || (n_tri < 0) || (n_map < 0) || + (m->n_ci_sen < 0) || (m->n_sen < 0) || (m->n_tmat < 0)); + + if ((n_ci == 0) || (m->n_ci_sen == 0) || (m->n_tmat == 0) + || (m->n_ci_sen > m->n_sen)) + E_FATAL("%s: Error in header\n", mdeffile); + + /* Check typesize limits */ + if (n_ci >= MAX_INT16) + E_FATAL("%s: #CI phones (%d) exceeds limit (%d)\n", mdeffile, n_ci, + MAX_INT16); + if (n_ci + n_tri >= MAX_INT32) /* Comparison is always false... */ + E_FATAL("%s: #Phones (%d) exceeds limit (%d)\n", mdeffile, + n_ci + n_tri, MAX_INT32); + if (m->n_sen >= MAX_INT16) + E_FATAL("%s: #senones (%d) exceeds limit (%d)\n", mdeffile, + m->n_sen, MAX_INT16); + if (m->n_tmat >= MAX_INT32) /* Comparison is always false... */ + E_FATAL("%s: #tmats (%d) exceeds limit (%d)\n", mdeffile, + m->n_tmat, MAX_INT32); + + m->n_emit_state = (n_map / (n_ci + n_tri)) - 1; + if ((m->n_emit_state + 1) * (n_ci + n_tri) != n_map) + E_FATAL + ("Header error: n_state_map not a multiple of n_ci*n_tri\n"); + + /* Initialize ciphone info */ + m->n_ciphone = n_ci; + m->ciphone_ht = hash_table_new(n_ci, HASH_CASE_YES); /* With case-insensitive string names *//* freed in mdef_free */ + m->ciphone = (ciphone_t *) ckd_calloc(n_ci, sizeof(ciphone_t)); /* freed in mdef_free */ + + /* Initialize phones info (ciphones + triphones) */ + m->n_phone = n_ci + n_tri; + m->phone = (phone_t *) ckd_calloc(m->n_phone, sizeof(phone_t)); /* freed in mdef_free */ + + /* Allocate space for state->senone map for each phone */ + senmap = ckd_calloc_2d(m->n_phone, m->n_emit_state, sizeof(**senmap)); /* freed in mdef_free */ + m->sseq = senmap; /* TEMPORARY; until it is compressed into just the unique ones */ + + /* Allocate initial space for -> pid mapping */ + m->wpos_ci_lclist = (ph_lc_t ***) ckd_calloc_2d(N_WORD_POSN, m->n_ciphone, sizeof(ph_lc_t *)); /* freed in mdef_free */ + + /* + * Read base phones and triphones. They'll simply be assigned a running sequence + * number as their "phone-id". If the phone-id < n_ci, it's a ciphone. + */ + + /* Read base phones */ + for (p = 0; p < n_ci; p++) { + if (noncomment_line(buf, sizeof(buf), fp) < 0) + E_FATAL("Premature EOF reading CIphone %d\n", p); + parse_base_line(m, buf, p); + } + m->sil = mdef_ciphone_id(m, S3_SILENCE_CIPHONE); + + /* Read triphones, if any */ + for (; p < m->n_phone; p++) { + if (noncomment_line(buf, sizeof(buf), fp) < 0) + E_FATAL("Premature EOF reading phone %d\n", p); + parse_tri_line(m, buf, p); + } + + if (noncomment_line(buf, sizeof(buf), fp) >= 0) + E_ERROR("Non-empty file beyond expected #phones (%d)\n", + m->n_phone); + + /* Build CD senones to CI senones map */ + if (m->n_ciphone * m->n_emit_state != m->n_ci_sen) + E_FATAL + ("#CI-senones(%d) != #CI-phone(%d) x #emitting-states(%d)\n", + m->n_ci_sen, m->n_ciphone, m->n_emit_state); + m->cd2cisen = (int16 *) ckd_calloc(m->n_sen, sizeof(*m->cd2cisen)); /* freed in mdef_free */ + + m->sen2cimap = (int16 *) ckd_calloc(m->n_sen, sizeof(*m->sen2cimap)); /* freed in mdef_free */ + + for (s = 0; s < m->n_sen; s++) + m->sen2cimap[s] = -1; + for (s = 0; s < m->n_ci_sen; s++) { /* CI senones */ + m->cd2cisen[s] = s; + m->sen2cimap[s] = s / m->n_emit_state; + } + for (p = n_ci; p < m->n_phone; p++) { /* CD senones */ + for (s = 0; s < m->n_emit_state; s++) { + cd = m->sseq[p][s]; + ci = m->sseq[m->phone[p].ci][s]; + m->cd2cisen[cd] = ci; + m->sen2cimap[cd] = m->phone[p].ci; + } + } + + sseq_compress(m); + fclose(fp); + + return m; +} + +void +mdef_report(mdef_t * m) +{ + E_INFO_NOFN("Initialization of mdef_t, report:\n"); + E_INFO_NOFN + ("%d CI-phone, %d CD-phone, %d emitstate/phone, %d CI-sen, %d Sen, %d Sen-Seq\n", + m->n_ciphone, m->n_phone - m->n_ciphone, m->n_emit_state, + m->n_ci_sen, m->n_sen, m->n_sseq); + E_INFO_NOFN("\n"); + +} + +/* RAH 4.23.01, Need to step down the ->next list to see if there are + any more things to free + */ + + + +/* RAH 4.19.01, Attempt to free memory that was allocated within this module + I have not verified that all the memory has been freed. I've taken only a + reasonable effort for now. + RAH 4.24.01 - verified that all memory is released. + */ +void +mdef_free_recursive_lc(ph_lc_t * lc) +{ + if (lc == NULL) + return; + + if (lc->rclist) + mdef_free_recursive_rc(lc->rclist); + + if (lc->next) + mdef_free_recursive_lc(lc->next); + + ckd_free((void *) lc); +} + +void +mdef_free_recursive_rc(ph_rc_t * rc) +{ + if (rc == NULL) + return; + + if (rc->next) + mdef_free_recursive_rc(rc->next); + + ckd_free((void *) rc); +} + + +/* RAH, Free memory that was allocated in mdef_init + Rational purify shows that no leaks exist + */ + +void +mdef_free(mdef_t * m) +{ + int i, j; + + if (m) { + if (m->sen2cimap) + ckd_free((void *) m->sen2cimap); + if (m->cd2cisen) + ckd_free((void *) m->cd2cisen); + + /* RAH, go down the ->next list and delete all the pieces */ + for (i = 0; i < N_WORD_POSN; i++) + for (j = 0; j < m->n_ciphone; j++) + if (m->wpos_ci_lclist[i][j]) { + mdef_free_recursive_lc(m->wpos_ci_lclist[i][j]->next); + mdef_free_recursive_rc(m->wpos_ci_lclist[i][j]-> + rclist); + } + + for (i = 0; i < N_WORD_POSN; i++) + for (j = 0; j < m->n_ciphone; j++) + if (m->wpos_ci_lclist[i][j]) + ckd_free((void *) m->wpos_ci_lclist[i][j]); + + + if (m->wpos_ci_lclist) + ckd_free_2d((void *) m->wpos_ci_lclist); + if (m->sseq) + ckd_free_2d((void *) m->sseq); + /* Free phone context */ + if (m->phone) + ckd_free((void *) m->phone); + if (m->ciphone_ht) + hash_table_free(m->ciphone_ht); + + for (i = 0; i < m->n_ciphone; i++) { + if (m->ciphone[i].name) + ckd_free((void *) m->ciphone[i].name); + } + + + if (m->ciphone) + ckd_free((void *) m->ciphone); + + ckd_free((void *) m); + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h new file mode 100644 index 0000000..42d325c --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h @@ -0,0 +1,274 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * mdef.h -- HMM model definition: base (CI) phones and triphones + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + */ + + +#ifndef __MDEF_H__ +#define __MDEF_H__ + + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** \file mdef.h + * \brief Model definition + */ + +/** \enum word_posn_t + * \brief Union of different type of word position + */ + +typedef enum { + WORD_POSN_INTERNAL = 0, /**< Internal phone of word */ + WORD_POSN_BEGIN = 1, /**< Beginning phone of word */ + WORD_POSN_END = 2, /**< Ending phone of word */ + WORD_POSN_SINGLE = 3, /**< Single phone word (i.e. begin & end) */ + WORD_POSN_UNDEFINED = 4 /**< Undefined value, used for initial conditions, etc */ +} word_posn_t; +#define N_WORD_POSN 4 /**< total # of word positions (excluding undefined) */ +#define WPOS_NAME "ibesu" /**< Printable code for each word position above */ +#define S3_SILENCE_CIPHONE "SIL" /**< Hard-coded silence CI phone name */ + +/** + \struct ciphone_t + \brief CI phone information +*/ +typedef struct ciphone_s { + char *name; /**< The name of the CI phone */ + int32 filler; /**< Whether a filler phone; if so, can be substituted by + silence phone in left or right context position */ +} ciphone_t; + +/** + * \struct phone_t + * \brief Triphone information, including base phones as a subset. For the latter, lc, rc and wpos are non-existent. + */ +typedef struct phone_s { + int32 ssid; /**< State sequence (or senone sequence) ID, considering the + n_emit_state senone-ids are a unit. The senone sequences + themselves are in a separate table */ + int32 tmat; /**< Transition matrix id */ + int16 ci, lc, rc; /**< Base, left, right context ciphones */ + word_posn_t wpos; /**< Word position */ + +} phone_t; + +/** + * \struct ph_rc_t + * \brief Structures needed for mapping into pid. (See mdef_t.wpos_ci_lclist below.) (lc = left context; rc = right context.) + * NOTE: Both ph_rc_t and ph_lc_t FOR INTERNAL USE ONLY. + */ +typedef struct ph_rc_s { + int16 rc; /**< Specific rc for a parent */ + int32 pid; /**< Triphone id for above rc instance */ + struct ph_rc_s *next; /**< Next rc entry for same parent */ +} ph_rc_t; + +/** + * \struct ph_lc_t + * \brief Structures for storing the left context. + */ + +typedef struct ph_lc_s { + int16 lc; /**< Specific lc for a parent */ + ph_rc_t *rclist; /**< rc list for above lc instance */ + struct ph_lc_s *next; /**< Next lc entry for same parent */ +} ph_lc_t; + + +/** The main model definition structure */ +/** + \struct mdef_t + \brief structure for storing the model definition. +*/ +typedef struct mdef_s { + int32 n_ciphone; /**< number basephones actually present */ + int32 n_phone; /**< number basephones + number triphones actually present */ + int32 n_emit_state; /**< number emitting states per phone */ + int32 n_ci_sen; /**< number CI senones; these are the first */ + int32 n_sen; /**< number senones (CI+CD) */ + int32 n_tmat; /**< number transition matrices */ + + hash_table_t *ciphone_ht; /**< Hash table for mapping ciphone strings to ids */ + ciphone_t *ciphone; /**< CI-phone information for all ciphones */ + phone_t *phone; /**< Information for all ciphones and triphones */ + uint16 **sseq; /**< Unique state (or senone) sequences in this model, shared + among all phones/triphones */ + int32 n_sseq; /**< No. of unique senone sequences in this model */ + + int16 *cd2cisen; /**< Parent CI-senone id for each senone; the first + n_ci_sen are identity mappings; the CD-senones are + contiguous for each parent CI-phone */ + int16 *sen2cimap; /**< Parent CI-phone for each senone (CI or CD) */ + + int16 sil; /**< SILENCE_CIPHONE id */ + + ph_lc_t ***wpos_ci_lclist; /**< wpos_ci_lclist[wpos][ci] = list of lc for . + wpos_ci_lclist[wpos][ci][lc].rclist = list of rc for + . Only entries for the known triphones + are created to conserve space. + (NOTE: FOR INTERNAL USE ONLY.) */ +} mdef_t; + +/** Access macros; not meant for arbitrary use */ +#define mdef_is_fillerphone(m,p) ((m)->ciphone[p].filler) +#define mdef_n_ciphone(m) ((m)->n_ciphone) +#define mdef_n_phone(m) ((m)->n_phone) +#define mdef_n_sseq(m) ((m)->n_sseq) +#define mdef_n_emit_state(m) ((m)->n_emit_state) +#define mdef_n_sen(m) ((m)->n_sen) +#define mdef_n_tmat(m) ((m)->n_tmat) +#define mdef_pid2ssid(m,p) ((m)->phone[p].ssid) +#define mdef_pid2tmatid(m,p) ((m)->phone[p].tmat) +#define mdef_silphone(m) ((m)->sil) +#define mdef_sen2cimap(m) ((m)->sen2cimap) +#define mdef_sseq2sen(m,ss,pos) ((m)->sseq[ss][pos]) +#define mdef_pid2ci(m,p) ((m)->phone[p].ci) +#define mdef_cd2cisen(m) ((m)->cd2cisen) + +/** + * Initialize the phone structure from the given model definition file. + * It should be treated as a READ-ONLY structure. + * @return pointer to the phone structure created. + */ +mdef_t *mdef_init (char *mdeffile, /**< In: Model definition file */ + int breport /**< In: whether to report the progress or not */ + ); + + +/** + Get the ciphone id given a string name + @return ciphone id for the given ciphone string name +*/ +int mdef_ciphone_id(mdef_t *m, /**< In: Model structure being queried */ + char *ciphone /**< In: ciphone for which id wanted */ + ); + +/** + Get the phone string given the ci phone id. + @return: READ-ONLY ciphone string name for the given ciphone id +*/ +const char *mdef_ciphone_str(mdef_t *m, /**< In: Model structure being queried */ + int ci /**< In: ciphone id for which name wanted */ + ); + +/** + Decide whether the phone is ci phone. + @return 1 if given triphone argument is a ciphone, 0 if not, -1 if error +*/ +int mdef_is_ciphone (mdef_t *m, /**< In: Model structure being queried */ + int p /**< In: triphone id being queried */ + ); + +/** + Decide whether the senone is a senone for a ci phone, or a ci senone + @return 1 if a given senone is a ci senone +*/ +int mdef_is_cisenone(mdef_t *m, /**< In: Model structure being queried */ + int s /**< In: senone id being queried */ + ); + +/** + Decide the phone id given the left, right and base phones. + @return: phone id for the given constituents if found, else BAD_S3PID +*/ +int mdef_phone_id (mdef_t *m, /**< In: Model structure being queried */ + int b, /**< In: base ciphone id */ + int l, /**< In: left context ciphone id */ + int r, /**< In: right context ciphone id */ + word_posn_t pos /**< In: Word position */ + ); + +/** + * Create a phone string for the given phone (base or triphone) id in the given buf. + * @return 0 if successful, -1 if error. + */ +int mdef_phone_str(mdef_t *m, /**< In: Model structure being queried */ + int pid, /**< In: phone id being queried */ + char *buf /**< Out: On return, buf has the string */ + ); + +/** + * Compare the underlying HMMs for two given phones (i.e., compare the two transition + * matrix IDs and the individual state(senone) IDs). + * @return 0 iff the HMMs are identical, -1 otherwise. + */ +int mdef_hmm_cmp (mdef_t *m, /**< In: Model being queried */ + int p1, /**< In: One of the two triphones being compared */ + int p2 /**< In: One of the two triphones being compared */ + ); + +/** Report the model definition's parameters */ +void mdef_report(mdef_t *m /**< In: model definition structure */ + ); + +/** RAH, For freeing memory */ +void mdef_free_recursive_lc (ph_lc_t *lc /**< In: A list of left context */ + ); +void mdef_free_recursive_rc (ph_rc_t *rc /**< In: A list of right context */ + ); + +/** Free an mdef_t */ +void mdef_free (mdef_t *mdef /**< In : The model definition*/ + ); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c new file mode 100644 index 0000000..0961acd --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c @@ -0,0 +1,571 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include +#include + +#include +#include +#include + +#include "ms_gauden.h" + +#define GAUDEN_PARAM_VERSION "1.0" + +#ifndef M_PI +#define M_PI 3.1415926535897932385e0 +#endif + +#define WORST_DIST (int32)(0x80000000) + +void +gauden_dump(const gauden_t * g) +{ + int32 c; + + for (c = 0; c < g->n_mgau; c++) + gauden_dump_ind(g, c); +} + + +void +gauden_dump_ind(const gauden_t * g, int senidx) +{ + int32 f, d, i; + + for (f = 0; f < g->n_feat; f++) { + E_INFO("Codebook %d, Feature %d (%dx%d):\n", + senidx, f, g->n_density, g->featlen[f]); + + for (d = 0; d < g->n_density; d++) { + printf("m[%3d]", d); + for (i = 0; i < g->featlen[f]; i++) + printf(" %7.4f", MFCC2FLOAT(g->mean[senidx][f][d][i])); + printf("\n"); + } + printf("\n"); + + for (d = 0; d < g->n_density; d++) { + printf("v[%3d]", d); + for (i = 0; i < g->featlen[f]; i++) + printf(" %d", (int)g->var[senidx][f][d][i]); + printf("\n"); + } + printf("\n"); + + for (d = 0; d < g->n_density; d++) + printf("d[%3d] %d\n", d, (int)g->det[senidx][f][d]); + } + fflush(stderr); +} + +/** + * Reads gaussian parameters from a file + * + * @param: out_param output parameter + * @ + * + * @returns: allocated 4-d array of gaussians + * + */ +static float **** +gauden_param_read(const char *file_name, + int32 * out_n_mgau, + int32 * out_n_feat, + int32 * out_n_density, + int32 ** out_veclen) +{ + char tmp; + FILE *fp; + int32 i, j, k, l, n, blk; + int32 n_mgau; + int32 n_feat; + int32 n_density; + int32 *veclen; + int32 byteswap, chksum_present; + float32 ****out; + float32 *buf; + char **argname, **argval; + uint32 chksum; + + E_INFO("Reading mixture gaussian parameter: %s\n", file_name); + + if ((fp = fopen(file_name, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open file '%s' for reading", file_name); + return NULL; + } + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) { + E_ERROR("Failed to read header from file '%s'\n", file_name); + fclose(fp); + return NULL; + } + + /* Parse argument-value list */ + chksum_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], GAUDEN_PARAM_VERSION) != 0) + E_WARN("Version mismatch(%s): %s, expecting %s\n", + file_name, argval[i], GAUDEN_PARAM_VERSION); + } + else if (strcmp(argname[i], "chksum0") == 0) { + chksum_present = 1; /* Ignore the associated value */ + } + } + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + /* #Codebooks */ + if (bio_fread(&n_mgau, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { + E_ERROR("Failed to read number fo codebooks from %s\n", file_name); + fclose(fp); + return NULL; + } + *out_n_mgau = n_mgau; + + /* #Features/codebook */ + if (bio_fread(&n_feat, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { + E_ERROR("Failed to read number of features from %s\n", file_name); + fclose(fp); + return NULL; + } + *out_n_feat = n_feat; + + /* #Gaussian densities/feature in each codebook */ + if (bio_fread(&n_density, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { + E_ERROR("fread(%s) (#density/codebook) failed\n", file_name); + } + *out_n_density = n_density; + + /* #Dimensions in each feature stream */ + veclen = ckd_calloc(n_feat, sizeof(uint32)); + *out_veclen = veclen; + if (bio_fread(veclen, sizeof(int32), n_feat, fp, byteswap, &chksum) != + n_feat) { + E_ERROR("fread(%s) (feature-lengths) failed\n", file_name); + fclose(fp); + return NULL; + } + + /* blk = total vector length of all feature streams */ + for (i = 0, blk = 0; i < n_feat; i++) + blk += veclen[i]; + + /* #Floats to follow; for the ENTIRE SET of CODEBOOKS */ + if (bio_fread(&n, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { + E_ERROR("Failed to read number of parameters from %s\n", file_name); + fclose(fp); + return NULL; + } + + if (n != n_mgau * n_density * blk) { + E_ERROR + ("Number of parameters in %s(%d) doesn't match dimensions: %d x %d x %d\n", + file_name, n, n_mgau, n_density, blk); + fclose(fp); + return NULL; + } + + /* Allocate memory for mixture gaussian densities if not already allocated */ + out = (float32 ****) ckd_calloc_3d(n_mgau, n_feat, n_density, + sizeof(float32 *)); + buf = (float32 *) ckd_calloc(n, sizeof(float32)); + for (i = 0, l = 0; i < n_mgau; i++) { + for (j = 0; j < n_feat; j++) { + for (k = 0; k < n_density; k++) { + out[i][j][k] = &buf[l]; + l += veclen[j]; + } + } + } + + /* Read mixture gaussian densities data */ + if (bio_fread(buf, sizeof(float32), n, fp, byteswap, &chksum) != n) { + E_ERROR("Failed to read density data from file '%s'\n", file_name); + fclose(fp); + ckd_free_3d(out); + return NULL; + } + + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&tmp, 1, 1, fp) == 1) { + E_ERROR("More data than expected in %s\n", file_name); + fclose(fp); + ckd_free_3d(out); + return NULL; + } + + fclose(fp); + + E_INFO("%d codebook, %d feature, size: \n", n_mgau, n_feat); + for (i = 0; i < n_feat; i++) + E_INFO(" %dx%d\n", n_density, veclen[i]); + + return out; +} + +static void +gauden_param_free(mfcc_t **** p) +{ + ckd_free(p[0][0][0]); + ckd_free_3d(p); +} + +/* + * Some of the gaussian density computation can be carried out in advance: + * log(determinant) calculation, + * 1/(2*var) in the exponent, + * NOTE; The density computation is performed in log domain. + */ +static int32 +gauden_dist_precompute(gauden_t * g, logmath_t *lmath, float32 varfloor) +{ + int32 i, m, f, d, flen; + mfcc_t *meanp; + mfcc_t *varp; + mfcc_t *detp; + int32 floored; + + floored = 0; + /* Allocate space for determinants */ + g->det = ckd_calloc_3d(g->n_mgau, g->n_feat, g->n_density, sizeof(***g->det)); + + for (m = 0; m < g->n_mgau; m++) { + for (f = 0; f < g->n_feat; f++) { + flen = g->featlen[f]; + + /* Determinants for all variance vectors in g->[m][f] */ + for (d = 0, detp = g->det[m][f]; d < g->n_density; d++, detp++) { + *detp = 0; + for (i = 0, varp = g->var[m][f][d], meanp = g->mean[m][f][d]; + i < flen; i++, varp++, meanp++) { + float32 *fvarp = (float32 *)varp; + +#ifdef FIXED_POINT + float32 *fmp = (float32 *)meanp; + *meanp = FLOAT2MFCC(*fmp); +#endif + if (*fvarp < varfloor) { + *fvarp = varfloor; + ++floored; + } + *detp += (mfcc_t)logmath_log(lmath, + 1.0 / sqrt(*fvarp * 2.0 * M_PI)); + /* Precompute this part of the exponential */ + *varp = (mfcc_t)logmath_ln_to_log(lmath, + (1.0 / (*fvarp * 2.0))); + } + } + } + } + + E_INFO("%d variance values floored\n", floored); + + return 0; +} + + +gauden_t * +gauden_init(char const *meanfile, char const *varfile, float32 varfloor, logmath_t *lmath) +{ + int32 i, m, f, d, *flen; + gauden_t *g; + + assert(meanfile != NULL); + assert(varfile != NULL); + assert(varfloor > 0.0); + + g = (gauden_t *) ckd_calloc(1, sizeof(gauden_t)); + g->lmath = logmath_retain(lmath); + + g->mean = (mfcc_t ****)gauden_param_read(meanfile, &g->n_mgau, &g->n_feat, &g->n_density, + &g->featlen); + if (g->mean == NULL) { + return NULL; + } + g->var = (mfcc_t ****)gauden_param_read(varfile, &m, &f, &d, &flen); + if (g->var == NULL) { + return NULL; + } + + /* Verify mean and variance parameter dimensions */ + if ((m != g->n_mgau) || (f != g->n_feat) || (d != g->n_density)) { + E_ERROR + ("Mixture-gaussians dimensions for means and variances differ\n"); + ckd_free(flen); + gauden_free(g); + return NULL; + } + for (i = 0; i < g->n_feat; i++) { + if (g->featlen[i] != flen[i]) { + E_ERROR("Feature lengths for means and variances differ\n"); + ckd_free(flen); + gauden_free(g); + return NULL; + } + } + + ckd_free(flen); + + gauden_dist_precompute(g, lmath, varfloor); + + return g; +} + +void +gauden_free(gauden_t * g) +{ + if (g == NULL) + return; + if (g->mean) + gauden_param_free(g->mean); + if (g->var) + gauden_param_free(g->var); + if (g->det) + ckd_free_3d(g->det); + if (g->featlen) + ckd_free(g->featlen); + if (g->lmath) + logmath_free(g->lmath); + ckd_free(g); +} + +/* See compute_dist below */ +static int32 +compute_dist_all(gauden_dist_t * out_dist, mfcc_t* obs, int32 featlen, + mfcc_t ** mean, mfcc_t ** var, mfcc_t * det, + int32 n_density) +{ + int32 i, d; + + for (d = 0; d < n_density; ++d) { + mfcc_t *m; + mfcc_t *v; + mfcc_t dval; + + m = mean[d]; + v = var[d]; + dval = det[d]; + + for (i = 0; i < featlen; i++) { + mfcc_t diff; +#ifdef FIXED_POINT + /* Have to check for underflows here. */ + mfcc_t pdval = dval; + diff = obs[i] - m[i]; + dval -= MFCCMUL(MFCCMUL(diff, diff), v[i]); + if (dval > pdval) { + dval = WORST_SCORE; + break; + } +#else + diff = obs[i] - m[i]; + /* The compiler really likes this to be a single + * expression, for whatever reason. */ + dval -= diff * diff * v[i]; +#endif + } + + out_dist[d].dist = dval; + out_dist[d].id = d; + } + + return 0; +} + + +/* + * Compute the top-N closest gaussians from the chosen set (mgau,feat) + * for the given input observation vector. + */ +static int32 +compute_dist(gauden_dist_t * out_dist, int32 n_top, + mfcc_t * obs, int32 featlen, + mfcc_t ** mean, mfcc_t ** var, mfcc_t * det, + int32 n_density) +{ + int32 i, j, d; + gauden_dist_t *worst; + + /* Special case optimization when n_density <= n_top */ + if (n_top >= n_density) + return (compute_dist_all + (out_dist, obs, featlen, mean, var, det, n_density)); + + for (i = 0; i < n_top; i++) + out_dist[i].dist = WORST_DIST; + worst = &(out_dist[n_top - 1]); + + for (d = 0; d < n_density; d++) { + mfcc_t *m; + mfcc_t *v; + mfcc_t dval; + + m = mean[d]; + v = var[d]; + dval = det[d]; + + for (i = 0; (i < featlen) && (dval >= worst->dist); i++) { + mfcc_t diff; +#ifdef FIXED_POINT + /* Have to check for underflows here. */ + mfcc_t pdval = dval; + diff = obs[i] - m[i]; + dval -= MFCCMUL(MFCCMUL(diff, diff), v[i]); + if (dval > pdval) { + dval = WORST_SCORE; + break; + } +#else + diff = obs[i] - m[i]; + /* The compiler really likes this to be a single + * expression, for whatever reason. */ + dval -= diff * diff * v[i]; +#endif + } + + if ((i < featlen) || (dval < worst->dist)) /* Codeword d worse than worst */ + continue; + + /* Codeword d at least as good as worst so far; insert in the ordered list */ + for (i = 0; (i < n_top) && (dval < out_dist[i].dist); i++); + assert(i < n_top); + for (j = n_top - 1; j > i; --j) + out_dist[j] = out_dist[j - 1]; + out_dist[i].dist = dval; + out_dist[i].id = d; + } + + return 0; +} + + +/* + * Compute distances of the input observation from the top N codewords in the given + * codebook (g->{mean,var}[mgau]). The input observation, obs, includes vectors for + * all features in the codebook. + */ +int32 +gauden_dist(gauden_t * g, + int mgau, int32 n_top, mfcc_t** obs, gauden_dist_t ** out_dist) +{ + int32 f; + + assert((n_top > 0) && (n_top <= g->n_density)); + + for (f = 0; f < g->n_feat; f++) { + compute_dist(out_dist[f], n_top, + obs[f], g->featlen[f], + g->mean[mgau][f], g->var[mgau][f], g->det[mgau][f], + g->n_density); + E_DEBUG("Top CW(%d,%d) = %d %d\n", mgau, f, out_dist[f][0].id, + (int)out_dist[f][0].dist >> SENSCR_SHIFT); + } + + return 0; +} + +int32 +gauden_mllr_transform(gauden_t *g, ps_mllr_t *mllr, cmd_ln_t *config) +{ + int32 i, m, f, d, *flen; + + /* Free data if already here */ + if (g->mean) + gauden_param_free(g->mean); + if (g->var) + gauden_param_free(g->var); + if (g->det) + ckd_free_3d(g->det); + if (g->featlen) + ckd_free(g->featlen); + g->det = NULL; + g->featlen = NULL; + + /* Reload means and variances (un-precomputed). */ + g->mean = (mfcc_t ****)gauden_param_read(cmd_ln_str_r(config, "_mean"), &g->n_mgau, &g->n_feat, &g->n_density, + &g->featlen); + g->var = (mfcc_t ****)gauden_param_read(cmd_ln_str_r(config, "_var"), &m, &f, &d, &flen); + + /* Verify mean and variance parameter dimensions */ + if ((m != g->n_mgau) || (f != g->n_feat) || (d != g->n_density)) + E_FATAL + ("Mixture-gaussians dimensions for means and variances differ\n"); + for (i = 0; i < g->n_feat; i++) + if (g->featlen[i] != flen[i]) + E_FATAL("Feature lengths for means and variances differ\n"); + ckd_free(flen); + + /* Transform codebook for each stream s */ + for (i = 0; i < g->n_mgau; ++i) { + for (f = 0; f < g->n_feat; ++f) { + float64 *temp; + temp = (float64 *) ckd_calloc(g->featlen[f], sizeof(float64)); + /* Transform each density d in selected codebook */ + for (d = 0; d < g->n_density; d++) { + int l; + for (l = 0; l < g->featlen[f]; l++) { + temp[l] = 0.0; + for (m = 0; m < g->featlen[f]; m++) { + /* FIXME: For now, only one class, hence the zeros below. */ + temp[l] += mllr->A[f][0][l][m] * g->mean[i][f][d][m]; + } + temp[l] += mllr->b[f][0][l]; + } + + for (l = 0; l < g->featlen[f]; l++) { + g->mean[i][f][d][l] = (float32) temp[l]; + g->var[i][f][d][l] *= mllr->h[f][0][l]; + } + } + ckd_free(temp); + } + } + + /* Re-precompute (if we aren't adapting variances this isn't + * actually necessary...) */ + gauden_dist_precompute(g, g->lmath, cmd_ln_float32_r(config, "-varfloor")); + return 0; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h new file mode 100644 index 0000000..1176085 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h @@ -0,0 +1,153 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _LIBFBS_GAUDEN_H_ +#define _LIBFBS_GAUDEN_H_ + +/** \file ms_gauden.h + * \brief (Sphinx 3.0 specific) Gaussian density module. + * + * Gaussian density distribution implementation. There are two major + * difference bettwen ms_gauden and cont_mgau. One is the fact that + * ms_gauden only take cares of the Gaussian computation part where + * cont_mgau actually take care of senone computation as well. The + * other is the fact that ms_gauden is a multi-stream implementation + * of GMM computation. + * + */ + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "vector.h" +#include "pocketsphinx_internal.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * \struct gauden_dist_t + * \brief Structure to store distance (density) values for a given input observation wrt density values in some given codebook. + */ +typedef struct gauden_dist_s { + int32 id; /**< Index of codeword (gaussian density) */ + mfcc_t dist; /**< Density value for input observation wrt above codeword; + NOTE: result in logs3 domain, but var_t used for speed */ + +} gauden_dist_t; + +/** + * \struct gauden_t + * \brief Multivariate gaussian mixture density parameters + */ +typedef struct gauden_s { + mfcc_t ****mean; /**< mean[codebook][feature][codeword] vector */ + mfcc_t ****var; /**< like mean; diagonal covariance vector only */ + mfcc_t ***det; /**< log(determinant) for each variance vector; + actually, log(sqrt(2*pi*det)) */ + logmath_t *lmath; /**< log math computation */ + int32 n_mgau; /**< Number codebooks */ + int32 n_feat; /**< Number feature streams in each codebook */ + int32 n_density; /**< Number gaussian densities in each codebook-feature stream */ + int32 *featlen; /**< feature length for each feature */ +} gauden_t; + + +/** + * Read mixture gaussian codebooks from the given files. Allocate memory space needed + * for them. Apply the specified variance floor value. + * Return value: ptr to the model created; NULL if error. + * (See Sphinx3 model file-format documentation.) + */ +gauden_t * +gauden_init (char const *meanfile,/**< Input: File containing means of mixture gaussians */ + char const *varfile,/**< Input: File containing variances of mixture gaussians */ + float32 varfloor, /**< Input: Floor value to be applied to variances */ + logmath_t *lmath + ); + +/** Release memory allocated by gauden_init. */ +void gauden_free(gauden_t *g); /**< In: The gauden_t to free */ + +/** Transform Gaussians according to an MLLR matrix (or, eventually, more). */ +int32 gauden_mllr_transform(gauden_t *s, ps_mllr_t *mllr, cmd_ln_t *config); + +/** + * Compute gaussian density values for the given input observation vector wrt the + * specified mixture gaussian codebook (which may consist of several feature streams). + * Density values are left UNnormalized. + * @return 0 if successful, -1 otherwise. + */ +int32 +gauden_dist (gauden_t *g, /**< In: handle to entire ensemble of codebooks */ + int mgau, /**< In: codebook for which density values to be evaluated + (g->{mean,var}[mgau]) */ + int n_top, /**< In: Number top densities to be evaluated */ + mfcc_t **obs, /**< In: Observation vector; obs[f] = for feature f */ + gauden_dist_t **out_dist + /**< Out: n_top best codewords and density values, + in worsening order, for each feature stream. + out_dist[f][i] = i-th best density for feature f. + Caller must allocate memory for this output */ + ); + +/** + Dump the definitionn of Gaussian distribution. +*/ +void gauden_dump (const gauden_t *g /**< In: Gaussian distribution g*/ + ); + +/** + Dump the definition of Gaussian distribution of a particular index to the standard output stream +*/ +void gauden_dump_ind (const gauden_t *g, /**< In: Gaussian distribution g*/ + int senidx /**< In: The senone index of the Gaussian */ + ); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* GAUDEN_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c new file mode 100644 index 0000000..27a8a1d --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c @@ -0,0 +1,283 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * ms_mgau.c -- Essentially a wrapper that wrap up gauden and + * senone. It supports multi-stream. + * + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1997 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * HISTORY + * $Log$ + * Revision 1.2 2006/02/22 16:56:01 arthchan2003 + * Merged from SPHINX3_5_2_RCI_IRII_BRANCH: Added ms_mgau.[ch] into the trunk. It is a wrapper of ms_gauden and ms_senone + * + * Revision 1.1.2.4 2005/09/25 18:55:19 arthchan2003 + * Added a flag to turn on and off precomputation. + * + * Revision 1.1.2.3 2005/08/03 18:53:44 dhdfu + * Add memory deallocation functions. Also move all the initialization + * of ms_mgau_model_t into ms_mgau_init (duh!), which entails removing it + * from decode_anytopo and friends. + * + * Revision 1.1.2.2 2005/08/02 21:05:38 arthchan2003 + * 1, Added dist and mgau_active as intermediate variable for computation. 2, Added ms_cont_mgau_frame_eval, which is a multi stream version of GMM computation mainly s3.0 family of tools. 3, Fixed dox-doc. + * + * Revision 1.1.2.1 2005/07/20 19:37:09 arthchan2003 + * Added a multi-stream cont_mgau (ms_mgau) which is a wrapper of both gauden and senone. Add ms_mgau_init and model_set_mllr. This allow eliminating 600 lines of code in decode_anytopo/align/allphone. + * + * + * + */ + +/* Local headers. */ +#include "ms_mgau.h" + +static ps_mgaufuncs_t ms_mgau_funcs = { + "ms", + ms_cont_mgau_frame_eval, /* frame_eval */ + ms_mgau_mllr_transform, /* transform */ + ms_mgau_free /* free */ +}; + +ps_mgau_t * +ms_mgau_init(acmod_t *acmod, logmath_t *lmath, bin_mdef_t *mdef) +{ + /* Codebooks */ + ms_mgau_model_t *msg; + ps_mgau_t *mg; + gauden_t *g; + senone_t *s; + cmd_ln_t *config; + int i; + + config = acmod->config; + + msg = (ms_mgau_model_t *) ckd_calloc(1, sizeof(ms_mgau_model_t)); + msg->config = config; + msg->g = NULL; + msg->s = NULL; + + if ((g = msg->g = gauden_init(cmd_ln_str_r(config, "_mean"), + cmd_ln_str_r(config, "_var"), + cmd_ln_float32_r(config, "-varfloor"), + lmath)) == NULL) { + E_ERROR("Failed to read means and variances\n"); + goto error_out; + } + + /* Verify n_feat and veclen, against acmod. */ + if (g->n_feat != feat_dimension1(acmod->fcb)) { + E_ERROR("Number of streams does not match: %d != %d\n", + g->n_feat, feat_dimension1(acmod->fcb)); + goto error_out; + } + for (i = 0; i < g->n_feat; ++i) { + if ((uint32)g->featlen[i] != feat_dimension2(acmod->fcb, i)) { + E_ERROR("Dimension of stream %d does not match: %d != %d\n", i, + g->featlen[i], feat_dimension2(acmod->fcb, i)); + goto error_out; + } + } + + s = msg->s = senone_init(msg->g, + cmd_ln_str_r(config, "_mixw"), + cmd_ln_str_r(config, "_senmgau"), + cmd_ln_float32_r(config, "-mixwfloor"), + lmath, mdef); + + s->aw = cmd_ln_int32_r(config, "-aw"); + + /* Verify senone parameters against gauden parameters */ + if (s->n_feat != (uint32)g->n_feat) + E_FATAL("#Feature mismatch: gauden= %d, senone= %d\n", g->n_feat, + s->n_feat); + if (s->n_cw != (uint32)g->n_density) + E_FATAL("#Densities mismatch: gauden= %d, senone= %d\n", + g->n_density, s->n_cw); + if (s->n_gauden > (uint32)g->n_mgau) + E_FATAL("Senones need more codebooks (%d) than present (%d)\n", + s->n_gauden, g->n_mgau); + if (s->n_gauden < (uint32)g->n_mgau) + E_ERROR("Senones use fewer codebooks (%d) than present (%d)\n", + s->n_gauden, g->n_mgau); + + msg->topn = cmd_ln_int32_r(config, "-topn"); + E_INFO("The value of topn: %d\n", msg->topn); + if (msg->topn == 0 || msg->topn > msg->g->n_density) { + E_WARN + ("-topn argument (%d) invalid or > #density codewords (%d); set to latter\n", + msg->topn, msg->g->n_density); + msg->topn = msg->g->n_density; + } + + msg->dist = (gauden_dist_t ***) + ckd_calloc_3d(g->n_mgau, g->n_feat, msg->topn, + sizeof(gauden_dist_t)); + msg->mgau_active = ckd_calloc(g->n_mgau, sizeof(int8)); + + mg = (ps_mgau_t *)msg; + mg->vt = &ms_mgau_funcs; + return mg; +error_out: + ms_mgau_free(ps_mgau_base(msg)); + return NULL; +} + +void +ms_mgau_free(ps_mgau_t * mg) +{ + ms_mgau_model_t *msg = (ms_mgau_model_t *)mg; + if (msg == NULL) + return; + + if (msg->g) + gauden_free(msg->g); + if (msg->s) + senone_free(msg->s); + if (msg->dist) + ckd_free_3d((void *) msg->dist); + if (msg->mgau_active) + ckd_free(msg->mgau_active); + + ckd_free(msg); +} + +int +ms_mgau_mllr_transform(ps_mgau_t *s, + ps_mllr_t *mllr) +{ + ms_mgau_model_t *msg = (ms_mgau_model_t *)s; + return gauden_mllr_transform(msg->g, mllr, msg->config); +} + +int32 +ms_cont_mgau_frame_eval(ps_mgau_t * mg, + int16 *senscr, + uint8 *senone_active, + int32 n_senone_active, + mfcc_t ** feat, + int32 frame, + int32 compallsen) +{ + ms_mgau_model_t *msg = (ms_mgau_model_t *)mg; + int32 gid; + int32 topn; + int32 best; + gauden_t *g; + senone_t *sen; + + (void)frame; + topn = ms_mgau_topn(msg); + g = ms_mgau_gauden(msg); + sen = ms_mgau_senone(msg); + + if (compallsen) { + int32 s; + + for (gid = 0; gid < g->n_mgau; gid++) + gauden_dist(g, gid, topn, feat, msg->dist[gid]); + + best = (int32) 0x7fffffff; + for (s = 0; (uint32)s < sen->n_sen; s++) { + senscr[s] = senone_eval(sen, s, msg->dist[sen->mgau[s]], topn); + if (best > senscr[s]) { + best = senscr[s]; + } + } + + /* Normalize senone scores */ + for (s = 0; (uint32)s < sen->n_sen; s++) { + int32 bs = senscr[s] - best; + if (bs > 32767) + bs = 32767; + if (bs < -32768) + bs = -32768; + senscr[s] = bs; + } + } + else { + int32 i, n; + /* Flag all active mixture-gaussian codebooks */ + for (gid = 0; gid < g->n_mgau; gid++) + msg->mgau_active[gid] = 0; + + n = 0; + for (i = 0; i < n_senone_active; i++) { + /* senone_active consists of deltas. */ + int32 s = senone_active[i] + n; + msg->mgau_active[sen->mgau[s]] = 1; + n = s; + } + + /* Compute topn gaussian density values (for active codebooks) */ + for (gid = 0; gid < g->n_mgau; gid++) { + if (msg->mgau_active[gid]) + gauden_dist(g, gid, topn, feat, msg->dist[gid]); + } + + best = (int32) 0x7fffffff; + n = 0; + for (i = 0; i < n_senone_active; i++) { + int32 s = senone_active[i] + n; + senscr[s] = senone_eval(sen, s, msg->dist[sen->mgau[s]], topn); + if (best > senscr[s]) { + best = senscr[s]; + } + n = s; + } + + /* Normalize senone scores */ + n = 0; + for (i = 0; i < n_senone_active; i++) { + int32 s = senone_active[i] + n; + int32 bs = senscr[s] - best; + if (bs > 32767) + bs = 32767; + if (bs < -32768) + bs = -32768; + senscr[s] = bs; + n = s; + } + } + + return 0; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h new file mode 100644 index 0000000..69b3cef --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h @@ -0,0 +1,153 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * ms_mgau.h -- Essentially a wrapper that wrap up gauden and + * senone. It supports multi-stream. + * + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1997 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * HISTORY + * $Log$ + * Revision 1.1 2006/04/05 20:27:30 dhdfu + * A Great Reorganzation of header files and executables + * + * Revision 1.3 2006/02/22 16:57:15 arthchan2003 + * Fixed minor dox-doc issue + * + * Revision 1.2 2006/02/22 16:56:01 arthchan2003 + * Merged from SPHINX3_5_2_RCI_IRII_BRANCH: Added ms_mgau.[ch] into the trunk. It is a wrapper of ms_gauden and ms_senone + * + * Revision 1.1.2.4 2005/09/25 18:55:19 arthchan2003 + * Added a flag to turn on and off precomputation. + * + * Revision 1.1.2.3 2005/08/03 18:53:44 dhdfu + * Add memory deallocation functions. Also move all the initialization + * of ms_mgau_model_t into ms_mgau_init (duh!), which entails removing it + * from decode_anytopo and friends. + * + * Revision 1.1.2.2 2005/08/02 21:05:38 arthchan2003 + * 1, Added dist and mgau_active as intermediate variable for computation. 2, Added ms_cont_mgau_frame_eval, which is a multi stream version of GMM computation mainly s3.0 family of tools. 3, Fixed dox-doc. + * + * Revision 1.1.2.1 2005/07/20 19:37:09 arthchan2003 + * Added a multi-stream cont_mgau (ms_mgau) which is a wrapper of both gauden and senone. Add ms_mgau_init and model_set_mllr. This allow eliminating 600 lines of code in decode_anytopo/align/allphone. + * + * + * + */ + +/** \file ms_mgau.h + * + * \brief (Sphinx 3.0 specific) A module that wraps up the code of + * gauden and senone because they are closely related. + * + * At the time at Sphinx 3.1 to 3.2, Ravi has decided to rewrite only + * single-stream part of the code into cont_mgau.[ch]. This marks the + * beginning of historical problem of having two sets of Gaussian + * distribution computation routine, one for single-stream and one of + * multi-stream. + * + * In Sphinx 3.5, when we figure out that it is possible to allow both + * 3.0 family of tools and 3.x family of tools to coexist. This + * becomes one problem we found that very hard to reconcile. That is + * why we currently allow two versions of the code in the code + * base. This is likely to change in the future. + */ + + +#ifndef _LIBFBS_MS_CONT_MGAU_H_ +#define _LIBFBS_MS_CONT_MGAU_H_ + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "acmod.h" +#include "bin_mdef.h" +#include "ms_gauden.h" +#include "ms_senone.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** \struct ms_mgau_t + \brief Multi-stream mixture gaussian. It is not necessary to be continr +*/ + +typedef struct ms_mgau_model_s { + ps_mgau_t base; + gauden_t* g; /**< The codebook */ + senone_t* s; /**< The senone */ + int topn; /**< Top-n gaussian will be computed */ + + /**< Intermediate used in computation */ + gauden_dist_t ***dist; + uint8 *mgau_active; + cmd_ln_t *config; +} ms_mgau_model_t; + +#define ms_mgau_gauden(msg) (msg->g) +#define ms_mgau_senone(msg) (msg->s) +#define ms_mgau_topn(msg) (msg->topn) + +ps_mgau_t* ms_mgau_init(acmod_t *acmod, logmath_t *lmath, bin_mdef_t *mdef); +void ms_mgau_free(ps_mgau_t *g); +int32 ms_cont_mgau_frame_eval(ps_mgau_t * msg, + int16 *senscr, + uint8 *senone_active, + int32 n_senone_active, + mfcc_t ** feat, + int32 frame, + int32 compallsen); +int32 ms_mgau_mllr_transform(ps_mgau_t *s, + ps_mllr_t *mllr); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* _LIBFBS_MS_CONT_MGAU_H_*/ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c new file mode 100644 index 0000000..3bc9e29 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c @@ -0,0 +1,404 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* System headers. */ +#include +#include +#include + +/* SphinxBase headers. */ +#include + +/* Local headers. */ +#include "ms_senone.h" + +#define MIXW_PARAM_VERSION "1.0" +#define SPDEF_PARAM_VERSION "1.2" + +static int32 +senone_mgau_map_read(senone_t * s, char const *file_name) +{ + FILE *fp; + int32 byteswap, chksum_present, n_gauden_present; + uint32 chksum; + int32 i; + char eofchk; + char **argname, **argval; + void *ptr; + float32 v; + + E_INFO("Reading senone gauden-codebook map file: %s\n", file_name); + + if ((fp = fopen(file_name, "rb")) == NULL) + E_FATAL_SYSTEM("Failed to open map file '%s' for reading", file_name); + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) + E_FATAL("Failed to read header from file '%s'\n", file_name); + + /* Parse argument-value list */ + chksum_present = 0; + n_gauden_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], SPDEF_PARAM_VERSION) != 0) { + E_WARN("Version mismatch(%s): %s, expecting %s\n", + file_name, argval[i], SPDEF_PARAM_VERSION); + } + + /* HACK!! Convert version# to float32 and take appropriate action */ + if (sscanf(argval[i], "%f", &v) != 1) + E_FATAL("%s: Bad version no. string: %s\n", file_name, + argval[i]); + + n_gauden_present = (v > 1.1) ? 1 : 0; + } + else if (strcmp(argname[i], "chksum0") == 0) { + chksum_present = 1; /* Ignore the associated value */ + } + } + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + /* Read #gauden (if version matches) */ + if (n_gauden_present) { + E_INFO("Reading number of codebooks from %s\n", file_name); + if (bio_fread + (&(s->n_gauden), sizeof(int32), 1, fp, byteswap, &chksum) != 1) + E_FATAL("fread(%s) (#gauden) failed\n", file_name); + } + + /* Read 1d array data */ + if (bio_fread_1d(&ptr, sizeof(uint32), &(s->n_sen), fp, + byteswap, &chksum) < 0) { + E_FATAL("bio_fread_1d(%s) failed\n", file_name); + } + s->mgau = ptr; + E_INFO("Mapping %d senones to %d codebooks\n", s->n_sen, s->n_gauden); + + /* Infer n_gauden if not present in this version */ + if (!n_gauden_present) { + s->n_gauden = 1; + for (i = 0; (uint32)i < s->n_sen; i++) + if (s->mgau[i] >= s->n_gauden) + s->n_gauden = s->mgau[i] + 1; + } + + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&eofchk, 1, 1, fp) == 1) + E_FATAL("More data than expected in %s: %d\n", file_name, eofchk); + + fclose(fp); + + E_INFO("Read %d->%d senone-codebook mappings\n", s->n_sen, + s->n_gauden); + + return 1; +} + + +static int32 +senone_mixw_read(senone_t * s, char const *file_name, logmath_t *lmath) +{ + char eofchk; + FILE *fp; + int32 byteswap, chksum_present; + uint32 chksum; + float32 *pdf; + int32 i, f, c, p, n_err; + char **argname, **argval; + + E_INFO("Reading senone mixture weights: %s\n", file_name); + + if ((fp = fopen(file_name, "rb")) == NULL) + E_FATAL_SYSTEM("Failed to open mixture weights file '%s' for reading", file_name); + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) + E_FATAL("Failed to read header from file '%s'\n", file_name); + + /* Parse argument-value list */ + chksum_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], MIXW_PARAM_VERSION) != 0) + E_WARN("Version mismatch(%s): %s, expecting %s\n", + file_name, argval[i], MIXW_PARAM_VERSION); + } + else if (strcmp(argname[i], "chksum0") == 0) { + chksum_present = 1; /* Ignore the associated value */ + } + } + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + /* Read #senones, #features, #codewords, arraysize */ + if ((bio_fread(&(s->n_sen), sizeof(int32), 1, fp, byteswap, &chksum) != + 1) + || + (bio_fread(&(s->n_feat), sizeof(int32), 1, fp, byteswap, &chksum) + != 1) + || (bio_fread(&(s->n_cw), sizeof(int32), 1, fp, byteswap, &chksum) + != 1) + || (bio_fread(&i, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { + E_FATAL("bio_fread(%s) (arraysize) failed\n", file_name); + } + if ((uint32)i != s->n_sen * s->n_feat * s->n_cw) { + E_FATAL + ("%s: #float32s(%d) doesn't match dimensions: %d x %d x %d\n", + file_name, i, s->n_sen, s->n_feat, s->n_cw); + } + + /* + * Compute #LSB bits to be dropped to represent mixwfloor with 8 bits. + * All PDF values will be truncated (in the LSB positions) by these many bits. + */ + if ((s->mixwfloor <= 0.0) || (s->mixwfloor >= 1.0)) + E_FATAL("mixwfloor (%e) not in range (0, 1)\n", s->mixwfloor); + + /* Use a fixed shift for compatibility with everything else. */ + E_INFO("Truncating senone logs3(pdf) values by %d bits\n", SENSCR_SHIFT); + + /* + * Allocate memory for senone PDF data. Organize normally or transposed depending on + * s->n_gauden. + */ + if (s->n_gauden > 1) { + E_INFO("Not transposing mixture weights in memory\n"); + s->pdf = + (senprob_t ***) ckd_calloc_3d(s->n_sen, s->n_feat, s->n_cw, + sizeof(senprob_t)); + } + else { + E_INFO("Transposing mixture weights in memory\n"); + s->pdf = + (senprob_t ***) ckd_calloc_3d(s->n_feat, s->n_cw, s->n_sen, + sizeof(senprob_t)); + } + + /* Temporary structure to read in floats */ + pdf = (float32 *) ckd_calloc(s->n_cw, sizeof(float32)); + + /* Read senone probs data, normalize, floor, convert to logs3, truncate to 8 bits */ + n_err = 0; + for (i = 0; (uint32)i < s->n_sen; i++) { + for (f = 0; (uint32)f < s->n_feat; f++) { + if (bio_fread + ((void *) pdf, sizeof(float32), s->n_cw, fp, byteswap, + &chksum) + != (int32)s->n_cw) { + E_FATAL("bio_fread(%s) (arraydata) failed\n", file_name); + } + + /* Normalize and floor */ + if (vector_sum_norm(pdf, s->n_cw) <= 0.0) + n_err++; + vector_floor(pdf, s->n_cw, s->mixwfloor); + vector_sum_norm(pdf, s->n_cw); + + /* Convert to logs3, truncate to 8 bits, and store in s->pdf */ + for (c = 0; (uint32)c < s->n_cw; c++) { + p = -(logmath_log(lmath, pdf[c])); + p += (1 << (SENSCR_SHIFT - 1)) - 1; /* Rounding before truncation */ + + if (s->n_gauden > 1) + s->pdf[i][f][c] = + (p < (255 << SENSCR_SHIFT)) ? (p >> SENSCR_SHIFT) : 255; + else + s->pdf[f][c][i] = + (p < (255 << SENSCR_SHIFT)) ? (p >> SENSCR_SHIFT) : 255; + } + } + } + if (n_err > 0) + E_WARN("Weight normalization failed for %d mixture weights components\n", n_err); + + ckd_free(pdf); + + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&eofchk, 1, 1, fp) == 1) + E_FATAL("More data than expected in %s\n", file_name); + + fclose(fp); + + E_INFO + ("Read mixture weights for %d senones: %d features x %d codewords\n", + s->n_sen, s->n_feat, s->n_cw); + + return 1; +} + + +senone_t * +senone_init(gauden_t *g, char const *mixwfile, char const *sen2mgau_map_file, + float32 mixwfloor, logmath_t *lmath, bin_mdef_t *mdef) +{ + senone_t *s; + int32 n = 0, i; + + s = (senone_t *) ckd_calloc(1, sizeof(senone_t)); + s->lmath = logmath_init(logmath_get_base(lmath), SENSCR_SHIFT, TRUE); + s->mixwfloor = mixwfloor; + + s->n_gauden = g->n_mgau; + if (sen2mgau_map_file) { + if (!(strcmp(sen2mgau_map_file, ".semi.") == 0 + || strcmp(sen2mgau_map_file, ".ptm.") == 0 + || strcmp(sen2mgau_map_file, ".cont.") == 0)) { + senone_mgau_map_read(s, sen2mgau_map_file); + n = s->n_sen; + } + } + else { + if (s->n_gauden == 1) + sen2mgau_map_file = ".semi."; + else if (s->n_gauden == (uint32)bin_mdef_n_ciphone(mdef)) + sen2mgau_map_file = ".ptm."; + else + sen2mgau_map_file = ".cont."; + } + + senone_mixw_read(s, mixwfile, lmath); + + if (strcmp(sen2mgau_map_file, ".semi.") == 0) { + /* All-to-1 senones-codebook mapping */ + E_INFO("Mapping all senones to one codebook\n"); + s->mgau = (uint32 *) ckd_calloc(s->n_sen, sizeof(*s->mgau)); + } + else if (strcmp(sen2mgau_map_file, ".ptm.") == 0) { + /* All-to-ciphone-id senones-codebook mapping */ + E_INFO("Mapping senones to context-independent phone codebooks\n"); + s->mgau = (uint32 *) ckd_calloc(s->n_sen, sizeof(*s->mgau)); + for (i = 0; (uint32)i < s->n_sen; i++) + s->mgau[i] = bin_mdef_sen2cimap(mdef, i); + } + else if (strcmp(sen2mgau_map_file, ".cont.") == 0 + || strcmp(sen2mgau_map_file, ".s3cont.") == 0) { + /* 1-to-1 senone-codebook mapping */ + E_INFO("Mapping senones to individual codebooks\n"); + if (s->n_sen <= 1) + E_FATAL("#senone=%d; must be >1\n", s->n_sen); + + s->mgau = (uint32 *) ckd_calloc(s->n_sen, sizeof(*s->mgau)); + for (i = 0; (uint32)i < s->n_sen; i++) + s->mgau[i] = i; + /* Not sure why this is here, it probably does nothing. */ + s->n_gauden = s->n_sen; + } + else { + if (s->n_sen != (uint32)n) + E_FATAL("#senones inconsistent: %d in %s; %d in %s\n", + n, sen2mgau_map_file, s->n_sen, mixwfile); + } + + s->featscr = NULL; + return s; +} + +void +senone_free(senone_t * s) +{ + if (s == NULL) + return; + if (s->pdf) + ckd_free_3d((void *) s->pdf); + if (s->mgau) + ckd_free(s->mgau); + if (s->featscr) + ckd_free(s->featscr); + logmath_free(s->lmath); + ckd_free(s); +} + + +/* + * Compute senone score for one senone. + * NOTE: Remember that senone PDF tables contain SCALED, NEGATED logs3 values. + * NOTE: Remember also that PDF data may be transposed or not depending on s->n_gauden. + */ +int32 +senone_eval(senone_t * s, int id, gauden_dist_t ** dist, int32 n_top) +{ + int32 scr; /* total senone score */ + int32 fden; /* Gaussian density */ + int32 fscr; /* senone score for one feature */ + int32 fwscr; /* senone score for one feature, one codeword */ + int32 f, t; + gauden_dist_t *fdist; + + assert((id >= 0) && ((uint32)id < s->n_sen)); + assert((n_top > 0) && ((uint32)n_top <= s->n_cw)); + + scr = 0; + + for (f = 0; (uint32)f < s->n_feat; f++) { + fdist = dist[f]; + + fden = ((int32)fdist[0].dist + ((1<> SENSCR_SHIFT; + fscr = (s->n_gauden > 1) + ? (fden + -s->pdf[id][f][fdist[0].id]) /* untransposed */ + : (fden + -s->pdf[f][fdist[0].id][id]); /* transposed */ + /* Remaining of n_top codewords for feature f */ + for (t = 1; t < n_top; t++) { + fden = ((int32)fdist[t].dist + ((1<> SENSCR_SHIFT; + fwscr = (s->n_gauden > 1) ? + (fden + -s->pdf[id][f][fdist[t].id]) : + (fden + -s->pdf[f][fdist[t].id][id]); + fscr = logmath_add(s->lmath, fscr, fwscr); + } + /* Senone scores are also scaled, negated logs3 values. Hence + * we have to negate the stuff we calculated above. */ + scr -= fscr; + } + /* Downscale scores. */ + scr /= s->aw; + + /* Avoid overflowing int16 */ + if (scr > 32767) + scr = 32767; + if (scr < -32768) + scr = -32768; + return scr; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h new file mode 100644 index 0000000..31faeaf --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h @@ -0,0 +1,134 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * senone.h -- Mixture density weights associated with each tied state. + */ + +#ifndef _MS_SENONE_H_ +#define _MS_SENONE_H_ + + +/* SphinxBase headers. */ +#include +#include +#include +#include + +/* Local headers. */ +#include "ms_gauden.h" +#include "bin_mdef.h" + +/** \file ms_senone.h + * \brief (Sphinx 3.0 specific) multiple streams senones. used with ms_gauden.h + * In Sphinx 3.0 family of tools, ms_senone is used to combine the Gaussian scores. + * Its existence is crucial in Sphinx 3.0 because 3.0 supports both SCHMM and CDHMM. + * There are optimization scheme for SCHMM (e.g. compute the top-N Gaussian) that is + * applicable to SCHMM than CDHMM. This is wrapped in senone_eval_all. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +typedef uint8 senprob_t; /**< Senone logs3-probs, truncated to 8 bits */ + +/** + * \struct senone_t + * \brief 8-bit senone PDF structure. + * + * 8-bit senone PDF structure. Senone pdf values are normalized, floored, converted to + * logs3 domain, and finally truncated to 8 bits precision to conserve memory space. + */ +typedef struct senone_s { + senprob_t ***pdf; /**< gaussian density mixture weights, organized two possible + ways depending on n_gauden: + if (n_gauden > 1): pdf[sen][feat][codeword]. Not an + efficient representation--memory access-wise--but + evaluating the many codebooks will be more costly. + if (n_gauden == 1): pdf[feat][codeword][sen]. Optimized + for the shared-distribution semi-continuous case. */ + logmath_t *lmath; /**< log math computation */ + uint32 n_sen; /**< Number senones in this set */ + uint32 n_feat; /**< Number feature streams */ + uint32 n_cw; /**< Number codewords per codebook,stream */ + uint32 n_gauden; /**< Number gaussian density codebooks referred to by senones */ + float32 mixwfloor; /**< floor applied to each PDF entry */ + uint32 *mgau; /**< senone-id -> mgau-id mapping for senones in this set */ + int32 *featscr; /**< The feature score for every senone, will be initialized inside senone_eval_all */ + int32 aw; /**< Inverse acoustic weight */ +} senone_t; + + +/** + * Load a set of senones (mixing weights and mixture gaussian codebook mappings) from + * the given files. Normalize weights for each codebook, apply the given floor, convert + * PDF values to logs3 domain and quantize to 8-bits. + * @return pointer to senone structure created. Caller MUST NOT change its contents. + */ +senone_t *senone_init (gauden_t *g, /**< In: codebooks */ + char const *mixwfile, /**< In: mixing weights file */ + char const *mgau_mapfile,/**< In: file specifying mapping from each + senone to mixture gaussian codebook. + If NULL all senones map to codebook 0 */ + float32 mixwfloor, /**< In: Floor value for senone weights */ + logmath_t *lmath, /**< In: log math computation */ + bin_mdef_t *mdef /**< In: model definition */ + ); + +/** Release memory allocated by senone_init. */ +void senone_free(senone_t *s); /**< In: The senone_t to free */ + +/** + * Evaluate the score for the given senone wrt to the given top N gaussian codewords. + * @return senone score (in logs3 domain). + */ +int32 senone_eval (senone_t *s, int id, /**< In: senone for which score desired */ + gauden_dist_t **dist, /**< In: top N codewords and densities for + all features, to be combined into + senone score. IE, dist[f][i] = i-th + best for feaure f */ + int n_top /**< In: Length of dist[f], for each f */ + ); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c new file mode 100644 index 0000000..ad7ca3a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c @@ -0,0 +1,1408 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ngram_search.c N-Gram based multi-pass search ("FBS") + */ + +/* System headers. */ +#include +#include + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "pocketsphinx_internal.h" +#include "ps_lattice_internal.h" +#include "ngram_search.h" +#include "ngram_search_fwdtree.h" +#include "ngram_search_fwdflat.h" + +static int ngram_search_start(ps_search_t *search); +static int ngram_search_step(ps_search_t *search, int frame_idx); +static int ngram_search_finish(ps_search_t *search); +static int ngram_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p); +static char const *ngram_search_hyp(ps_search_t *search, int32 *out_score); +static int32 ngram_search_prob(ps_search_t *search); +static ps_seg_t *ngram_search_seg_iter(ps_search_t *search); + +static ps_searchfuncs_t ngram_funcs = { + /* start: */ ngram_search_start, + /* step: */ ngram_search_step, + /* finish: */ ngram_search_finish, + /* reinit: */ ngram_search_reinit, + /* free: */ ngram_search_free, + /* lattice: */ ngram_search_lattice, + /* hyp: */ ngram_search_hyp, + /* prob: */ ngram_search_prob, + /* seg_iter: */ ngram_search_seg_iter, +}; + +static ngram_model_t *default_lm; + +static void +ngram_search_update_widmap(ngram_search_t *ngs) +{ + char const **words; + int32 i, n_words; + + /* It's okay to include fillers since they won't be in the LM */ + n_words = ps_search_n_words(ngs); + words = (char const**)ckd_calloc(n_words, sizeof(*words)); + /* This will include alternates, again, that's okay since they aren't in the LM */ + for (i = 0; i < n_words; ++i) + words[i] = dict_wordstr(ps_search_dict(ngs), i); + ngram_model_set_map_words(ngs->lmset, words, n_words); + ckd_free(words); +} + +static void +ngram_search_calc_beams(ngram_search_t *ngs) +{ + cmd_ln_t *config; + acmod_t *acmod; + + config = ps_search_config(ngs); + acmod = ps_search_acmod(ngs); + + /* Log beam widths. */ + ngs->beam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-beam"))>>SENSCR_SHIFT; + ngs->wbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-wbeam"))>>SENSCR_SHIFT; + ngs->pbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pbeam"))>>SENSCR_SHIFT; + ngs->lpbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-lpbeam"))>>SENSCR_SHIFT; + ngs->lponlybeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-lponlybeam"))>>SENSCR_SHIFT; + ngs->fwdflatbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-fwdflatbeam"))>>SENSCR_SHIFT; + ngs->fwdflatwbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-fwdflatwbeam"))>>SENSCR_SHIFT; + + /* Absolute pruning parameters. */ + ngs->maxwpf = cmd_ln_int32_r(config, "-maxwpf"); + ngs->maxhmmpf = cmd_ln_int32_r(config, "-maxhmmpf"); + + /* Various penalties which may or may not be useful. */ + ngs->wip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-wip")) >>SENSCR_SHIFT; + ngs->nwpen = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-nwpen")) >>SENSCR_SHIFT; + ngs->pip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pip")) >>SENSCR_SHIFT; + ngs->silpen = ngs->pip + + (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-silprob"))>>SENSCR_SHIFT); + ngs->fillpen = ngs->pip + + (logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-fillprob"))>>SENSCR_SHIFT); + + /* Language weight ratios for fwdflat and bestpath search. */ + ngs->fwdflat_fwdtree_lw_ratio = + cmd_ln_float32_r(config, "-fwdflatlw") + / cmd_ln_float32_r(config, "-lw"); + ngs->bestpath_fwdtree_lw_ratio = + cmd_ln_float32_r(config, "-bestpathlw") + / cmd_ln_float32_r(config, "-lw"); + + /* Acoustic score scale for posterior probabilities. */ + ngs->ascale = 1.0 / cmd_ln_float32_r(config, "-ascale"); +} + +ps_search_t * +ngram_search_init(const char *name, + ngram_model_t *lm, + cmd_ln_t *config, + acmod_t *acmod, + dict_t *dict, + dict2pid_t *d2p) +{ + ngram_search_t *ngs; + static char *lmname = "default"; + + /* Make the acmod's feature buffer growable if we are doing two-pass + * search. */ + acmod_set_grow(acmod, cmd_ln_boolean_r(config, "-fwdflat") && + cmd_ln_boolean_r(config, "-fwdtree")); + + ngs = ckd_calloc(1, sizeof(*ngs)); + ps_search_init(&ngs->base, &ngram_funcs, PS_SEARCH_TYPE_NGRAM, name, config, acmod, dict, d2p); + + ngs->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), + acmod->tmat->tp, NULL, acmod->mdef->sseq); + if (ngs->hmmctx == NULL) { + ps_search_free(ps_search_base(ngs)); + return NULL; + } + ngs->chan_alloc = listelem_alloc_init(sizeof(chan_t)); + ngs->root_chan_alloc = listelem_alloc_init(sizeof(root_chan_t)); + ngs->latnode_alloc = listelem_alloc_init(sizeof(ps_latnode_t)); + + /* Calculate various beam widths and such. */ + ngram_search_calc_beams(ngs); + + /* Allocate a billion different tables for stuff. */ + ngs->word_chan = ckd_calloc(dict_size(dict), + sizeof(*ngs->word_chan)); + ngs->word_lat_idx = ckd_calloc(dict_size(dict), + sizeof(*ngs->word_lat_idx)); + ngs->word_active = bitvec_alloc(dict_size(dict)); + ngs->last_ltrans = ckd_calloc(dict_size(dict), + sizeof(*ngs->last_ltrans)); + + /* FIXME: All these structures need to be made dynamic with + * garbage collection. */ + ngs->bp_table_size = cmd_ln_int32_r(config, "-latsize"); + ngs->bp_table = ckd_calloc(ngs->bp_table_size, + sizeof(*ngs->bp_table)); + /* FIXME: This thing is frickin' huge. */ + ngs->bscore_stack_size = ngs->bp_table_size * 20; + ngs->bscore_stack = ckd_calloc(ngs->bscore_stack_size, + sizeof(*ngs->bscore_stack)); + ngs->n_frame_alloc = 256; + ngs->bp_table_idx = ckd_calloc(ngs->n_frame_alloc + 1, + sizeof(*ngs->bp_table_idx)); + ++ngs->bp_table_idx; /* Make bptableidx[-1] valid */ + + /* Allocate active word list array */ + ngs->active_word_list = ckd_calloc_2d(2, dict_size(dict), + sizeof(**ngs->active_word_list)); + + ngs->lmset = ngram_model_set_init(config, &lm, &lmname, NULL, 1); + if (!ngs->lmset) + goto error_out; + + if (ngram_wid(ngs->lmset, S3_FINISH_WORD) == + ngram_unknown_wid(ngs->lmset)) + { + E_ERROR("Language model/set does not contain
, " + "recognition will fail\n"); + goto error_out; + } + + /* Create word mappings. */ + ngram_search_update_widmap(ngs); + + /* Initialize fwdtree, fwdflat, bestpath modules if necessary. */ + if (cmd_ln_boolean_r(config, "-fwdtree")) { + ngram_fwdtree_init(ngs); + ngs->fwdtree = TRUE; + ngs->fwdtree_perf.name = "fwdtree"; + ptmr_init(&ngs->fwdtree_perf); + } + if (cmd_ln_boolean_r(config, "-fwdflat")) { + ngram_fwdflat_init(ngs); + ngs->fwdflat = TRUE; + ngs->fwdflat_perf.name = "fwdflat"; + ptmr_init(&ngs->fwdflat_perf); + } + if (cmd_ln_boolean_r(config, "-bestpath")) { + ngs->bestpath = TRUE; + ngs->bestpath_perf.name = "bestpath"; + ptmr_init(&ngs->bestpath_perf); + } + + return (ps_search_t *)ngs; + +error_out: + ngram_search_free((ps_search_t *)ngs); + return NULL; +} + +static int +ngram_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + int old_n_words; + int rv = 0; + + /* Update the number of words. */ + old_n_words = search->n_words; + if (old_n_words != dict_size(dict)) { + search->n_words = dict_size(dict); + /* Reallocate these temporary arrays. */ + ckd_free(ngs->word_lat_idx); + ckd_free(ngs->word_active); + ckd_free(ngs->last_ltrans); + ckd_free_2d(ngs->active_word_list); + ngs->word_lat_idx = ckd_calloc(search->n_words, sizeof(*ngs->word_lat_idx)); + ngs->word_active = bitvec_alloc(search->n_words); + ngs->last_ltrans = ckd_calloc(search->n_words, sizeof(*ngs->last_ltrans)); + ngs->active_word_list + = ckd_calloc_2d(2, search->n_words, + sizeof(**ngs->active_word_list)); + } + + /* Free old dict2pid, dict */ + ps_search_base_reinit(search, dict, d2p); + + if (ngs->lmset == NULL) + return 0; + + /* Update beam widths. */ + ngram_search_calc_beams(ngs); + + /* Update word mappings. */ + ngram_search_update_widmap(ngs); + + /* Now rebuild lextrees. */ + if (ngs->fwdtree) { + if ((rv = ngram_fwdtree_reinit(ngs)) < 0) + return rv; + } + if (ngs->fwdflat) { + if ((rv = ngram_fwdflat_reinit(ngs)) < 0) + return rv; + } + + return rv; +} + +void +ngram_search_free(ps_search_t *search) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + + if (ngs->fwdtree) + ngram_fwdtree_deinit(ngs); + if (ngs->fwdflat) + ngram_fwdflat_deinit(ngs); + if (ngs->bestpath) { + double n_speech = (double)ngs->n_tot_frame + / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + + E_INFO("TOTAL bestpath %.2f CPU %.3f xRT\n", + ngs->bestpath_perf.t_tot_cpu, + ngs->bestpath_perf.t_tot_cpu / n_speech); + E_INFO("TOTAL bestpath %.2f wall %.3f xRT\n", + ngs->bestpath_perf.t_tot_elapsed, + ngs->bestpath_perf.t_tot_elapsed / n_speech); + } + + ps_search_base_free(search); + hmm_context_free(ngs->hmmctx); + listelem_alloc_free(ngs->chan_alloc); + listelem_alloc_free(ngs->root_chan_alloc); + listelem_alloc_free(ngs->latnode_alloc); + ngram_model_free(ngs->lmset); + + ckd_free(ngs->word_chan); + ckd_free(ngs->word_lat_idx); + bitvec_free(ngs->word_active); + ckd_free(ngs->bp_table); + ckd_free(ngs->bscore_stack); + if (ngs->bp_table_idx != NULL) + ckd_free(ngs->bp_table_idx - 1); + ckd_free_2d(ngs->active_word_list); + ckd_free(ngs->last_ltrans); + ckd_free(ngs); +} + +int +ngram_search_mark_bptable(ngram_search_t *ngs, int frame_idx) +{ + if (frame_idx >= ngs->n_frame_alloc) { + ngs->n_frame_alloc *= 2; + ngs->bp_table_idx = ckd_realloc(ngs->bp_table_idx - 1, + (ngs->n_frame_alloc + 1) + * sizeof(*ngs->bp_table_idx)); + if (ngs->frm_wordlist) { + ngs->frm_wordlist = ckd_realloc(ngs->frm_wordlist, + ngs->n_frame_alloc + * sizeof(*ngs->frm_wordlist)); + } + ++ngs->bp_table_idx; /* Make bptableidx[-1] valid */ + } + ngs->bp_table_idx[frame_idx] = ngs->bpidx; + return ngs->bpidx; +} + +static void +set_real_wid(ngram_search_t *ngs, int32 bp) +{ + bptbl_t *ent, *prev; + + assert(bp != NO_BP); + ent = ngs->bp_table + bp; + if (ent->bp == NO_BP) + prev = NULL; + else + prev = ngs->bp_table + ent->bp; + + /* Propagate lm state for fillers, rotate it for words. */ + if (dict_filler_word(ps_search_dict(ngs), ent->wid)) { + if (prev != NULL) { + ent->real_wid = prev->real_wid; + ent->prev_real_wid = prev->prev_real_wid; + } + else { + ent->real_wid = dict_basewid(ps_search_dict(ngs), + ent->wid); + ent->prev_real_wid = BAD_S3WID; + } + } + else { + ent->real_wid = dict_basewid(ps_search_dict(ngs), ent->wid); + if (prev != NULL) + ent->prev_real_wid = prev->real_wid; + else + ent->prev_real_wid = BAD_S3WID; + } +} + +#define NGRAM_HISTORY_LONG_WORD 2000 /* 20s */ + +void +ngram_search_save_bp(ngram_search_t *ngs, int frame_idx, + int32 w, int32 score, int32 path, int32 rc) +{ + int32 bp; + + /* Look for an existing exit for this word in this frame. The + * only reason one would exist is from a different right context + * triphone, but of course that happens quite frequently. */ + bp = ngs->word_lat_idx[w]; + if (bp != NO_BP) { + + if (frame_idx - ngs->bp_table[path].frame > NGRAM_HISTORY_LONG_WORD) { + E_WARN("Word '%s' survived for %d frames, potential overpruning\n", dict_wordstr(ps_search_dict(ngs), w), + frame_idx - ngs->bp_table[path].frame); + } + + /* Keep only the best scoring one, we will reconstruct the + * others from the right context scores - usually the history + * is not lost. */ + if (ngs->bp_table[bp].score WORSE_THAN score) { + assert(path != bp); /* Pathological. */ + if (ngs->bp_table[bp].bp != path) { + int32 bplh[2], newlh[2]; + /* But, sometimes, the history *is* lost. If we wanted to + * do exact language model scoring we'd have to preserve + * these alternate histories. */ + E_DEBUG("Updating path history %d => %d frame %d\n", + ngs->bp_table[bp].bp, path, frame_idx); + bplh[0] = ngs->bp_table[bp].bp == -1 + ? -1 : ngs->bp_table[ngs->bp_table[bp].bp].prev_real_wid; + bplh[1] = ngs->bp_table[bp].bp == -1 + ? -1 : ngs->bp_table[ngs->bp_table[bp].bp].real_wid; + newlh[0] = path == -1 + ? -1 : ngs->bp_table[path].prev_real_wid; + newlh[1] = path == -1 + ? -1 : ngs->bp_table[path].real_wid; + /* Actually it's worth checking how often the actual + * language model state changes. */ + if (bplh[0] != newlh[0] || bplh[1] != newlh[1]) { + /* It's fairly rare that the actual language model + * state changes, but it does happen some + * times. */ + E_DEBUG("Updating language model state %s,%s => %s,%s frame %d\n", + dict_wordstr(ps_search_dict(ngs), bplh[0]), + dict_wordstr(ps_search_dict(ngs), bplh[1]), + dict_wordstr(ps_search_dict(ngs), newlh[0]), + dict_wordstr(ps_search_dict(ngs), newlh[1]), + frame_idx); + set_real_wid(ngs, bp); + } + ngs->bp_table[bp].bp = path; + } + ngs->bp_table[bp].score = score; + } + /* But do keep track of scores for all right contexts, since + * we need them to determine the starting path scores for any + * successors of this word exit. */ + if (ngs->bp_table[bp].s_idx != -1) + ngs->bscore_stack[ngs->bp_table[bp].s_idx + rc] = score; + } + else { + int32 i, rcsize; + bptbl_t *be; + + /* This might happen if recognition fails. */ + if (ngs->bpidx == NO_BP) { + E_ERROR("No entries in backpointer table!"); + return; + } + + /* Expand the backpointer tables if necessary. */ + if (ngs->bpidx >= ngs->bp_table_size) { + ngs->bp_table_size *= 2; + ngs->bp_table = ckd_realloc(ngs->bp_table, + ngs->bp_table_size + * sizeof(*ngs->bp_table)); + E_INFO("Resized backpointer table to %d entries\n", ngs->bp_table_size); + } + if (ngs->bss_head >= ngs->bscore_stack_size + - bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef)) { + ngs->bscore_stack_size *= 2; + ngs->bscore_stack = ckd_realloc(ngs->bscore_stack, + ngs->bscore_stack_size + * sizeof(*ngs->bscore_stack)); + E_INFO("Resized score stack to %d entries\n", ngs->bscore_stack_size); + } + + ngs->word_lat_idx[w] = ngs->bpidx; + be = &(ngs->bp_table[ngs->bpidx]); + be->wid = w; + be->frame = frame_idx; + be->bp = path; + be->score = score; + be->s_idx = ngs->bss_head; + be->valid = TRUE; + assert(path != ngs->bpidx); + + /* DICT2PID */ + /* Get diphone ID for final phone and number of ssids corresponding to it. */ + be->last_phone = dict_last_phone(ps_search_dict(ngs),w); + if (dict_is_single_phone(ps_search_dict(ngs), w)) { + be->last2_phone = -1; + be->s_idx = -1; + rcsize = 0; + } + else { + be->last2_phone = dict_second_last_phone(ps_search_dict(ngs),w); + rcsize = dict2pid_rssid(ps_search_dict2pid(ngs), + be->last_phone, be->last2_phone)->n_ssid; + } + /* Allocate some space on the bscore_stack for all of these triphones. */ + for (i = 0; i < rcsize; ++i) + ngs->bscore_stack[ngs->bss_head + i] = WORST_SCORE; + if (rcsize) + ngs->bscore_stack[ngs->bss_head + rc] = score; + set_real_wid(ngs, ngs->bpidx); + + ngs->bpidx++; + ngs->bss_head += rcsize; + } +} + +int +ngram_search_find_exit(ngram_search_t *ngs, int frame_idx, int32 *out_best_score) +{ + /* End of backpointers for this frame. */ + int end_bpidx; + int best_exit, bp; + int32 best_score; + + /* No hypothesis means no exit node! */ + if (ngs->n_frame == 0) + return NO_BP; + + if (frame_idx == -1 || frame_idx >= ngs->n_frame) + frame_idx = ngs->n_frame - 1; + end_bpidx = ngs->bp_table_idx[frame_idx]; + + best_score = WORST_SCORE; + best_exit = NO_BP; + + /* Scan back to find a frame with some backpointers in it. */ + while (frame_idx >= 0 && ngs->bp_table_idx[frame_idx] == end_bpidx) + --frame_idx; + /* This is NOT an error, it just means there is no hypothesis yet. */ + if (frame_idx < 0) + return NO_BP; + + /* Now find the entry for
OR the best scoring entry. */ + assert(end_bpidx < ngs->bp_table_size); + for (bp = ngs->bp_table_idx[frame_idx]; bp < end_bpidx; ++bp) { + if (ngs->bp_table[bp].wid == ps_search_finish_wid(ngs) + || ngs->bp_table[bp].score BETTER_THAN best_score) { + best_score = ngs->bp_table[bp].score; + best_exit = bp; + } + if (ngs->bp_table[bp].wid == ps_search_finish_wid(ngs)) + break; + } + + if (out_best_score) { + *out_best_score = best_score; + } + return best_exit; +} + +char const * +ngram_search_bp_hyp(ngram_search_t *ngs, int bpidx) +{ + ps_search_t *base = ps_search_base(ngs); + char *c; + size_t len; + int bp; + + if (bpidx == NO_BP) + return NULL; + + bp = bpidx; + len = 0; + while (bp != NO_BP) { + bptbl_t *be = &ngs->bp_table[bp]; + bp = be->bp; + if (dict_real_word(ps_search_dict(ngs), be->wid)) + len += strlen(dict_basestr(ps_search_dict(ngs), be->wid)) + 1; + } + + ckd_free(base->hyp_str); + if (len == 0) { + base->hyp_str = NULL; + return base->hyp_str; + } + base->hyp_str = ckd_calloc(1, len); + + bp = bpidx; + c = base->hyp_str + len - 1; + while (bp != NO_BP) { + bptbl_t *be = &ngs->bp_table[bp]; + size_t len; + + bp = be->bp; + if (dict_real_word(ps_search_dict(ngs), be->wid)) { + len = strlen(dict_basestr(ps_search_dict(ngs), be->wid)); + c -= len; + memcpy(c, dict_basestr(ps_search_dict(ngs), be->wid), len); + if (c > base->hyp_str) { + --c; + *c = ' '; + } + } + } + + return base->hyp_str; +} + +void +ngram_search_alloc_all_rc(ngram_search_t *ngs, int32 w) +{ + chan_t *hmm, *thmm; + xwdssid_t *rssid; + int32 i, tmatid, ciphone; + + /* DICT2PID */ + /* Get pointer to array of triphones for final diphone. */ + assert(!dict_is_single_phone(ps_search_dict(ngs), w)); + ciphone = dict_last_phone(ps_search_dict(ngs),w); + rssid = dict2pid_rssid(ps_search_dict2pid(ngs), + ciphone, + dict_second_last_phone(ps_search_dict(ngs),w)); + tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, ciphone); + hmm = ngs->word_chan[w]; + if ((hmm == NULL) || (hmm_nonmpx_ssid(&hmm->hmm) != rssid->ssid[0])) { + hmm = listelem_malloc(ngs->chan_alloc); + hmm->next = ngs->word_chan[w]; + ngs->word_chan[w] = hmm; + + hmm->info.rc_id = 0; + hmm->ciphone = ciphone; + hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, rssid->ssid[0], tmatid); + E_DEBUG("allocated rc_id 0 ssid %d ciphone %d lc %d word %s\n", + rssid->ssid[0], hmm->ciphone, + dict_second_last_phone(ps_search_dict(ngs),w), + dict_wordstr(ps_search_dict(ngs),w)); + } + for (i = 1; i < rssid->n_ssid; ++i) { + if ((hmm->next == NULL) || (hmm_nonmpx_ssid(&hmm->next->hmm) != rssid->ssid[i])) { + thmm = listelem_malloc(ngs->chan_alloc); + thmm->next = hmm->next; + hmm->next = thmm; + hmm = thmm; + + hmm->info.rc_id = i; + hmm->ciphone = ciphone; + hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, rssid->ssid[i], tmatid); + E_DEBUG("allocated rc_id %d ssid %d ciphone %d lc %d word %s\n", + i, rssid->ssid[i], hmm->ciphone, + dict_second_last_phone(ps_search_dict(ngs),w), + dict_wordstr(ps_search_dict(ngs),w)); + } + else + hmm = hmm->next; + } +} + +void +ngram_search_free_all_rc(ngram_search_t *ngs, int32 w) +{ + chan_t *hmm, *thmm; + + for (hmm = ngs->word_chan[w]; hmm; hmm = thmm) { + thmm = hmm->next; + hmm_deinit(&hmm->hmm); + listelem_free(ngs->chan_alloc, hmm); + } + ngs->word_chan[w] = NULL; +} + +int32 +ngram_search_exit_score(ngram_search_t *ngs, bptbl_t *pbe, int rcphone) +{ + /* DICT2PID */ + /* Get the mapping from right context phone ID to index in the + * right context table and the bscore_stack. */ + if (pbe->last2_phone == -1) { + /* No right context for single phone predecessor words. */ + return pbe->score; + } + else { + xwdssid_t *rssid; + /* Find the index for the last diphone of the previous word + + * the first phone of the current word. */ + rssid = dict2pid_rssid(ps_search_dict2pid(ngs), + pbe->last_phone, pbe->last2_phone); + /* This may be WORST_SCORE, which means that there was no exit + * with rcphone as right context. */ + return ngs->bscore_stack[pbe->s_idx + rssid->cimap[rcphone]]; + } +} + +/* + * Compute acoustic and LM scores for a BPTable entry (segment). + */ +void +ngram_compute_seg_score(ngram_search_t *ngs, bptbl_t *be, float32 lwf, + int32 *out_ascr, int32 *out_lscr) +{ + bptbl_t *pbe; + int32 start_score; + + /* Start of utterance. */ + if (be->bp == NO_BP) { + *out_ascr = be->score; + *out_lscr = 0; + return; + } + + /* Otherwise, calculate lscr and ascr. */ + pbe = ngs->bp_table + be->bp; + start_score = ngram_search_exit_score(ngs, pbe, + dict_first_phone(ps_search_dict(ngs),be->wid)); + assert(start_score BETTER_THAN WORST_SCORE); + + /* FIXME: These result in positive acoustic scores when filler + words have non-filler pronunciations. That whole business + is still pretty much broken but at least it doesn't + segfault. */ + if (be->wid == ps_search_silence_wid(ngs)) { + *out_lscr = ngs->silpen; + } + else if (dict_filler_word(ps_search_dict(ngs), be->wid)) { + *out_lscr = ngs->fillpen; + } + else { + int32 n_used; + *out_lscr = ngram_tg_score(ngs->lmset, + be->real_wid, + pbe->real_wid, + pbe->prev_real_wid, + &n_used)>>SENSCR_SHIFT; + *out_lscr = *out_lscr * lwf; + } + *out_ascr = be->score - start_score - *out_lscr; +} + +static int +ngram_search_start(ps_search_t *search) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + + ngs->done = FALSE; + ngram_model_flush(ngs->lmset); + if (ngs->fwdtree) + ngram_fwdtree_start(ngs); + else if (ngs->fwdflat) + ngram_fwdflat_start(ngs); + else + return -1; + return 0; +} + +static int +ngram_search_step(ps_search_t *search, int frame_idx) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + + if (ngs->fwdtree) + return ngram_fwdtree_search(ngs, frame_idx); + else if (ngs->fwdflat) + return ngram_fwdflat_search(ngs, frame_idx); + else + return -1; +} + +void +dump_bptable(ngram_search_t *ngs) +{ + int i; + E_INFO("Backpointer table (%d entries):\n", ngs->bpidx); + for (i = 0; i < ngs->bpidx; ++i) { + bptbl_t *bpe = ngs->bp_table + i; + int j, rcsize; + + E_INFO_NOFN("%-5d %-10s start %-3d end %-3d score %-8d bp %-3d real_wid %-5d prev_real_wid %-5d", + i, dict_wordstr(ps_search_dict(ngs), bpe->wid), + (bpe->bp == -1 + ? 0 : ngs->bp_table[bpe->bp].frame + 1), + bpe->frame, bpe->score, bpe->bp, + bpe->real_wid, bpe->prev_real_wid); + + if (bpe->last2_phone == -1) + rcsize = 0; + else + rcsize = dict2pid_rssid(ps_search_dict2pid(ngs), + bpe->last_phone, bpe->last2_phone)->n_ssid; + if (rcsize) { + E_INFOCONT("\tbss"); + for (j = 0; j < rcsize; ++j) + if (ngs->bscore_stack[bpe->s_idx + j] != WORST_SCORE) + E_INFOCONT(" %d", bpe->score - ngs->bscore_stack[bpe->s_idx + j]); + } + E_INFOCONT("\n"); + } +} + +static int +ngram_search_finish(ps_search_t *search) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + + ngs->n_tot_frame += ngs->n_frame; + if (ngs->fwdtree) { + ngram_fwdtree_finish(ngs); + /* dump_bptable(ngs); */ + + /* Now do fwdflat search in its entirety, if requested. */ + if (ngs->fwdflat) { + int i; + /* Rewind the acoustic model. */ + if (acmod_rewind(ps_search_acmod(ngs)) < 0) + return -1; + /* Now redo search. */ + ngram_fwdflat_start(ngs); + i = 0; + while (ps_search_acmod(ngs)->n_feat_frame > 0) { + int nfr; + if ((nfr = ngram_fwdflat_search(ngs, i)) < 0) + return nfr; + acmod_advance(ps_search_acmod(ngs)); + ++i; + } + ngram_fwdflat_finish(ngs); + /* And now, we should have a result... */ + /* dump_bptable(ngs); */ + } + } + else if (ngs->fwdflat) { + ngram_fwdflat_finish(ngs); + } + + /* Mark the current utterance as done. */ + ngs->done = TRUE; + return 0; +} + +static ps_latlink_t * +ngram_search_bestpath(ps_search_t *search, int32 *out_score, int backward) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + + (void)backward; + if (search->last_link == NULL) { + search->last_link = ps_lattice_bestpath(search->dag, ngs->lmset, + ngs->bestpath_fwdtree_lw_ratio, + ngs->ascale); + if (search->last_link == NULL) + return NULL; + /* Also calculate betas so we can fill in the posterior + * probability field in the segmentation. */ + if (search->post == 0) + search->post = ps_lattice_posterior(search->dag, ngs->lmset, + ngs->ascale); + } + if (out_score) + *out_score = search->last_link->path_scr + search->dag->final_node_ascr; + return search->last_link; +} + +static char const * +ngram_search_hyp(ps_search_t *search, int32 *out_score) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + + /* Only do bestpath search if the utterance is complete. */ + if (ngs->bestpath && ngs->done) { + ps_lattice_t *dag; + ps_latlink_t *link; + char const *hyp; + double n_speech; + + ptmr_reset(&ngs->bestpath_perf); + ptmr_start(&ngs->bestpath_perf); + if ((dag = ngram_search_lattice(search)) == NULL) + return NULL; + if ((link = ngram_search_bestpath(search, out_score, FALSE)) == NULL) + return NULL; + hyp = ps_lattice_hyp(dag, link); + ptmr_stop(&ngs->bestpath_perf); + n_speech = (double)dag->n_frames + / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + E_INFO("bestpath %.2f CPU %.3f xRT\n", + ngs->bestpath_perf.t_cpu, + ngs->bestpath_perf.t_cpu / n_speech); + E_INFO("bestpath %.2f wall %.3f xRT\n", + ngs->bestpath_perf.t_elapsed, + ngs->bestpath_perf.t_elapsed / n_speech); + return hyp; + } + else { + int32 bpidx; + + /* fwdtree and fwdflat use same backpointer table. */ + bpidx = ngram_search_find_exit(ngs, -1, out_score); + if (bpidx != NO_BP) + return ngram_search_bp_hyp(ngs, bpidx); + } + + return NULL; +} + +static void +ngram_search_bp2itor(ps_seg_t *seg, int bp) +{ + ngram_search_t *ngs = (ngram_search_t *)seg->search; + bptbl_t *be, *pbe; + + be = &ngs->bp_table[bp]; + pbe = be->bp == -1 ? NULL : &ngs->bp_table[be->bp]; + seg->word = dict_wordstr(ps_search_dict(ngs), be->wid); + seg->ef = be->frame; + seg->sf = pbe ? pbe->frame + 1 : 0; + seg->prob = 0; /* Bogus value... */ + /* Compute acoustic and LM scores for this segment. */ + if (pbe == NULL) { + seg->ascr = be->score; + seg->lscr = 0; + seg->lback = 0; + } + else { + int32 start_score; + + /* Find ending path score of previous word. */ + start_score = ngram_search_exit_score(ngs, pbe, + dict_first_phone(ps_search_dict(ngs), be->wid)); + assert(start_score BETTER_THAN WORST_SCORE); + if (be->wid == ps_search_silence_wid(ngs)) { + seg->lscr = ngs->silpen; + } + else if (dict_filler_word(ps_search_dict(ngs), be->wid)) { + seg->lscr = ngs->fillpen; + } + else { + seg->lscr = ngram_tg_score(ngs->lmset, + be->real_wid, + pbe->real_wid, + pbe->prev_real_wid, + &seg->lback)>>SENSCR_SHIFT; + seg->lscr = (int32)(seg->lscr * seg->lwf); + } + seg->ascr = be->score - start_score - seg->lscr; + } +} + +static void +ngram_bp_seg_free(ps_seg_t *seg) +{ + bptbl_seg_t *itor = (bptbl_seg_t *)seg; + + ckd_free(itor->bpidx); + ckd_free(itor); +} + +static ps_seg_t * +ngram_bp_seg_next(ps_seg_t *seg) +{ + bptbl_seg_t *itor = (bptbl_seg_t *)seg; + + if (++itor->cur == itor->n_bpidx) { + ngram_bp_seg_free(seg); + return NULL; + } + + ngram_search_bp2itor(seg, itor->bpidx[itor->cur]); + return seg; +} + +static ps_segfuncs_t ngram_bp_segfuncs = { + /* seg_next */ ngram_bp_seg_next, + /* seg_free */ ngram_bp_seg_free +}; + +static ps_seg_t * +ngram_search_bp_iter(ngram_search_t *ngs, int bpidx, float32 lwf) +{ + bptbl_seg_t *itor; + int bp, cur; + + /* Calling this an "iterator" is a bit of a misnomer since we have + * to get the entire backtrace in order to produce it. On the + * other hand, all we actually need is the bptbl IDs, and we can + * allocate a fixed-size array of them. */ + itor = ckd_calloc(1, sizeof(*itor)); + itor->base.vt = &ngram_bp_segfuncs; + itor->base.search = ps_search_base(ngs); + itor->base.lwf = lwf; + itor->n_bpidx = 0; + bp = bpidx; + while (bp != NO_BP) { + bptbl_t *be = &ngs->bp_table[bp]; + bp = be->bp; + ++itor->n_bpidx; + } + if (itor->n_bpidx == 0) { + ckd_free(itor); + return NULL; + } + itor->bpidx = ckd_calloc(itor->n_bpidx, sizeof(*itor->bpidx)); + cur = itor->n_bpidx - 1; + bp = bpidx; + while (bp != NO_BP) { + bptbl_t *be = &ngs->bp_table[bp]; + itor->bpidx[cur] = bp; + bp = be->bp; + --cur; + } + + /* Fill in relevant fields for first element. */ + ngram_search_bp2itor((ps_seg_t *)itor, itor->bpidx[0]); + + return (ps_seg_t *)itor; +} + +static ps_seg_t * +ngram_search_seg_iter(ps_search_t *search) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + + /* Only do bestpath search if the utterance is done. */ + if (ngs->bestpath && ngs->done) { + ps_lattice_t *dag; + ps_latlink_t *link; + double n_speech; + ps_seg_t *itor; + + ptmr_reset(&ngs->bestpath_perf); + ptmr_start(&ngs->bestpath_perf); + if ((dag = ngram_search_lattice(search)) == NULL) + return NULL; + if ((link = ngram_search_bestpath(search, NULL, TRUE)) == NULL) + return NULL; + itor = ps_lattice_seg_iter(dag, link, + ngs->bestpath_fwdtree_lw_ratio); + ptmr_stop(&ngs->bestpath_perf); + n_speech = (double)dag->n_frames + / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + E_INFO("bestpath %.2f CPU %.3f xRT\n", + ngs->bestpath_perf.t_cpu, + ngs->bestpath_perf.t_cpu / n_speech); + E_INFO("bestpath %.2f wall %.3f xRT\n", + ngs->bestpath_perf.t_elapsed, + ngs->bestpath_perf.t_elapsed / n_speech); + return itor; + } + else { + int32 bpidx; + + /* fwdtree and fwdflat use same backpointer table. */ + bpidx = ngram_search_find_exit(ngs, -1, NULL); + return ngram_search_bp_iter(ngs, bpidx, + /* but different language weights... */ + (ngs->done && ngs->fwdflat) + ? ngs->fwdflat_fwdtree_lw_ratio : 1.0); + } + + return NULL; +} + +static int32 +ngram_search_prob(ps_search_t *search) +{ + ngram_search_t *ngs = (ngram_search_t *)search; + + /* Only do bestpath search if the utterance is done. */ + if (ngs->bestpath && ngs->done) { + ps_lattice_t *dag; + ps_latlink_t *link; + + if ((dag = ngram_search_lattice(search)) == NULL) + return 0; + if ((link = ngram_search_bestpath(search, NULL, TRUE)) == NULL) + return 0; + return search->post; + } + else { + /* FIXME: Give some kind of good estimate here, eventually. */ + return 0; + } +} + +static void +create_dag_nodes(ngram_search_t *ngs, ps_lattice_t *dag) +{ + bptbl_t *bp_ptr; + int32 i; + + for (i = 0, bp_ptr = ngs->bp_table; i < ngs->bpidx; ++i, ++bp_ptr) { + int32 sf, ef, wid; + ps_latnode_t *node; + + /* Skip invalid backpointers (these result from -maxwpf pruning) */ + if (!bp_ptr->valid) + continue; + + sf = (bp_ptr->bp < 0) ? 0 : ngs->bp_table[bp_ptr->bp].frame + 1; + ef = bp_ptr->frame; + wid = bp_ptr->wid; + + assert(ef < dag->n_frames); + /* Skip non-final
entries. */ + if ((wid == ps_search_finish_wid(ngs)) && (ef < dag->n_frames - 1)) + continue; + + /* Skip if word not in LM */ + if ((!dict_filler_word(ps_search_dict(ngs), wid)) + && (!ngram_model_set_known_wid(ngs->lmset, + dict_basewid(ps_search_dict(ngs), wid)))) + continue; + + /* See if bptbl entry already in lattice */ + for (node = dag->nodes; node; node = node->next) { + if ((node->wid == wid) && (node->sf == sf)) + break; + } + + /* For the moment, store bptbl indices in node.{fef,lef} */ + if (node) + node->lef = i; + else { + /* New node; link to head of list */ + node = listelem_malloc(dag->latnode_alloc); + node->wid = wid; + node->sf = sf; /* This is a frame index. */ + node->fef = node->lef = i; /* These are backpointer indices (argh) */ + node->reachable = FALSE; + node->entries = NULL; + node->exits = NULL; + + /* NOTE: This creates the list of nodes in reverse + * topological order, i.e. a node always precedes its + * antecedents in this list. */ + node->next = dag->nodes; + dag->nodes = node; + ++dag->n_nodes; + } + } +} + +static ps_latnode_t * +find_start_node(ngram_search_t *ngs, ps_lattice_t *dag) +{ + ps_latnode_t *node; + + /* Find start node .0 */ + for (node = dag->nodes; node; node = node->next) { + if ((node->wid == ps_search_start_wid(ngs)) && (node->sf == 0)) + break; + } + if (!node) { + /* This is probably impossible. */ + E_ERROR("Couldn't find in first frame\n"); + return NULL; + } + return node; +} + +static ps_latnode_t * +find_end_node(ngram_search_t *ngs, ps_lattice_t *dag, float32 lwf) +{ + ps_latnode_t *node; + int32 ef, bestbp, bp, bestscore; + + /* Find final node .last_frame; nothing can follow this node */ + for (node = dag->nodes; node; node = node->next) { + int32 lef = ngs->bp_table[node->lef].frame; + if ((node->wid == ps_search_finish_wid(ngs)) + && (lef == dag->n_frames - 1)) + break; + } + if (node != NULL) + return node; + + /* It is quite likely that no exited in the last frame. So, + * find the node corresponding to the best exit. */ + /* Find the last frame containing a word exit. */ + for (ef = dag->n_frames - 1; + ef >= 0 && ngs->bp_table_idx[ef] == ngs->bpidx; + --ef); + if (ef < 0) { + E_ERROR("Empty backpointer table: can not build DAG.\n"); + return NULL; + } + + /* Find best word exit in that frame. */ + bestscore = WORST_SCORE; + bestbp = NO_BP; + for (bp = ngs->bp_table_idx[ef]; bp < ngs->bp_table_idx[ef + 1]; ++bp) { + int32 n_used, l_scr, wid, prev_wid; + wid = ngs->bp_table[bp].real_wid; + prev_wid = ngs->bp_table[bp].prev_real_wid; + /* Always prefer
, of which there will only be one per frame. */ + if (wid == ps_search_finish_wid(ngs)) { + bestbp = bp; + break; + } + l_scr = ngram_tg_score(ngs->lmset, ps_search_finish_wid(ngs), + wid, prev_wid, &n_used) >>SENSCR_SHIFT; + l_scr = l_scr * lwf; + if (ngs->bp_table[bp].score + l_scr BETTER_THAN bestscore) { + bestscore = ngs->bp_table[bp].score + l_scr; + bestbp = bp; + } + } + if (bestbp == NO_BP) { + E_ERROR("No word exits found in last frame (%d), assuming no recognition\n", ef); + return NULL; + } + E_INFO("
not found in last frame, using %s.%d instead\n", + dict_basestr(ps_search_dict(ngs), ngs->bp_table[bestbp].wid), ef); + + /* Now find the node that corresponds to it. */ + for (node = dag->nodes; node; node = node->next) { + if (node->lef == bestbp) + return node; + } + + /* FIXME: This seems to happen a lot! */ + E_ERROR("Failed to find DAG node corresponding to %s\n", + dict_basestr(ps_search_dict(ngs), ngs->bp_table[bestbp].wid)); + return NULL; +} + +/* + * Build lattice from bptable. + */ +ps_lattice_t * +ngram_search_lattice(ps_search_t *search) +{ + int32 i, score, ascr, lscr; + ps_latnode_t *node, *from, *to; + ngram_search_t *ngs; + ps_lattice_t *dag; + int min_endfr, nlink; + float lwf; + + ngs = (ngram_search_t *)search; + min_endfr = cmd_ln_int32_r(ps_search_config(search), "-min_endfr"); + + /* If the best score is WORST_SCORE or worse, there is no way to + * make a lattice. */ + if (ngs->best_score == WORST_SCORE || ngs->best_score WORSE_THAN WORST_SCORE) + return NULL; + + /* Check to see if a lattice has previously been created over the + * same number of frames, and reuse it if so. */ + if (search->dag && search->dag->n_frames == ngs->n_frame) + return search->dag; + + /* Nope, create a new one. */ + ps_lattice_free(search->dag); + search->dag = NULL; + dag = ps_lattice_init_search(search, ngs->n_frame); + /* Compute these such that they agree with the fwdtree language weight. */ + lwf = ngs->fwdflat ? ngs->fwdflat_fwdtree_lw_ratio : 1.0; + create_dag_nodes(ngs, dag); + if ((dag->start = find_start_node(ngs, dag)) == NULL) + goto error_out; + if ((dag->end = find_end_node(ngs, dag, ngs->bestpath_fwdtree_lw_ratio)) == NULL) + goto error_out; + E_INFO("lattice start node %s.%d end node %s.%d\n", + dict_wordstr(search->dict, dag->start->wid), dag->start->sf, + dict_wordstr(search->dict, dag->end->wid), dag->end->sf); + + ngram_compute_seg_score(ngs, ngs->bp_table + dag->end->lef, lwf, + &dag->final_node_ascr, &lscr); + + /* + * At this point, dag->nodes is ordered such that nodes earlier in + * the list can follow (in time) those later in the list, but not + * vice versa (see above - also note that adjacency is purely + * determined by time which is why we can make this claim). Now + * create precedence links and simultanesously mark all nodes that + * can reach dag->end. (All nodes are reached from dag->start + * simply by definition - they were created that way). + * + * Note that this also means that any nodes before dag->end in the + * list can be discarded, meaning that dag->end will always be + * equal to dag->nodes (FIXME: except when loading from a file but + * we can fix that...) + */ + i = 0; + while (dag->nodes && dag->nodes != dag->end) { + ps_latnode_t *next = dag->nodes->next; + listelem_free(dag->latnode_alloc, dag->nodes); + dag->nodes = next; + ++i; + } + E_INFO("Eliminated %d nodes before end node\n", i); + dag->end->reachable = TRUE; + nlink = 0; + for (to = dag->end; to; to = to->next) { + int fef, lef; + + /* Skip if not reachable; it will never be reachable from dag->end */ + if (!to->reachable) + continue; + + /* Prune nodes with too few endpoints - heuristic + borrowed from Sphinx3 */ + fef = ngs->bp_table[to->fef].frame; + lef = ngs->bp_table[to->lef].frame; + if (to != dag->end && lef - fef < min_endfr) { + to->reachable = FALSE; + continue; + } + + /* Find predecessors of to : from->fef+1 <= to->sf <= from->lef+1 */ + for (from = to->next; from; from = from->next) { + bptbl_t *from_bpe; + + fef = ngs->bp_table[from->fef].frame; + lef = ngs->bp_table[from->lef].frame; + + if ((to->sf <= fef) || (to->sf > lef + 1)) + continue; + if (lef - fef < min_endfr) { + assert(!from->reachable); + continue; + } + + /* Find bptable entry for "from" that exactly precedes "to" */ + i = from->fef; + from_bpe = ngs->bp_table + i; + for (; i <= from->lef; i++, from_bpe++) { + if (from_bpe->wid != from->wid) + continue; + if (from_bpe->frame >= to->sf - 1) + break; + } + + if ((i > from->lef) || (from_bpe->frame != to->sf - 1)) + continue; + + /* Find acoustic score from.sf->to.sf-1 with right context = to */ + /* This gives us from_bpe's best acoustic score. */ + ngram_compute_seg_score(ngs, from_bpe, lwf, + &ascr, &lscr); + /* Now find the exact path score for from->to, including + * the appropriate final triphone. In fact this might not + * exist. */ + score = ngram_search_exit_score(ngs, from_bpe, + dict_first_phone(ps_search_dict(ngs), to->wid)); + /* Does not exist. Can't create a link here. */ + if (score == WORST_SCORE) + continue; + /* Adjust the arc score to match the correct triphone. */ + else + score = ascr + (score - from_bpe->score); + if (score BETTER_THAN 0) { + /* Scores must be negative, or Bad Things will happen. + In general, they are, except in corner cases + involving filler words. We don't want to throw any + links away so we'll keep these, but with some + arbitrarily improbable but recognizable score. */ + ps_lattice_link(dag, from, to, -424242, from_bpe->frame); + ++nlink; + from->reachable = TRUE; + } + else if (score BETTER_THAN WORST_SCORE) { + ps_lattice_link(dag, from, to, score, from_bpe->frame); + ++nlink; + from->reachable = TRUE; + } + } + } + + /* There must be at least one path between dag->start and dag->end */ + if (!dag->start->reachable) { + E_ERROR("End node of lattice isolated; unreachable\n"); + goto error_out; + } + + for (node = dag->nodes; node; node = node->next) { + /* Change node->{fef,lef} from bptbl indices to frames. */ + node->fef = ngs->bp_table[node->fef].frame; + node->lef = ngs->bp_table[node->lef].frame; + /* Find base wid for nodes. */ + node->basewid = dict_basewid(search->dict, node->wid); + } + + /* Link nodes with alternate pronunciations at the same timepoint. */ + for (node = dag->nodes; node; node = node->next) { + ps_latnode_t *alt; + /* Scan forward to find the next alternate, then stop. */ + for (alt = node->next; alt && alt->sf == node->sf; alt = alt->next) { + if (alt->basewid == node->basewid) { + alt->alt = node->alt; + node->alt = alt; + break; + } + } + } + E_INFO("Lattice has %d nodes, %d links\n", dag->n_nodes, nlink); + + /* Minor hack: If the final node is a filler word and not
, + * then set its base word ID to
, so that the language model + * scores won't be screwed up. */ + if (dict_filler_word(ps_search_dict(ngs), dag->end->wid)) + dag->end->basewid = ps_search_finish_wid(ngs); + + /* Free nodes unreachable from dag->end and their links */ + ps_lattice_delete_unreachable(dag); + + /* Add silprob and fillprob to corresponding links */ + ps_lattice_penalize_fillers(dag, ngs->silpen, ngs->fillpen); + + search->dag = dag; + return dag; + +error_out: + ps_lattice_free(dag); + return NULL; +} + +void ngram_search_set_lm(ngram_model_t *lm) +{ + default_lm = ngram_model_retain(lm); +} + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h new file mode 100644 index 0000000..a575fa3 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h @@ -0,0 +1,449 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ngram_search.h N-Gram based multi-pass search ("FBS") + */ + +#ifndef __NGRAM_SEARCH_H__ +#define __NGRAM_SEARCH_H__ + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include + +/* Local headers. */ +#include +#include "pocketsphinx_internal.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Lexical tree node data type. + * + * Not the first HMM for words, which multiplex HMMs based on + * different left contexts. This structure is used both in the + * dynamic HMM tree structure and in the per-word last-phone right + * context fanout. + */ +typedef struct chan_s { + hmm_t hmm; /**< Basic HMM structure. This *must* be first in + the structure because chan_t and root_chan_t are + sometimes used interchangeably */ + struct chan_s *next; /**< first descendant of this channel; or, in the + case of the last phone of a word, the next + alternative right context channel */ + struct chan_s *alt; /**< sibling; i.e., next descendant of parent HMM */ + + int32 ciphone; /**< ciphone for this node */ + union { + int32 penult_phn_wid; /**< list of words whose last phone follows this one; + this field indicates the first of the list; the + rest must be built up in a separate array. Used + only within HMM tree. -1 if none */ + int32 rc_id; /**< right-context id for last phone of words */ + } info; +} chan_t; + +/** + * Lexical tree node data type for the first phone (root) of each dynamic HMM tree + * structure. + * + * Each state may have a different parent static HMM. Most fields are + * similar to those in chan_t. + */ +typedef struct root_chan_s { + hmm_t hmm; /**< Basic HMM structure. This *must* be first in + the structure because chan_t and root_chan_t are + sometimes used interchangeably. */ + chan_t *next; /**< first descendant of this channel */ + + int32 penult_phn_wid; + int32 this_phn_wid; /**< list of words consisting of this single phone; + actually the first of the list, like penult_phn_wid; + -1 if none */ + int16 ciphone; /**< first ciphone of this node; all words rooted at this + node begin with this ciphone */ + int16 ci2phone; /**< second ciphone of this node; one root HMM for each + unique right context */ +} root_chan_t; + +/** + * Back pointer table (forward pass lattice; actually a tree) + */ +typedef struct bptbl_s { + frame_idx_t frame; /**< start or end frame */ + uint8 valid; /**< For absolute pruning */ + uint8 refcnt; /**< Reference count (number of successors) */ + int32 wid; /**< Word index */ + int32 bp; /**< Back Pointer */ + int32 score; /**< Score (best among all right contexts) */ + int32 s_idx; /**< Start of BScoreStack for various right contexts*/ + int32 real_wid; /**< wid of this or latest predecessor real word */ + int32 prev_real_wid; /**< wid of second-last real word */ + int16 last_phone; /**< last phone of this word */ + int16 last2_phone; /**< next-to-last phone of this word */ +} bptbl_t; + +/** + * Segmentation "iterator" for backpointer table results. + */ +typedef struct bptbl_seg_s { + ps_seg_t base; /**< Base structure. */ + int32 *bpidx; /**< Sequence of backpointer IDs. */ + int16 n_bpidx; /**< Number of backpointer IDs. */ + int16 cur; /**< Current position in bpidx. */ +} bptbl_seg_t; + +/* + * Candidates words for entering their last phones. Cleared and rebuilt in each + * frame. + * NOTE: candidates can only be multi-phone, real dictionary words. + */ +typedef struct lastphn_cand_s { + int32 wid; + int32 score; + int32 bp; + int32 next; /* next candidate starting at the same frame */ +} lastphn_cand_t; + +/* + * Since the same instance of a word (i.e., ) reaches its last + * phone several times, we can compute its best BP and LM transition score info + * just the first time and cache it for future occurrences. Structure for such + * a cache. + */ +typedef struct last_ltrans_s { + int32 sf; /* Start frame */ + int32 dscr; /* Delta-score upon entering last phone */ + int32 bp; /* Best BP */ +} last_ltrans_t; + +#define CAND_SF_ALLOCSIZE 32 +typedef struct cand_sf_s { + int32 bp_ef; + int32 cand; +} cand_sf_t; + +/* + * Structure for reorganizing the BP table entries in the current frame according + * to distinct right context ci-phones. Each entry contains the best BP entry for + * a given right context. Each successor word will pick up the correct entry based + * on its first ci-phone. + */ +typedef struct bestbp_rc_s { + int32 score; + int32 path; /* BP table index corresponding to this entry */ + int32 lc; /* right most ci-phone of above BP entry word */ +} bestbp_rc_t; + +#define NO_BP -1 + +/** + * Various statistics for profiling. + */ +typedef struct ngram_search_stats_s { + int32 n_phone_eval; + int32 n_root_chan_eval; + int32 n_nonroot_chan_eval; + int32 n_last_chan_eval; + int32 n_word_lastchan_eval; + int32 n_lastphn_cand_utt; + int32 n_fwdflat_chan; + int32 n_fwdflat_words; + int32 n_fwdflat_word_transition; + int32 n_senone_active_utt; +} ngram_search_stats_t; + + +/** + * N-Gram search module structure. + */ +struct ngram_search_s { + ps_search_t base; + ngram_model_t *lmset; /**< Set of language models. */ + hmm_context_t *hmmctx; /**< HMM context. */ + + /* Flags to quickly indicate which passes are enabled. */ + uint8 fwdtree; + uint8 fwdflat; + uint8 bestpath; + + /* State of processing. */ + uint8 done; + + /* Allocators */ + listelem_alloc_t *chan_alloc; /**< For chan_t */ + listelem_alloc_t *root_chan_alloc; /**< For root_chan_t */ + listelem_alloc_t *latnode_alloc; /**< For latnode_t */ + + /** + * Search structure of HMM instances. + * + * The word triphone sequences (HMM instances) are transformed + * into tree structures, one tree per unique left triphone in the + * entire dictionary (actually diphone, since its left context + * varies dyamically during the search process). The entire set + * of trees of channels is allocated once and for all during + * initialization (since dynamic management of active CHANs is + * time consuming), with one exception: the last phones of words, + * that need multiple right context modelling, are not maintained + * in this static structure since there are too many of them and + * few are active at any time. Instead they are maintained as + * linked lists of CHANs, one list per word, and each CHAN in this + * set is allocated only on demand and freed if inactive. + */ + root_chan_t *root_chan; /**< Roots of search tree. */ + int32 n_root_chan_alloc; /**< Number of root_chan allocated */ + int32 n_root_chan; /**< Number of valid root_chan */ + int32 n_nonroot_chan; /**< Number of valid non-root channels */ + int32 max_nonroot_chan; /**< Maximum possible number of non-root channels */ + root_chan_t *rhmm_1ph; /**< Root HMMs for single-phone words */ + + /** + * Channels associated with a given word (only used for right + * contexts, single-phone words in fwdtree search, and word HMMs + * in fwdflat search). WARNING: For single-phone words and + * fwdflat search, this actually contains pointers to root_chan_t, + * which are allocated using root_chan_alloc. This is a + * suboptimal state of affairs. + */ + chan_t **word_chan; + bitvec_t *word_active; /**< array of active flags for all words. */ + + /** + * Each node in the HMM tree structure may point to a set of words + * whose last phone would follow that node in the tree structure + * (but is not included in the tree structure for reasons + * explained above). The channel node points to one word in this + * set of words. The remaining words are linked through + * homophone_set[]. + * + * Single-phone words are not represented in the HMM tree; they + * are kept in word_chan. + * + * Specifically, homophone_set[w] = wid of next word in the same + * set as w. + */ + int32 *homophone_set; + int32 *single_phone_wid; /**< list of single-phone word ids */ + int32 n_1ph_words; /**< Number single phone words in dict (total) */ + int32 n_1ph_LMwords; /**< Number single phone dict words also in LM; + these come first in single_phone_wid */ + /** + * Array of active channels for current and next frame. + * + * In any frame, only some HMM tree nodes are active. + * active_chan_list[f mod 2] = list of nonroot channels in the HMM + * tree active in frame f. + */ + chan_t ***active_chan_list; + int32 n_active_chan[2]; /**< Number entries in active_chan_list */ + /** + * Array of active multi-phone words for current and next frame. + * + * Similarly to active_chan_list, active_word_list[f mod 2] = list + * of word ids for which active channels exist in word_chan in + * frame f. + * + * Statically allocated single-phone words are always active and + * should not appear in this list. + */ + int32 **active_word_list; + int32 n_active_word[2]; /**< Number entries in active_word_list */ + + /* + * FIXME: Document all of these bits. + */ + lastphn_cand_t *lastphn_cand; + int32 n_lastphn_cand; + last_ltrans_t *last_ltrans; /* one per word */ + int32 cand_sf_alloc; + cand_sf_t *cand_sf; + bestbp_rc_t *bestbp_rc; + + bptbl_t *bp_table; /* Forward pass lattice */ + int32 bpidx; /* First free BPTable entry */ + int32 bp_table_size; + int32 *bscore_stack; /* Score stack for all possible right contexts */ + int32 bss_head; /* First free BScoreStack entry */ + int32 bscore_stack_size; + + int32 n_frame_alloc; /**< Number of frames allocated in bp_table_idx and friends. */ + int32 n_frame; /**< Number of frames actually present. */ + int32 *bp_table_idx; /* First BPTable entry for each frame */ + int32 *word_lat_idx; /* BPTable index for any word in current frame; + cleared before each frame */ + + /* + * Flat lexicon (2nd pass) search stuff. + */ + ps_latnode_t **frm_wordlist; /**< List of active words in each frame. */ + int32 *fwdflat_wordlist; /**< List of active word IDs for utterance. */ + bitvec_t *expand_word_flag; + int32 *expand_word_list; + int32 n_expand_words; + int32 min_ef_width; + int32 max_sf_win; + float32 fwdflat_fwdtree_lw_ratio; + + int32 best_score; /**< Best Viterbi path score. */ + int32 last_phone_best_score; /**< Best Viterbi path score for last phone. */ + int32 renormalized; + + /* + * DAG (3rd pass) search stuff. + */ + float32 bestpath_fwdtree_lw_ratio; + float32 ascale; /**< Acoustic score scale for posterior probabilities. */ + + ngram_search_stats_t st; /**< Various statistics for profiling. */ + ptmr_t fwdtree_perf; + ptmr_t fwdflat_perf; + ptmr_t bestpath_perf; + int32 n_tot_frame; + + /* A collection of beam widths. */ + int32 beam; + int32 dynamic_beam; + int32 pbeam; + int32 wbeam; + int32 lpbeam; + int32 lponlybeam; + int32 fwdflatbeam; + int32 fwdflatwbeam; + int32 fillpen; + int32 silpen; + int32 wip; + int32 nwpen; + int32 pip; + int32 maxwpf; + int32 maxhmmpf; +}; +typedef struct ngram_search_s ngram_search_t; + +/** + * Initialize the N-Gram search module. + */ +ps_search_t *ngram_search_init(const char *name, + ngram_model_t *lm, + cmd_ln_t *config, + acmod_t *acmod, + dict_t *dict, + dict2pid_t *d2p); + +/** + * Finalize the N-Gram search module. + */ +void ngram_search_free(ps_search_t *ngs); + +/** + * Record the current frame's index in the backpointer table. + * + * @return the current backpointer index. + */ +int ngram_search_mark_bptable(ngram_search_t *ngs, int frame_idx); + +/** + * Enter a word in the backpointer table. + */ +void ngram_search_save_bp(ngram_search_t *ngs, int frame_idx, int32 w, + int32 score, int32 path, int32 rc); + +/** + * Allocate last phone channels for all possible right contexts for word w. + */ +void ngram_search_alloc_all_rc(ngram_search_t *ngs, int32 w); + +/** + * Allocate last phone channels for all possible right contexts for word w. + */ +void ngram_search_free_all_rc(ngram_search_t *ngs, int32 w); + +/** + * Find the best word exit for the current frame in the backpointer table. + * + * @return the backpointer index of the best word exit. + */ +POCKETSPHINX_EXPORT +int ngram_search_find_exit(ngram_search_t *ngs, int frame_idx, int32 *out_best_score); + +/** + * Backtrace from a given backpointer index to obtain a word hypothesis. + * + * @return a read-only string with the best hypothesis. + */ +POCKETSPHINX_EXPORT +char const *ngram_search_bp_hyp(ngram_search_t *ngs, int bpidx); + +/** + * Compute language and acoustic scores for backpointer table entries. + */ +void ngram_compute_seg_scores(ngram_search_t *ngs, float32 lwf); + +/** + * Construct a word lattice from the current hypothesis. + */ +POCKETSPHINX_EXPORT +ps_lattice_t *ngram_search_lattice(ps_search_t *search); + +/** + * Get the exit score for a backpointer entry with a given right context. + */ +int32 ngram_search_exit_score(ngram_search_t *ngs, bptbl_t *pbe, int rcphone); + +/** + * Sets the global language model. + * + * Sets the language model to use if nothing was passed in configuration + */ +void ngram_search_set_lm(ngram_model_t *lm); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __NGRAM_SEARCH_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c new file mode 100644 index 0000000..c393f04 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c @@ -0,0 +1,965 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ngram_search_fwdflat.c Flat lexicon search. + */ + +/* System headers. */ +#include +#include + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "ngram_search.h" +#include "ps_lattice_internal.h" + +/* Turn this on to dump channels for debugging */ +#define __CHAN_DUMP__ 0 +#if __CHAN_DUMP__ +#define chan_v_eval(chan) hmm_dump_vit_eval(&(chan)->hmm, stderr) +#else +#define chan_v_eval(chan) hmm_vit_eval(&(chan)->hmm) +#endif + +static void +ngram_fwdflat_expand_all(ngram_search_t *ngs) +{ + int n_words, i; + + /* For all "real words" (not fillers or /) in the dictionary, + * + * 1) Add the ones which are in the LM to the fwdflat wordlist + * 2) And to the expansion list (since we are expanding all) + */ + ngs->n_expand_words = 0; + n_words = ps_search_n_words(ngs); + bitvec_clear_all(ngs->expand_word_flag, ps_search_n_words(ngs)); + for (i = 0; i < n_words; ++i) { + if (!ngram_model_set_known_wid(ngs->lmset, + dict_basewid(ps_search_dict(ngs),i))) + continue; + ngs->fwdflat_wordlist[ngs->n_expand_words] = i; + ngs->expand_word_list[ngs->n_expand_words] = i; + bitvec_set(ngs->expand_word_flag, i); + ngs->n_expand_words++; + } + E_INFO("Utterance vocabulary contains %d words\n", ngs->n_expand_words); + ngs->expand_word_list[ngs->n_expand_words] = -1; + ngs->fwdflat_wordlist[ngs->n_expand_words] = -1; +} + +static void +ngram_fwdflat_allocate_1ph(ngram_search_t *ngs) +{ + dict_t *dict = ps_search_dict(ngs); + int n_words = ps_search_n_words(ngs); + int i, w; + + /* Allocate single-phone words, since they won't have + * been allocated for us by fwdtree initialization. */ + ngs->n_1ph_words = 0; + for (w = 0; w < n_words; w++) { + if (dict_is_single_phone(dict, w)) + ++ngs->n_1ph_words; + } + ngs->single_phone_wid = ckd_calloc(ngs->n_1ph_words, + sizeof(*ngs->single_phone_wid)); + ngs->rhmm_1ph = ckd_calloc(ngs->n_1ph_words, sizeof(*ngs->rhmm_1ph)); + i = 0; + for (w = 0; w < n_words; w++) { + if (!dict_is_single_phone(dict, w)) + continue; + + /* DICT2PID location */ + ngs->rhmm_1ph[i].ciphone = dict_first_phone(dict, w); + ngs->rhmm_1ph[i].ci2phone = bin_mdef_silphone(ps_search_acmod(ngs)->mdef); + hmm_init(ngs->hmmctx, &ngs->rhmm_1ph[i].hmm, TRUE, + /* ssid */ bin_mdef_pid2ssid(ps_search_acmod(ngs)->mdef, + ngs->rhmm_1ph[i].ciphone), + /* tmatid */ bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, + ngs->rhmm_1ph[i].ciphone)); + ngs->rhmm_1ph[i].next = NULL; + ngs->word_chan[w] = (chan_t *) &(ngs->rhmm_1ph[i]); + ngs->single_phone_wid[i] = w; + i++; + } +} + +static void +ngram_fwdflat_free_1ph(ngram_search_t *ngs) +{ + int i, w; + int n_words = ps_search_n_words(ngs); + + for (i = w = 0; w < n_words; ++w) { + if (!dict_is_single_phone(ps_search_dict(ngs), w)) + continue; + hmm_deinit(&ngs->rhmm_1ph[i].hmm); + ++i; + } + ckd_free(ngs->rhmm_1ph); + ngs->rhmm_1ph = NULL; + ckd_free(ngs->single_phone_wid); +} + +void +ngram_fwdflat_init(ngram_search_t *ngs) +{ + int n_words; + + n_words = ps_search_n_words(ngs); + ngs->fwdflat_wordlist = ckd_calloc(n_words + 1, sizeof(*ngs->fwdflat_wordlist)); + ngs->expand_word_flag = bitvec_alloc(n_words); + ngs->expand_word_list = ckd_calloc(n_words + 1, sizeof(*ngs->expand_word_list)); + ngs->frm_wordlist = ckd_calloc(ngs->n_frame_alloc, sizeof(*ngs->frm_wordlist)); + ngs->min_ef_width = cmd_ln_int32_r(ps_search_config(ngs), "-fwdflatefwid"); + ngs->max_sf_win = cmd_ln_int32_r(ps_search_config(ngs), "-fwdflatsfwin"); + E_INFO("fwdflat: min_ef_width = %d, max_sf_win = %d\n", + ngs->min_ef_width, ngs->max_sf_win); + + /* No tree-search; pre-build the expansion list, including all LM words. */ + if (!ngs->fwdtree) { + /* Build full expansion list from LM words. */ + ngram_fwdflat_expand_all(ngs); + /* Allocate single phone words. */ + ngram_fwdflat_allocate_1ph(ngs); + } +} + +void +ngram_fwdflat_deinit(ngram_search_t *ngs) +{ + double n_speech = (double)ngs->n_tot_frame + / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + + E_INFO("TOTAL fwdflat %.2f CPU %.3f xRT\n", + ngs->fwdflat_perf.t_tot_cpu, + ngs->fwdflat_perf.t_tot_cpu / n_speech); + E_INFO("TOTAL fwdflat %.2f wall %.3f xRT\n", + ngs->fwdflat_perf.t_tot_elapsed, + ngs->fwdflat_perf.t_tot_elapsed / n_speech); + + /* Free single-phone words if we allocated them. */ + if (!ngs->fwdtree) { + ngram_fwdflat_free_1ph(ngs); + } + ckd_free(ngs->fwdflat_wordlist); + bitvec_free(ngs->expand_word_flag); + ckd_free(ngs->expand_word_list); + ckd_free(ngs->frm_wordlist); +} + +int +ngram_fwdflat_reinit(ngram_search_t *ngs) +{ + /* Reallocate things that depend on the number of words. */ + int n_words; + + ckd_free(ngs->fwdflat_wordlist); + ckd_free(ngs->expand_word_list); + bitvec_free(ngs->expand_word_flag); + n_words = ps_search_n_words(ngs); + ngs->fwdflat_wordlist = ckd_calloc(n_words + 1, sizeof(*ngs->fwdflat_wordlist)); + ngs->expand_word_flag = bitvec_alloc(n_words); + ngs->expand_word_list = ckd_calloc(n_words + 1, sizeof(*ngs->expand_word_list)); + + /* No tree-search; take care of the expansion list and single phone words. */ + if (!ngs->fwdtree) { + /* Free single-phone words. */ + ngram_fwdflat_free_1ph(ngs); + /* Reallocate word_chan. */ + ckd_free(ngs->word_chan); + ngs->word_chan = ckd_calloc(dict_size(ps_search_dict(ngs)), + sizeof(*ngs->word_chan)); + /* Rebuild full expansion list from LM words. */ + ngram_fwdflat_expand_all(ngs); + /* Allocate single phone words. */ + ngram_fwdflat_allocate_1ph(ngs); + } + /* Otherwise there is nothing to do since the wordlist is + * generated anew every utterance. */ + return 0; +} + +/** + * Find all active words in backpointer table and sort by frame. + */ +static void +build_fwdflat_wordlist(ngram_search_t *ngs) +{ + int32 i, f, sf, ef, wid, nwd; + bptbl_t *bp; + ps_latnode_t *node, *prevnode, *nextnode; + + /* No tree-search, use statically allocated wordlist. */ + if (!ngs->fwdtree) + return; + + memset(ngs->frm_wordlist, 0, ngs->n_frame_alloc * sizeof(*ngs->frm_wordlist)); + + /* Scan the backpointer table for all active words and record + * their exit frames. */ + for (i = 0, bp = ngs->bp_table; i < ngs->bpidx; i++, bp++) { + sf = (bp->bp < 0) ? 0 : ngs->bp_table[bp->bp].frame + 1; + ef = bp->frame; + wid = bp->wid; + + /* Anything that can be transitioned to in the LM can go in + * the word list. */ + if (!ngram_model_set_known_wid(ngs->lmset, + dict_basewid(ps_search_dict(ngs), wid))) + continue; + + /* Look for it in the wordlist. */ + for (node = ngs->frm_wordlist[sf]; node && (node->wid != wid); + node = node->next); + + /* Update last end frame. */ + if (node) + node->lef = ef; + else { + /* New node; link to head of list */ + node = listelem_malloc(ngs->latnode_alloc); + node->wid = wid; + node->fef = node->lef = ef; + + node->next = ngs->frm_wordlist[sf]; + ngs->frm_wordlist[sf] = node; + } + } + + /* Eliminate "unlikely" words, for which there are too few end points */ + for (f = 0; f < ngs->n_frame; f++) { + prevnode = NULL; + for (node = ngs->frm_wordlist[f]; node; node = nextnode) { + nextnode = node->next; + /* Word has too few endpoints */ + if ((node->lef - node->fef < ngs->min_ef_width) || + /* Word is
and doesn't actually end in last frame */ + ((node->wid == ps_search_finish_wid(ngs)) && (node->lef < ngs->n_frame - 1))) { + if (!prevnode) + ngs->frm_wordlist[f] = nextnode; + else + prevnode->next = nextnode; + listelem_free(ngs->latnode_alloc, node); + } + else + prevnode = node; + } + } + + /* Form overall wordlist for 2nd pass */ + nwd = 0; + bitvec_clear_all(ngs->word_active, ps_search_n_words(ngs)); + for (f = 0; f < ngs->n_frame; f++) { + for (node = ngs->frm_wordlist[f]; node; node = node->next) { + if (!bitvec_is_set(ngs->word_active, node->wid)) { + bitvec_set(ngs->word_active, node->wid); + ngs->fwdflat_wordlist[nwd++] = node->wid; + } + } + } + ngs->fwdflat_wordlist[nwd] = -1; + E_INFO("Utterance vocabulary contains %d words\n", nwd); +} + +/** + * Build HMM network for one utterance of fwdflat search. + */ +static void +build_fwdflat_chan(ngram_search_t *ngs) +{ + int32 i, wid, p; + root_chan_t *rhmm; + chan_t *hmm, *prevhmm; + dict_t *dict; + dict2pid_t *d2p; + + dict = ps_search_dict(ngs); + d2p = ps_search_dict2pid(ngs); + + /* Build word HMMs for each word in the lattice. */ + for (i = 0; ngs->fwdflat_wordlist[i] >= 0; i++) { + wid = ngs->fwdflat_wordlist[i]; + + /* Single-phone words are permanently allocated */ + if (dict_is_single_phone(dict, wid)) + continue; + + assert(ngs->word_chan[wid] == NULL); + + /* Multiplex root HMM for first phone (one root per word, flat + * lexicon). diphone is irrelevant here, for the time being, + * at least. */ + rhmm = listelem_malloc(ngs->root_chan_alloc); + rhmm->ci2phone = dict_second_phone(dict, wid); + rhmm->ciphone = dict_first_phone(dict, wid); + rhmm->next = NULL; + hmm_init(ngs->hmmctx, &rhmm->hmm, TRUE, + bin_mdef_pid2ssid(ps_search_acmod(ngs)->mdef, rhmm->ciphone), + bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, rhmm->ciphone)); + + /* HMMs for word-internal phones */ + prevhmm = NULL; + for (p = 1; p < dict_pronlen(dict, wid) - 1; p++) { + hmm = listelem_malloc(ngs->chan_alloc); + hmm->ciphone = dict_pron(dict, wid, p); + hmm->info.rc_id = (p == dict_pronlen(dict, wid) - 1) ? 0 : -1; + hmm->next = NULL; + hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, + dict2pid_internal(d2p,wid,p), + bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, hmm->ciphone)); + + if (prevhmm) + prevhmm->next = hmm; + else + rhmm->next = hmm; + + prevhmm = hmm; + } + + /* Right-context phones */ + ngram_search_alloc_all_rc(ngs, wid); + + /* Link in just allocated right-context phones */ + if (prevhmm) + prevhmm->next = ngs->word_chan[wid]; + else + rhmm->next = ngs->word_chan[wid]; + ngs->word_chan[wid] = (chan_t *) rhmm; + } + +} + +void +ngram_fwdflat_start(ngram_search_t *ngs) +{ + root_chan_t *rhmm; + int i; + + ptmr_reset(&ngs->fwdflat_perf); + ptmr_start(&ngs->fwdflat_perf); + build_fwdflat_wordlist(ngs); + build_fwdflat_chan(ngs); + + ngs->bpidx = 0; + ngs->bss_head = 0; + + for (i = 0; i < ps_search_n_words(ngs); i++) + ngs->word_lat_idx[i] = NO_BP; + + /* Reset the permanently allocated single-phone words, since they + * may have junk left over in them from previous searches. */ + for (i = 0; i < ngs->n_1ph_words; i++) { + int32 w = ngs->single_phone_wid[i]; + rhmm = (root_chan_t *) ngs->word_chan[w]; + hmm_clear(&rhmm->hmm); + } + + /* Start search with ; word_chan[] is permanently allocated */ + rhmm = (root_chan_t *) ngs->word_chan[ps_search_start_wid(ngs)]; + hmm_enter(&rhmm->hmm, 0, NO_BP, 0); + ngs->active_word_list[0][0] = ps_search_start_wid(ngs); + ngs->n_active_word[0] = 1; + + ngs->best_score = 0; + ngs->renormalized = FALSE; + + for (i = 0; i < ps_search_n_words(ngs); i++) + ngs->last_ltrans[i].sf = -1; + + if (!ngs->fwdtree) + ngs->n_frame = 0; + + ngs->st.n_fwdflat_chan = 0; + ngs->st.n_fwdflat_words = 0; + ngs->st.n_fwdflat_word_transition = 0; + ngs->st.n_senone_active_utt = 0; +} + +static void +compute_fwdflat_sen_active(ngram_search_t *ngs, int frame_idx) +{ + int32 i, nw, w; + int32 *awl; + root_chan_t *rhmm; + chan_t *hmm; + + acmod_clear_active(ps_search_acmod(ngs)); + + nw = ngs->n_active_word[frame_idx & 0x1]; + awl = ngs->active_word_list[frame_idx & 0x1]; + + for (i = 0; i < nw; i++) { + w = *(awl++); + rhmm = (root_chan_t *)ngs->word_chan[w]; + if (hmm_frame(&rhmm->hmm) == frame_idx) { + acmod_activate_hmm(ps_search_acmod(ngs), &rhmm->hmm); + } + + for (hmm = rhmm->next; hmm; hmm = hmm->next) { + if (hmm_frame(&hmm->hmm) == frame_idx) { + acmod_activate_hmm(ps_search_acmod(ngs), &hmm->hmm); + } + } + } +} + +static void +fwdflat_eval_chan(ngram_search_t *ngs, int frame_idx) +{ + int32 i, w, nw, bestscore; + int32 *awl; + root_chan_t *rhmm; + chan_t *hmm; + + nw = ngs->n_active_word[frame_idx & 0x1]; + awl = ngs->active_word_list[frame_idx & 0x1]; + bestscore = WORST_SCORE; + + ngs->st.n_fwdflat_words += nw; + + /* Scan all active words. */ + for (i = 0; i < nw; i++) { + w = *(awl++); + rhmm = (root_chan_t *) ngs->word_chan[w]; + if (hmm_frame(&rhmm->hmm) == frame_idx) { + int32 score = chan_v_eval(rhmm); + if ((score BETTER_THAN bestscore) && (w != ps_search_finish_wid(ngs))) + bestscore = score; + ngs->st.n_fwdflat_chan++; + } + + for (hmm = rhmm->next; hmm; hmm = hmm->next) { + if (hmm_frame(&hmm->hmm) == frame_idx) { + int32 score = chan_v_eval(hmm); + if (score BETTER_THAN bestscore) + bestscore = score; + ngs->st.n_fwdflat_chan++; + } + } + } + + ngs->best_score = bestscore; +} + +static void +fwdflat_prune_chan(ngram_search_t *ngs, int frame_idx) +{ + int32 i, nw, cf, nf, w, pip, newscore, thresh, wordthresh; + int32 *awl; + root_chan_t *rhmm; + chan_t *hmm, *nexthmm; + + cf = frame_idx; + nf = cf + 1; + nw = ngs->n_active_word[cf & 0x1]; + awl = ngs->active_word_list[cf & 0x1]; + bitvec_clear_all(ngs->word_active, ps_search_n_words(ngs)); + + thresh = ngs->best_score + ngs->fwdflatbeam; + wordthresh = ngs->best_score + ngs->fwdflatwbeam; + pip = ngs->pip; + E_DEBUG("frame %d thresh %d wordthresh %d\n", frame_idx, thresh, wordthresh); + + /* Scan all active words. */ + for (i = 0; i < nw; i++) { + w = *(awl++); + rhmm = (root_chan_t *) ngs->word_chan[w]; + /* Propagate active root channels */ + if (hmm_frame(&rhmm->hmm) == cf + && hmm_bestscore(&rhmm->hmm) BETTER_THAN thresh) { + hmm_frame(&rhmm->hmm) = nf; + bitvec_set(ngs->word_active, w); + + /* Transitions out of root channel */ + newscore = hmm_out_score(&rhmm->hmm); + if (rhmm->next) { + assert(!dict_is_single_phone(ps_search_dict(ngs), w)); + + newscore += pip; + if (newscore BETTER_THAN thresh) { + hmm = rhmm->next; + /* Enter all right context phones */ + if (hmm->info.rc_id >= 0) { + for (; hmm; hmm = hmm->next) { + if ((hmm_frame(&hmm->hmm) < cf) + || (newscore BETTER_THAN hmm_in_score(&hmm->hmm))) { + hmm_enter(&hmm->hmm, newscore, + hmm_out_history(&rhmm->hmm), nf); + } + } + } + /* Just a normal word internal phone */ + else { + if ((hmm_frame(&hmm->hmm) < cf) + || (newscore BETTER_THAN hmm_in_score(&hmm->hmm))) { + hmm_enter(&hmm->hmm, newscore, + hmm_out_history(&rhmm->hmm), nf); + } + } + } + } + else { + assert(dict_is_single_phone(ps_search_dict(ngs), w)); + + /* Word exit for single-phone words (where did their + * whmms come from?) (either from + * ngram_search_fwdtree, or from + * ngram_fwdflat_allocate_1ph(), that's where) */ + if (newscore BETTER_THAN wordthresh) { + ngram_search_save_bp(ngs, cf, w, newscore, + hmm_out_history(&rhmm->hmm), 0); + } + } + } + + /* Transitions out of non-root channels. */ + for (hmm = rhmm->next; hmm; hmm = hmm->next) { + if (hmm_frame(&hmm->hmm) >= cf) { + /* Propagate forward HMMs inside the beam. */ + if (hmm_bestscore(&hmm->hmm) BETTER_THAN thresh) { + hmm_frame(&hmm->hmm) = nf; + bitvec_set(ngs->word_active, w); + + newscore = hmm_out_score(&hmm->hmm); + /* Word-internal phones */ + if (hmm->info.rc_id < 0) { + newscore += pip; + if (newscore BETTER_THAN thresh) { + nexthmm = hmm->next; + /* Enter all right-context phones. */ + if (nexthmm->info.rc_id >= 0) { + for (; nexthmm; nexthmm = nexthmm->next) { + if ((hmm_frame(&nexthmm->hmm) < cf) + || (newscore BETTER_THAN + hmm_in_score(&nexthmm->hmm))) { + hmm_enter(&nexthmm->hmm, + newscore, + hmm_out_history(&hmm->hmm), + nf); + } + } + } + /* Enter single word-internal phone. */ + else { + if ((hmm_frame(&nexthmm->hmm) < cf) + || (newscore BETTER_THAN + hmm_in_score(&nexthmm->hmm))) { + hmm_enter(&nexthmm->hmm, newscore, + hmm_out_history(&hmm->hmm), nf); + } + } + } + } + /* Right-context phones - apply word beam and exit. */ + else { + if (newscore BETTER_THAN wordthresh) { + ngram_search_save_bp(ngs, cf, w, newscore, + hmm_out_history(&hmm->hmm), + hmm->info.rc_id); + } + } + } + /* Zero out inactive HMMs. */ + else if (hmm_frame(&hmm->hmm) != nf) { + hmm_clear_scores(&hmm->hmm); + } + } + } + } +} + +static void +get_expand_wordlist(ngram_search_t *ngs, int32 frm, int32 win) +{ + int32 f, sf, ef; + ps_latnode_t *node; + + if (!ngs->fwdtree) { + ngs->st.n_fwdflat_word_transition += ngs->n_expand_words; + return; + } + + sf = frm - win; + if (sf < 0) + sf = 0; + ef = frm + win; + if (ef > ngs->n_frame) + ef = ngs->n_frame; + + bitvec_clear_all(ngs->expand_word_flag, ps_search_n_words(ngs)); + ngs->n_expand_words = 0; + + for (f = sf; f < ef; f++) { + for (node = ngs->frm_wordlist[f]; node; node = node->next) { + if (!bitvec_is_set(ngs->expand_word_flag, node->wid)) { + ngs->expand_word_list[ngs->n_expand_words++] = node->wid; + bitvec_set(ngs->expand_word_flag, node->wid); + } + } + } + ngs->expand_word_list[ngs->n_expand_words] = -1; + ngs->st.n_fwdflat_word_transition += ngs->n_expand_words; +} + +static void +fwdflat_word_transition(ngram_search_t *ngs, int frame_idx) +{ + int32 cf, nf, b, thresh, pip, i, nw, w, newscore; + int32 best_silrc_score = 0, best_silrc_bp = 0; /* FIXME: good defaults? */ + bptbl_t *bp; + int32 *rcss; + root_chan_t *rhmm; + int32 *awl; + float32 lwf; + dict_t *dict = ps_search_dict(ngs); + dict2pid_t *d2p = ps_search_dict2pid(ngs); + + cf = frame_idx; + nf = cf + 1; + thresh = ngs->best_score + ngs->fwdflatbeam; + pip = ngs->pip; + best_silrc_score = WORST_SCORE; + lwf = ngs->fwdflat_fwdtree_lw_ratio; + + /* Search for all words starting within a window of this frame. + * These are the successors for words exiting now. */ + get_expand_wordlist(ngs, cf, ngs->max_sf_win); + + /* Scan words exited in current frame */ + for (b = ngs->bp_table_idx[cf]; b < ngs->bpidx; b++) { + xwdssid_t *rssid; + int32 silscore; + + bp = ngs->bp_table + b; + ngs->word_lat_idx[bp->wid] = NO_BP; + + if (bp->wid == ps_search_finish_wid(ngs)) + continue; + + /* DICT2PID location */ + /* Get the mapping from right context phone ID to index in the + * right context table and the bscore_stack. */ + rcss = ngs->bscore_stack + bp->s_idx; + if (bp->last2_phone == -1) + rssid = NULL; + else + rssid = dict2pid_rssid(d2p, bp->last_phone, bp->last2_phone); + + /* Transition to all successor words. */ + for (i = 0; ngs->expand_word_list[i] >= 0; i++) { + int32 n_used; + + w = ngs->expand_word_list[i]; + + /* Get the exit score we recorded in save_bwd_ptr(), or + * something approximating it. */ + if (rssid) + newscore = rcss[rssid->cimap[dict_first_phone(dict, w)]]; + else + newscore = bp->score; + if (newscore == WORST_SCORE) + continue; + /* FIXME: Floating point... */ + newscore += lwf + * (ngram_tg_score(ngs->lmset, + dict_basewid(dict, w), + bp->real_wid, + bp->prev_real_wid, + &n_used) >> SENSCR_SHIFT); + newscore += pip; + + /* Enter the next word */ + if (newscore BETTER_THAN thresh) { + rhmm = (root_chan_t *) ngs->word_chan[w]; + if ((hmm_frame(&rhmm->hmm) < cf) + || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { + hmm_enter(&rhmm->hmm, newscore, b, nf); + /* DICT2PID: This is where mpx ssids get introduced. */ + /* Look up the ssid to use when entering this mpx triphone. */ + hmm_mpx_ssid(&rhmm->hmm, 0) = + dict2pid_ldiph_lc(d2p, rhmm->ciphone, rhmm->ci2phone, + dict_last_phone(dict, bp->wid)); + assert(IS_S3SSID(hmm_mpx_ssid(&rhmm->hmm, 0))); + E_DEBUG("ssid %d(%d,%d) = %d\n", + rhmm->ciphone, dict_last_phone(dict, bp->wid), rhmm->ci2phone, + hmm_mpx_ssid(&rhmm->hmm, 0)); + bitvec_set(ngs->word_active, w); + } + } + } + + /* Get the best exit into silence. */ + if (rssid) + silscore = rcss[rssid->cimap[ps_search_acmod(ngs)->mdef->sil]]; + else + silscore = bp->score; + if (silscore BETTER_THAN best_silrc_score) { + best_silrc_score = silscore; + best_silrc_bp = b; + } + } + + /* Transition to */ + newscore = best_silrc_score + ngs->silpen + pip; + if ((newscore BETTER_THAN thresh) && (newscore BETTER_THAN WORST_SCORE)) { + w = ps_search_silence_wid(ngs); + rhmm = (root_chan_t *) ngs->word_chan[w]; + if ((hmm_frame(&rhmm->hmm) < cf) + || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { + hmm_enter(&rhmm->hmm, newscore, + best_silrc_bp, nf); + bitvec_set(ngs->word_active, w); + } + } + /* Transition to noise words */ + newscore = best_silrc_score + ngs->fillpen + pip; + if ((newscore BETTER_THAN thresh) && (newscore BETTER_THAN WORST_SCORE)) { + for (w = dict_filler_start(dict); w <= dict_filler_end(dict); w++) { + if (w == ps_search_silence_wid(ngs)) + continue; + + rhmm = (root_chan_t *) ngs->word_chan[w]; + /* Noise words that aren't a single phone will have NULL here. */ + if (rhmm == NULL) + continue; + if ((hmm_frame(&rhmm->hmm) < cf) + || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { + hmm_enter(&rhmm->hmm, newscore, + best_silrc_bp, nf); + bitvec_set(ngs->word_active, w); + } + } + } + + /* Reset initial channels of words that have become inactive even after word trans. */ + nw = ngs->n_active_word[cf & 0x1]; + awl = ngs->active_word_list[cf & 0x1]; + for (i = 0; i < nw; i++) { + w = *(awl++); + rhmm = (root_chan_t *) ngs->word_chan[w]; + if (hmm_frame(&rhmm->hmm) == cf) { + hmm_clear_scores(&rhmm->hmm); + } + } +} + +static void +fwdflat_renormalize_scores(ngram_search_t *ngs, int frame_idx, int32 norm) +{ + root_chan_t *rhmm; + chan_t *hmm; + int32 i, nw, cf, w, *awl; + + cf = frame_idx; + + /* Renormalize individual word channels */ + nw = ngs->n_active_word[cf & 0x1]; + awl = ngs->active_word_list[cf & 0x1]; + for (i = 0; i < nw; i++) { + w = *(awl++); + rhmm = (root_chan_t *) ngs->word_chan[w]; + if (hmm_frame(&rhmm->hmm) == cf) { + hmm_normalize(&rhmm->hmm, norm); + } + for (hmm = rhmm->next; hmm; hmm = hmm->next) { + if (hmm_frame(&hmm->hmm) == cf) { + hmm_normalize(&hmm->hmm, norm); + } + } + } + + ngs->renormalized = TRUE; +} + +int +ngram_fwdflat_search(ngram_search_t *ngs, int frame_idx) +{ + int16 const *senscr; + int32 nf, i, j; + int32 *nawl; + + /* Activate our HMMs for the current frame if need be. */ + if (!ps_search_acmod(ngs)->compallsen) + compute_fwdflat_sen_active(ngs, frame_idx); + + /* Compute GMM scores for the current frame. */ + senscr = acmod_score(ps_search_acmod(ngs), &frame_idx); + ngs->st.n_senone_active_utt += ps_search_acmod(ngs)->n_senone_active; + + /* Mark backpointer table for current frame. */ + ngram_search_mark_bptable(ngs, frame_idx); + + /* If the best score is equal to or worse than WORST_SCORE, + * recognition has failed, don't bother to keep trying. */ + if (ngs->best_score == WORST_SCORE || ngs->best_score WORSE_THAN WORST_SCORE) + return 0; + /* Renormalize if necessary */ + if (ngs->best_score + (2 * ngs->beam) WORSE_THAN WORST_SCORE) { + E_INFO("Renormalizing Scores at frame %d, best score %d\n", + frame_idx, ngs->best_score); + fwdflat_renormalize_scores(ngs, frame_idx, ngs->best_score); + } + + ngs->best_score = WORST_SCORE; + hmm_context_set_senscore(ngs->hmmctx, senscr); + + /* Evaluate HMMs */ + fwdflat_eval_chan(ngs, frame_idx); + /* Prune HMMs and do phone transitions. */ + fwdflat_prune_chan(ngs, frame_idx); + /* Do word transitions. */ + fwdflat_word_transition(ngs, frame_idx); + + /* Create next active word list, skip fillers */ + nf = frame_idx + 1; + nawl = ngs->active_word_list[nf & 0x1]; + for (i = 0, j = 0; ngs->fwdflat_wordlist[i] >= 0; i++) { + int32 wid = ngs->fwdflat_wordlist[i]; + if (bitvec_is_set(ngs->word_active, wid) && wid < ps_search_start_wid(ngs)) { + *(nawl++) = wid; + j++; + } + } + /* Add fillers */ + for (i = ps_search_start_wid(ngs); i < ps_search_n_words(ngs); i++) { + if (bitvec_is_set(ngs->word_active, i)) { + *(nawl++) = i; + j++; + } + } + if (!ngs->fwdtree) + ++ngs->n_frame; + ngs->n_active_word[nf & 0x1] = j; + + /* Return the number of frames processed. */ + return 1; +} + +/** + * Destroy wordlist from the current utterance. + */ +static void +destroy_fwdflat_wordlist(ngram_search_t *ngs) +{ + ps_latnode_t *node, *tnode; + int32 f; + + if (!ngs->fwdtree) + return; + + for (f = 0; f < ngs->n_frame; f++) { + for (node = ngs->frm_wordlist[f]; node; node = tnode) { + tnode = node->next; + listelem_free(ngs->latnode_alloc, node); + } + } +} + +/** + * Free HMM network for one utterance of fwdflat search. + */ +static void +destroy_fwdflat_chan(ngram_search_t *ngs) +{ + int32 i, wid; + + for (i = 0; ngs->fwdflat_wordlist[i] >= 0; i++) { + root_chan_t *rhmm; + chan_t *thmm; + wid = ngs->fwdflat_wordlist[i]; + if (dict_is_single_phone(ps_search_dict(ngs),wid)) + continue; + assert(ngs->word_chan[wid] != NULL); + + /* The first HMM in ngs->word_chan[wid] was allocated with + * ngs->root_chan_alloc, but this will attempt to free it + * using ngs->chan_alloc, which will not work. Therefore we + * free it manually and move the list forward before handing + * it off. */ + rhmm = (root_chan_t *)ngs->word_chan[wid]; + thmm = rhmm->next; + listelem_free(ngs->root_chan_alloc, rhmm); + ngs->word_chan[wid] = thmm; + ngram_search_free_all_rc(ngs, wid); + } +} + +void +ngram_fwdflat_finish(ngram_search_t *ngs) +{ + int32 cf; + + destroy_fwdflat_chan(ngs); + destroy_fwdflat_wordlist(ngs); + bitvec_clear_all(ngs->word_active, ps_search_n_words(ngs)); + + /* This is the number of frames processed. */ + cf = ps_search_acmod(ngs)->output_frame; + /* Add a mark in the backpointer table for one past the final frame. */ + ngram_search_mark_bptable(ngs, cf); + + ptmr_stop(&ngs->fwdflat_perf); + /* Print out some statistics. */ + if (cf > 0) { + double n_speech = (double)(cf + 1) + / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + E_INFO("%8d words recognized (%d/fr)\n", + ngs->bpidx, (ngs->bpidx + (cf >> 1)) / (cf + 1)); + E_INFO("%8d senones evaluated (%d/fr)\n", ngs->st.n_senone_active_utt, + (ngs->st.n_senone_active_utt + (cf >> 1)) / (cf + 1)); + E_INFO("%8d channels searched (%d/fr)\n", + ngs->st.n_fwdflat_chan, ngs->st.n_fwdflat_chan / (cf + 1)); + E_INFO("%8d words searched (%d/fr)\n", + ngs->st.n_fwdflat_words, ngs->st.n_fwdflat_words / (cf + 1)); + E_INFO("%8d word transitions (%d/fr)\n", + ngs->st.n_fwdflat_word_transition, + ngs->st.n_fwdflat_word_transition / (cf + 1)); + E_INFO("fwdflat %.2f CPU %.3f xRT\n", + ngs->fwdflat_perf.t_cpu, + ngs->fwdflat_perf.t_cpu / n_speech); + E_INFO("fwdflat %.2f wall %.3f xRT\n", + ngs->fwdflat_perf.t_elapsed, + ngs->fwdflat_perf.t_elapsed / n_speech); + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h new file mode 100644 index 0000000..b17d73c --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h @@ -0,0 +1,91 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ngram_search_fwdflat.h Flat lexicon based Viterbi search. + */ + +#ifndef __NGRAM_SEARCH_FWDFLAT_H__ +#define __NGRAM_SEARCH_FWDFLAT_H__ + +/* SphinxBase headers. */ + +/* Local headers. */ +#include "ngram_search.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Initialize N-Gram search for fwdflat decoding. + */ +void ngram_fwdflat_init(ngram_search_t *ngs); + +/** + * Release memory associated with fwdflat decoding. + */ +void ngram_fwdflat_deinit(ngram_search_t *ngs); + +/** + * Rebuild search structures for updated language models. + */ +int ngram_fwdflat_reinit(ngram_search_t *ngs); + +/** + * Start fwdflat decoding for an utterance. + */ +void ngram_fwdflat_start(ngram_search_t *ngs); + +/** + * Search one frame forward in an utterance. + */ +int ngram_fwdflat_search(ngram_search_t *ngs, int frame_idx); + +/** + * Finish fwdflat decoding for an utterance. + */ +void ngram_fwdflat_finish(ngram_search_t *ngs); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __NGRAM_SEARCH_FWDFLAT_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c new file mode 100644 index 0000000..a460b07 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c @@ -0,0 +1,1570 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ngram_search_fwdtree.c Lexicon tree search. + */ + +/* System headers. */ +#include +#include + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "ngram_search_fwdtree.h" +#include "phone_loop_search.h" + +/* Turn this on to dump channels for debugging */ +#define __CHAN_DUMP__ 0 +#if __CHAN_DUMP__ +#define chan_v_eval(chan) hmm_dump_vit_eval(&(chan)->hmm, stderr) +#else +#define chan_v_eval(chan) hmm_vit_eval(&(chan)->hmm) +#endif + +/* + * Allocate that part of the search channel tree structure that is independent of the + * LM in use. + */ +static void +init_search_tree(ngram_search_t *ngs) +{ + int32 w, ndiph, i, n_words, n_ci; + dict_t *dict = ps_search_dict(ngs); + bitvec_t *dimap; + + E_INFO("Initializing search tree\n"); + + n_words = ps_search_n_words(ngs); + ngs->homophone_set = ckd_calloc(n_words, sizeof(*ngs->homophone_set)); + + /* Find #single phone words, and #unique first diphones (#root channels) in dict. */ + ndiph = 0; + ngs->n_1ph_words = 0; + n_ci = bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef); + /* Allocate a bitvector with flags for each possible diphone. */ + dimap = bitvec_alloc(n_ci * n_ci); + for (w = 0; w < n_words; w++) { + if (!dict_real_word(dict, w)) + continue; + if (dict_is_single_phone(dict, w)) + ++ngs->n_1ph_words; + else { + int ph0, ph1; + ph0 = dict_first_phone(dict, w); + ph1 = dict_second_phone(dict, w); + /* Increment ndiph the first time we see a diphone. */ + if (bitvec_is_clear(dimap, ph0 * n_ci + ph1)) { + bitvec_set(dimap, ph0 * n_ci + ph1); + ++ndiph; + } + } + } + E_INFO("%d unique initial diphones\n", ndiph); + bitvec_free(dimap); + + /* Add remaining dict words (, , , noise words) to single-phone words */ + ngs->n_1ph_words += dict_num_fillers(dict) + 2; + ngs->n_root_chan_alloc = ndiph + 1; + /* Verify that these are all *actually* single-phone words, + * otherwise really bad things will happen to us. */ + for (w = 0; w < n_words; ++w) { + if (dict_real_word(dict, w)) + continue; + if (!dict_is_single_phone(dict, w)) { + E_WARN("Filler word %d = %s has more than one phone, ignoring it.\n", + w, dict_wordstr(dict, w)); + --ngs->n_1ph_words; + } + } + + /* Allocate and initialize root channels */ + ngs->root_chan = + ckd_calloc(ngs->n_root_chan_alloc, sizeof(*ngs->root_chan)); + for (i = 0; i < ngs->n_root_chan_alloc; i++) { + hmm_init(ngs->hmmctx, &ngs->root_chan[i].hmm, TRUE, -1, -1); + ngs->root_chan[i].penult_phn_wid = -1; + ngs->root_chan[i].next = NULL; + } + + /* Permanently allocate and initialize channels for single-phone + * words (1/word). */ + ngs->rhmm_1ph = ckd_calloc(ngs->n_1ph_words, sizeof(*ngs->rhmm_1ph)); + i = 0; + for (w = 0; w < n_words; w++) { + if (!dict_is_single_phone(dict, w)) + continue; + /* Use SIL as right context for these. */ + ngs->rhmm_1ph[i].ci2phone = bin_mdef_silphone(ps_search_acmod(ngs)->mdef); + ngs->rhmm_1ph[i].ciphone = dict_first_phone(dict, w); + hmm_init(ngs->hmmctx, &ngs->rhmm_1ph[i].hmm, TRUE, + bin_mdef_pid2ssid(ps_search_acmod(ngs)->mdef, ngs->rhmm_1ph[i].ciphone), + bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, ngs->rhmm_1ph[i].ciphone)); + ngs->rhmm_1ph[i].next = NULL; + + ngs->word_chan[w] = (chan_t *) &(ngs->rhmm_1ph[i]); + i++; + } + + ngs->single_phone_wid = ckd_calloc(ngs->n_1ph_words, + sizeof(*ngs->single_phone_wid)); +} + +/* + * One-time initialization of internal channels in HMM tree. + */ +static void +init_nonroot_chan(ngram_search_t *ngs, chan_t * hmm, int32 ph, int32 ci, int32 tmatid) +{ + hmm->next = NULL; + hmm->alt = NULL; + hmm->info.penult_phn_wid = -1; + hmm->ciphone = ci; + hmm_init(ngs->hmmctx, &hmm->hmm, FALSE, ph, tmatid); +} + +/* + * Allocate and initialize search channel-tree structure. + * At this point, all the root-channels have been allocated and partly initialized + * (as per init_search_tree()), and channels for all the single-phone words have been + * allocated and initialized. None of the interior channels of search-trees have + * been allocated. + * This routine may be called on every utterance, after reinit_search_tree() clears + * the search tree created for the previous utterance. Meant for reconfiguring the + * search tree to suit the currently active LM. + */ +static void +create_search_channels(ngram_search_t *ngs) +{ + chan_t *hmm; + root_chan_t *rhmm; + int32 w, i, j, p, ph, tmatid; + int32 n_words; + dict_t *dict = ps_search_dict(ngs); + dict2pid_t *d2p = ps_search_dict2pid(ngs); + + n_words = ps_search_n_words(ngs); + + E_INFO("Creating search channels\n"); + + for (w = 0; w < n_words; w++) + ngs->homophone_set[w] = -1; + + ngs->n_1ph_LMwords = 0; + ngs->n_root_chan = 0; + ngs->n_nonroot_chan = 0; + + for (w = 0; w < n_words; w++) { + int ciphone, ci2phone; + + /* Ignore dictionary words not in LM */ + if (!ngram_model_set_known_wid(ngs->lmset, dict_basewid(dict, w))) + continue; + + /* Handle single-phone words individually; not in channel tree */ + if (dict_is_single_phone(dict, w)) { + E_DEBUG("single_phone_wid[%d] = %s\n", + ngs->n_1ph_LMwords, dict_wordstr(dict, w)); + ngs->single_phone_wid[ngs->n_1ph_LMwords++] = w; + continue; + } + + /* Find a root channel matching the initial diphone, or + * allocate one if not found. */ + ciphone = dict_first_phone(dict, w); + ci2phone = dict_second_phone(dict, w); + for (i = 0; i < ngs->n_root_chan; ++i) { + if (ngs->root_chan[i].ciphone == ciphone + && ngs->root_chan[i].ci2phone == ci2phone) + break; + } + if (i == ngs->n_root_chan) { + rhmm = &(ngs->root_chan[ngs->n_root_chan]); + rhmm->hmm.tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, ciphone); + /* Begin with CI phone? Not sure this makes a difference... */ + hmm_mpx_ssid(&rhmm->hmm, 0) = + bin_mdef_pid2ssid(ps_search_acmod(ngs)->mdef, ciphone); + rhmm->ciphone = ciphone; + rhmm->ci2phone = ci2phone; + ngs->n_root_chan++; + } + else + rhmm = &(ngs->root_chan[i]); + + E_DEBUG("word %s rhmm %d\n", dict_wordstr(dict, w), rhmm - ngs->root_chan); + /* Now, rhmm = root channel for w. Go on to remaining phones */ + if (dict_pronlen(dict, w) == 2) { + /* Next phone is the last; not kept in tree; add w to penult_phn_wid set */ + if ((j = rhmm->penult_phn_wid) < 0) + rhmm->penult_phn_wid = w; + else { + for (; ngs->homophone_set[j] >= 0; j = ngs->homophone_set[j]); + ngs->homophone_set[j] = w; + } + } + else { + /* Add remaining phones, except the last, to tree */ + ph = dict2pid_internal(d2p, w, 1); + tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, dict_pron(dict, w, 1)); + hmm = rhmm->next; + if (hmm == NULL) { + rhmm->next = hmm = listelem_malloc(ngs->chan_alloc); + init_nonroot_chan(ngs, hmm, ph, dict_pron(dict, w, 1), tmatid); + ngs->n_nonroot_chan++; + } + else { + chan_t *prev_hmm = NULL; + + for (; hmm && (hmm_nonmpx_ssid(&hmm->hmm) != ph); hmm = hmm->alt) + prev_hmm = hmm; + if (!hmm) { /* thanks, rkm! */ + prev_hmm->alt = hmm = listelem_malloc(ngs->chan_alloc); + init_nonroot_chan(ngs, hmm, ph, dict_pron(dict, w, 1), tmatid); + ngs->n_nonroot_chan++; + } + } + E_DEBUG("phone %s = %d\n", + bin_mdef_ciphone_str(ps_search_acmod(ngs)->mdef, + dict_second_phone(dict, w)), ph); + for (p = 2; p < dict_pronlen(dict, w) - 1; p++) { + ph = dict2pid_internal(d2p, w, p); + tmatid = bin_mdef_pid2tmatid(ps_search_acmod(ngs)->mdef, dict_pron(dict, w, p)); + if (!hmm->next) { + hmm->next = listelem_malloc(ngs->chan_alloc); + hmm = hmm->next; + init_nonroot_chan(ngs, hmm, ph, dict_pron(dict, w, p), tmatid); + ngs->n_nonroot_chan++; + } + else { + chan_t *prev_hmm = NULL; + + for (hmm = hmm->next; hmm && (hmm_nonmpx_ssid(&hmm->hmm) != ph); + hmm = hmm->alt) + prev_hmm = hmm; + if (!hmm) { /* thanks, rkm! */ + prev_hmm->alt = hmm = listelem_malloc(ngs->chan_alloc); + init_nonroot_chan(ngs, hmm, ph, dict_pron(dict, w, p), tmatid); + ngs->n_nonroot_chan++; + } + } + E_DEBUG("phone %s = %d\n", + bin_mdef_ciphone_str(ps_search_acmod(ngs)->mdef, + dict_pron(dict, w, p)), ph); + } + + /* All but last phone of w in tree; add w to hmm->info.penult_phn_wid set */ + if ((j = hmm->info.penult_phn_wid) < 0) + hmm->info.penult_phn_wid = w; + else { + for (; ngs->homophone_set[j] >= 0; j = ngs->homophone_set[j]); + ngs->homophone_set[j] = w; + } + } + } + + ngs->n_1ph_words = ngs->n_1ph_LMwords; + + /* Add filler words to the array of 1ph words. */ + for (w = 0; w < n_words; ++w) { + /* Skip anything that doesn't actually have a single phone. */ + if (!dict_is_single_phone(dict, w)) + continue; + /* Also skip "real words" and things that are in the LM. */ + if (dict_real_word(dict, w)) + continue; + if (ngram_model_set_known_wid(ngs->lmset, dict_basewid(dict, w))) + continue; + E_DEBUG("single_phone_wid[%d] = %s\n", + ngs->n_1ph_words, dict_wordstr(dict, w)); + ngs->single_phone_wid[ngs->n_1ph_words++] = w; + } + + if (ngs->n_nonroot_chan >= ngs->max_nonroot_chan) { + /* Give some room for channels for new words added dynamically at run time */ + ngs->max_nonroot_chan = ngs->n_nonroot_chan + 128; + E_INFO("Max nonroot chan increased to %d\n", ngs->max_nonroot_chan); + + /* Free old active channel list array if any and allocate new one */ + if (ngs->active_chan_list) + ckd_free_2d(ngs->active_chan_list); + ngs->active_chan_list = ckd_calloc_2d(2, ngs->max_nonroot_chan, + sizeof(**ngs->active_chan_list)); + } + + E_INFO("Created %d root, %d non-root channels, %d single-phone words\n", + ngs->n_root_chan, ngs->n_nonroot_chan, ngs->n_1ph_words); + + if (ngs->n_root_chan + ngs->n_1ph_words == 0) + E_ERROR("No word from the language model has pronunciation in the dictionary\n"); +} + +static void +reinit_search_subtree(ngram_search_t *ngs, chan_t * hmm) +{ + chan_t *child, *sibling; + + /* First free all children under hmm */ + for (child = hmm->next; child; child = sibling) { + sibling = child->alt; + reinit_search_subtree(ngs, child); + } + + /* Now free hmm */ + hmm_deinit(&hmm->hmm); + listelem_free(ngs->chan_alloc, hmm); +} + +/* + * Delete search tree by freeing all interior channels within search tree and + * restoring root channel state to the init state (i.e., just after init_search_tree()). + */ +static void +reinit_search_tree(ngram_search_t *ngs) +{ + int32 i; + chan_t *hmm, *sibling; + + for (i = 0; i < ngs->n_root_chan; i++) { + hmm = ngs->root_chan[i].next; + + while (hmm) { + sibling = hmm->alt; + reinit_search_subtree(ngs, hmm); + hmm = sibling; + } + + ngs->root_chan[i].penult_phn_wid = -1; + ngs->root_chan[i].next = NULL; + } + ngs->n_nonroot_chan = 0; +} + +void +ngram_fwdtree_init(ngram_search_t *ngs) +{ + /* Allocate bestbp_rc, lastphn_cand, last_ltrans */ + ngs->bestbp_rc = ckd_calloc(bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef), + sizeof(*ngs->bestbp_rc)); + ngs->lastphn_cand = ckd_calloc(ps_search_n_words(ngs), + sizeof(*ngs->lastphn_cand)); + init_search_tree(ngs); + create_search_channels(ngs); +} + +static void +deinit_search_tree(ngram_search_t *ngs) +{ + int i, w, n_words; + + n_words = ps_search_n_words(ngs); + for (i = 0; i < ngs->n_root_chan_alloc; i++) { + hmm_deinit(&ngs->root_chan[i].hmm); + } + if (ngs->rhmm_1ph) { + for (i = w = 0; w < n_words; ++w) { + if (!dict_is_single_phone(ps_search_dict(ngs), w)) + continue; + hmm_deinit(&ngs->rhmm_1ph[i].hmm); + ++i; + } + ckd_free(ngs->rhmm_1ph); + ngs->rhmm_1ph = NULL; + } + ngs->n_root_chan = 0; + ngs->n_root_chan_alloc = 0; + ckd_free(ngs->root_chan); + ngs->root_chan = NULL; + ckd_free(ngs->single_phone_wid); + ngs->single_phone_wid = NULL; + ckd_free(ngs->homophone_set); + ngs->homophone_set = NULL; +} + +void +ngram_fwdtree_deinit(ngram_search_t *ngs) +{ + double n_speech = (double)ngs->n_tot_frame + / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + + E_INFO("TOTAL fwdtree %.2f CPU %.3f xRT\n", + ngs->fwdtree_perf.t_tot_cpu, + ngs->fwdtree_perf.t_tot_cpu / n_speech); + E_INFO("TOTAL fwdtree %.2f wall %.3f xRT\n", + ngs->fwdtree_perf.t_tot_elapsed, + ngs->fwdtree_perf.t_tot_elapsed / n_speech); + + /* Reset non-root channels. */ + reinit_search_tree(ngs); + /* Free the search tree. */ + deinit_search_tree(ngs); + /* Free other stuff. */ + ngs->max_nonroot_chan = 0; + ckd_free_2d(ngs->active_chan_list); + ngs->active_chan_list = NULL; + ckd_free(ngs->cand_sf); + ngs->cand_sf = NULL; + ckd_free(ngs->bestbp_rc); + ngs->bestbp_rc = NULL; + ckd_free(ngs->lastphn_cand); + ngs->lastphn_cand = NULL; +} + +int +ngram_fwdtree_reinit(ngram_search_t *ngs) +{ + /* Reset non-root channels. */ + reinit_search_tree(ngs); + /* Free the search tree. */ + deinit_search_tree(ngs); + /* Reallocate things that depend on the number of words. */ + ckd_free(ngs->lastphn_cand); + ngs->lastphn_cand = ckd_calloc(ps_search_n_words(ngs), + sizeof(*ngs->lastphn_cand)); + ckd_free(ngs->word_chan); + ngs->word_chan = ckd_calloc(ps_search_n_words(ngs), + sizeof(*ngs->word_chan)); + /* Rebuild the search tree. */ + init_search_tree(ngs); + create_search_channels(ngs); + return 0; +} + +void +ngram_fwdtree_start(ngram_search_t *ngs) +{ + ps_search_t *base = (ps_search_t *)ngs; + int32 i, w, n_words; + root_chan_t *rhmm; + + n_words = ps_search_n_words(ngs); + + /* Reset utterance statistics. */ + memset(&ngs->st, 0, sizeof(ngs->st)); + ptmr_reset(&ngs->fwdtree_perf); + ptmr_start(&ngs->fwdtree_perf); + + /* Reset backpointer table. */ + ngs->bpidx = 0; + ngs->bss_head = 0; + + /* Reset word lattice. */ + for (i = 0; i < n_words; ++i) + ngs->word_lat_idx[i] = NO_BP; + + /* Reset active HMM and word lists. */ + ngs->n_active_chan[0] = ngs->n_active_chan[1] = 0; + ngs->n_active_word[0] = ngs->n_active_word[1] = 0; + + /* Reset scores. */ + ngs->best_score = 0; + ngs->renormalized = 0; + + /* Reset other stuff. */ + for (i = 0; i < n_words; i++) + ngs->last_ltrans[i].sf = -1; + ngs->n_frame = 0; + + /* Clear the hypothesis string. */ + ckd_free(base->hyp_str); + base->hyp_str = NULL; + + /* Reset the permanently allocated single-phone words, since they + * may have junk left over in them from FWDFLAT. */ + for (i = 0; i < ngs->n_1ph_words; i++) { + w = ngs->single_phone_wid[i]; + rhmm = (root_chan_t *) ngs->word_chan[w]; + hmm_clear(&rhmm->hmm); + } + + /* Start search with ; word_chan[] is permanently allocated */ + rhmm = (root_chan_t *) ngs->word_chan[dict_startwid(ps_search_dict(ngs))]; + hmm_clear(&rhmm->hmm); + hmm_enter(&rhmm->hmm, 0, NO_BP, 0); +} + +/* + * Mark the active senones for all senones belonging to channels that are active in the + * current frame. + */ +static void +compute_sen_active(ngram_search_t *ngs, int frame_idx) +{ + root_chan_t *rhmm; + chan_t *hmm, **acl; + int32 i, w, *awl; + + acmod_clear_active(ps_search_acmod(ngs)); + + /* Flag active senones for root channels */ + for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { + if (hmm_frame(&rhmm->hmm) == frame_idx) + acmod_activate_hmm(ps_search_acmod(ngs), &rhmm->hmm); + } + + /* Flag active senones for nonroot channels in HMM tree */ + i = ngs->n_active_chan[frame_idx & 0x1]; + acl = ngs->active_chan_list[frame_idx & 0x1]; + for (hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { + acmod_activate_hmm(ps_search_acmod(ngs), &hmm->hmm); + } + + /* Flag active senones for individual word channels */ + i = ngs->n_active_word[frame_idx & 0x1]; + awl = ngs->active_word_list[frame_idx & 0x1]; + for (w = *(awl++); i > 0; --i, w = *(awl++)) { + for (hmm = ngs->word_chan[w]; hmm; hmm = hmm->next) { + acmod_activate_hmm(ps_search_acmod(ngs), &hmm->hmm); + } + } + for (i = 0; i < ngs->n_1ph_words; i++) { + w = ngs->single_phone_wid[i]; + rhmm = (root_chan_t *) ngs->word_chan[w]; + + if (hmm_frame(&rhmm->hmm) == frame_idx) + acmod_activate_hmm(ps_search_acmod(ngs), &rhmm->hmm); + } +} + +static void +renormalize_scores(ngram_search_t *ngs, int frame_idx, int32 norm) +{ + root_chan_t *rhmm; + chan_t *hmm, **acl; + int32 i, w, *awl; + + /* Renormalize root channels */ + for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { + if (hmm_frame(&rhmm->hmm) == frame_idx) { + hmm_normalize(&rhmm->hmm, norm); + } + } + + /* Renormalize nonroot channels in HMM tree */ + i = ngs->n_active_chan[frame_idx & 0x1]; + acl = ngs->active_chan_list[frame_idx & 0x1]; + for (hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { + hmm_normalize(&hmm->hmm, norm); + } + + /* Renormalize individual word channels */ + i = ngs->n_active_word[frame_idx & 0x1]; + awl = ngs->active_word_list[frame_idx & 0x1]; + for (w = *(awl++); i > 0; --i, w = *(awl++)) { + for (hmm = ngs->word_chan[w]; hmm; hmm = hmm->next) { + hmm_normalize(&hmm->hmm, norm); + } + } + for (i = 0; i < ngs->n_1ph_words; i++) { + w = ngs->single_phone_wid[i]; + rhmm = (root_chan_t *) ngs->word_chan[w]; + if (hmm_frame(&rhmm->hmm) == frame_idx) { + hmm_normalize(&rhmm->hmm, norm); + } + } + + ngs->renormalized = TRUE; +} + +static int32 +eval_root_chan(ngram_search_t *ngs, int frame_idx) +{ + root_chan_t *rhmm; + int32 i, bestscore; + + bestscore = WORST_SCORE; + for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { + if (hmm_frame(&rhmm->hmm) == frame_idx) { + int32 score = chan_v_eval(rhmm); + if (score BETTER_THAN bestscore) + bestscore = score; + ++ngs->st.n_root_chan_eval; + } + } + return (bestscore); +} + +static int32 +eval_nonroot_chan(ngram_search_t *ngs, int frame_idx) +{ + chan_t *hmm, **acl; + int32 i, bestscore; + + i = ngs->n_active_chan[frame_idx & 0x1]; + acl = ngs->active_chan_list[frame_idx & 0x1]; + bestscore = WORST_SCORE; + ngs->st.n_nonroot_chan_eval += i; + + for (hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { + int32 score = chan_v_eval(hmm); + assert(hmm_frame(&hmm->hmm) == frame_idx); + if (score BETTER_THAN bestscore) + bestscore = score; + } + + return bestscore; +} + +static int32 +eval_word_chan(ngram_search_t *ngs, int frame_idx) +{ + root_chan_t *rhmm; + chan_t *hmm; + int32 i, w, bestscore, *awl, j, k; + + k = 0; + bestscore = WORST_SCORE; + awl = ngs->active_word_list[frame_idx & 0x1]; + + i = ngs->n_active_word[frame_idx & 0x1]; + for (w = *(awl++); i > 0; --i, w = *(awl++)) { + assert(bitvec_is_set(ngs->word_active, w)); + bitvec_clear(ngs->word_active, w); + assert(ngs->word_chan[w] != NULL); + + for (hmm = ngs->word_chan[w]; hmm; hmm = hmm->next) { + int32 score; + + assert(hmm_frame(&hmm->hmm) == frame_idx); + score = chan_v_eval(hmm); + /*printf("eval word chan %d score %d\n", w, score); */ + + if (score BETTER_THAN bestscore) + bestscore = score; + + k++; + } + } + + /* Similarly for statically allocated single-phone words */ + j = 0; + for (i = 0; i < ngs->n_1ph_words; i++) { + int32 score; + + w = ngs->single_phone_wid[i]; + rhmm = (root_chan_t *) ngs->word_chan[w]; + if (hmm_frame(&rhmm->hmm) < frame_idx) + continue; + + score = chan_v_eval(rhmm); + /* printf("eval 1ph word chan %d score %d\n", w, score); */ + if (score BETTER_THAN bestscore && w != ps_search_finish_wid(ngs)) + bestscore = score; + + j++; + } + + ngs->st.n_last_chan_eval += k + j; + ngs->st.n_nonroot_chan_eval += k + j; + ngs->st.n_word_lastchan_eval += + ngs->n_active_word[frame_idx & 0x1] + j; + + return bestscore; +} + +static int32 +evaluate_channels(ngram_search_t *ngs, int16 const *senone_scores, int frame_idx) +{ + int32 bs; + + hmm_context_set_senscore(ngs->hmmctx, senone_scores); + ngs->best_score = eval_root_chan(ngs, frame_idx); + if ((bs = eval_nonroot_chan(ngs, frame_idx)) BETTER_THAN ngs->best_score) + ngs->best_score = bs; + if ((bs = eval_word_chan(ngs, frame_idx)) BETTER_THAN ngs->best_score) + ngs->best_score = bs; + ngs->last_phone_best_score = bs; + + return ngs->best_score; +} + +/* + * Prune currently active root channels for next frame. Also, perform exit + * transitions out of them and activate successors. + * score[] of pruned root chan set to WORST_SCORE elsewhere. + */ +static void +prune_root_chan(ngram_search_t *ngs, int frame_idx) +{ + root_chan_t *rhmm; + chan_t *hmm; + int32 i, nf, w; + int32 thresh, newphone_thresh, lastphn_thresh, newphone_score; + chan_t **nacl; /* next active list */ + lastphn_cand_t *candp; + phone_loop_search_t *pls; + + nf = frame_idx + 1; + thresh = ngs->best_score + ngs->dynamic_beam; + newphone_thresh = ngs->best_score + ngs->pbeam; + lastphn_thresh = ngs->best_score + ngs->lpbeam; + nacl = ngs->active_chan_list[nf & 0x1]; + pls = (phone_loop_search_t *)ps_search_lookahead(ngs); + + for (i = 0, rhmm = ngs->root_chan; i < ngs->n_root_chan; i++, rhmm++) { + E_DEBUG("Root channel %d frame %d score %d thresh %d\n", + i, hmm_frame(&rhmm->hmm), hmm_bestscore(&rhmm->hmm), thresh); + /* First check if this channel was active in current frame */ + if (hmm_frame(&rhmm->hmm) < frame_idx) + continue; + + if (hmm_bestscore(&rhmm->hmm) BETTER_THAN thresh) { + hmm_frame(&rhmm->hmm) = nf; /* rhmm will be active in next frame */ + E_DEBUG("Preserving root channel %d score %d\n", i, hmm_bestscore(&rhmm->hmm)); + /* transitions out of this root channel */ + /* transition to all next-level channels in the HMM tree */ + newphone_score = hmm_out_score(&rhmm->hmm) + ngs->pip; + if (pls != NULL || newphone_score BETTER_THAN newphone_thresh) { + for (hmm = rhmm->next; hmm; hmm = hmm->alt) { + int32 pl_newphone_score = newphone_score + + phone_loop_search_score(pls, hmm->ciphone); + if (pl_newphone_score BETTER_THAN newphone_thresh) { + if ((hmm_frame(&hmm->hmm) < frame_idx) + || (newphone_score BETTER_THAN hmm_in_score(&hmm->hmm))) { + hmm_enter(&hmm->hmm, newphone_score, + hmm_out_history(&rhmm->hmm), nf); + *(nacl++) = hmm; + } + } + } + } + + /* + * Transition to last phone of all words for which this is the + * penultimate phone (the last phones may need multiple right contexts). + * Remember to remove the temporary newword_penalty. + */ + if (pls != NULL || newphone_score BETTER_THAN lastphn_thresh) { + for (w = rhmm->penult_phn_wid; w >= 0; + w = ngs->homophone_set[w]) { + int32 pl_newphone_score = newphone_score + + phone_loop_search_score + (pls, dict_last_phone(ps_search_dict(ngs),w)); + E_DEBUG("word %s newphone_score %d\n", dict_wordstr(ps_search_dict(ngs), w), newphone_score); + if (pl_newphone_score BETTER_THAN lastphn_thresh) { + candp = ngs->lastphn_cand + ngs->n_lastphn_cand; + ngs->n_lastphn_cand++; + candp->wid = w; + candp->score = + newphone_score - ngs->nwpen; + candp->bp = hmm_out_history(&rhmm->hmm); + } + } + } + } + } + ngs->n_active_chan[nf & 0x1] = (int)(nacl - ngs->active_chan_list[nf & 0x1]); +} + +/* + * Prune currently active nonroot channels in HMM tree for next frame. Also, perform + * exit transitions out of such channels and activate successors. + */ +static void +prune_nonroot_chan(ngram_search_t *ngs, int frame_idx) +{ + chan_t *hmm, *nexthmm; + int32 nf, w, i; + int32 thresh, newphone_thresh, lastphn_thresh, newphone_score; + chan_t **acl, **nacl; /* active list, next active list */ + lastphn_cand_t *candp; + phone_loop_search_t *pls; + + nf = frame_idx + 1; + + thresh = ngs->best_score + ngs->dynamic_beam; + newphone_thresh = ngs->best_score + ngs->pbeam; + lastphn_thresh = ngs->best_score + ngs->lpbeam; + pls = (phone_loop_search_t *)ps_search_lookahead(ngs); + + acl = ngs->active_chan_list[frame_idx & 0x1]; /* currently active HMMs in tree */ + nacl = ngs->active_chan_list[nf & 0x1] + ngs->n_active_chan[nf & 0x1]; + + for (i = ngs->n_active_chan[frame_idx & 0x1], hmm = *(acl++); i > 0; + --i, hmm = *(acl++)) { + assert(hmm_frame(&hmm->hmm) >= frame_idx); + + if (hmm_bestscore(&hmm->hmm) BETTER_THAN thresh) { + /* retain this channel in next frame */ + if (hmm_frame(&hmm->hmm) != nf) { + hmm_frame(&hmm->hmm) = nf; + *(nacl++) = hmm; + } + + /* transition to all next-level channel in the HMM tree */ + newphone_score = hmm_out_score(&hmm->hmm) + ngs->pip; + if (pls != NULL || newphone_score BETTER_THAN newphone_thresh) { + for (nexthmm = hmm->next; nexthmm; nexthmm = nexthmm->alt) { + int32 pl_newphone_score = newphone_score + + phone_loop_search_score(pls, nexthmm->ciphone); + if ((pl_newphone_score BETTER_THAN newphone_thresh) + && ((hmm_frame(&nexthmm->hmm) < frame_idx) + || (newphone_score + BETTER_THAN hmm_in_score(&nexthmm->hmm)))) { + if (hmm_frame(&nexthmm->hmm) != nf) { + /* Keep this HMM on the active list */ + *(nacl++) = nexthmm; + } + hmm_enter(&nexthmm->hmm, newphone_score, + hmm_out_history(&hmm->hmm), nf); + } + } + } + + /* + * Transition to last phone of all words for which this is the + * penultimate phone (the last phones may need multiple right contexts). + * Remember to remove the temporary newword_penalty. + */ + if (pls != NULL || newphone_score BETTER_THAN lastphn_thresh) { + for (w = hmm->info.penult_phn_wid; w >= 0; + w = ngs->homophone_set[w]) { + int32 pl_newphone_score = newphone_score + + phone_loop_search_score + (pls, dict_last_phone(ps_search_dict(ngs),w)); + if (pl_newphone_score BETTER_THAN lastphn_thresh) { + candp = ngs->lastphn_cand + ngs->n_lastphn_cand; + ngs->n_lastphn_cand++; + candp->wid = w; + candp->score = + newphone_score - ngs->nwpen; + candp->bp = hmm_out_history(&hmm->hmm); + } + } + } + } + else if (hmm_frame(&hmm->hmm) != nf) { + hmm_clear(&hmm->hmm); + } + } + ngs->n_active_chan[nf & 0x1] = (int)(nacl - ngs->active_chan_list[nf & 0x1]); +} + +/* + * Execute the transition into the last phone for all candidates words emerging from + * the HMM tree. Attach LM scores to such transitions. + * (Executed after pruning root and non-root, but before pruning word-chan.) + */ +static void +last_phone_transition(ngram_search_t *ngs, int frame_idx) +{ + int32 i, j, k, nf, bp, bpend, w; + lastphn_cand_t *candp; + int32 *nawl; + int32 thresh; + int32 bestscore, dscr; + chan_t *hmm; + bptbl_t *bpe; + int32 n_cand_sf = 0; + + nf = frame_idx + 1; + nawl = ngs->active_word_list[nf & 0x1]; + ngs->st.n_lastphn_cand_utt += ngs->n_lastphn_cand; + + /* For each candidate word (entering its last phone) */ + /* If best LM score and bp for candidate known use it, else sort cands by startfrm */ + for (i = 0, candp = ngs->lastphn_cand; i < ngs->n_lastphn_cand; i++, candp++) { + int32 start_score; + + /* This can happen if recognition fails. */ + if (candp->bp == -1) + continue; + /* Backpointer entry for it. */ + bpe = &(ngs->bp_table[candp->bp]); + + /* Subtract starting score for candidate, leave it with only word score */ + start_score = ngram_search_exit_score + (ngs, bpe, dict_first_phone(ps_search_dict(ngs), candp->wid)); + assert(start_score BETTER_THAN WORST_SCORE); + candp->score -= start_score; + + /* + * If this candidate not occurred in an earlier frame, prepare for finding + * best transition score into last phone; sort by start frame. + */ + /* i.e. if we don't have an entry in last_ltrans for this + * , then create one */ + if (ngs->last_ltrans[candp->wid].sf != bpe->frame + 1) { + /* Look for an entry in cand_sf matching the backpointer + * for this candidate. */ + for (j = 0; j < n_cand_sf; j++) { + if (ngs->cand_sf[j].bp_ef == bpe->frame) + break; + } + /* Oh, we found one, so chain onto it. */ + if (j < n_cand_sf) + candp->next = ngs->cand_sf[j].cand; + else { + /* Nope, let's make a new one, allocating cand_sf if necessary. */ + if (n_cand_sf >= ngs->cand_sf_alloc) { + if (ngs->cand_sf_alloc == 0) { + ngs->cand_sf = + ckd_calloc(CAND_SF_ALLOCSIZE, + sizeof(*ngs->cand_sf)); + ngs->cand_sf_alloc = CAND_SF_ALLOCSIZE; + } + else { + ngs->cand_sf_alloc += CAND_SF_ALLOCSIZE; + ngs->cand_sf = ckd_realloc(ngs->cand_sf, + ngs->cand_sf_alloc + * sizeof(*ngs->cand_sf)); + E_INFO("cand_sf[] increased to %d entries\n", + ngs->cand_sf_alloc); + } + } + + /* Use the newly created cand_sf. */ + j = n_cand_sf++; + candp->next = -1; /* End of the chain. */ + ngs->cand_sf[j].bp_ef = bpe->frame; + } + /* Update it to point to this candidate. */ + ngs->cand_sf[j].cand = i; + + ngs->last_ltrans[candp->wid].dscr = WORST_SCORE; + ngs->last_ltrans[candp->wid].sf = bpe->frame + 1; + } + } + + /* Compute best LM score and bp for new cands entered in the sorted lists above */ + for (i = 0; i < n_cand_sf; i++) { + /* For the i-th unique end frame... */ + bp = ngs->bp_table_idx[ngs->cand_sf[i].bp_ef]; + bpend = ngs->bp_table_idx[ngs->cand_sf[i].bp_ef + 1]; + for (bpe = &(ngs->bp_table[bp]); bp < bpend; bp++, bpe++) { + if (!bpe->valid) + continue; + /* For each candidate at the start frame find bp->cand transition-score */ + for (j = ngs->cand_sf[i].cand; j >= 0; j = candp->next) { + int32 n_used; + candp = &(ngs->lastphn_cand[j]); + dscr = + ngram_search_exit_score + (ngs, bpe, dict_first_phone(ps_search_dict(ngs), candp->wid)); + if (dscr BETTER_THAN WORST_SCORE) { + assert(!dict_filler_word(ps_search_dict(ngs), candp->wid)); + dscr += ngram_tg_score(ngs->lmset, + dict_basewid(ps_search_dict(ngs), candp->wid), + bpe->real_wid, + bpe->prev_real_wid, + &n_used)>>SENSCR_SHIFT; + } + + if (dscr BETTER_THAN ngs->last_ltrans[candp->wid].dscr) { + ngs->last_ltrans[candp->wid].dscr = dscr; + ngs->last_ltrans[candp->wid].bp = bp; + } + } + } + } + + /* Update best transitions for all candidates; also update best lastphone score */ + bestscore = ngs->last_phone_best_score; + for (i = 0, candp = ngs->lastphn_cand; i < ngs->n_lastphn_cand; i++, candp++) { + candp->score += ngs->last_ltrans[candp->wid].dscr; + candp->bp = ngs->last_ltrans[candp->wid].bp; + + if (candp->score BETTER_THAN bestscore) + bestscore = candp->score; + } + ngs->last_phone_best_score = bestscore; + + /* At this pt, we know the best entry score (with LM component) for all candidates */ + thresh = bestscore + ngs->lponlybeam; + for (i = ngs->n_lastphn_cand, candp = ngs->lastphn_cand; i > 0; --i, candp++) { + if (candp->score BETTER_THAN thresh) { + w = candp->wid; + + ngram_search_alloc_all_rc(ngs, w); + + k = 0; + for (hmm = ngs->word_chan[w]; hmm; hmm = hmm->next) { + if ((hmm_frame(&hmm->hmm) < frame_idx) + || (candp->score BETTER_THAN hmm_in_score(&hmm->hmm))) { + assert(hmm_frame(&hmm->hmm) != nf); + hmm_enter(&hmm->hmm, + candp->score, candp->bp, nf); + k++; + } + } + if (k > 0) { + assert(bitvec_is_clear(ngs->word_active, w)); + assert(!dict_is_single_phone(ps_search_dict(ngs), w)); + *(nawl++) = w; + bitvec_set(ngs->word_active, w); + } + } + } + ngs->n_active_word[nf & 0x1] = (int)(nawl - ngs->active_word_list[nf & 0x1]); +} + +/* + * Prune currently active word channels for next frame. Also, perform exit + * transitions out of such channels and active successors. + */ +static void +prune_word_chan(ngram_search_t *ngs, int frame_idx) +{ + root_chan_t *rhmm; + chan_t *hmm, *thmm; + chan_t **phmmp; /* previous HMM-pointer */ + int32 nf, w, i, k; + int32 newword_thresh, lastphn_thresh; + int32 *awl, *nawl; + + nf = frame_idx + 1; + newword_thresh = ngs->last_phone_best_score + ngs->wbeam; + lastphn_thresh = ngs->last_phone_best_score + ngs->lponlybeam; + + awl = ngs->active_word_list[frame_idx & 0x1]; + nawl = ngs->active_word_list[nf & 0x1] + ngs->n_active_word[nf & 0x1]; + + /* Dynamically allocated last channels of multi-phone words */ + for (i = ngs->n_active_word[frame_idx & 0x1], w = *(awl++); i > 0; + --i, w = *(awl++)) { + k = 0; + phmmp = &(ngs->word_chan[w]); + for (hmm = ngs->word_chan[w]; hmm; hmm = thmm) { + assert(hmm_frame(&hmm->hmm) >= frame_idx); + + thmm = hmm->next; + if (hmm_bestscore(&hmm->hmm) BETTER_THAN lastphn_thresh) { + /* retain this channel in next frame */ + hmm_frame(&hmm->hmm) = nf; + k++; + phmmp = &(hmm->next); + + /* Could if ((! skip_alt_frm) || (frame_idx & 0x1)) the following */ + if (hmm_out_score(&hmm->hmm) BETTER_THAN newword_thresh) { + /* can exit channel and recognize word */ + ngram_search_save_bp(ngs, frame_idx, w, + hmm_out_score(&hmm->hmm), + hmm_out_history(&hmm->hmm), + hmm->info.rc_id); + } + } + else if (hmm_frame(&hmm->hmm) == nf) { + phmmp = &(hmm->next); + } + else { + hmm_deinit(&hmm->hmm); + listelem_free(ngs->chan_alloc, hmm); + *phmmp = thmm; + } + } + if ((k > 0) && (bitvec_is_clear(ngs->word_active, w))) { + assert(!dict_is_single_phone(ps_search_dict(ngs), w)); + *(nawl++) = w; + bitvec_set(ngs->word_active, w); + } + } + ngs->n_active_word[nf & 0x1] = (int)(nawl - ngs->active_word_list[nf & 0x1]); + + /* + * Prune permanently allocated single-phone channels. + * NOTES: score[] of pruned channels set to WORST_SCORE elsewhere. + */ + for (i = 0; i < ngs->n_1ph_words; i++) { + w = ngs->single_phone_wid[i]; + rhmm = (root_chan_t *) ngs->word_chan[w]; + E_DEBUG("Single phone word %s frame %d score %d thresh %d outscore %d nwthresh %d\n", + dict_wordstr(ps_search_dict(ngs),w), + hmm_frame(&rhmm->hmm), hmm_bestscore(&rhmm->hmm), + lastphn_thresh, hmm_out_score(&rhmm->hmm), newword_thresh); + if (hmm_frame(&rhmm->hmm) < frame_idx) + continue; + if (hmm_bestscore(&rhmm->hmm) BETTER_THAN lastphn_thresh) { + hmm_frame(&rhmm->hmm) = nf; + + /* Could if ((! skip_alt_frm) || (frame_idx & 0x1)) the following */ + if (hmm_out_score(&rhmm->hmm) BETTER_THAN newword_thresh) { + E_DEBUG("Exiting single phone word %s with %d > %d, %d\n", + dict_wordstr(ps_search_dict(ngs),w), + hmm_out_score(&rhmm->hmm), + lastphn_thresh, newword_thresh); + ngram_search_save_bp(ngs, frame_idx, w, + hmm_out_score(&rhmm->hmm), + hmm_out_history(&rhmm->hmm), 0); + } + } + } +} + +static void +prune_channels(ngram_search_t *ngs, int frame_idx) +{ + /* Clear last phone candidate list. */ + ngs->n_lastphn_cand = 0; + /* Set the dynamic beam based on maxhmmpf here. */ + ngs->dynamic_beam = ngs->beam; + if (ngs->maxhmmpf != -1 + && ngs->st.n_root_chan_eval + ngs->st.n_nonroot_chan_eval > ngs->maxhmmpf) { + /* Build a histogram to approximately prune them. */ + int32 bins[256], bw, nhmms, i; + root_chan_t *rhmm; + chan_t **acl, *hmm; + + /* Bins go from zero (best score) to edge of beam. */ + bw = -ngs->beam / 256; + memset(bins, 0, sizeof(bins)); + /* For each active root channel. */ + for (i = 0, rhmm = ngs->root_chan; i < ngs->n_root_chan; i++, rhmm++) { + int32 b; + + /* Put it in a bin according to its bestscore. */ + b = (ngs->best_score - hmm_bestscore(&rhmm->hmm)) / bw; + if (b >= 256) + b = 255; + ++bins[b]; + } + /* For each active non-root channel. */ + acl = ngs->active_chan_list[frame_idx & 0x1]; /* currently active HMMs in tree */ + for (i = ngs->n_active_chan[frame_idx & 0x1], hmm = *(acl++); + i > 0; --i, hmm = *(acl++)) { + int32 b; + + /* Put it in a bin according to its bestscore. */ + b = (ngs->best_score - hmm_bestscore(&hmm->hmm)) / bw; + if (b >= 256) + b = 255; + ++bins[b]; + } + /* Walk down the bins to find the new beam. */ + for (i = nhmms = 0; i < 256; ++i) { + nhmms += bins[i]; + if (nhmms > ngs->maxhmmpf) + break; + } + ngs->dynamic_beam = -(i * bw); + } + + prune_root_chan(ngs, frame_idx); + prune_nonroot_chan(ngs, frame_idx); + last_phone_transition(ngs, frame_idx); + prune_word_chan(ngs, frame_idx); +} + +/* + * Limit the number of word exits in each frame to maxwpf. And also limit the number of filler + * words to 1. + */ +static void +bptable_maxwpf(ngram_search_t *ngs, int frame_idx) +{ + int32 bp, n; + int32 bestscr, worstscr; + bptbl_t *bpe, *bestbpe, *worstbpe; + + /* Don't prune if no pruing. */ + if (ngs->maxwpf == -1 || ngs->maxwpf == ps_search_n_words(ngs)) + return; + + /* Allow only one filler word exit (the best) per frame */ + bestscr = (int32) 0x80000000; + bestbpe = NULL; + n = 0; + for (bp = ngs->bp_table_idx[frame_idx]; bp < ngs->bpidx; bp++) { + bpe = &(ngs->bp_table[bp]); + if (dict_filler_word(ps_search_dict(ngs), bpe->wid)) { + if (bpe->score BETTER_THAN bestscr) { + bestscr = bpe->score; + bestbpe = bpe; + } + bpe->valid = FALSE; + n++; /* No. of filler words */ + } + } + /* Restore bestbpe to valid state */ + if (bestbpe != NULL) { + bestbpe->valid = TRUE; + --n; + } + + /* Allow up to maxwpf best entries to survive; mark the remaining with valid = 0 */ + n = (ngs->bpidx + - ngs->bp_table_idx[frame_idx]) - n; /* No. of entries after limiting fillers */ + for (; n > ngs->maxwpf; --n) { + /* Find worst BPTable entry */ + worstscr = (int32) 0x7fffffff; + worstbpe = NULL; + for (bp = ngs->bp_table_idx[frame_idx]; (bp < ngs->bpidx); bp++) { + bpe = &(ngs->bp_table[bp]); + if (bpe->valid && (bpe->score WORSE_THAN worstscr)) { + worstscr = bpe->score; + worstbpe = bpe; + } + } + /* FIXME: Don't panic! */ + if (worstbpe == NULL) + E_FATAL("PANIC: No worst BPtable entry remaining\n"); + worstbpe->valid = FALSE; + } +} + +static void +word_transition(ngram_search_t *ngs, int frame_idx) +{ + int32 i, k, bp, w, nf; + int32 rc; + int32 thresh, newscore, pl_newscore; + bptbl_t *bpe; + root_chan_t *rhmm; + struct bestbp_rc_s *bestbp_rc_ptr; + phone_loop_search_t *pls; + dict_t *dict = ps_search_dict(ngs); + dict2pid_t *d2p = ps_search_dict2pid(ngs); + + /* + * Transition to start of new word instances (HMM tree roots); but only if words + * other than finished here. + * But, first, find the best starting score for each possible right context phone. + */ + for (i = bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef) - 1; i >= 0; --i) + ngs->bestbp_rc[i].score = WORST_SCORE; + k = 0; + pls = (phone_loop_search_t *)ps_search_lookahead(ngs); + /* Ugh, this is complicated. Scan all word exits for this frame + * (they have already been created by prune_word_chan()). */ + for (bp = ngs->bp_table_idx[frame_idx]; bp < ngs->bpidx; bp++) { + bpe = &(ngs->bp_table[bp]); + ngs->word_lat_idx[bpe->wid] = NO_BP; + + if (bpe->wid == ps_search_finish_wid(ngs)) + continue; + k++; + + /* DICT2PID */ + /* Array of HMM scores corresponding to all the possible right + * context expansions of the final phone. It's likely that a + * lot of these are going to be missing, actually. */ + if (bpe->last2_phone == -1) { /* implies s_idx == -1 */ + /* No right context expansion. */ + for (rc = 0; rc < bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef); ++rc) { + if (bpe->score BETTER_THAN ngs->bestbp_rc[rc].score) { + E_DEBUG("bestbp_rc[0] = %d lc %d\n", + bpe->score, bpe->last_phone); + ngs->bestbp_rc[rc].score = bpe->score; + ngs->bestbp_rc[rc].path = bp; + ngs->bestbp_rc[rc].lc = bpe->last_phone; + } + } + } + else { + xwdssid_t *rssid = dict2pid_rssid(d2p, bpe->last_phone, bpe->last2_phone); + int32 *rcss = &(ngs->bscore_stack[bpe->s_idx]); + for (rc = 0; rc < bin_mdef_n_ciphone(ps_search_acmod(ngs)->mdef); ++rc) { + if (rcss[rssid->cimap[rc]] BETTER_THAN ngs->bestbp_rc[rc].score) { + E_DEBUG("bestbp_rc[%d] = %d lc %d\n", + rc, rcss[rssid->cimap[rc]], bpe->last_phone); + ngs->bestbp_rc[rc].score = rcss[rssid->cimap[rc]]; + ngs->bestbp_rc[rc].path = bp; + ngs->bestbp_rc[rc].lc = bpe->last_phone; + } + } + } + } + if (k == 0) + return; + + nf = frame_idx + 1; + thresh = ngs->best_score + ngs->dynamic_beam; + /* + * Hypothesize successors to words finished in this frame. + * Main dictionary, multi-phone words transition to HMM-trees roots. + */ + for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { + bestbp_rc_ptr = &(ngs->bestbp_rc[rhmm->ciphone]); + + newscore = bestbp_rc_ptr->score + ngs->nwpen + ngs->pip; + pl_newscore = newscore + + phone_loop_search_score(pls, rhmm->ciphone); + if (pl_newscore BETTER_THAN thresh) { + if ((hmm_frame(&rhmm->hmm) < frame_idx) + || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { + hmm_enter(&rhmm->hmm, newscore, + bestbp_rc_ptr->path, nf); + /* DICT2PID: Another place where mpx ssids are entered. */ + /* Look up the ssid to use when entering this mpx triphone. */ + hmm_mpx_ssid(&rhmm->hmm, 0) = + dict2pid_ldiph_lc(d2p, rhmm->ciphone, rhmm->ci2phone, bestbp_rc_ptr->lc); + assert(hmm_mpx_ssid(&rhmm->hmm, 0) != BAD_SSID); + } + } + } + + /* + * Single phone words; no right context for these. Cannot use bestbp_rc as + * LM scores have to be included. First find best transition to these words. + */ + for (i = 0; i < ngs->n_1ph_LMwords; i++) { + w = ngs->single_phone_wid[i]; + ngs->last_ltrans[w].dscr = (int32) 0x80000000; + } + for (bp = ngs->bp_table_idx[frame_idx]; bp < ngs->bpidx; bp++) { + bpe = &(ngs->bp_table[bp]); + if (!bpe->valid) + continue; + + for (i = 0; i < ngs->n_1ph_LMwords; i++) { + int32 n_used; + w = ngs->single_phone_wid[i]; + newscore = ngram_search_exit_score + (ngs, bpe, dict_first_phone(dict, w)); + E_DEBUG("initial newscore for %s: %d\n", + dict_wordstr(dict, w), newscore); + if (newscore != WORST_SCORE) + newscore += ngram_tg_score(ngs->lmset, + dict_basewid(dict, w), + bpe->real_wid, + bpe->prev_real_wid, + &n_used)>>SENSCR_SHIFT; + + /* FIXME: Not sure how WORST_SCORE could be better, but it + * apparently happens. */ + if (newscore BETTER_THAN ngs->last_ltrans[w].dscr) { + ngs->last_ltrans[w].dscr = newscore; + ngs->last_ltrans[w].bp = bp; + } + } + } + + /* Now transition to in-LM single phone words */ + for (i = 0; i < ngs->n_1ph_LMwords; i++) { + w = ngs->single_phone_wid[i]; + /* Never transition into the start word (for one thing, it is + a non-event in the language model.) */ + if (w == dict_startwid(ps_search_dict(ngs))) + continue; + rhmm = (root_chan_t *) ngs->word_chan[w]; + newscore = ngs->last_ltrans[w].dscr + ngs->pip; + pl_newscore = newscore + phone_loop_search_score(pls, rhmm->ciphone); + if (pl_newscore BETTER_THAN thresh) { + bpe = ngs->bp_table + ngs->last_ltrans[w].bp; + if ((hmm_frame(&rhmm->hmm) < frame_idx) + || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { + hmm_enter(&rhmm->hmm, + newscore, ngs->last_ltrans[w].bp, nf); + /* DICT2PID: another place where mpx ssids are entered. */ + /* Look up the ssid to use when entering this mpx triphone. */ + hmm_mpx_ssid(&rhmm->hmm, 0) = + dict2pid_ldiph_lc(d2p, rhmm->ciphone, rhmm->ci2phone, + dict_last_phone(dict, bpe->wid)); + assert(hmm_mpx_ssid(&rhmm->hmm, 0) != BAD_SSID); + } + } + } + + /* Remaining words: , noise words. No mpx for these! */ + w = ps_search_silence_wid(ngs); + rhmm = (root_chan_t *) ngs->word_chan[w]; + bestbp_rc_ptr = &(ngs->bestbp_rc[ps_search_acmod(ngs)->mdef->sil]); + newscore = bestbp_rc_ptr->score + ngs->silpen + ngs->pip; + pl_newscore = newscore + + phone_loop_search_score(pls, rhmm->ciphone); + if (pl_newscore BETTER_THAN thresh) { + if ((hmm_frame(&rhmm->hmm) < frame_idx) + || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { + hmm_enter(&rhmm->hmm, + newscore, bestbp_rc_ptr->path, nf); + } + } + for (w = dict_filler_start(dict); w <= dict_filler_end(dict); w++) { + if (w == ps_search_silence_wid(ngs)) + continue; + /* Never transition into the start word (for one thing, it is + a non-event in the language model.) */ + if (w == dict_startwid(ps_search_dict(ngs))) + continue; + rhmm = (root_chan_t *) ngs->word_chan[w]; + /* If this was not actually a single-phone word, rhmm will be NULL. */ + if (rhmm == NULL) + continue; + newscore = bestbp_rc_ptr->score + ngs->fillpen + ngs->pip; + pl_newscore = newscore + + phone_loop_search_score(pls, rhmm->ciphone); + if (pl_newscore BETTER_THAN thresh) { + if ((hmm_frame(&rhmm->hmm) < frame_idx) + || (newscore BETTER_THAN hmm_in_score(&rhmm->hmm))) { + hmm_enter(&rhmm->hmm, + newscore, bestbp_rc_ptr->path, nf); + } + } + } +} + +static void +deactivate_channels(ngram_search_t *ngs, int frame_idx) +{ + root_chan_t *rhmm; + int i; + + /* Clear score[] of pruned root channels */ + for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { + if (hmm_frame(&rhmm->hmm) == frame_idx) { + hmm_clear(&rhmm->hmm); + } + } + /* Clear score[] of pruned single-phone channels */ + for (i = 0; i < ngs->n_1ph_words; i++) { + int32 w = ngs->single_phone_wid[i]; + rhmm = (root_chan_t *) ngs->word_chan[w]; + if (hmm_frame(&rhmm->hmm) == frame_idx) { + hmm_clear(&rhmm->hmm); + } + } +} + +int +ngram_fwdtree_search(ngram_search_t *ngs, int frame_idx) +{ + int16 const *senscr; + + /* Activate our HMMs for the current frame if need be. */ + if (!ps_search_acmod(ngs)->compallsen) + compute_sen_active(ngs, frame_idx); + + /* Compute GMM scores for the current frame. */ + if ((senscr = acmod_score(ps_search_acmod(ngs), &frame_idx)) == NULL) + return 0; + ngs->st.n_senone_active_utt += ps_search_acmod(ngs)->n_senone_active; + + /* Mark backpointer table for current frame. */ + ngram_search_mark_bptable(ngs, frame_idx); + + /* If the best score is equal to or worse than WORST_SCORE, + * recognition has failed, don't bother to keep trying. */ + if (ngs->best_score == WORST_SCORE || ngs->best_score WORSE_THAN WORST_SCORE) + return 0; + /* Renormalize if necessary */ + if (ngs->best_score + (2 * ngs->beam) WORSE_THAN WORST_SCORE) { + E_INFO("Renormalizing Scores at frame %d, best score %d\n", + frame_idx, ngs->best_score); + renormalize_scores(ngs, frame_idx, ngs->best_score); + } + + /* Evaluate HMMs */ + evaluate_channels(ngs, senscr, frame_idx); + /* Prune HMMs and do phone transitions. */ + prune_channels(ngs, frame_idx); + /* Do absolute pruning on word exits. */ + bptable_maxwpf(ngs, frame_idx); + /* Do word transitions. */ + word_transition(ngs, frame_idx); + /* Deactivate pruned HMMs. */ + deactivate_channels(ngs, frame_idx); + + ++ngs->n_frame; + /* Return the number of frames processed. */ + return 1; +} + +void +ngram_fwdtree_finish(ngram_search_t *ngs) +{ + int32 i, w, cf, *awl; + root_chan_t *rhmm; + chan_t *hmm, **acl; + + /* This is the number of frames processed. */ + cf = ps_search_acmod(ngs)->output_frame; + /* Add a mark in the backpointer table for one past the final frame. */ + ngram_search_mark_bptable(ngs, cf); + + /* Deactivate channels lined up for the next frame */ + /* First, root channels of HMM tree */ + for (i = ngs->n_root_chan, rhmm = ngs->root_chan; i > 0; --i, rhmm++) { + hmm_clear(&rhmm->hmm); + } + + /* nonroot channels of HMM tree */ + i = ngs->n_active_chan[cf & 0x1]; + acl = ngs->active_chan_list[cf & 0x1]; + for (hmm = *(acl++); i > 0; --i, hmm = *(acl++)) { + hmm_clear(&hmm->hmm); + } + + /* word channels */ + i = ngs->n_active_word[cf & 0x1]; + awl = ngs->active_word_list[cf & 0x1]; + for (w = *(awl++); i > 0; --i, w = *(awl++)) { + /* Don't accidentally free single-phone words! */ + if (dict_is_single_phone(ps_search_dict(ngs), w)) + continue; + bitvec_clear(ngs->word_active, w); + if (ngs->word_chan[w] == NULL) + continue; + ngram_search_free_all_rc(ngs, w); + } + + /* + * The previous search code did a postprocessing of the + * backpointer table here, but we will postpone this until it is + * absolutely necessary, i.e. when generating a word graph. + * Likewise we don't actually have to decide what the exit word is + * until somebody requests a backtrace. + */ + + ptmr_stop(&ngs->fwdtree_perf); + /* Print out some statistics. */ + if (cf > 0) { + double n_speech = (double)(cf + 1) + / cmd_ln_int32_r(ps_search_config(ngs), "-frate"); + E_INFO("%8d words recognized (%d/fr)\n", + ngs->bpidx, (ngs->bpidx + (cf >> 1)) / (cf + 1)); + E_INFO("%8d senones evaluated (%d/fr)\n", ngs->st.n_senone_active_utt, + (ngs->st.n_senone_active_utt + (cf >> 1)) / (cf + 1)); + E_INFO("%8d channels searched (%d/fr), %d 1st, %d last\n", + ngs->st.n_root_chan_eval + ngs->st.n_nonroot_chan_eval, + (ngs->st.n_root_chan_eval + ngs->st.n_nonroot_chan_eval) / (cf + 1), + ngs->st.n_root_chan_eval, ngs->st.n_last_chan_eval); + E_INFO("%8d words for which last channels evaluated (%d/fr)\n", + ngs->st.n_word_lastchan_eval, + ngs->st.n_word_lastchan_eval / (cf + 1)); + E_INFO("%8d candidate words for entering last phone (%d/fr)\n", + ngs->st.n_lastphn_cand_utt, ngs->st.n_lastphn_cand_utt / (cf + 1)); + E_INFO("fwdtree %.2f CPU %.3f xRT\n", + ngs->fwdtree_perf.t_cpu, + ngs->fwdtree_perf.t_cpu / n_speech); + E_INFO("fwdtree %.2f wall %.3f xRT\n", + ngs->fwdtree_perf.t_elapsed, + ngs->fwdtree_perf.t_elapsed / n_speech); + } + /* dump_bptable(ngs); */ +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h new file mode 100644 index 0000000..5d28b47 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h @@ -0,0 +1,97 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ngram_search_fwdtree.h Lexicon tree based Viterbi search. + */ + +#ifndef __NGRAM_SEARCH_FWDTREE_H__ +#define __NGRAM_SEARCH_FWDTREE_H__ + +/* SphinxBase headers. */ + +/* Local headers. */ +#include +#include "ngram_search.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Initialize N-Gram search for fwdtree decoding. + */ +void ngram_fwdtree_init(ngram_search_t *ngs); + +/** + * Release memory associated with fwdtree decoding. + */ +void ngram_fwdtree_deinit(ngram_search_t *ngs); + +/** + * Rebuild search structures for updated language models. + */ +int ngram_fwdtree_reinit(ngram_search_t *ngs); + +/** + * Start fwdtree decoding for an utterance. + */ +POCKETSPHINX_EXPORT +void ngram_fwdtree_start(ngram_search_t *ngs); + +/** + * Search one frame forward in an utterance. + * + * @return Number of frames searched (either 0 or 1). + */ +POCKETSPHINX_EXPORT +int ngram_fwdtree_search(ngram_search_t *ngs, int frame_idx); + +/** + * Finish fwdtree decoding for an utterance. + */ +POCKETSPHINX_EXPORT +void ngram_fwdtree_finish(ngram_search_t *ngs); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __NGRAM_SEARCH_FWDTREE_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c new file mode 100644 index 0000000..0bca980 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c @@ -0,0 +1,373 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file phone_loop_search.h Fast and rough context-independent phoneme loop search. + */ + +#include + +#include "phone_loop_search.h" + +static int phone_loop_search_start(ps_search_t *search); +static int phone_loop_search_step(ps_search_t *search, int frame_idx); +static int phone_loop_search_finish(ps_search_t *search); +static int phone_loop_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p); +static void phone_loop_search_free(ps_search_t *search); +static char const *phone_loop_search_hyp(ps_search_t *search, int32 *out_score); +static int32 phone_loop_search_prob(ps_search_t *search); +static ps_seg_t *phone_loop_search_seg_iter(ps_search_t *search); + +static ps_searchfuncs_t phone_loop_search_funcs = { + /* start: */ phone_loop_search_start, + /* step: */ phone_loop_search_step, + /* finish: */ phone_loop_search_finish, + /* reinit: */ phone_loop_search_reinit, + /* free: */ phone_loop_search_free, + /* lattice: */ NULL, + /* hyp: */ phone_loop_search_hyp, + /* prob: */ phone_loop_search_prob, + /* seg_iter: */ phone_loop_search_seg_iter, +}; + +static int +phone_loop_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) +{ + phone_loop_search_t *pls = (phone_loop_search_t *)search; + cmd_ln_t *config = ps_search_config(search); + acmod_t *acmod = ps_search_acmod(search); + int i; + + /* Free old dict2pid, dict, if necessary. */ + ps_search_base_reinit(search, dict, d2p); + + /* Initialize HMM context. */ + if (pls->hmmctx) + hmm_context_free(pls->hmmctx); + pls->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), + acmod->tmat->tp, NULL, acmod->mdef->sseq); + if (pls->hmmctx == NULL) + return -1; + + /* Initialize penalty storage */ + pls->n_phones = bin_mdef_n_ciphone(acmod->mdef); + pls->window = cmd_ln_int32_r(config, "-pl_window"); + if (pls->penalties) + ckd_free(pls->penalties); + pls->penalties = (int32 *)ckd_calloc(pls->n_phones, sizeof(*pls->penalties)); + if (pls->pen_buf) + ckd_free_2d(pls->pen_buf); + pls->pen_buf = (int32 **)ckd_calloc_2d(pls->window, pls->n_phones, sizeof(**pls->pen_buf)); + + /* Initialize phone HMMs. */ + if (pls->hmms) { + for (i = 0; i < pls->n_phones; ++i) + hmm_deinit((hmm_t *)&pls->hmms[i]); + ckd_free(pls->hmms); + } + pls->hmms = (hmm_t *)ckd_calloc(pls->n_phones, sizeof(*pls->hmms)); + for (i = 0; i < pls->n_phones; ++i) { + hmm_init(pls->hmmctx, (hmm_t *)&pls->hmms[i], + FALSE, + bin_mdef_pid2ssid(acmod->mdef, i), + bin_mdef_pid2tmatid(acmod->mdef, i)); + } + pls->penalty_weight = cmd_ln_float64_r(config, "-pl_weight"); + pls->beam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pl_beam")) >> SENSCR_SHIFT; + pls->pbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pl_pbeam")) >> SENSCR_SHIFT; + pls->pip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pl_pip")) >> SENSCR_SHIFT; + E_INFO("State beam %d Phone exit beam %d Insertion penalty %d\n", + pls->beam, pls->pbeam, pls->pip); + + return 0; +} + +ps_search_t * +phone_loop_search_init(cmd_ln_t *config, + acmod_t *acmod, + dict_t *dict) +{ + phone_loop_search_t *pls; + + /* Allocate and initialize. */ + pls = (phone_loop_search_t *)ckd_calloc(1, sizeof(*pls)); + ps_search_init(ps_search_base(pls), &phone_loop_search_funcs, + PS_SEARCH_TYPE_PHONE_LOOP, PS_DEFAULT_PL_SEARCH, + config, acmod, dict, NULL); + phone_loop_search_reinit(ps_search_base(pls), ps_search_dict(pls), + ps_search_dict2pid(pls)); + + return ps_search_base(pls); +} + +static void +phone_loop_search_free_renorm(phone_loop_search_t *pls) +{ + gnode_t *gn; + for (gn = pls->renorm; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(pls->renorm); + pls->renorm = NULL; +} + +static void +phone_loop_search_free(ps_search_t *search) +{ + phone_loop_search_t *pls = (phone_loop_search_t *)search; + int i; + + ps_search_base_free(search); + for (i = 0; i < pls->n_phones; ++i) + hmm_deinit((hmm_t *)&pls->hmms[i]); + phone_loop_search_free_renorm(pls); + ckd_free_2d(pls->pen_buf); + ckd_free(pls->hmms); + ckd_free(pls->penalties); + hmm_context_free(pls->hmmctx); + ckd_free(pls); +} + +static int +phone_loop_search_start(ps_search_t *search) +{ + phone_loop_search_t *pls = (phone_loop_search_t *)search; + int i; + + /* Reset and enter all phone HMMs. */ + for (i = 0; i < pls->n_phones; ++i) { + hmm_t *hmm = (hmm_t *)&pls->hmms[i]; + hmm_clear(hmm); + hmm_enter(hmm, 0, -1, 0); + } + memset(pls->penalties, 0, pls->n_phones * sizeof(*pls->penalties)); + for (i = 0; i < pls->window; i++) + memset(pls->pen_buf[i], 0, pls->n_phones * sizeof(*pls->pen_buf[i])); + phone_loop_search_free_renorm(pls); + pls->best_score = 0; + pls->pen_buf_ptr = 0; + + return 0; +} + +static void +renormalize_hmms(phone_loop_search_t *pls, int frame_idx, int32 norm) +{ + phone_loop_renorm_t *rn = (phone_loop_renorm_t *)ckd_calloc(1, sizeof(*rn)); + int i; + + pls->renorm = glist_add_ptr(pls->renorm, rn); + rn->frame_idx = frame_idx; + rn->norm = norm; + + for (i = 0; i < pls->n_phones; ++i) { + hmm_normalize((hmm_t *)&pls->hmms[i], norm); + } +} + +static void +evaluate_hmms(phone_loop_search_t *pls, int16 const *senscr, int frame_idx) +{ + int32 bs = WORST_SCORE; + int i; + + hmm_context_set_senscore(pls->hmmctx, senscr); + + for (i = 0; i < pls->n_phones; ++i) { + hmm_t *hmm = (hmm_t *)&pls->hmms[i]; + int32 score; + + if (hmm_frame(hmm) < frame_idx) + continue; + score = hmm_vit_eval(hmm); + if (score BETTER_THAN bs) { + bs = score; + } + } + pls->best_score = bs; +} + +static void +store_scores(phone_loop_search_t *pls, int frame_idx) +{ + int i, j, itr; + + (void)frame_idx; + for (i = 0; i < pls->n_phones; ++i) { + hmm_t *hmm = (hmm_t *)&pls->hmms[i]; + pls->pen_buf[pls->pen_buf_ptr][i] = (hmm_bestscore(hmm) - pls->best_score) * pls->penalty_weight; + } + pls->pen_buf_ptr++; + pls->pen_buf_ptr = pls->pen_buf_ptr % pls->window; + + /* update penalties */ + for (i = 0; i < pls->n_phones; ++i) { + pls->penalties[i] = WORST_SCORE; + for (j = 0, itr = pls->pen_buf_ptr + 1; j < pls->window; j++, itr++) { + itr = itr % pls->window; + if (pls->pen_buf[itr][i] > pls->penalties[i]) + pls->penalties[i] = pls->pen_buf[itr][i]; + } + } +} + +static void +prune_hmms(phone_loop_search_t *pls, int frame_idx) +{ + int32 thresh = pls->best_score + pls->beam; + int nf = frame_idx + 1; + int i; + + /* Check all phones to see if they remain active in the next frame. */ + for (i = 0; i < pls->n_phones; ++i) { + hmm_t *hmm = (hmm_t *)&pls->hmms[i]; + + if (hmm_frame(hmm) < frame_idx) + continue; + /* Retain if score better than threshold. */ + if (hmm_bestscore(hmm) BETTER_THAN thresh) { + hmm_frame(hmm) = nf; + } + else + hmm_clear_scores(hmm); + } +} + +static void +phone_transition(phone_loop_search_t *pls, int frame_idx) +{ + int32 thresh = pls->best_score + pls->pbeam; + int nf = frame_idx + 1; + int i; + + /* Now transition out of phones whose last states are inside the + * phone transition beam. */ + for (i = 0; i < pls->n_phones; ++i) { + hmm_t *hmm = (hmm_t *)&pls->hmms[i]; + int32 newphone_score; + int j; + + if (hmm_frame(hmm) != nf) + continue; + + newphone_score = hmm_out_score(hmm) + pls->pip; + if (newphone_score BETTER_THAN thresh) { + /* Transition into all phones using the usual Viterbi rule. */ + for (j = 0; j < pls->n_phones; ++j) { + hmm_t *nhmm = (hmm_t *)&pls->hmms[j]; + + if (hmm_frame(nhmm) < frame_idx + || newphone_score BETTER_THAN hmm_in_score(nhmm)) { + hmm_enter(nhmm, newphone_score, hmm_out_history(hmm), nf); + } + } + } + } +} + +static int +phone_loop_search_step(ps_search_t *search, int frame_idx) +{ + phone_loop_search_t *pls = (phone_loop_search_t *)search; + acmod_t *acmod = ps_search_acmod(search); + int16 const *senscr; + int i; + + /* All CI senones are active all the time. */ + if (!ps_search_acmod(pls)->compallsen) { + acmod_clear_active(ps_search_acmod(pls)); + for (i = 0; i < pls->n_phones; ++i) + acmod_activate_hmm(acmod, (hmm_t *)&pls->hmms[i]); + } + + /* Calculate senone scores for current frame. */ + senscr = acmod_score(acmod, &frame_idx); + + /* Renormalize, if necessary. */ + if (pls->best_score + (2 * pls->beam) WORSE_THAN WORST_SCORE) { + E_INFO("Renormalizing Scores at frame %d, best score %d\n", + frame_idx, pls->best_score); + renormalize_hmms(pls, frame_idx, pls->best_score); + } + + /* Evaluate phone HMMs for current frame. */ + evaluate_hmms(pls, senscr, frame_idx); + + /* Store hmm scores for senone penaly calculation */ + store_scores(pls, frame_idx); + + /* Prune phone HMMs. */ + prune_hmms(pls, frame_idx); + + /* Do phone transitions. */ + phone_transition(pls, frame_idx); + + return 0; +} + +static int +phone_loop_search_finish(ps_search_t *search) +{ + /* Actually nothing to do here really. */ + (void)search; + return 0; +} + +static char const * +phone_loop_search_hyp(ps_search_t *search, int32 *out_score) +{ + (void)search; + (void)out_score; + E_WARN("Hypotheses are not returned from phone loop search"); + return NULL; +} + +static int32 +phone_loop_search_prob(ps_search_t *search) +{ + (void)search; + /* FIXME: Actually... they ought to be. */ + E_WARN("Posterior probabilities are not returned from phone loop search"); + return 0; +} + +static ps_seg_t * +phone_loop_search_seg_iter(ps_search_t *search) +{ + (void)search; + E_WARN("Hypotheses are not returned from phone loop search"); + return NULL; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h new file mode 100644 index 0000000..4de5253 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h @@ -0,0 +1,113 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file phone_loop_search.h Fast and rough context-independent + * phoneme loop search. + * + * This exists for the purposes of phoneme lookahead, and thus it + * actually does not do phoneme recognition (it wouldn't be very + * accurate anyway). + */ + +#ifndef __PHONE_LOOP_SEARCH_H__ +#define __PHONE_LOOP_SEARCH_H__ + +/* SphinxBase headers. */ +#include +#include +#include +#include + +/* Local headers. */ +#include "pocketsphinx_internal.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Renormalization event. + */ +struct phone_loop_renorm_s { + int frame_idx; /**< Frame of renormalization. */ + int32 norm; /**< Normalization constant. */ +}; +typedef struct phone_loop_renorm_s phone_loop_renorm_t; + +/** + * Phone loop search structure. + */ +struct phone_loop_search_s { + ps_search_t base; /**< Base search structure. */ + hmm_t *hmms; /**< Basic HMM structures for CI phones. */ + hmm_context_t *hmmctx; /**< HMM context structure. */ + int16 frame; /**< Current frame being searched. */ + int16 n_phones; /**< Size of phone array. */ + int32 **pen_buf; /**< Penalty buffer */ + int16 pen_buf_ptr; /**< Pointer for frame to fill in penalty buffer */ + int32 *penalties; /**< Penalties for CI phones in current frame */ + float64 penalty_weight; /**< Weighting factor for penalties */ + + int32 best_score; /**< Best Viterbi score in current frame. */ + int32 beam; /**< HMM pruning beam width. */ + int32 pbeam; /**< Phone exit pruning beam width. */ + int32 pip; /**< Phone insertion penalty ("language score"). */ + int window; /**< Window size for phoneme lookahead */ + glist_t renorm; /**< List of renormalizations. */ +}; +typedef struct phone_loop_search_s phone_loop_search_t; + +ps_search_t *phone_loop_search_init(cmd_ln_t *config, + acmod_t *acmod, + dict_t *dict); + +/** + * Return lookahead heuristic score for a specific phone. + */ +#define phone_loop_search_score(pls,ci) \ + ((pls == NULL) ? 0 : (pls->penalties[ci])) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __PHONE_LOOP_SEARCH_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c new file mode 100644 index 0000000..06ae5c8 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c @@ -0,0 +1,1528 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* System headers. */ +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include +#include + +/* Local headers. */ +#include "cmdln_macro.h" +#include "pocketsphinx.h" +#include "pocketsphinx_internal.h" +#include "ps_lattice_internal.h" +#include "phone_loop_search.h" +#include "kws_search.h" +#include "fsg_search_internal.h" +#include "ngram_search.h" +#include "ngram_search_fwdtree.h" +#include "ngram_search_fwdflat.h" +#include "allphone_search.h" +#include "state_align_search.h" +#include "fe/fe_internal.h" + +static const arg_t ps_args_def[] = { + POCKETSPHINX_OPTIONS, + CMDLN_EMPTY_OPTION +}; + +/* I'm not sure what the portable way to do this is. */ +static int +file_exists(const char *path) +{ + FILE *tmp; + + tmp = fopen(path, "rb"); + if (tmp) fclose(tmp); + return (tmp != NULL); +} + +#ifdef MODELDIR +static int +hmmdir_exists(const char *path) +{ + FILE *tmp; + char *mdef = string_join(path, "/mdef", NULL); + + tmp = fopen(mdef, "rb"); + if (tmp) fclose(tmp); + ckd_free(mdef); + return (tmp != NULL); +} +#endif + +static void +ps_expand_file_config(ps_decoder_t *ps, const char *arg, const char *extra_arg, + const char *hmmdir, const char *file) +{ + const char *val; + if ((val = cmd_ln_str_r(ps->config, arg)) != NULL) { + cmd_ln_set_str_extra_r(ps->config, extra_arg, val); + } else if (hmmdir == NULL) { + cmd_ln_set_str_extra_r(ps->config, extra_arg, NULL); + } else { + char *tmp = string_join(hmmdir, "/", file, NULL); + if (file_exists(tmp)) + cmd_ln_set_str_extra_r(ps->config, extra_arg, tmp); + else + cmd_ln_set_str_extra_r(ps->config, extra_arg, NULL); + ckd_free(tmp); + } +} + +/* Feature and front-end parameters that may be in feat.params */ +static const arg_t feat_defn[] = { + waveform_to_cepstral_command_line_macro(), + cepstral_to_feature_command_line_macro(), + CMDLN_EMPTY_OPTION +}; + +static void +ps_expand_model_config(ps_decoder_t *ps) +{ + char const *hmmdir, *featparams; + + /* Disable memory mapping on Blackfin (FIXME: should be uClinux in general). */ +#ifdef __ADSPBLACKFIN__ + E_INFO("Will not use mmap() on uClinux/Blackfin."); + cmd_ln_set_boolean_r(ps->config, "-mmap", FALSE); +#endif + + /* Get acoustic model filenames and add them to the command-line */ + hmmdir = cmd_ln_str_r(ps->config, "-hmm"); + ps_expand_file_config(ps, "-mdef", "_mdef", hmmdir, "mdef"); + ps_expand_file_config(ps, "-mean", "_mean", hmmdir, "means"); + ps_expand_file_config(ps, "-var", "_var", hmmdir, "variances"); + ps_expand_file_config(ps, "-tmat", "_tmat", hmmdir, "transition_matrices"); + ps_expand_file_config(ps, "-mixw", "_mixw", hmmdir, "mixture_weights"); + ps_expand_file_config(ps, "-sendump", "_sendump", hmmdir, "sendump"); + ps_expand_file_config(ps, "-fdict", "_fdict", hmmdir, "noisedict"); + ps_expand_file_config(ps, "-lda", "_lda", hmmdir, "feature_transform"); + ps_expand_file_config(ps, "-featparams", "_featparams", hmmdir, "feat.params"); + ps_expand_file_config(ps, "-senmgau", "_senmgau", hmmdir, "senmgau"); + + /* Look for feat.params in acoustic model dir. */ + if ((featparams = cmd_ln_str_r(ps->config, "_featparams"))) { + if (NULL != + cmd_ln_parse_file_r(ps->config, feat_defn, featparams, FALSE)) + E_INFO("Parsed model-specific feature parameters from %s\n", + featparams); + } +} + +static void +ps_free_searches(ps_decoder_t *ps) +{ + if (ps->searches) { + hash_iter_t *search_it; + for (search_it = hash_table_iter(ps->searches); search_it; + search_it = hash_table_iter_next(search_it)) { + ps_search_free(hash_entry_val(search_it->ent)); + } + hash_table_free(ps->searches); + } + + ps->searches = NULL; + ps->search = NULL; +} + +static ps_search_t * +ps_find_search(ps_decoder_t *ps, char const *name) +{ + void *search = NULL; + hash_table_lookup(ps->searches, name, &search); + + return (ps_search_t *) search; +} + +/* Set default acoustic and language models if they are not defined in configuration. */ +void +ps_default_search_args(cmd_ln_t *config) +{ +#ifdef MODELDIR + const char *hmmdir = cmd_ln_str_r(config, "-hmm"); + const char *lmfile = cmd_ln_str_r(config, "-lm"); + const char *dictfile = cmd_ln_str_r(config, "-dict"); + + if (hmmdir == NULL && hmmdir_exists(MODELDIR "/en-us/en-us")) { + hmmdir = MODELDIR "/en-us/en-us"; + cmd_ln_set_str_r(config, "-hmm", hmmdir); + } + + if (lmfile == NULL && !cmd_ln_str_r(config, "-fsg") + && !cmd_ln_str_r(config, "-jsgf") + && !cmd_ln_str_r(config, "-lmctl") + && !cmd_ln_str_r(config, "-kws") + && !cmd_ln_str_r(config, "-keyphrase") + && !cmd_ln_str_r(config, "-alignctl") + && file_exists(MODELDIR "/en-us/en-us.lm.bin")) { + lmfile = MODELDIR "/en-us/en-us.lm.bin"; + cmd_ln_set_str_r(config, "-lm", lmfile); + } + + if (dictfile == NULL && file_exists(MODELDIR "/en-us/cmudict-en-us.dict")) { + dictfile = MODELDIR "/en-us/cmudict-en-us.dict"; + cmd_ln_set_str_r(config, "-dict", dictfile); + } +#else + (void)config; +#endif +} + +int +ps_reinit_feat(ps_decoder_t *ps, cmd_ln_t *config) +{ + if (config && config != ps->config) { + cmd_ln_free_r(ps->config); + ps->config = cmd_ln_retain(config); + } + return acmod_reinit_feat(ps->acmod, NULL, NULL); +} + +int +ps_reinit(ps_decoder_t *ps, cmd_ln_t *config) +{ + const char *path; + const char *keyphrase; + int32 lw; + + if (config && config != ps->config) { + cmd_ln_free_r(ps->config); + ps->config = cmd_ln_retain(config); + } + + /* Set up logging. We need to do this earlier because we want to dump + * the information to the configured log, not to the stderr. */ + if (config) { + const char *logfn, *loglevel; + logfn = cmd_ln_str_r(ps->config, "-logfn"); + if (logfn) { + if (err_set_logfile(logfn) < 0) { + E_ERROR("Cannot redirect log output\n"); + return -1; + } + } + loglevel = cmd_ln_str_r(ps->config, "-loglevel"); + if (loglevel) { + if (err_set_loglevel_str(loglevel) == NULL) { + E_ERROR("Invalid log level: %s\n", loglevel); + return -1; + } + } + } + + ps->mfclogdir = cmd_ln_str_r(ps->config, "-mfclogdir"); + ps->rawlogdir = cmd_ln_str_r(ps->config, "-rawlogdir"); + ps->senlogdir = cmd_ln_str_r(ps->config, "-senlogdir"); + + /* Fill in some default arguments. */ + ps_expand_model_config(ps); + + /* Print out the config for logging. */ + cmd_ln_log_values_r(ps->config, ps_args()); + + /* Free old searches (do this before other reinit) */ + ps_free_searches(ps); + ps->searches = hash_table_new(3, HASH_CASE_YES); + + /* Free old acmod. */ + acmod_free(ps->acmod); + ps->acmod = NULL; + + /* Free old dictionary (must be done after the two things above) */ + dict_free(ps->dict); + ps->dict = NULL; + + /* Free d2p */ + dict2pid_free(ps->d2p); + ps->d2p = NULL; + + /* Logmath computation (used in acmod and search) */ + if (ps->lmath == NULL + || (logmath_get_base(ps->lmath) != + (float64)cmd_ln_float32_r(ps->config, "-logbase"))) { + if (ps->lmath) + logmath_free(ps->lmath); + ps->lmath = logmath_init + ((float64)cmd_ln_float32_r(ps->config, "-logbase"), 0, TRUE); + } + + /* Acoustic model (this is basically everything that + * uttproc.c, senscr.c, and others used to do) */ + if ((ps->acmod = acmod_init(ps->config, ps->lmath, NULL, NULL)) == NULL) + return -1; + + + + if (cmd_ln_int32_r(ps->config, "-pl_window") > 0) { + /* Initialize an auxiliary phone loop search, which will run in + * "parallel" with FSG or N-Gram search. */ + if ((ps->phone_loop = + phone_loop_search_init(ps->config, ps->acmod, ps->dict)) == NULL) + return -1; + hash_table_enter(ps->searches, + ps_search_name(ps->phone_loop), + ps->phone_loop); + } + + /* Dictionary and triphone mappings (depends on acmod). */ + /* FIXME: pass config, change arguments, implement LTS, etc. */ + if ((ps->dict = dict_init(ps->config, ps->acmod->mdef)) == NULL) + return -1; + if ((ps->d2p = dict2pid_build(ps->acmod->mdef, ps->dict)) == NULL) + return -1; + + lw = cmd_ln_float32_r(ps->config, "-lw"); + + /* Determine whether we are starting out in FSG or N-Gram search mode. + * If neither is used skip search initialization. */ + + /* Load KWS if one was specified in config */ + if ((keyphrase = cmd_ln_str_r(ps->config, "-keyphrase"))) { + if (ps_set_keyphrase(ps, PS_DEFAULT_SEARCH, keyphrase)) + return -1; + ps_set_search(ps, PS_DEFAULT_SEARCH); + } + + if ((path = cmd_ln_str_r(ps->config, "-kws"))) { + if (ps_set_kws(ps, PS_DEFAULT_SEARCH, path)) + return -1; + ps_set_search(ps, PS_DEFAULT_SEARCH); + } + + /* Load an FSG if one was specified in config */ + if ((path = cmd_ln_str_r(ps->config, "-fsg"))) { + fsg_model_t *fsg = fsg_model_readfile(path, ps->lmath, lw); + if (!fsg) + return -1; + if (ps_set_fsg(ps, PS_DEFAULT_SEARCH, fsg)) { + fsg_model_free(fsg); + return -1; + } + fsg_model_free(fsg); + ps_set_search(ps, PS_DEFAULT_SEARCH); + } + + /* Or load a JSGF grammar */ + if ((path = cmd_ln_str_r(ps->config, "-jsgf"))) { + if (ps_set_jsgf_file(ps, PS_DEFAULT_SEARCH, path) + || ps_set_search(ps, PS_DEFAULT_SEARCH)) + return -1; + } + + if ((path = cmd_ln_str_r(ps->config, "-allphone"))) { + if (ps_set_allphone_file(ps, PS_DEFAULT_SEARCH, path) + || ps_set_search(ps, PS_DEFAULT_SEARCH)) + return -1; + } + + if ((path = cmd_ln_str_r(ps->config, "-lm")) && + !cmd_ln_str_r(ps->config, "-allphone")) { + if (ps_set_lm_file(ps, PS_DEFAULT_SEARCH, path) + || ps_set_search(ps, PS_DEFAULT_SEARCH)) + return -1; + } + + if ((path = cmd_ln_str_r(ps->config, "-lmctl"))) { + const char *name; + ngram_model_t *lmset; + ngram_model_set_iter_t *lmset_it; + + if (!(lmset = ngram_model_set_read(ps->config, path, ps->lmath))) { + E_ERROR("Failed to read language model control file: %s\n", path); + return -1; + } + + for(lmset_it = ngram_model_set_iter(lmset); + lmset_it; lmset_it = ngram_model_set_iter_next(lmset_it)) { + ngram_model_t *lm = ngram_model_set_iter_model(lmset_it, &name); + E_INFO("adding search %s\n", name); + if (ps_set_lm(ps, name, lm)) { + ngram_model_set_iter_free(lmset_it); + ngram_model_free(lmset); + return -1; + } + } + ngram_model_free(lmset); + + name = cmd_ln_str_r(ps->config, "-lmname"); + if (name) + ps_set_search(ps, name); + else { + E_ERROR("No default LM name (-lmname) for `-lmctl'\n"); + return -1; + } + } + + /* Initialize performance timer. */ + ps->perf.name = "decode"; + ptmr_init(&ps->perf); + + return 0; +} + +ps_decoder_t * +ps_init(cmd_ln_t *config) +{ + ps_decoder_t *ps; + + ps = ckd_calloc(1, sizeof(*ps)); + ps->refcount = 1; + if (config) { + if (ps_reinit(ps, config) < 0) { + ps_free(ps); + return NULL; + } + } + return ps; +} + +arg_t const * +ps_args(void) +{ + return ps_args_def; +} + +ps_decoder_t * +ps_retain(ps_decoder_t *ps) +{ + ++ps->refcount; + return ps; +} + +int +ps_free(ps_decoder_t *ps) +{ + if (ps == NULL) + return 0; + if (--ps->refcount > 0) + return ps->refcount; + ps_free_searches(ps); + dict_free(ps->dict); + dict2pid_free(ps->d2p); + acmod_free(ps->acmod); + logmath_free(ps->lmath); + cmd_ln_free_r(ps->config); + ckd_free(ps); + return 0; +} + +cmd_ln_t * +ps_get_config(ps_decoder_t *ps) +{ + return ps->config; +} + +logmath_t * +ps_get_logmath(ps_decoder_t *ps) +{ + return ps->lmath; +} + +fe_t * +ps_get_fe(ps_decoder_t *ps) +{ + return ps->acmod->fe; +} + +feat_t * +ps_get_feat(ps_decoder_t *ps) +{ + return ps->acmod->fcb; +} + +ps_mllr_t * +ps_update_mllr(ps_decoder_t *ps, ps_mllr_t *mllr) +{ + return acmod_update_mllr(ps->acmod, mllr); +} + +int +ps_set_search(ps_decoder_t *ps, const char *name) +{ + ps_search_t *search; + + if (ps->acmod->state != ACMOD_ENDED && ps->acmod->state != ACMOD_IDLE) { + E_ERROR("Cannot change search while decoding, end utterance first\n"); + return -1; + } + + if (!(search = ps_find_search(ps, name))) { + return -1; + } + + ps->search = search; + /* Set pl window depending on the search */ + if (!strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) { + ps->pl_window = cmd_ln_int32_r(ps->config, "-pl_window"); + } else { + ps->pl_window = 0; + } + + return 0; +} + +const char* +ps_get_search(ps_decoder_t *ps) +{ + hash_iter_t *search_it; + const char* name = NULL; + for (search_it = hash_table_iter(ps->searches); search_it; + search_it = hash_table_iter_next(search_it)) { + if (hash_entry_val(search_it->ent) == ps->search) { + name = hash_entry_key(search_it->ent); + break; + } + } + return name; +} + +int +ps_unset_search(ps_decoder_t *ps, const char *name) +{ + ps_search_t *search = hash_table_delete(ps->searches, name); + if (!search) + return -1; + if (ps->search == search) + ps->search = NULL; + ps_search_free(search); + return 0; +} + +ps_search_iter_t * +ps_search_iter(ps_decoder_t *ps) +{ + return (ps_search_iter_t *)hash_table_iter(ps->searches); +} + +ps_search_iter_t * +ps_search_iter_next(ps_search_iter_t *itor) +{ + return (ps_search_iter_t *)hash_table_iter_next((hash_iter_t *)itor); +} + +const char* +ps_search_iter_val(ps_search_iter_t *itor) +{ + return (const char*)(((hash_iter_t *)itor)->ent->key); +} + +void +ps_search_iter_free(ps_search_iter_t *itor) +{ + hash_table_iter_free((hash_iter_t *)itor); +} + +ngram_model_t * +ps_get_lm(ps_decoder_t *ps, const char *name) +{ + ps_search_t *search = ps_find_search(ps, name); + if (search && strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) + return NULL; + return search ? ((ngram_search_t *) search)->lmset : NULL; +} + +fsg_model_t * +ps_get_fsg(ps_decoder_t *ps, const char *name) +{ + ps_search_t *search = ps_find_search(ps, name); + if (search && strcmp(PS_SEARCH_TYPE_FSG, ps_search_type(search))) + return NULL; + return search ? ((fsg_search_t *) search)->fsg : NULL; +} + +const char* +ps_get_kws(ps_decoder_t *ps, const char* name) +{ + ps_search_t *search = ps_find_search(ps, name); + if (search && strcmp(PS_SEARCH_TYPE_KWS, ps_search_type(search))) + return NULL; + return search ? kws_search_get_keyphrases(search) : NULL; +} + +static int +set_search_internal(ps_decoder_t *ps, ps_search_t *search) +{ + ps_search_t *old_search; + + if (!search) + return -1; + + search->pls = ps->phone_loop; + old_search = (ps_search_t *) hash_table_replace(ps->searches, ps_search_name(search), search); + if (old_search != search) + ps_search_free(old_search); + + return 0; +} + +int +ps_set_lm(ps_decoder_t *ps, const char *name, ngram_model_t *lm) +{ + ps_search_t *search; + search = ngram_search_init(name, lm, ps->config, ps->acmod, ps->dict, ps->d2p); + return set_search_internal(ps, search); +} + +int +ps_set_lm_file(ps_decoder_t *ps, const char *name, const char *path) +{ + ngram_model_t *lm; + int result; + + lm = ngram_model_read(ps->config, path, NGRAM_AUTO, ps->lmath); + if (!lm) + return -1; + + result = ps_set_lm(ps, name, lm); + ngram_model_free(lm); + return result; +} + +int +ps_set_allphone(ps_decoder_t *ps, const char *name, ngram_model_t *lm) +{ + ps_search_t *search; + search = allphone_search_init(name, lm, ps->config, ps->acmod, ps->dict, ps->d2p); + return set_search_internal(ps, search); +} + +int +ps_set_allphone_file(ps_decoder_t *ps, const char *name, const char *path) +{ + ngram_model_t *lm; + int result; + + lm = NULL; + if (path) + lm = ngram_model_read(ps->config, path, NGRAM_AUTO, ps->lmath); + result = ps_set_allphone(ps, name, lm); + if (lm) + ngram_model_free(lm); + return result; +} + +int +ps_set_align(ps_decoder_t *ps, const char *name, const char *text) +{ + ps_search_t *search; + ps_alignment_t *alignment; + char *textbuf = ckd_salloc(text); + char *ptr, *word, delimfound; + int n; + + textbuf = string_trim(textbuf, STRING_BOTH); + alignment = ps_alignment_init(ps->d2p); + ps_alignment_add_word(alignment, dict_wordid(ps->dict, ""), 0); + for (ptr = textbuf; + (n = nextword(ptr, " \t\n\r", &word, &delimfound)) >= 0; + ptr = word + n, *ptr = delimfound) { + int wid; + if ((wid = dict_wordid(ps->dict, word)) == BAD_S3WID) { + E_ERROR("Unknown word %s\n", word); + ckd_free(textbuf); + ps_alignment_free(alignment); + return -1; + } + ps_alignment_add_word(alignment, wid, 0); + } + ps_alignment_add_word(alignment, dict_wordid(ps->dict, ""), 0); + ps_alignment_populate(alignment); + search = state_align_search_init(name, ps->config, ps->acmod, alignment); + ps_alignment_free(alignment); + ckd_free(textbuf); + return set_search_internal(ps, search); +} + +int +ps_set_kws(ps_decoder_t *ps, const char *name, const char *keyfile) +{ + ps_search_t *search; + search = kws_search_init(name, NULL, keyfile, ps->config, ps->acmod, ps->dict, ps->d2p); + return set_search_internal(ps, search); +} + +int +ps_set_keyphrase(ps_decoder_t *ps, const char *name, const char *keyphrase) +{ + ps_search_t *search; + search = kws_search_init(name, keyphrase, NULL, ps->config, ps->acmod, ps->dict, ps->d2p); + return set_search_internal(ps, search); +} + +int +ps_set_fsg(ps_decoder_t *ps, const char *name, fsg_model_t *fsg) +{ + ps_search_t *search; + search = fsg_search_init(name, fsg, ps->config, ps->acmod, ps->dict, ps->d2p); + return set_search_internal(ps, search); +} + +int +ps_set_jsgf_file(ps_decoder_t *ps, const char *name, const char *path) +{ + fsg_model_t *fsg; + jsgf_rule_t *rule; + char const *toprule; + jsgf_t *jsgf = jsgf_parse_file(path, NULL); + float lw; + int result; + + if (!jsgf) + return -1; + + rule = NULL; + /* Take the -toprule if specified. */ + if ((toprule = cmd_ln_str_r(ps->config, "-toprule"))) { + rule = jsgf_get_rule(jsgf, toprule); + if (rule == NULL) { + E_ERROR("Start rule %s not found\n", toprule); + jsgf_grammar_free(jsgf); + return -1; + } + } else { + rule = jsgf_get_public_rule(jsgf); + if (rule == NULL) { + E_ERROR("No public rules found in %s\n", path); + jsgf_grammar_free(jsgf); + return -1; + } + } + + lw = cmd_ln_float32_r(ps->config, "-lw"); + fsg = jsgf_build_fsg(jsgf, rule, ps->lmath, lw); + result = ps_set_fsg(ps, name, fsg); + fsg_model_free(fsg); + jsgf_grammar_free(jsgf); + return result; +} + +int +ps_set_jsgf_string(ps_decoder_t *ps, const char *name, const char *jsgf_string) +{ + fsg_model_t *fsg; + jsgf_rule_t *rule; + char const *toprule; + jsgf_t *jsgf = jsgf_parse_string(jsgf_string, NULL); + float lw; + int result; + + if (!jsgf) + return -1; + + rule = NULL; + /* Take the -toprule if specified. */ + if ((toprule = cmd_ln_str_r(ps->config, "-toprule"))) { + rule = jsgf_get_rule(jsgf, toprule); + if (rule == NULL) { + E_ERROR("Start rule %s not found\n", toprule); + jsgf_grammar_free(jsgf); + return -1; + } + } else { + rule = jsgf_get_public_rule(jsgf); + if (rule == NULL) { + E_ERROR("No public rules found in input string\n"); + jsgf_grammar_free(jsgf); + return -1; + } + } + + lw = cmd_ln_float32_r(ps->config, "-lw"); + fsg = jsgf_build_fsg(jsgf, rule, ps->lmath, lw); + result = ps_set_fsg(ps, name, fsg); + fsg_model_free(fsg); + jsgf_grammar_free(jsgf); + return result; +} + + +int +ps_load_dict(ps_decoder_t *ps, char const *dictfile, + char const *fdictfile, char const *format) +{ + dict2pid_t *d2p; + dict_t *dict; + hash_iter_t *search_it; + cmd_ln_t *newconfig; + + (void)format; + /* Create a new scratch config to load this dict (so existing one + * won't be affected if it fails) */ + newconfig = cmd_ln_init(NULL, ps_args(), TRUE, NULL); + cmd_ln_set_boolean_r(newconfig, "-dictcase", + cmd_ln_boolean_r(ps->config, "-dictcase")); + cmd_ln_set_str_r(newconfig, "-dict", dictfile); + if (fdictfile) + cmd_ln_set_str_extra_r(newconfig, "_fdict", fdictfile); + else + cmd_ln_set_str_extra_r(newconfig, "_fdict", + cmd_ln_str_r(ps->config, "_fdict")); + + /* Try to load it. */ + if ((dict = dict_init(newconfig, ps->acmod->mdef)) == NULL) { + cmd_ln_free_r(newconfig); + return -1; + } + + /* Reinit the dict2pid. */ + if ((d2p = dict2pid_build(ps->acmod->mdef, dict)) == NULL) { + cmd_ln_free_r(newconfig); + return -1; + } + + /* Success! Update the existing config to reflect new dicts and + * drop everything into place. */ + cmd_ln_free_r(newconfig); + dict_free(ps->dict); + ps->dict = dict; + dict2pid_free(ps->d2p); + ps->d2p = d2p; + + /* And tell all searches to reconfigure themselves. */ + for (search_it = hash_table_iter(ps->searches); search_it; + search_it = hash_table_iter_next(search_it)) { + if (ps_search_reinit(hash_entry_val(search_it->ent), dict, d2p) < 0) { + hash_table_iter_free(search_it); + return -1; + } + } + + return 0; +} + +int +ps_save_dict(ps_decoder_t *ps, char const *dictfile, + char const *format) +{ + return dict_write(ps->dict, dictfile, format); +} + +int +ps_add_word(ps_decoder_t *ps, + char const *word, + char const *phones, + int update) +{ + int32 wid; + s3cipid_t *pron; + hash_iter_t *search_it; + char **phonestr, *tmp; + int np, i, rv; + + /* Parse phones into an array of phone IDs. */ + tmp = ckd_salloc(phones); + np = str2words(tmp, NULL, 0); + phonestr = ckd_calloc(np, sizeof(*phonestr)); + str2words(tmp, phonestr, np); + pron = ckd_calloc(np, sizeof(*pron)); + for (i = 0; i < np; ++i) { + pron[i] = bin_mdef_ciphone_id(ps->acmod->mdef, phonestr[i]); + if (pron[i] == -1) { + E_ERROR("Unknown phone %s in phone string %s\n", + phonestr[i], tmp); + ckd_free(phonestr); + ckd_free(tmp); + ckd_free(pron); + return -1; + } + } + /* No longer needed. */ + ckd_free(phonestr); + ckd_free(tmp); + + /* Add it to the dictionary. */ + if ((wid = dict_add_word(ps->dict, word, pron, np)) == -1) { + ckd_free(pron); + return -1; + } + /* No longer needed. */ + ckd_free(pron); + + /* Now we also have to add it to dict2pid. */ + dict2pid_add_word(ps->d2p, wid); + + /* TODO: we definitely need to refactor this */ + for (search_it = hash_table_iter(ps->searches); search_it; + search_it = hash_table_iter_next(search_it)) { + ps_search_t *search = hash_entry_val(search_it->ent); + if (!strcmp(PS_SEARCH_TYPE_NGRAM, ps_search_type(search))) { + ngram_model_t *lmset = ((ngram_search_t *) search)->lmset; + if (ngram_model_add_word(lmset, word, 1.0) == NGRAM_INVALID_WID) { + hash_table_iter_free(search_it); + return -1; + } + } + + if (update) { + if ((rv = ps_search_reinit(search, ps->dict, ps->d2p)) < 0) { + hash_table_iter_free(search_it); + return rv; + } + } + } + + /* Rebuild the widmap and search tree if requested. */ + return wid; +} + +char * +ps_lookup_word(ps_decoder_t *ps, const char *word) +{ + s3wid_t wid; + int32 phlen, j; + char *phones; + dict_t *dict = ps->dict; + + wid = dict_wordid(dict, word); + if (wid == BAD_S3WID) + return NULL; + + for (phlen = j = 0; j < dict_pronlen(dict, wid); ++j) + phlen += strlen(dict_ciphone_str(dict, wid, j)) + 1; + phones = ckd_calloc(1, phlen); + for (j = 0; j < dict_pronlen(dict, wid); ++j) { + strcat(phones, dict_ciphone_str(dict, wid, j)); + if (j != dict_pronlen(dict, wid) - 1) + strcat(phones, " "); + } + return phones; +} + +long +ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, + long maxsamps) +{ + int16 *data; + long total, pos, endpos; + + ps_start_utt(ps); + + /* If this file is seekable or maxsamps is specified, then decode + * the whole thing at once. */ + if (maxsamps != -1) { + data = ckd_calloc(maxsamps, sizeof(*data)); + total = fread(data, sizeof(*data), maxsamps, rawfh); + ps_process_raw(ps, data, total, FALSE, TRUE); + ckd_free(data); + } else if ((pos = ftell(rawfh)) >= 0) { + fseek(rawfh, 0, SEEK_END); + endpos = ftell(rawfh); + fseek(rawfh, pos, SEEK_SET); + maxsamps = endpos - pos; + + data = ckd_calloc(maxsamps, sizeof(*data)); + total = fread(data, sizeof(*data), maxsamps, rawfh); + ps_process_raw(ps, data, total, FALSE, TRUE); + ckd_free(data); + } else { + /* Otherwise decode it in a stream. */ + total = 0; + while (!feof(rawfh)) { + int16 data[256]; + size_t nread; + + nread = fread(data, sizeof(*data), sizeof(data)/sizeof(*data), rawfh); + ps_process_raw(ps, data, nread, FALSE, FALSE); + total += nread; + } + } + ps_end_utt(ps); + return total; +} + +int +ps_start_stream(ps_decoder_t *ps) +{ + if (ps->acmod == NULL) + return -1; + if (ps->acmod->fe == NULL) + return -1; + if (ps->acmod->fe->noise_stats == NULL) + return -1; + fe_reset_noisestats(ps->acmod->fe->noise_stats); + return 0; +} + +int +ps_get_in_speech(ps_decoder_t *ps) +{ + return (ps->acmod->state == ACMOD_STARTED || ps->acmod->state == ACMOD_PROCESSING); +} + +int +ps_start_utt(ps_decoder_t *ps) +{ + int rv; + char uttid[16]; + + if (ps->acmod->state == ACMOD_STARTED || ps->acmod->state == ACMOD_PROCESSING) { + E_ERROR("Utterance already started\n"); + return -1; + } + + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } + + ptmr_reset(&ps->perf); + ptmr_start(&ps->perf); + + sprintf(uttid, "%09u", ps->uttno); + ++ps->uttno; + + /* Remove any residual word lattice and hypothesis. */ + ps_lattice_free(ps->search->dag); + ps->search->dag = NULL; + ps->search->last_link = NULL; + ps->search->post = 0; + ckd_free(ps->search->hyp_str); + ps->search->hyp_str = NULL; + if ((rv = acmod_start_utt(ps->acmod)) < 0) + return rv; + + /* Start logging features and audio if requested. */ + if (ps->mfclogdir) { + char *logfn = string_join(ps->mfclogdir, "/", + uttid, ".mfc", NULL); + FILE *mfcfh; + E_INFO("Writing MFCC file: %s\n", logfn); + if ((mfcfh = fopen(logfn, "wb")) == NULL) { + E_ERROR_SYSTEM("Failed to open MFCC file %s", logfn); + ckd_free(logfn); + return -1; + } + ckd_free(logfn); + acmod_set_mfcfh(ps->acmod, mfcfh); + } + if (ps->rawlogdir) { + char *logfn = string_join(ps->rawlogdir, "/", + uttid, ".raw", NULL); + FILE *rawfh; + E_INFO("Writing raw audio file: %s\n", logfn); + if ((rawfh = fopen(logfn, "wb")) == NULL) { + E_ERROR_SYSTEM("Failed to open raw audio file %s", logfn); + ckd_free(logfn); + return -1; + } + ckd_free(logfn); + acmod_set_rawfh(ps->acmod, rawfh); + } + if (ps->senlogdir) { + char *logfn = string_join(ps->senlogdir, "/", + uttid, ".sen", NULL); + FILE *senfh; + E_INFO("Writing senone score file: %s\n", logfn); + if ((senfh = fopen(logfn, "wb")) == NULL) { + E_ERROR_SYSTEM("Failed to open senone score file %s", logfn); + ckd_free(logfn); + return -1; + } + ckd_free(logfn); + acmod_set_senfh(ps->acmod, senfh); + } + + /* Start auxiliary phone loop search. */ + if (ps->phone_loop) + ps_search_start(ps->phone_loop); + + return ps_search_start(ps->search); +} + +static int +ps_search_forward(ps_decoder_t *ps) +{ + int nfr; + + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } + nfr = 0; + while (ps->acmod->n_feat_frame > 0) { + int k; + if (ps->pl_window > 0) + if ((k = ps_search_step(ps->phone_loop, ps->acmod->output_frame)) < 0) + return k; + if (ps->acmod->output_frame >= ps->pl_window) + if ((k = ps_search_step(ps->search, + ps->acmod->output_frame - ps->pl_window)) < 0) + return k; + acmod_advance(ps->acmod); + ++ps->n_frame; + ++nfr; + } + return nfr; +} + +int +ps_decode_senscr(ps_decoder_t *ps, FILE *senfh) +{ + int nfr, n_searchfr; + + ps_start_utt(ps); + n_searchfr = 0; + acmod_set_insenfh(ps->acmod, senfh); + while ((nfr = acmod_read_scores(ps->acmod)) > 0) { + if ((nfr = ps_search_forward(ps)) < 0) { + ps_end_utt(ps); + return nfr; + } + n_searchfr += nfr; + } + ps_end_utt(ps); + acmod_set_insenfh(ps->acmod, NULL); + + return n_searchfr; +} + +int +ps_process_raw(ps_decoder_t *ps, + int16 const *data, + size_t n_samples, + int no_search, + int full_utt) +{ + int n_searchfr = 0; + + if (ps->acmod->state == ACMOD_IDLE) { + E_ERROR("Failed to process data, utterance is not started. Use start_utt to start it\n"); + return 0; + } + + if (no_search) + acmod_set_grow(ps->acmod, TRUE); + + while (n_samples) { + int nfr; + + /* Process some data into features. */ + if ((nfr = acmod_process_raw(ps->acmod, &data, + &n_samples, full_utt)) < 0) + return nfr; + + /* Score and search as much data as possible */ + if (no_search) + continue; + if ((nfr = ps_search_forward(ps)) < 0) + return nfr; + n_searchfr += nfr; + } + + return n_searchfr; +} + +int +ps_process_cep(ps_decoder_t *ps, + mfcc_t **data, + int32 n_frames, + int no_search, + int full_utt) +{ + int n_searchfr = 0; + + if (no_search) + acmod_set_grow(ps->acmod, TRUE); + + while (n_frames) { + int nfr; + + /* Process some data into features. */ + if ((nfr = acmod_process_cep(ps->acmod, &data, + &n_frames, full_utt)) < 0) + return nfr; + + /* Score and search as much data as possible */ + if (no_search) + continue; + if ((nfr = ps_search_forward(ps)) < 0) + return nfr; + n_searchfr += nfr; + } + + return n_searchfr; +} + +int +ps_end_utt(ps_decoder_t *ps) +{ + int rv, i; + + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } + if (ps->acmod->state == ACMOD_ENDED || ps->acmod->state == ACMOD_IDLE) { + E_ERROR("Utterance is not started\n"); + return -1; + } + acmod_end_utt(ps->acmod); + + /* Search any remaining frames. */ + if ((rv = ps_search_forward(ps)) < 0) { + ptmr_stop(&ps->perf); + return rv; + } + /* Finish phone loop search. */ + if (ps->phone_loop) { + if ((rv = ps_search_finish(ps->phone_loop)) < 0) { + ptmr_stop(&ps->perf); + return rv; + } + } + /* Search any frames remaining in the lookahead window. */ + if (ps->acmod->output_frame >= ps->pl_window) { + for (i = ps->acmod->output_frame - ps->pl_window; + i < ps->acmod->output_frame; ++i) + ps_search_step(ps->search, i); + } + /* Finish main search. */ + if ((rv = ps_search_finish(ps->search)) < 0) { + ptmr_stop(&ps->perf); + return rv; + } + ptmr_stop(&ps->perf); + + /* Log a backtrace if requested. */ + if (cmd_ln_boolean_r(ps->config, "-backtrace")) { + const char* hyp; + ps_seg_t *seg; + int32 score; + + hyp = ps_get_hyp(ps, &score); + + if (hyp != NULL) { + E_INFO("%s (%d)\n", hyp, score); + E_INFO_NOFN("%-20s %-5s %-5s %-5s %-10s %-10s %-3s\n", + "word", "start", "end", "pprob", "ascr", "lscr", "lback"); + for (seg = ps_seg_iter(ps); seg; + seg = ps_seg_next(seg)) { + char const *word; + int sf, ef; + int32 post, lscr, ascr, lback; + + word = ps_seg_word(seg); + ps_seg_frames(seg, &sf, &ef); + post = ps_seg_prob(seg, &ascr, &lscr, &lback); + E_INFO_NOFN("%-20s %-5d %-5d %-1.3f %-10d %-10d %-3d\n", + word, sf, ef, logmath_exp(ps_get_logmath(ps), post), + ascr, lscr, lback); + } + } + } + return rv; +} + +char const * +ps_get_hyp(ps_decoder_t *ps, int32 *out_best_score) +{ + char const *hyp; + + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } + ptmr_start(&ps->perf); + hyp = ps_search_hyp(ps->search, out_best_score); + ptmr_stop(&ps->perf); + return hyp; +} + +int32 +ps_get_prob(ps_decoder_t *ps) +{ + int32 prob; + + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return -1; + } + ptmr_start(&ps->perf); + prob = ps_search_prob(ps->search); + ptmr_stop(&ps->perf); + return prob; +} + +ps_seg_t * +ps_seg_iter(ps_decoder_t *ps) +{ + ps_seg_t *itor; + + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } + ptmr_start(&ps->perf); + itor = ps_search_seg_iter(ps->search); + ptmr_stop(&ps->perf); + return itor; +} + +ps_seg_t * +ps_seg_next(ps_seg_t *seg) +{ + return ps_search_seg_next(seg); +} + +char const * +ps_seg_word(ps_seg_t *seg) +{ + return seg->word; +} + +void +ps_seg_frames(ps_seg_t *seg, int *out_sf, int *out_ef) +{ + if (out_sf) *out_sf = seg->sf; + if (out_ef) *out_ef = seg->ef; +} + +int32 +ps_seg_prob(ps_seg_t *seg, int32 *out_ascr, int32 *out_lscr, int32 *out_lback) +{ + if (out_ascr) *out_ascr = seg->ascr; + if (out_lscr) *out_lscr = seg->lscr; + if (out_lback) *out_lback = seg->lback; + return seg->prob; +} + +void +ps_seg_free(ps_seg_t *seg) +{ + ps_search_seg_free(seg); +} + +ps_lattice_t * +ps_get_lattice(ps_decoder_t *ps) +{ + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } + return ps_search_lattice(ps->search); +} + +ps_nbest_t * +ps_nbest(ps_decoder_t *ps) +{ + ps_lattice_t *dag; + ngram_model_t *lmset; + ps_astar_t *nbest; + float32 lwf; + + if (ps->search == NULL) { + E_ERROR("No search module is selected, did you forget to " + "specify a language model or grammar?\n"); + return NULL; + } + if ((dag = ps_get_lattice(ps)) == NULL) + return NULL; + + /* FIXME: This is all quite specific to N-Gram search. Either we + * should make N-best a method for each search module or it needs + * to be abstracted to work for N-Gram and FSG. */ + if (0 != strcmp(ps_search_type(ps->search), PS_SEARCH_TYPE_NGRAM)) { + lmset = NULL; + lwf = 1.0f; + } else { + lmset = ((ngram_search_t *)ps->search)->lmset; + lwf = ((ngram_search_t *)ps->search)->bestpath_fwdtree_lw_ratio; + } + + nbest = ps_astar_start(dag, lmset, lwf, 0, -1, -1, -1); + + nbest = ps_nbest_next(nbest); + + return (ps_nbest_t *)nbest; +} + +void +ps_nbest_free(ps_nbest_t *nbest) +{ + ps_astar_finish(nbest); +} + +ps_nbest_t * +ps_nbest_next(ps_nbest_t *nbest) +{ + ps_latpath_t *next; + + next = ps_astar_next(nbest); + if (next == NULL) { + ps_nbest_free(nbest); + return NULL; + } + return nbest; +} + +char const * +ps_nbest_hyp(ps_nbest_t *nbest, int32 *out_score) +{ + assert(nbest != NULL); + + if (nbest->top == NULL) + return NULL; + if (out_score) *out_score = nbest->top->score; + return ps_astar_hyp(nbest, nbest->top); +} + +ps_seg_t * +ps_nbest_seg(ps_nbest_t *nbest) +{ + if (nbest->top == NULL) + return NULL; + + return ps_astar_seg_iter(nbest, nbest->top, 1.0); +} + +int +ps_get_n_frames(ps_decoder_t *ps) +{ + return ps->acmod->output_frame + 1; +} + +void +ps_get_utt_time(ps_decoder_t *ps, double *out_nspeech, + double *out_ncpu, double *out_nwall) +{ + int32 frate; + + frate = cmd_ln_int32_r(ps->config, "-frate"); + *out_nspeech = (double)ps->acmod->output_frame / frate; + *out_ncpu = ps->perf.t_cpu; + *out_nwall = ps->perf.t_elapsed; +} + +void +ps_get_all_time(ps_decoder_t *ps, double *out_nspeech, + double *out_ncpu, double *out_nwall) +{ + int32 frate; + + frate = cmd_ln_int32_r(ps->config, "-frate"); + *out_nspeech = (double)ps->n_frame / frate; + *out_ncpu = ps->perf.t_tot_cpu; + *out_nwall = ps->perf.t_tot_elapsed; +} + +void +ps_search_init(ps_search_t *search, ps_searchfuncs_t *vt, + const char *type, + const char *name, + cmd_ln_t *config, acmod_t *acmod, dict_t *dict, + dict2pid_t *d2p) +{ + search->vt = vt; + search->name = ckd_salloc(name); + search->type = ckd_salloc(type); + + search->config = config; + search->acmod = acmod; + if (d2p) + search->d2p = dict2pid_retain(d2p); + else + search->d2p = NULL; + if (dict) { + search->dict = dict_retain(dict); + search->start_wid = dict_startwid(dict); + search->finish_wid = dict_finishwid(dict); + search->silence_wid = dict_silwid(dict); + search->n_words = dict_size(dict); + } + else { + search->dict = NULL; + search->start_wid = search->finish_wid = search->silence_wid = -1; + search->n_words = 0; + } +} + +void +ps_search_base_free(ps_search_t *search) +{ + /* FIXME: We will have refcounting on acmod, config, etc, at which + * point we will free them here too. */ + ckd_free(search->name); + ckd_free(search->type); + dict_free(search->dict); + dict2pid_free(search->d2p); + ckd_free(search->hyp_str); + ps_lattice_free(search->dag); +} + +void +ps_search_base_reinit(ps_search_t *search, dict_t *dict, + dict2pid_t *d2p) +{ + dict_free(search->dict); + dict2pid_free(search->d2p); + /* FIXME: _retain() should just return NULL if passed NULL. */ + if (dict) { + search->dict = dict_retain(dict); + search->start_wid = dict_startwid(dict); + search->finish_wid = dict_finishwid(dict); + search->silence_wid = dict_silwid(dict); + search->n_words = dict_size(dict); + } + else { + search->dict = NULL; + search->start_wid = search->finish_wid = search->silence_wid = -1; + search->n_words = 0; + } + if (d2p) + search->d2p = dict2pid_retain(d2p); + else + search->d2p = NULL; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h new file mode 100644 index 0000000..7fc0e00 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h @@ -0,0 +1,245 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file pocketsphinx_internal.h Internal implementation of + * PocketSphinx decoder. + * @author David Huggins-Daines + */ + +#ifndef __POCKETSPHINX_INTERNAL_H__ +#define __POCKETSPHINX_INTERNAL_H__ + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include +#include + +/* Local headers. */ +#include "pocketsphinx.h" +#include "acmod.h" +#include "dict.h" +#include "dict2pid.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Search algorithm structure. + */ +typedef struct ps_search_s ps_search_t; + + +/* Search names*/ +#define PS_DEFAULT_SEARCH "_default" +#define PS_DEFAULT_PL_SEARCH "_default_pl" + +/* Search types */ +#define PS_SEARCH_TYPE_KWS "kws" +#define PS_SEARCH_TYPE_FSG "fsg" +#define PS_SEARCH_TYPE_NGRAM "ngram" +#define PS_SEARCH_TYPE_ALLPHONE "allphone" +#define PS_SEARCH_TYPE_STATE_ALIGN "state_align" +#define PS_SEARCH_TYPE_PHONE_LOOP "phone_loop" + +/** + * V-table for search algorithm. + */ +typedef struct ps_searchfuncs_s { + int (*start)(ps_search_t *search); + int (*step)(ps_search_t *search, int frame_idx); + int (*finish)(ps_search_t *search); + int (*reinit)(ps_search_t *search, dict_t *dict, dict2pid_t *d2p); + void (*free)(ps_search_t *search); + + ps_lattice_t *(*lattice)(ps_search_t *search); + char const *(*hyp)(ps_search_t *search, int32 *out_score); + int32 (*prob)(ps_search_t *search); + ps_seg_t *(*seg_iter)(ps_search_t *search); +} ps_searchfuncs_t; + +/** + * Base structure for search module. + */ +struct ps_search_s { + ps_searchfuncs_t *vt; /**< V-table of search methods. */ + + char *type; + char *name; + + ps_search_t *pls; /**< Phoneme loop for lookahead. */ + cmd_ln_t *config; /**< Configuration. */ + acmod_t *acmod; /**< Acoustic model. */ + dict_t *dict; /**< Pronunciation dictionary. */ + dict2pid_t *d2p; /**< Dictionary to senone mappings. */ + char *hyp_str; /**< Current hypothesis string. */ + ps_lattice_t *dag; /**< Current hypothesis word graph. */ + ps_latlink_t *last_link; /**< Final link in best path. */ + int32 post; /**< Utterance posterior probability. */ + int32 n_words; /**< Number of words known to search (may + be less than in the dictionary) */ + + /* Magical word IDs that must exist in the dictionary: */ + int32 start_wid; /**< Start word ID. */ + int32 silence_wid; /**< Silence word ID. */ + int32 finish_wid; /**< Finish word ID. */ +}; + +#define ps_search_base(s) ((ps_search_t *)s) +#define ps_search_config(s) ps_search_base(s)->config +#define ps_search_acmod(s) ps_search_base(s)->acmod +#define ps_search_dict(s) ps_search_base(s)->dict +#define ps_search_dict2pid(s) ps_search_base(s)->d2p +#define ps_search_dag(s) ps_search_base(s)->dag +#define ps_search_last_link(s) ps_search_base(s)->last_link +#define ps_search_post(s) ps_search_base(s)->post +#define ps_search_lookahead(s) ps_search_base(s)->pls +#define ps_search_n_words(s) ps_search_base(s)->n_words + +#define ps_search_type(s) ps_search_base(s)->type +#define ps_search_name(s) ps_search_base(s)->name +#define ps_search_start(s) (*(ps_search_base(s)->vt->start))(s) +#define ps_search_step(s,i) (*(ps_search_base(s)->vt->step))(s,i) +#define ps_search_finish(s) (*(ps_search_base(s)->vt->finish))(s) +#define ps_search_reinit(s,d,d2p) (*(ps_search_base(s)->vt->reinit))(s,d,d2p) +#define ps_search_free(s) (*(ps_search_base(s)->vt->free))(s) +#define ps_search_lattice(s) (*(ps_search_base(s)->vt->lattice))(s) +#define ps_search_hyp(s,sc) (*(ps_search_base(s)->vt->hyp))(s,sc) +#define ps_search_prob(s) (*(ps_search_base(s)->vt->prob))(s) +#define ps_search_seg_iter(s) (*(ps_search_base(s)->vt->seg_iter))(s) + +/* For convenience... */ +#define ps_search_silence_wid(s) ps_search_base(s)->silence_wid +#define ps_search_start_wid(s) ps_search_base(s)->start_wid +#define ps_search_finish_wid(s) ps_search_base(s)->finish_wid + +/** + * Initialize base structure. + */ +void ps_search_init(ps_search_t *search, ps_searchfuncs_t *vt, + const char *type, const char *name, + cmd_ln_t *config, acmod_t *acmod, dict_t *dict, + dict2pid_t *d2p); + + +/** + * Free search + */ +void ps_search_base_free(ps_search_t *search); + +/** + * Re-initialize base structure with new dictionary. + */ +void ps_search_base_reinit(ps_search_t *search, dict_t *dict, + dict2pid_t *d2p); + +typedef struct ps_segfuncs_s { + ps_seg_t *(*seg_next)(ps_seg_t *seg); + void (*seg_free)(ps_seg_t *seg); +} ps_segfuncs_t; + +/** + * Base structure for hypothesis segmentation iterator. + */ +struct ps_seg_s { + ps_segfuncs_t *vt; /**< V-table of seg methods */ + ps_search_t *search; /**< Search object from whence this came */ + char const *word; /**< Word string (pointer into dictionary hash) */ + frame_idx_t sf; /**< Start frame. */ + frame_idx_t ef; /**< End frame. */ + int32 ascr; /**< Acoustic score. */ + int32 lscr; /**< Language model score. */ + int32 prob; /**< Log posterior probability. */ + /* This doesn't need to be 32 bits, so once the scores above are + * reduced to 16 bits (or less!), this will be too. */ + int32 lback; /**< Language model backoff. */ + /* Not sure if this should be here at all. */ + float32 lwf; /**< Language weight factor (for second-pass searches) */ +}; + +#define ps_search_seg_next(seg) (*(seg->vt->seg_next))(seg) +#define ps_search_seg_free(s) (*(seg->vt->seg_free))(seg) + + +/** + * Decoder object. + */ +struct ps_decoder_s { + /* Model parameters and such. */ + cmd_ln_t *config; /**< Configuration. */ + int refcount; /**< Reference count. */ + + /* Basic units of computation. */ + acmod_t *acmod; /**< Acoustic model. */ + dict_t *dict; /**< Pronunciation dictionary. */ + dict2pid_t *d2p; /**< Dictionary to senone mapping. */ + logmath_t *lmath; /**< Log math computation. */ + + /* Search modules. */ + hash_table_t *searches; /**< Set of search modules. */ + /* TODO: Convert this to a stack of searches each with their own + * lookahead value. */ + ps_search_t *search; /**< Currently active search module. */ + ps_search_t *phone_loop; /**< Phone loop search for lookahead. */ + int pl_window; /**< Window size for phoneme lookahead. */ + + /* Utterance-processing related stuff. */ + uint32 uttno; /**< Utterance counter. */ + ptmr_t perf; /**< Performance counter for all of decoding. */ + uint32 n_frame; /**< Total number of frames processed. */ + char const *mfclogdir; /**< Log directory for MFCC files. */ + char const *rawlogdir; /**< Log directory for audio files. */ + char const *senlogdir; /**< Log directory for senone score files. */ +}; + + +struct ps_search_iter_s { + hash_iter_t itor; +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __POCKETSPHINX_INTERNAL_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c new file mode 100644 index 0000000..5111552 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c @@ -0,0 +1,508 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ps_alignment.c Multi-level alignment structure + */ + +/* System headers. */ + +/* SphinxBase headers. */ +#include + +/* Local headers. */ +#include "ps_alignment.h" + +ps_alignment_t * +ps_alignment_init(dict2pid_t *d2p) +{ + ps_alignment_t *al = ckd_calloc(1, sizeof(*al)); + al->d2p = dict2pid_retain(d2p); + al->refcount = 1; + return al; +} + +ps_alignment_t * +ps_alignment_retain(ps_alignment_t *al) +{ + ++al->refcount; + return al; +} + +int +ps_alignment_free(ps_alignment_t *al) +{ + if (al == NULL) + return 0; + if (--al->refcount > 0) + return al->refcount; + dict2pid_free(al->d2p); + ckd_free(al->word.seq); + ckd_free(al->sseq.seq); + ckd_free(al->state.seq); + ckd_free(al); + return 0; +} + +#define VECTOR_GROW 10 +static void * +vector_grow_one(void *ptr, uint16 *n_alloc, uint16 *n, size_t item_size) +{ + int newsize = *n + 1; + if (newsize < *n_alloc) { + *n += 1; + return ptr; + } + newsize += VECTOR_GROW; + if (newsize > 0xffff) + return NULL; + ptr = ckd_realloc(ptr, newsize * item_size); + *n += 1; + *n_alloc = newsize; + return ptr; +} + +static ps_alignment_entry_t * +ps_alignment_vector_grow_one(ps_alignment_vector_t *vec) +{ + void *ptr; + ptr = vector_grow_one(vec->seq, &vec->n_alloc, + &vec->n_ent, sizeof(*vec->seq)); + if (ptr == NULL) + return NULL; + vec->seq = ptr; + return vec->seq + vec->n_ent - 1; +} + +static void +ps_alignment_vector_empty(ps_alignment_vector_t *vec) +{ + vec->n_ent = 0; +} + +int +ps_alignment_add_word(ps_alignment_t *al, + int32 wid, int duration) +{ + ps_alignment_entry_t *ent; + + if ((ent = ps_alignment_vector_grow_one(&al->word)) == NULL) + return 0; + ent->id.wid = wid; + if (al->word.n_ent > 1) + ent->start = ent[-1].start + ent[-1].duration; + else + ent->start = 0; + ent->duration = duration; + ent->score = 0; + ent->parent = PS_ALIGNMENT_NONE; + ent->child = PS_ALIGNMENT_NONE; + + return al->word.n_ent; +} + +int +ps_alignment_populate(ps_alignment_t *al) +{ + dict2pid_t *d2p; + dict_t *dict; + bin_mdef_t *mdef; + int i, lc; + + /* Clear phone and state sequences. */ + ps_alignment_vector_empty(&al->sseq); + ps_alignment_vector_empty(&al->state); + + /* For each word, expand to phones/senone sequences. */ + d2p = al->d2p; + dict = d2p->dict; + mdef = d2p->mdef; + lc = bin_mdef_silphone(mdef); + for (i = 0; i < al->word.n_ent; ++i) { + ps_alignment_entry_t *went = al->word.seq + i; + ps_alignment_entry_t *sent; + int wid = went->id.wid; + int len = dict_pronlen(dict, wid); + int j, rc; + + if (i < al->word.n_ent - 1) + rc = dict_first_phone(dict, al->word.seq[i+1].id.wid); + else + rc = bin_mdef_silphone(mdef); + + /* First phone. */ + if ((sent = ps_alignment_vector_grow_one(&al->sseq)) == NULL) { + E_ERROR("Failed to add phone entry!\n"); + return -1; + } + sent->id.pid.cipid = dict_first_phone(dict, wid); + sent->id.pid.tmatid = bin_mdef_pid2tmatid(mdef, sent->id.pid.cipid); + sent->start = went->start; + sent->duration = went->duration; + sent->score = 0; + sent->parent = i; + went->child = (uint16)(sent - al->sseq.seq); + if (len == 1) + sent->id.pid.ssid + = dict2pid_lrdiph_rc(d2p, sent->id.pid.cipid, lc, rc); + else + sent->id.pid.ssid + = dict2pid_ldiph_lc(d2p, sent->id.pid.cipid, + dict_second_phone(dict, wid), lc); + assert(sent->id.pid.ssid != BAD_SSID); + + /* Internal phones. */ + for (j = 1; j < len - 1; ++j) { + if ((sent = ps_alignment_vector_grow_one(&al->sseq)) == NULL) { + E_ERROR("Failed to add phone entry!\n"); + return -1; + } + sent->id.pid.cipid = dict_pron(dict, wid, j); + sent->id.pid.tmatid = bin_mdef_pid2tmatid(mdef, sent->id.pid.cipid); + sent->id.pid.ssid = dict2pid_internal(d2p, wid, j); + assert(sent->id.pid.ssid != BAD_SSID); + sent->start = went->start; + sent->duration = went->duration; + sent->score = 0; + sent->parent = i; + } + + /* Last phone. */ + if (j < len) { + xwdssid_t *rssid; + assert(j == len - 1); + if ((sent = ps_alignment_vector_grow_one(&al->sseq)) == NULL) { + E_ERROR("Failed to add phone entry!\n"); + return -1; + } + sent->id.pid.cipid = dict_last_phone(dict, wid); + sent->id.pid.tmatid = bin_mdef_pid2tmatid(mdef, sent->id.pid.cipid); + rssid = dict2pid_rssid(d2p, sent->id.pid.cipid, + dict_second_last_phone(dict, wid)); + sent->id.pid.ssid = rssid->ssid[rssid->cimap[rc]]; + assert(sent->id.pid.ssid != BAD_SSID); + sent->start = went->start; + sent->duration = went->duration; + sent->score = 0; + sent->parent = i; + } + /* Update lc. Could just use sent->id.pid.cipid here but that + * seems needlessly obscure. */ + lc = dict_last_phone(dict, wid); + } + + /* For each senone sequence, expand to senones. (we could do this + * nested above but this makes it more clear and easier to + * refactor) */ + for (i = 0; i < al->sseq.n_ent; ++i) { + ps_alignment_entry_t *pent = al->sseq.seq + i; + ps_alignment_entry_t *sent; + int j; + + for (j = 0; j < bin_mdef_n_emit_state(mdef); ++j) { + if ((sent = ps_alignment_vector_grow_one(&al->state)) == NULL) { + E_ERROR("Failed to add state entry!\n"); + return -1; + } + sent->id.senid = bin_mdef_sseq2sen(mdef, pent->id.pid.ssid, j); + assert(sent->id.senid != BAD_SENID); + sent->start = pent->start; + sent->duration = pent->duration; + sent->score = 0; + sent->parent = i; + if (j == 0) + pent->child = (uint16)(sent - al->state.seq); + } + } + + return 0; +} + +/* FIXME: Somewhat the same as the above function, needs refactoring */ +int +ps_alignment_populate_ci(ps_alignment_t *al) +{ + dict2pid_t *d2p; + dict_t *dict; + bin_mdef_t *mdef; + int i; + + /* Clear phone and state sequences. */ + ps_alignment_vector_empty(&al->sseq); + ps_alignment_vector_empty(&al->state); + + /* For each word, expand to phones/senone sequences. */ + d2p = al->d2p; + dict = d2p->dict; + mdef = d2p->mdef; + for (i = 0; i < al->word.n_ent; ++i) { + ps_alignment_entry_t *went = al->word.seq + i; + ps_alignment_entry_t *sent; + int wid = went->id.wid; + int len = dict_pronlen(dict, wid); + int j; + + for (j = 0; j < len; ++j) { + if ((sent = ps_alignment_vector_grow_one(&al->sseq)) == NULL) { + E_ERROR("Failed to add phone entry!\n"); + return -1; + } + sent->id.pid.cipid = dict_pron(dict, wid, j); + sent->id.pid.tmatid = bin_mdef_pid2tmatid(mdef, sent->id.pid.cipid); + sent->id.pid.ssid = bin_mdef_pid2ssid(mdef, sent->id.pid.cipid); + assert(sent->id.pid.ssid != BAD_SSID); + sent->start = went->start; + sent->duration = went->duration; + sent->score = 0; + sent->parent = i; + } + } + + /* For each senone sequence, expand to senones. (we could do this + * nested above but this makes it more clear and easier to + * refactor) */ + for (i = 0; i < al->sseq.n_ent; ++i) { + ps_alignment_entry_t *pent = al->sseq.seq + i; + ps_alignment_entry_t *sent; + int j; + + for (j = 0; j < bin_mdef_n_emit_state(mdef); ++j) { + if ((sent = ps_alignment_vector_grow_one(&al->state)) == NULL) { + E_ERROR("Failed to add state entry!\n"); + return -1; + } + sent->id.senid = bin_mdef_sseq2sen(mdef, pent->id.pid.ssid, j); + assert(sent->id.senid != BAD_SENID); + sent->start = pent->start; + sent->duration = pent->duration; + sent->score = 0; + sent->parent = i; + if (j == 0) + pent->child = (uint16)(sent - al->state.seq); + } + } + + return 0; +} + +int +ps_alignment_propagate(ps_alignment_t *al) +{ + ps_alignment_entry_t *last_ent = NULL; + int i; + + /* Propagate duration up from states to phones. */ + for (i = 0; i < al->state.n_ent; ++i) { + ps_alignment_entry_t *sent = al->state.seq + i; + ps_alignment_entry_t *pent = al->sseq.seq + sent->parent; + if (pent != last_ent) { + pent->start = sent->start; + pent->duration = 0; + pent->score = 0; + } + pent->duration += sent->duration; + pent->score += sent->score; + last_ent = pent; + } + + /* Propagate duration up from phones to words. */ + last_ent = NULL; + for (i = 0; i < al->sseq.n_ent; ++i) { + ps_alignment_entry_t *pent = al->sseq.seq + i; + ps_alignment_entry_t *went = al->word.seq + pent->parent; + if (went != last_ent) { + went->start = pent->start; + went->duration = 0; + went->score = 0; + } + went->duration += pent->duration; + went->score += pent->score; + last_ent = went; + } + + return 0; +} + +int +ps_alignment_n_words(ps_alignment_t *al) +{ + return (int)al->word.n_ent; +} + +int +ps_alignment_n_phones(ps_alignment_t *al) +{ + return (int)al->sseq.n_ent; +} + +int +ps_alignment_n_states(ps_alignment_t *al) +{ + return (int)al->state.n_ent; +} + +ps_alignment_iter_t * +ps_alignment_words(ps_alignment_t *al) +{ + ps_alignment_iter_t *itor; + + if (al->word.n_ent == 0) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + itor->al = al; + itor->vec = &al->word; + itor->pos = 0; + return itor; +} + +ps_alignment_iter_t * +ps_alignment_phones(ps_alignment_t *al) +{ + ps_alignment_iter_t *itor; + + if (al->sseq.n_ent == 0) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + itor->al = al; + itor->vec = &al->sseq; + itor->pos = 0; + return itor; +} + +ps_alignment_iter_t * +ps_alignment_states(ps_alignment_t *al) +{ + ps_alignment_iter_t *itor; + + if (al->state.n_ent == 0) + return NULL; + itor = ckd_calloc(1, sizeof(*itor)); + itor->al = al; + itor->vec = &al->state; + itor->pos = 0; + return itor; +} + +ps_alignment_entry_t * +ps_alignment_iter_get(ps_alignment_iter_t *itor) +{ + return itor->vec->seq + itor->pos; +} + +int +ps_alignment_iter_free(ps_alignment_iter_t *itor) +{ + ckd_free(itor); + return 0; +} + +ps_alignment_iter_t * +ps_alignment_iter_goto(ps_alignment_iter_t *itor, int pos) +{ + if (itor == NULL) + return NULL; + if (pos >= itor->vec->n_ent) { + ps_alignment_iter_free(itor); + return NULL; + } + itor->pos = pos; + return itor; +} + +ps_alignment_iter_t * +ps_alignment_iter_next(ps_alignment_iter_t *itor) +{ + if (itor == NULL) + return NULL; + if (++itor->pos >= itor->vec->n_ent) { + ps_alignment_iter_free(itor); + return NULL; + } + return itor; +} + +ps_alignment_iter_t * +ps_alignment_iter_prev(ps_alignment_iter_t *itor) +{ + if (itor == NULL) + return NULL; + if (--itor->pos < 0) { + ps_alignment_iter_free(itor); + return NULL; + } + return itor; +} + +ps_alignment_iter_t * +ps_alignment_iter_up(ps_alignment_iter_t *itor) +{ + ps_alignment_iter_t *itor2; + if (itor == NULL) + return NULL; + if (itor->vec == &itor->al->word) + return NULL; + if (itor->vec->seq[itor->pos].parent == PS_ALIGNMENT_NONE) + return NULL; + itor2 = ckd_calloc(1, sizeof(*itor2)); + itor2->al = itor->al; + itor2->pos = itor->vec->seq[itor->pos].parent; + if (itor->vec == &itor->al->sseq) + itor2->vec = &itor->al->word; + else + itor2->vec = &itor->al->sseq; + return itor2; +} + +ps_alignment_iter_t * +ps_alignment_iter_down(ps_alignment_iter_t *itor) +{ + ps_alignment_iter_t *itor2; + if (itor == NULL) + return NULL; + if (itor->vec == &itor->al->state) + return NULL; + if (itor->vec->seq[itor->pos].child == PS_ALIGNMENT_NONE) + return NULL; + itor2 = ckd_calloc(1, sizeof(*itor2)); + itor2->al = itor->al; + itor2->pos = itor->vec->seq[itor->pos].child; + if (itor->vec == &itor->al->word) + itor2->vec = &itor->al->sseq; + else + itor2->vec = &itor->al->state; + return itor2; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h new file mode 100644 index 0000000..8b471ef --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h @@ -0,0 +1,240 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ps_alignment.h Multi-level alignment structure + */ + +#ifndef __PS_ALIGNMENT_H__ +#define __PS_ALIGNMENT_H__ + +/* System headers. */ + +/* SphinxBase headers. */ +#include +#include + +/* Local headers. */ +#include "dict2pid.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +#define PS_ALIGNMENT_NONE ((uint16)0xffff) + +struct ps_alignment_entry_s { + union { + int32 wid; + struct { + uint16 ssid; + uint16 cipid; + uint16 tmatid; + } pid; + uint16 senid; + } id; + int16 start; + int16 duration; + int32 score; + uint16 parent; + uint16 child; +}; +typedef struct ps_alignment_entry_s ps_alignment_entry_t; + +struct ps_alignment_vector_s { + ps_alignment_entry_t *seq; + uint16 n_ent, n_alloc; +}; +typedef struct ps_alignment_vector_s ps_alignment_vector_t; + +struct ps_alignment_s { + int refcount; + dict2pid_t *d2p; + ps_alignment_vector_t word; + ps_alignment_vector_t sseq; + ps_alignment_vector_t state; +}; +typedef struct ps_alignment_s ps_alignment_t; + +struct ps_alignment_iter_s { + ps_alignment_t *al; + ps_alignment_vector_t *vec; + int pos; +}; +typedef struct ps_alignment_iter_s ps_alignment_iter_t; + +/** + * Create a new, empty alignment. + */ +POCKETSPHINX_EXPORT +ps_alignment_t *ps_alignment_init(dict2pid_t *d2p); + +/** + * Retain an alighment + */ +POCKETSPHINX_EXPORT +ps_alignment_t *ps_alignment_retain(ps_alignment_t *al); + +/** + * Release an alignment + */ +POCKETSPHINX_EXPORT +int ps_alignment_free(ps_alignment_t *al); + +/** + * Append a word. + */ +POCKETSPHINX_EXPORT +int ps_alignment_add_word(ps_alignment_t *al, + int32 wid, int duration); + +/** + * Populate lower layers using available word information. + */ +POCKETSPHINX_EXPORT +int ps_alignment_populate(ps_alignment_t *al); + +/** + * Populate lower layers using context-independent phones. + */ +POCKETSPHINX_EXPORT +int ps_alignment_populate_ci(ps_alignment_t *al); + +/** + * Propagate timing information up from state sequence. + */ +POCKETSPHINX_EXPORT +int ps_alignment_propagate(ps_alignment_t *al); + +/** + * Number of words. + */ +POCKETSPHINX_EXPORT +int ps_alignment_n_words(ps_alignment_t *al); + +/** + * Number of phones. + */ +POCKETSPHINX_EXPORT +int ps_alignment_n_phones(ps_alignment_t *al); + +/** + * Number of states. + */ +POCKETSPHINX_EXPORT +int ps_alignment_n_states(ps_alignment_t *al); + +/** + * Iterate over the alignment starting at the first word. + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_words(ps_alignment_t *al); + +/** + * Iterate over the alignment starting at the first phone. + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_phones(ps_alignment_t *al); + +/** + * Iterate over the alignment starting at the first state. + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_states(ps_alignment_t *al); + +/** + * Get the alignment entry pointed to by an iterator. + * + * The iterator retains ownership of this so don't try to free it. + */ +POCKETSPHINX_EXPORT +ps_alignment_entry_t *ps_alignment_iter_get(ps_alignment_iter_t *itor); + +/** + * Move alignment iterator to given index. + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_iter_goto(ps_alignment_iter_t *itor, int pos); + +/** + * Move an alignment iterator forward. + * + * If the end of the alignment is reached, this will free the iterator + * and return NULL. + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_iter_next(ps_alignment_iter_t *itor); + +/** + * Move an alignment iterator back. + * + * If the start of the alignment is reached, this will free the iterator + * and return NULL. + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_iter_prev(ps_alignment_iter_t *itor); + +/** + * Get a new iterator starting at the parent of the current node. + * + * If there is no parent node, NULL is returned. + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_iter_up(ps_alignment_iter_t *itor); +/** + * Get a new iterator starting at the first child of the current node. + * + * If there is no child node, NULL is returned. + */ +POCKETSPHINX_EXPORT +ps_alignment_iter_t *ps_alignment_iter_down(ps_alignment_iter_t *itor); + +/** + * Release an iterator before completing all iterations. + */ +POCKETSPHINX_EXPORT +int ps_alignment_iter_free(ps_alignment_iter_t *itor); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __PS_ALIGNMENT_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c new file mode 100644 index 0000000..4b6c1cc --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c @@ -0,0 +1,1937 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ps_lattice.c Word graph search. + */ + +/* System headers. */ +#include +#include +#include + +/* SphinxBase headers. */ +#include +#include +#include +#include +#include + +/* Local headers. */ +#include "pocketsphinx_internal.h" +#include "ps_lattice_internal.h" +#include "ngram_search.h" +#include "dict.h" + +/* + * Create a directed link between "from" and "to" nodes, but if a link already exists, + * choose one with the best ascr. + */ +void +ps_lattice_link(ps_lattice_t *dag, ps_latnode_t *from, ps_latnode_t *to, + int32 score, int32 ef) +{ + latlink_list_t *fwdlink; + + /* Look for an existing link between "from" and "to" nodes */ + for (fwdlink = from->exits; fwdlink; fwdlink = fwdlink->next) + if (fwdlink->link->to == to) + break; + + if (fwdlink == NULL) { + latlink_list_t *revlink; + ps_latlink_t *link; + + /* No link between the two nodes; create a new one */ + link = listelem_malloc(dag->latlink_alloc); + fwdlink = listelem_malloc(dag->latlink_list_alloc); + revlink = listelem_malloc(dag->latlink_list_alloc); + + link->from = from; + link->to = to; + link->ascr = score; + link->ef = ef; + link->best_prev = NULL; + + fwdlink->link = revlink->link = link; + fwdlink->next = from->exits; + from->exits = fwdlink; + revlink->next = to->entries; + to->entries = revlink; + } + else { + /* Link already exists; just retain the best ascr */ + if (score BETTER_THAN fwdlink->link->ascr) { + fwdlink->link->ascr = score; + fwdlink->link->ef = ef; + } + } +} + +void +ps_lattice_penalize_fillers(ps_lattice_t *dag, int32 silpen, int32 fillpen) +{ + ps_latnode_t *node; + + for (node = dag->nodes; node; node = node->next) { + latlink_list_t *linklist; + if (node != dag->start && node != dag->end && dict_filler_word(dag->dict, node->basewid)) { + for (linklist = node->entries; linklist; linklist = linklist->next) + linklist->link->ascr += (node->basewid == dag->silence) ? silpen : fillpen; + } + } +} + +static void +delete_node(ps_lattice_t *dag, ps_latnode_t *node) +{ + latlink_list_t *x, *next_x; + + for (x = node->exits; x; x = next_x) { + next_x = x->next; + x->link->from = NULL; + listelem_free(dag->latlink_list_alloc, x); + } + for (x = node->entries; x; x = next_x) { + next_x = x->next; + x->link->to = NULL; + listelem_free(dag->latlink_list_alloc, x); + } + listelem_free(dag->latnode_alloc, node); +} + + +static void +remove_dangling_links(ps_lattice_t *dag, ps_latnode_t *node) +{ + latlink_list_t *x, *prev_x, *next_x; + + prev_x = NULL; + for (x = node->exits; x; x = next_x) { + next_x = x->next; + if (x->link->to == NULL) { + if (prev_x) + prev_x->next = next_x; + else + node->exits = next_x; + listelem_free(dag->latlink_alloc, x->link); + listelem_free(dag->latlink_list_alloc, x); + } + else + prev_x = x; + } + prev_x = NULL; + for (x = node->entries; x; x = next_x) { + next_x = x->next; + if (x->link->from == NULL) { + if (prev_x) + prev_x->next = next_x; + else + node->entries = next_x; + listelem_free(dag->latlink_alloc, x->link); + listelem_free(dag->latlink_list_alloc, x); + } + else + prev_x = x; + } +} + +void +ps_lattice_delete_unreachable(ps_lattice_t *dag) +{ + ps_latnode_t *node, *prev_node, *next_node; + int i; + + /* Remove unreachable nodes from the list of nodes. */ + prev_node = NULL; + for (node = dag->nodes; node; node = next_node) { + next_node = node->next; + if (!node->reachable) { + if (prev_node) + prev_node->next = next_node; + else + dag->nodes = next_node; + /* Delete this node and NULLify links to it. */ + delete_node(dag, node); + } + else + prev_node = node; + } + + /* Remove all links to and from unreachable nodes. */ + i = 0; + for (node = dag->nodes; node; node = node->next) { + /* Assign sequence numbers. */ + node->id = i++; + + /* We should obviously not encounter unreachable nodes here! */ + assert(node->reachable); + + /* Remove all links that go nowhere. */ + remove_dangling_links(dag, node); + } +} + +int32 +ps_lattice_write(ps_lattice_t *dag, char const *filename) +{ + FILE *fp; + int32 i; + ps_latnode_t *d, *initial, *final; + + initial = dag->start; + final = dag->end; + + E_INFO("Writing lattice file: %s\n", filename); + if ((fp = fopen(filename, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open lattice file '%s' for writing", filename); + return -1; + } + + /* Stupid Sphinx-III lattice code expects 'getcwd:' here */ + fprintf(fp, "# getcwd: /this/is/bogus\n"); + fprintf(fp, "# -logbase %e\n", logmath_get_base(dag->lmath)); + fprintf(fp, "#\n"); + + fprintf(fp, "Frames %d\n", dag->n_frames); + fprintf(fp, "#\n"); + + for (i = 0, d = dag->nodes; d; d = d->next, i++); + fprintf(fp, + "Nodes %d (NODEID WORD STARTFRAME FIRST-ENDFRAME LAST-ENDFRAME)\n", + i); + for (i = 0, d = dag->nodes; d; d = d->next, i++) { + d->id = i; + fprintf(fp, "%d %s %d %d %d ; %d\n", + i, dict_wordstr(dag->dict, d->wid), + d->sf, d->fef, d->lef, d->node_id); + } + fprintf(fp, "#\n"); + + fprintf(fp, "Initial %d\nFinal %d\n", initial->id, final->id); + fprintf(fp, "#\n"); + + /* Don't bother with this, it's not used by anything. */ + fprintf(fp, "BestSegAscr %d (NODEID ENDFRAME ASCORE)\n", + 0 /* #BPTable entries */ ); + fprintf(fp, "#\n"); + + fprintf(fp, "Edges (FROM-NODEID TO-NODEID ASCORE)\n"); + for (d = dag->nodes; d; d = d->next) { + latlink_list_t *l; + for (l = d->exits; l; l = l->next) { + if (l->link->ascr WORSE_THAN WORST_SCORE || l->link->ascr BETTER_THAN 0) + continue; + fprintf(fp, "%d %d %d\n", + d->id, l->link->to->id, l->link->ascr << SENSCR_SHIFT); + } + } + fprintf(fp, "End\n"); + fclose(fp); + + return 0; +} + +int32 +ps_lattice_write_htk(ps_lattice_t *dag, char const *filename) +{ + FILE *fp; + ps_latnode_t *d, *initial, *final; + int32 j, n_links, n_nodes; + + initial = dag->start; + final = dag->end; + + E_INFO("Writing lattice file: %s\n", filename); + if ((fp = fopen(filename, "w")) == NULL) { + E_ERROR_SYSTEM("Failed to open lattice file '%s' for writing", filename); + return -1; + } + + for (n_links = n_nodes = 0, d = dag->nodes; d; d = d->next) { + latlink_list_t *l; + if (!d->reachable) + continue; + d->id = n_nodes; + for (l = d->exits; l; l = l->next) { + if (l->link->to == NULL || !l->link->to->reachable) + continue; + if (l->link->ascr WORSE_THAN WORST_SCORE || l->link->ascr BETTER_THAN 0) + continue; + ++n_links; + } + ++n_nodes; + } + + fprintf(fp, "# Lattice generated by PocketSphinx\n"); + fprintf(fp, "#\n# Header\n#\n"); + fprintf(fp, "VERSION=1.0\n"); + fprintf(fp, "start=%d\n", initial->id); + fprintf(fp, "end=%d\n", final->id); + fprintf(fp, "#\n"); + + fprintf(fp, "N=%d\tL=%d\n", n_nodes, n_links); + fprintf(fp, "#\n# Node definitions\n#\n"); + for (d = dag->nodes; d; d = d->next) { + char const *word = dict_wordstr(dag->dict, d->wid); + char const *c = strrchr(word, '('); + int altpron = 1; + if (!d->reachable) + continue; + if (c) + altpron = atoi(c + 1); + word = dict_basestr(dag->dict, d->wid); + if (d->wid == dict_startwid(dag->dict)) + word = "!SENT_START"; + else if (d->wid == dict_finishwid(dag->dict)) + word = "!SENT_END"; + else if (dict_filler_word(dag->dict, d->wid)) + word = "!NULL"; + fprintf(fp, "I=%d\tt=%.2f\tW=%s\tv=%d\n", + d->id, (double)d->sf / dag->frate, + word, altpron); + } + fprintf(fp, "#\n# Link definitions\n#\n"); + for (j = 0, d = dag->nodes; d; d = d->next) { + latlink_list_t *l; + if (!d->reachable) + continue; + for (l = d->exits; l; l = l->next) { + if (l->link->to == NULL || !l->link->to->reachable) + continue; + if (l->link->ascr WORSE_THAN WORST_SCORE || l->link->ascr BETTER_THAN 0) + continue; + fprintf(fp, "J=%d\tS=%d\tE=%d\ta=%f\tp=%g\n", j++, + d->id, l->link->to->id, + logmath_log_to_ln(dag->lmath, l->link->ascr << SENSCR_SHIFT), + logmath_exp(dag->lmath, l->link->alpha + l->link->beta - dag->norm)); + } + } + fclose(fp); + + return 0; +} + +/* Read parameter from a lattice file*/ +static int +dag_param_read(lineiter_t *li, char *param) +{ + int32 n; + + while ((li = lineiter_next(li)) != NULL) { + char *c; + + /* Ignore comments. */ + if (li->buf[0] == '#') + continue; + + /* Find the first space. */ + c = strchr(li->buf, ' '); + if (c == NULL) continue; + + /* Check that the first field equals param and that there's a number after it. */ + if (strncmp(li->buf, param, strlen(param)) == 0 + && sscanf(c + 1, "%d", &n) == 1) + return n; + } + return -1; +} + +/* Mark every node that has a path to the argument dagnode as "reachable". */ +static void +dag_mark_reachable(ps_latnode_t * d) +{ + latlink_list_t *l; + + d->reachable = 1; + for (l = d->entries; l; l = l->next) + if (l->link->from && !l->link->from->reachable) + dag_mark_reachable(l->link->from); +} + +ps_lattice_t * +ps_lattice_read(ps_decoder_t *ps, + char const *file) +{ + FILE *fp; + int32 ispipe; + lineiter_t *line; + float64 lb; + float32 logratio; + ps_latnode_t **darray; + ps_lattice_t *dag; + int i, k, n_nodes; + int32 pip, silpen, fillpen; + ps_latnode_t **pnodes; + + dag = ckd_calloc(1, sizeof(*dag)); + + if (ps) { + dag->search = ps->search; + dag->dict = dict_retain(ps->dict); + dag->lmath = logmath_retain(ps->lmath); + dag->frate = cmd_ln_int32_r(dag->search->config, "-frate"); + } + else { + dag->dict = dict_init(NULL, NULL); + dag->lmath = logmath_init(1.0001, 0, FALSE); + dag->frate = 100; + } + dag->silence = dict_silwid(dag->dict); + dag->latnode_alloc = listelem_alloc_init(sizeof(ps_latnode_t)); + dag->latlink_alloc = listelem_alloc_init(sizeof(ps_latlink_t)); + dag->latlink_list_alloc = listelem_alloc_init(sizeof(latlink_list_t)); + dag->refcount = 1; + + darray = NULL; + + E_INFO("Reading DAG file: %s\n", file); + if ((fp = fopen_compchk(file, &ispipe)) == NULL) { + E_ERROR_SYSTEM("Failed to open DAG file '%s' for reading", file); + return NULL; + } + line = lineiter_start(fp); + + /* Read and verify logbase (ONE BIG HACK!!) */ + if (line == NULL) { + E_ERROR("Premature EOF(%s)\n", file); + goto load_error; + } + if (strncmp(line->buf, "# getcwd: ", 10) != 0) { + E_ERROR("%s does not begin with '# getcwd: '\n%s", file, line->buf); + goto load_error; + } + if ((line = lineiter_next(line)) == NULL) { + E_ERROR("Premature EOF(%s)\n", file); + goto load_error; + } + if ((strncmp(line->buf, "# -logbase ", 11) != 0) + || (sscanf(line->buf + 11, "%lf", &lb) != 1)) { + E_WARN("%s: Cannot find -logbase in header\n", file); + lb = 1.0001; + } + logratio = 1.0f; + if (dag->lmath == NULL) + dag->lmath = logmath_init(lb, 0, TRUE); + else { + float32 pb = logmath_get_base(dag->lmath); + if (fabs(lb - pb) >= 0.0001) { + E_WARN("Inconsistent logbases: %f vs %f: will compensate\n", lb, pb); + logratio = (float32)(log(lb) / log(pb)); + E_INFO("Lattice log ratio: %f\n", logratio); + } + } + /* Read Frames parameter */ + dag->n_frames = dag_param_read(line, "Frames"); + if (dag->n_frames <= 0) { + E_ERROR("Frames parameter missing or invalid\n"); + goto load_error; + } + /* Read Nodes parameter */ + n_nodes = dag_param_read(line, "Nodes"); + if (n_nodes <= 0) { + E_ERROR("Nodes parameter missing or invalid\n"); + goto load_error; + } + + /* Read nodes */ + darray = ckd_calloc(n_nodes, sizeof(*darray)); + pnodes = &dag->nodes; + for (i = 0; i < n_nodes; i++) { + int32 w; + int seqid, sf, fef, lef; + char wd[256]; + ps_latnode_t *node; + + if ((line = lineiter_next(line)) == NULL) { + E_ERROR("Premature EOF while loading Nodes(%s)\n", file); + goto load_error; + } + + if ((k = + sscanf(line->buf, "%d %255s %d %d %d", &seqid, wd, &sf, &fef, + &lef)) != 5) { + E_ERROR("Cannot parse line: %s, value of count %d\n", line->buf, k); + goto load_error; + } + + w = dict_wordid(dag->dict, wd); + if (w < 0) { + if (dag->search == NULL) { + char *ww = ckd_salloc(wd); + if (dict_word2basestr(ww) != -1) { + if (dict_wordid(dag->dict, ww) == BAD_S3WID) + dict_add_word(dag->dict, ww, NULL, 0); + } + ckd_free(ww); + w = dict_add_word(dag->dict, wd, NULL, 0); + } + if (w < 0) { + E_ERROR("Unknown word in line: %s\n", line->buf); + goto load_error; + } + } + + if (seqid != i) { + E_ERROR("Seqno error: %s\n", line->buf); + goto load_error; + } + + *pnodes = listelem_malloc(dag->latnode_alloc); + node = *pnodes; + darray[i] = node; + node->wid = w; + node->basewid = dict_basewid(dag->dict, w); + node->id = seqid; + node->sf = sf; + node->fef = fef; + node->lef = lef; + node->reachable = 0; + node->exits = node->entries = NULL; + node->next = NULL; + pnodes = &node->next; + } + + /* Read initial node ID */ + k = dag_param_read(line, "Initial"); + if ((k < 0) || (k >= n_nodes)) { + E_ERROR("Initial node parameter missing or invalid\n"); + goto load_error; + } + dag->start = darray[k]; + + /* Read final node ID */ + k = dag_param_read(line, "Final"); + if ((k < 0) || (k >= n_nodes)) { + E_ERROR("Final node parameter missing or invalid\n"); + goto load_error; + } + dag->end = darray[k]; + + /* Read bestsegscore entries and ignore them. */ + if ((k = dag_param_read(line, "BestSegAscr")) < 0) { + E_ERROR("BestSegAscr parameter missing\n"); + goto load_error; + } + for (i = 0; i < k; i++) { + if ((line = lineiter_next(line)) == NULL) { + E_ERROR("Premature EOF while (%s) ignoring BestSegAscr\n", + line); + goto load_error; + } + } + + /* Read in edges. */ + while ((line = lineiter_next(line)) != NULL) { + if (line->buf[0] == '#') + continue; + if (0 == strncmp(line->buf, "Edges", 5)) + break; + } + if (line == NULL) { + E_ERROR("Edges missing\n"); + goto load_error; + } + while ((line = lineiter_next(line)) != NULL) { + int from, to, ascr; + ps_latnode_t *pd, *d; + + if (sscanf(line->buf, "%d %d %d", &from, &to, &ascr) != 3) + break; + if (ascr WORSE_THAN WORST_SCORE) + continue; + pd = darray[from]; + d = darray[to]; + if (logratio != 1.0f) + ascr = (int32)(ascr * logratio); + ps_lattice_link(dag, pd, d, ascr, d->sf - 1); + } + if (strcmp(line->buf, "End\n") != 0) { + E_ERROR("Terminating 'End' missing\n"); + goto load_error; + } + lineiter_free(line); + fclose_comp(fp, ispipe); + ckd_free(darray); + + /* Minor hack: If the final node is a filler word and not , + * then set its base word ID to , so that the language model + * scores won't be screwed up. */ + if (dict_filler_word(dag->dict, dag->end->wid)) + dag->end->basewid = dag->search + ? ps_search_finish_wid(dag->search) + : dict_wordid(dag->dict, S3_FINISH_WORD); + + /* Mark reachable from dag->end */ + dag_mark_reachable(dag->end); + + /* Free nodes unreachable from dag->end and their links */ + ps_lattice_delete_unreachable(dag); + + if (ps) { + /* Build links around silence and filler words, since they do + * not exist in the language model. FIXME: This is + * potentially buggy, as we already do this before outputting + * lattices. */ + pip = logmath_log(dag->lmath, cmd_ln_float32_r(ps->config, "-pip")); + silpen = pip + logmath_log(dag->lmath, + cmd_ln_float32_r(ps->config, "-silprob")); + fillpen = pip + logmath_log(dag->lmath, + cmd_ln_float32_r(ps->config, "-fillprob")); + ps_lattice_penalize_fillers(dag, silpen, fillpen); + } + + return dag; + + load_error: + E_ERROR("Failed to load %s\n", file); + lineiter_free(line); + fclose_comp(fp, ispipe); + ckd_free(darray); + return NULL; +} + +int +ps_lattice_n_frames(ps_lattice_t *dag) +{ + return dag->n_frames; +} + +ps_lattice_t * +ps_lattice_init_search(ps_search_t *search, int n_frame) +{ + ps_lattice_t *dag; + + dag = ckd_calloc(1, sizeof(*dag)); + dag->search = search; + dag->dict = dict_retain(search->dict); + dag->lmath = logmath_retain(search->acmod->lmath); + dag->frate = cmd_ln_int32_r(dag->search->config, "-frate"); + dag->silence = dict_silwid(dag->dict); + dag->n_frames = n_frame; + dag->latnode_alloc = listelem_alloc_init(sizeof(ps_latnode_t)); + dag->latlink_alloc = listelem_alloc_init(sizeof(ps_latlink_t)); + dag->latlink_list_alloc = listelem_alloc_init(sizeof(latlink_list_t)); + dag->refcount = 1; + return dag; +} + +ps_lattice_t * +ps_lattice_retain(ps_lattice_t *dag) +{ + ++dag->refcount; + return dag; +} + +int +ps_lattice_free(ps_lattice_t *dag) +{ + if (dag == NULL) + return 0; + if (--dag->refcount > 0) + return dag->refcount; + logmath_free(dag->lmath); + dict_free(dag->dict); + listelem_alloc_free(dag->latnode_alloc); + listelem_alloc_free(dag->latlink_alloc); + listelem_alloc_free(dag->latlink_list_alloc); + ckd_free(dag->hyp_str); + ckd_free(dag); + return 0; +} + +logmath_t * +ps_lattice_get_logmath(ps_lattice_t *dag) +{ + return dag->lmath; +} + +ps_latnode_iter_t * +ps_latnode_iter(ps_lattice_t *dag) +{ + return dag->nodes; +} + +ps_latnode_iter_t * +ps_latnode_iter_next(ps_latnode_iter_t *itor) +{ + return itor->next; +} + +void +ps_latnode_iter_free(ps_latnode_iter_t *itor) +{ + /* Do absolutely nothing. */ + (void)itor; +} + +ps_latnode_t * +ps_latnode_iter_node(ps_latnode_iter_t *itor) +{ + return itor; +} + +int +ps_latnode_times(ps_latnode_t *node, int16 *out_fef, int16 *out_lef) +{ + if (out_fef) *out_fef = (int16)node->fef; + if (out_lef) *out_lef = (int16)node->lef; + return node->sf; +} + +char const * +ps_latnode_word(ps_lattice_t *dag, ps_latnode_t *node) +{ + return dict_wordstr(dag->dict, node->wid); +} + +char const * +ps_latnode_baseword(ps_lattice_t *dag, ps_latnode_t *node) +{ + return dict_wordstr(dag->dict, node->basewid); +} + +int32 +ps_latnode_prob(ps_lattice_t *dag, ps_latnode_t *node, + ps_latlink_t **out_link) +{ + latlink_list_t *links; + int32 bestpost = logmath_get_zero(dag->lmath); + + for (links = node->exits; links; links = links->next) { + int32 post = links->link->alpha + links->link->beta - dag->norm; + if (post > bestpost) { + if (out_link) *out_link = links->link; + bestpost = post; + } + } + return bestpost; +} + +ps_latlink_iter_t * +ps_latnode_exits(ps_latnode_t *node) +{ + return node->exits; +} + +ps_latlink_iter_t * +ps_latnode_entries(ps_latnode_t *node) +{ + return node->entries; +} + +ps_latlink_iter_t * +ps_latlink_iter_next(ps_latlink_iter_t *itor) +{ + return itor->next; +} + +void +ps_latlink_iter_free(ps_latlink_iter_t *itor) +{ + /* Do absolutely nothing. */ + (void)itor; +} + +ps_latlink_t * +ps_latlink_iter_link(ps_latlink_iter_t *itor) +{ + return itor->link; +} + +int +ps_latlink_times(ps_latlink_t *link, int16 *out_sf) +{ + if (out_sf) { + if (link->from) { + *out_sf = link->from->sf; + } + else { + *out_sf = 0; + } + } + return link->ef; +} + +ps_latnode_t * +ps_latlink_nodes(ps_latlink_t *link, ps_latnode_t **out_src) +{ + if (out_src) *out_src = link->from; + return link->to; +} + +char const * +ps_latlink_word(ps_lattice_t *dag, ps_latlink_t *link) +{ + if (link->from == NULL) + return NULL; + return dict_wordstr(dag->dict, link->from->wid); +} + +char const * +ps_latlink_baseword(ps_lattice_t *dag, ps_latlink_t *link) +{ + if (link->from == NULL) + return NULL; + return dict_wordstr(dag->dict, link->from->basewid); +} + +ps_latlink_t * +ps_latlink_pred(ps_latlink_t *link) +{ + return link->best_prev; +} + +int32 +ps_latlink_prob(ps_lattice_t *dag, ps_latlink_t *link, int32 *out_ascr) +{ + int32 post = link->alpha + link->beta - dag->norm; + if (out_ascr) *out_ascr = link->ascr << SENSCR_SHIFT; + return post; +} + +char const * +ps_lattice_hyp(ps_lattice_t *dag, ps_latlink_t *link) +{ + ps_latlink_t *l; + size_t len; + char *c; + + /* Backtrace once to get hypothesis length. */ + len = 0; + /* FIXME: There may not be a search, but actually there should be a dict. */ + if (dict_real_word(dag->dict, link->to->basewid)) { + char *wstr = dict_wordstr(dag->dict, link->to->basewid); + if (wstr != NULL) + len += strlen(wstr) + 1; + } + for (l = link; l; l = l->best_prev) { + if (dict_real_word(dag->dict, l->from->basewid)) { + char *wstr = dict_wordstr(dag->dict, l->from->basewid); + if (wstr != NULL) + len += strlen(wstr) + 1; + } + } + + /* Backtrace again to construct hypothesis string. */ + ckd_free(dag->hyp_str); + dag->hyp_str = ckd_calloc(1, len+1); /* extra one incase the hyp is empty */ + c = dag->hyp_str + len - 1; + if (dict_real_word(dag->dict, link->to->basewid)) { + char *wstr = dict_wordstr(dag->dict, link->to->basewid); + if (wstr != NULL) { + len = strlen(wstr); + c -= len; + memcpy(c, wstr, len); + if (c > dag->hyp_str) { + --c; + *c = ' '; + } + } + } + for (l = link; l; l = l->best_prev) { + if (dict_real_word(dag->dict, l->from->basewid)) { + char *wstr = dict_wordstr(dag->dict, l->from->basewid); + if (wstr != NULL) { + len = strlen(wstr); + c -= len; + memcpy(c, wstr, len); + if (c > dag->hyp_str) { + --c; + *c = ' '; + } + } + } + } + + return dag->hyp_str; +} + +static void +ps_lattice_compute_lscr(ps_seg_t *seg, ps_latlink_t *link, int to) +{ + ngram_model_t *lmset; + + /* Language model score is included in the link score for FSG + * search. FIXME: Of course, this is sort of a hack :( */ + if (0 != strcmp(ps_search_type(seg->search), PS_SEARCH_TYPE_NGRAM)) { + seg->lback = 1; /* Unigram... */ + seg->lscr = 0; + return; + } + + lmset = ((ngram_search_t *)seg->search)->lmset; + + if (link->best_prev == NULL) { + if (to) /* Sentence has only two words. */ + seg->lscr = ngram_bg_score(lmset, link->to->basewid, + link->from->basewid, &seg->lback) + >> SENSCR_SHIFT; + else {/* This is the start symbol, its lscr is always 0. */ + seg->lscr = 0; + seg->lback = 1; + } + } + else { + /* Find the two predecessor words. */ + if (to) { + seg->lscr = ngram_tg_score(lmset, link->to->basewid, + link->from->basewid, + link->best_prev->from->basewid, + &seg->lback) >> SENSCR_SHIFT; + } + else { + if (link->best_prev->best_prev) + seg->lscr = ngram_tg_score(lmset, link->from->basewid, + link->best_prev->from->basewid, + link->best_prev->best_prev->from->basewid, + &seg->lback) >> SENSCR_SHIFT; + else + seg->lscr = ngram_bg_score(lmset, link->from->basewid, + link->best_prev->from->basewid, + &seg->lback) >> SENSCR_SHIFT; + } + } +} + +static void +ps_lattice_link2itor(ps_seg_t *seg, ps_latlink_t *link, int to) +{ + dag_seg_t *itor = (dag_seg_t *)seg; + ps_latnode_t *node; + + if (to) { + node = link->to; + seg->ef = node->lef; + seg->prob = 0; /* norm + beta - norm */ + } + else { + latlink_list_t *x; + ps_latnode_t *n; + logmath_t *lmath = ps_search_acmod(seg->search)->lmath; + + node = link->from; + seg->ef = link->ef; + seg->prob = link->alpha + link->beta - itor->norm; + /* Sum over all exits for this word and any alternate + pronunciations at the same frame. */ + for (n = node; n; n = n->alt) { + for (x = n->exits; x; x = x->next) { + if (x->link == link) + continue; + seg->prob = logmath_add(lmath, seg->prob, + x->link->alpha + x->link->beta - itor->norm); + } + } + } + seg->word = dict_wordstr(ps_search_dict(seg->search), node->wid); + seg->sf = node->sf; + seg->ascr = link->ascr << SENSCR_SHIFT; + /* Compute language model score from best predecessors. */ + ps_lattice_compute_lscr(seg, link, to); +} + +static void +ps_lattice_seg_free(ps_seg_t *seg) +{ + dag_seg_t *itor = (dag_seg_t *)seg; + + ckd_free(itor->links); + ckd_free(itor); +} + +static ps_seg_t * +ps_lattice_seg_next(ps_seg_t *seg) +{ + dag_seg_t *itor = (dag_seg_t *)seg; + + ++itor->cur; + if (itor->cur == itor->n_links + 1) { + ps_lattice_seg_free(seg); + return NULL; + } + else if (itor->cur == itor->n_links) { + /* Re-use the last link but with the "to" node. */ + ps_lattice_link2itor(seg, itor->links[itor->cur - 1], TRUE); + } + else { + ps_lattice_link2itor(seg, itor->links[itor->cur], FALSE); + } + + return seg; +} + +static ps_segfuncs_t ps_lattice_segfuncs = { + /* seg_next */ ps_lattice_seg_next, + /* seg_free */ ps_lattice_seg_free +}; + +ps_seg_t * +ps_lattice_seg_iter(ps_lattice_t *dag, ps_latlink_t *link, float32 lwf) +{ + dag_seg_t *itor; + ps_latlink_t *l; + int cur; + + /* Calling this an "iterator" is a bit of a misnomer since we have + * to get the entire backtrace in order to produce it. + */ + itor = ckd_calloc(1, sizeof(*itor)); + itor->base.vt = &ps_lattice_segfuncs; + itor->base.search = dag->search; + itor->base.lwf = lwf; + itor->n_links = 0; + itor->norm = dag->norm; + + for (l = link; l; l = l->best_prev) { + ++itor->n_links; + } + if (itor->n_links == 0) { + ckd_free(itor); + return NULL; + } + + itor->links = ckd_calloc(itor->n_links, sizeof(*itor->links)); + cur = itor->n_links - 1; + for (l = link; l; l = l->best_prev) { + itor->links[cur] = l; + --cur; + } + + ps_lattice_link2itor((ps_seg_t *)itor, itor->links[0], FALSE); + return (ps_seg_t *)itor; +} + +latlink_list_t * +latlink_list_new(ps_lattice_t *dag, ps_latlink_t *link, latlink_list_t *next) +{ + latlink_list_t *ll; + + ll = listelem_malloc(dag->latlink_list_alloc); + ll->link = link; + ll->next = next; + + return ll; +} + +void +ps_lattice_pushq(ps_lattice_t *dag, ps_latlink_t *link) +{ + if (dag->q_head == NULL) + dag->q_head = dag->q_tail = latlink_list_new(dag, link, NULL); + else { + dag->q_tail->next = latlink_list_new(dag, link, NULL); + dag->q_tail = dag->q_tail->next; + } + +} + +ps_latlink_t * +ps_lattice_popq(ps_lattice_t *dag) +{ + latlink_list_t *x; + ps_latlink_t *link; + + if (dag->q_head == NULL) + return NULL; + link = dag->q_head->link; + x = dag->q_head->next; + listelem_free(dag->latlink_list_alloc, dag->q_head); + dag->q_head = x; + if (dag->q_head == NULL) + dag->q_tail = NULL; + return link; +} + +void +ps_lattice_delq(ps_lattice_t *dag) +{ + while (ps_lattice_popq(dag)) { + /* Do nothing. */ + } +} + +ps_latlink_t * +ps_lattice_traverse_edges(ps_lattice_t *dag, ps_latnode_t *start, ps_latnode_t *end) +{ + ps_latnode_t *node; + latlink_list_t *x; + + /* Cancel any unfinished traversal. */ + ps_lattice_delq(dag); + + /* Initialize node fanin counts and path scores. */ + for (node = dag->nodes; node; node = node->next) + node->info.fanin = 0; + for (node = dag->nodes; node; node = node->next) { + for (x = node->exits; x; x = x->next) + (x->link->to->info.fanin)++; + } + + /* Initialize agenda with all exits from start. */ + if (start == NULL) start = dag->start; + for (x = start->exits; x; x = x->next) + ps_lattice_pushq(dag, x->link); + + /* Pull the first edge off the queue. */ + return ps_lattice_traverse_next(dag, end); +} + +ps_latlink_t * +ps_lattice_traverse_next(ps_lattice_t *dag, ps_latnode_t *end) +{ + ps_latlink_t *next; + + next = ps_lattice_popq(dag); + if (next == NULL) + return NULL; + + /* Decrease fanin count for destination node and expand outgoing + * edges if all incoming edges have been seen. */ + --next->to->info.fanin; + if (next->to->info.fanin == 0) { + latlink_list_t *x; + + if (end == NULL) end = dag->end; + if (next->to == end) { + /* If we have traversed all links entering the end node, + * clear the queue, causing future calls to this function + * to return NULL. */ + ps_lattice_delq(dag); + return next; + } + + /* Extend all outgoing edges. */ + for (x = next->to->exits; x; x = x->next) + ps_lattice_pushq(dag, x->link); + } + return next; +} + +ps_latlink_t * +ps_lattice_reverse_edges(ps_lattice_t *dag, ps_latnode_t *start, ps_latnode_t *end) +{ + ps_latnode_t *node; + latlink_list_t *x; + + /* Cancel any unfinished traversal. */ + ps_lattice_delq(dag); + + /* Initialize node fanout counts and path scores. */ + for (node = dag->nodes; node; node = node->next) { + node->info.fanin = 0; + for (x = node->exits; x; x = x->next) + ++node->info.fanin; + } + + /* Initialize agenda with all entries from end. */ + if (end == NULL) end = dag->end; + for (x = end->entries; x; x = x->next) + ps_lattice_pushq(dag, x->link); + + /* Pull the first edge off the queue. */ + return ps_lattice_reverse_next(dag, start); +} + +ps_latlink_t * +ps_lattice_reverse_next(ps_lattice_t *dag, ps_latnode_t *start) +{ + ps_latlink_t *next; + + next = ps_lattice_popq(dag); + if (next == NULL) + return NULL; + + /* Decrease fanout count for source node and expand incoming + * edges if all incoming edges have been seen. */ + --next->from->info.fanin; + if (next->from->info.fanin == 0) { + latlink_list_t *x; + + if (start == NULL) start = dag->start; + if (next->from == start) { + /* If we have traversed all links entering the start node, + * clear the queue, causing future calls to this function + * to return NULL. */ + ps_lattice_delq(dag); + return next; + } + + /* Extend all outgoing edges. */ + for (x = next->from->entries; x; x = x->next) + ps_lattice_pushq(dag, x->link); + } + return next; +} + +/* + * Find the best score from dag->start to end point of any link and + * use it to update links further down the path. This is like + * single-source shortest path search, except that it is done over + * edges rather than nodes, which allows us to do exact trigram scoring. + * + * Helpfully enough, we get half of the posterior probability + * calculation for free that way too. (interesting research topic: is + * there a reliable Viterbi analogue to word-level Forward-Backward + * like there is for state-level? Or, is it just lattice density?) + */ +ps_latlink_t * +ps_lattice_bestpath(ps_lattice_t *dag, ngram_model_t *lmset, + float32 lwf, float32 ascale) +{ + ps_search_t *search; + ps_latnode_t *node; + ps_latlink_t *link; + ps_latlink_t *bestend; + latlink_list_t *x; + logmath_t *lmath; + int32 bestescr; + + search = dag->search; + lmath = dag->lmath; + + /* Initialize path scores for all links exiting dag->start, and + * set all other scores to the minimum. Also initialize alphas to + * log-zero. */ + for (node = dag->nodes; node; node = node->next) { + for (x = node->exits; x; x = x->next) { + x->link->path_scr = MAX_NEG_INT32; + x->link->alpha = logmath_get_zero(lmath); + } + } + for (x = dag->start->exits; x; x = x->next) { + int32 n_used; + int16 to_is_fil; + + to_is_fil = dict_filler_word(ps_search_dict(search), x->link->to->basewid) && x->link->to != dag->end; + + /* Best path points to dag->start, obviously. */ + x->link->path_scr = x->link->ascr; + if (lmset && !to_is_fil) + x->link->path_scr += (ngram_bg_score(lmset, x->link->to->basewid, + ps_search_start_wid(search), &n_used) >> SENSCR_SHIFT) * lwf; + x->link->best_prev = NULL; + /* No predecessors for start links. */ + x->link->alpha = 0; + } + + /* Traverse the edges in the graph, updating path scores. */ + for (link = ps_lattice_traverse_edges(dag, NULL, NULL); + link; link = ps_lattice_traverse_next(dag, NULL)) { + int32 bprob, n_used; + int32 w3_wid, w2_wid; + int16 w3_is_fil, w2_is_fil; + ps_latlink_t *prev_link; + + /* Sanity check, we should not be traversing edges that + * weren't previously updated, otherwise nasty overflows will result. */ + assert(link->path_scr != MAX_NEG_INT32); + + /* Find word predecessor if from-word is filler */ + w3_wid = link->from->basewid; + w2_wid = link->to->basewid; + w3_is_fil = dict_filler_word(ps_search_dict(search), link->from->basewid) && link->from != dag->start; + w2_is_fil = dict_filler_word(ps_search_dict(search), w2_wid) && link->to != dag->end; + prev_link = link; + + if (w3_is_fil) { + while (prev_link->best_prev != NULL) { + prev_link = prev_link->best_prev; + w3_wid = prev_link->from->basewid; + if (!dict_filler_word(ps_search_dict(search), w3_wid) || prev_link->from == dag->start) { + w3_is_fil = FALSE; + break; + } + } + } + + /* Calculate common bigram probability for all alphas. */ + if (lmset && !w3_is_fil && !w2_is_fil) + bprob = ngram_ng_prob(lmset, w2_wid, &w3_wid, 1, &n_used); + else + bprob = 0; + /* Add in this link's acoustic score, which was a constant + factor in previous computations (if any). */ + link->alpha += (link->ascr << SENSCR_SHIFT) * ascale; + + if (w2_is_fil) { + w2_is_fil = w3_is_fil; + w3_is_fil = TRUE; + w2_wid = w3_wid; + while (prev_link->best_prev != NULL) { + prev_link = prev_link->best_prev; + w3_wid = prev_link->from->basewid; + if (!dict_filler_word(ps_search_dict(search), w3_wid) || prev_link->from == dag->start) { + w3_is_fil = FALSE; + break; + } + } + } + + /* Update scores for all paths exiting link->to. */ + for (x = link->to->exits; x; x = x->next) { + int32 score; + int32 w1_wid; + int16 w1_is_fil; + + w1_wid = x->link->to->basewid; + w1_is_fil = dict_filler_word(ps_search_dict(search), w1_wid) && x->link->to != dag->end; + + /* Update alpha with sum of previous alphas. */ + x->link->alpha = logmath_add(lmath, x->link->alpha, link->alpha + bprob); + + /* Update link score with maximum link score. */ + score = link->path_scr + x->link->ascr; + /* Calculate language score for bestpath if possible */ + if (lmset && !w1_is_fil && !w2_is_fil) { + if (w3_is_fil) + /* partial context available */ + score += (ngram_bg_score(lmset, w1_wid, w2_wid, &n_used) >> SENSCR_SHIFT) * lwf; + else + /* full context available */ + score += (ngram_tg_score(lmset, w1_wid, w2_wid, w3_wid, &n_used) >> SENSCR_SHIFT) * lwf; + } + + if (score BETTER_THAN x->link->path_scr) { + x->link->path_scr = score; + x->link->best_prev = link; + } + } + } + + /* Find best link entering final node, and calculate normalizer + * for posterior probabilities. */ + bestend = NULL; + bestescr = MAX_NEG_INT32; + + /* Normalizer is the alpha for the imaginary link exiting the + final node. */ + dag->norm = logmath_get_zero(lmath); + for (x = dag->end->entries; x; x = x->next) { + int32 bprob, n_used; + int32 from_wid; + int16 from_is_fil; + + from_wid = x->link->from->basewid; + from_is_fil = dict_filler_word(ps_search_dict(search), from_wid) && x->link->from != dag->start; + if (from_is_fil) { + ps_latlink_t *prev_link = x->link; + while (prev_link->best_prev != NULL) { + prev_link = prev_link->best_prev; + from_wid = prev_link->from->basewid; + if (!dict_filler_word(ps_search_dict(search), from_wid) || prev_link->from == dag->start) { + from_is_fil = FALSE; + break; + } + } + } + + if (lmset && !from_is_fil) + bprob = ngram_ng_prob(lmset, + x->link->to->basewid, + &from_wid, 1, &n_used); + else + bprob = 0; + dag->norm = logmath_add(lmath, dag->norm, x->link->alpha + bprob); + if (x->link->path_scr BETTER_THAN bestescr) { + bestescr = x->link->path_scr; + bestend = x->link; + } + } + /* FIXME: floating point... */ + dag->norm += (int32)(dag->final_node_ascr << SENSCR_SHIFT) * ascale; + + E_INFO("Bestpath score: %d\n", bestescr); + E_INFO("Normalizer P(O) = alpha(%s:%d:%d) = %d\n", + dict_wordstr(dag->search->dict, dag->end->wid), + dag->end->sf, dag->end->lef, + dag->norm); + return bestend; +} + +static int32 +ps_lattice_joint(ps_lattice_t *dag, ps_latlink_t *link, float32 ascale) +{ + ngram_model_t *lmset; + int32 jprob; + + /* Sort of a hack... */ + if (dag->search && 0 == strcmp(ps_search_type(dag->search), PS_SEARCH_TYPE_NGRAM)) + lmset = ((ngram_search_t *)dag->search)->lmset; + else + lmset = NULL; + + jprob = (dag->final_node_ascr << SENSCR_SHIFT) * ascale; + while (link) { + if (lmset) { + int lback; + int32 from_wid, to_wid; + int16 from_is_fil, to_is_fil; + + from_wid = link->from->basewid; + to_wid = link->to->basewid; + from_is_fil = dict_filler_word(dag->dict, from_wid) && link->from != dag->start; + to_is_fil = dict_filler_word(dag->dict, to_wid) && link->to != dag->end; + + /* Find word predecessor if from-word is filler */ + if (!to_is_fil && from_is_fil) { + ps_latlink_t *prev_link = link; + while (prev_link->best_prev != NULL) { + prev_link = prev_link->best_prev; + from_wid = prev_link->from->basewid; + if (!dict_filler_word(dag->dict, from_wid) || prev_link->from == dag->start) { + from_is_fil = FALSE; + break; + } + } + } + + /* Compute unscaled language model probability. Note that + this is actually not the language model probability + that corresponds to this link, but that is okay, + because we are just taking the sum over all links in + the best path. */ + if (!from_is_fil && !to_is_fil) + jprob += ngram_ng_prob(lmset, to_wid, + &from_wid, 1, &lback); + } + /* If there is no language model, we assume that the language + model probability (such as it is) has been included in the + link score. */ + jprob += (link->ascr << SENSCR_SHIFT) * ascale; + link = link->best_prev; + } + + E_INFO("Joint P(O,S) = %d P(S|O) = %d\n", jprob, jprob - dag->norm); + return jprob; +} + +int32 +ps_lattice_posterior(ps_lattice_t *dag, ngram_model_t *lmset, + float32 ascale) +{ + logmath_t *lmath; + ps_latnode_t *node; + ps_latlink_t *link; + latlink_list_t *x; + ps_latlink_t *bestend; + int32 bestescr; + + lmath = dag->lmath; + + /* Reset all betas to zero. */ + for (node = dag->nodes; node; node = node->next) { + for (x = node->exits; x; x = x->next) { + x->link->beta = logmath_get_zero(lmath); + } + } + + bestend = NULL; + bestescr = MAX_NEG_INT32; + /* Accumulate backward probabilities for all links. */ + for (link = ps_lattice_reverse_edges(dag, NULL, NULL); + link; link = ps_lattice_reverse_next(dag, NULL)) { + int32 bprob, n_used; + int32 from_wid, to_wid; + int16 from_is_fil, to_is_fil; + + from_wid = link->from->basewid; + to_wid = link->to->basewid; + from_is_fil = dict_filler_word(dag->dict, from_wid) && link->from != dag->start; + to_is_fil = dict_filler_word(dag->dict, to_wid) && link->to != dag->end; + + /* Find word predecessor if from-word is filler */ + if (!to_is_fil && from_is_fil) { + ps_latlink_t *prev_link = link; + while (prev_link->best_prev != NULL) { + prev_link = prev_link->best_prev; + from_wid = prev_link->from->basewid; + if (!dict_filler_word(dag->dict, from_wid) || prev_link->from == dag->start) { + from_is_fil = FALSE; + break; + } + } + } + + /* Calculate LM probability. */ + if (lmset && !from_is_fil && !to_is_fil) + bprob = ngram_ng_prob(lmset, to_wid, &from_wid, 1, &n_used); + else + bprob = 0; + + if (link->to == dag->end) { + /* Track the best path - we will backtrace in order to + calculate the unscaled joint probability for sentence + posterior. */ + if (link->path_scr BETTER_THAN bestescr) { + bestescr = link->path_scr; + bestend = link; + } + /* Imaginary exit link from final node has beta = 1.0 */ + link->beta = bprob + (dag->final_node_ascr << SENSCR_SHIFT) * ascale; + } + else { + /* Update beta from all outgoing betas. */ + for (x = link->to->exits; x; x = x->next) { + link->beta = logmath_add(lmath, link->beta, + x->link->beta + bprob + + (x->link->ascr << SENSCR_SHIFT) * ascale); + } + } + } + + /* Return P(S|O) = P(O,S)/P(O) */ + return ps_lattice_joint(dag, bestend, ascale) - dag->norm; +} + +int32 +ps_lattice_posterior_prune(ps_lattice_t *dag, int32 beam) +{ + ps_latlink_t *link; + int npruned = 0; + + for (link = ps_lattice_traverse_edges(dag, dag->start, dag->end); + link; link = ps_lattice_traverse_next(dag, dag->end)) { + link->from->reachable = FALSE; + if (link->alpha + link->beta - dag->norm < beam) { + latlink_list_t *x, *tmp, *next; + tmp = NULL; + for (x = link->from->exits; x; x = next) { + next = x->next; + if (x->link == link) { + listelem_free(dag->latlink_list_alloc, x); + } + else { + x->next = tmp; + tmp = x; + } + } + link->from->exits = tmp; + tmp = NULL; + for (x = link->to->entries; x; x = next) { + next = x->next; + if (x->link == link) { + listelem_free(dag->latlink_list_alloc, x); + } + else { + x->next = tmp; + tmp = x; + } + } + link->to->entries = tmp; + listelem_free(dag->latlink_alloc, link); + ++npruned; + } + } + dag_mark_reachable(dag->end); + ps_lattice_delete_unreachable(dag); + return npruned; +} + + +/* Parameters to prune n-best alternatives search */ +#define MAX_PATHS 500 /* Max allowed active paths at any time */ +#define MAX_HYP_TRIES 10000 + +/* + * For each node in any path between from and end of utt, find the + * best score from "from".sf to end of utt. (NOTE: Uses bigram probs; + * this is an estimate of the best score from "from".) (NOTE #2: yes, + * this is the "heuristic score" used in A* search) + */ +static int32 +best_rem_score(ps_astar_t *nbest, ps_latnode_t * from) +{ + latlink_list_t *x; + int32 bestscore, score; + + if (from->info.rem_score <= 0) + return (from->info.rem_score); + + /* Best score from "from" to end of utt not known; compute from successors */ + bestscore = WORST_SCORE; + for (x = from->exits; x; x = x->next) { + int32 n_used; + + score = best_rem_score(nbest, x->link->to); + score += x->link->ascr; + if (nbest->lmset) + score += (ngram_bg_score(nbest->lmset, x->link->to->basewid, + from->basewid, &n_used) >> SENSCR_SHIFT) + * nbest->lwf; + if (score BETTER_THAN bestscore) + bestscore = score; + } + from->info.rem_score = bestscore; + + return bestscore; +} + +/* + * Insert newpath in sorted (by path score) list of paths. But if newpath is + * too far down the list, drop it (FIXME: necessary?) + * total_score = path score (newpath) + rem_score to end of utt. + */ +static void +path_insert(ps_astar_t *nbest, ps_latpath_t *newpath, int32 total_score) +{ + ps_latpath_t *prev, *p; + int32 i; + + prev = NULL; + for (i = 0, p = nbest->path_list; (i < MAX_PATHS) && p; p = p->next, i++) { + if ((p->score + p->node->info.rem_score) < total_score) + break; + prev = p; + } + + /* newpath should be inserted between prev and p */ + if (i < MAX_PATHS) { + /* Insert new partial hyp */ + newpath->next = p; + if (!prev) + nbest->path_list = newpath; + else + prev->next = newpath; + if (!p) + nbest->path_tail = newpath; + + nbest->n_path++; + nbest->n_hyp_insert++; + nbest->insert_depth += i; + } + else { + /* newpath score too low; reject it and also prune paths beyond MAX_PATHS */ + nbest->path_tail = prev; + prev->next = NULL; + nbest->n_path = MAX_PATHS; + listelem_free(nbest->latpath_alloc, newpath); + + nbest->n_hyp_reject++; + for (; p; p = newpath) { + newpath = p->next; + listelem_free(nbest->latpath_alloc, p); + nbest->n_hyp_reject++; + } + } +} + +/* Find all possible extensions to given partial path */ +static void +path_extend(ps_astar_t *nbest, ps_latpath_t * path) +{ + latlink_list_t *x; + ps_latpath_t *newpath; + int32 total_score, tail_score; + + /* Consider all successors of path->node */ + for (x = path->node->exits; x; x = x->next) { + int32 n_used; + + /* Skip successor if no path from it reaches the final node */ + if (x->link->to->info.rem_score <= WORST_SCORE) + continue; + + /* Create path extension and compute exact score for this extension */ + newpath = listelem_malloc(nbest->latpath_alloc); + newpath->node = x->link->to; + newpath->parent = path; + newpath->score = path->score + x->link->ascr; + if (nbest->lmset) { + if (path->parent) { + newpath->score += nbest->lwf + * (ngram_tg_score(nbest->lmset, newpath->node->basewid, + path->node->basewid, + path->parent->node->basewid, &n_used) + >> SENSCR_SHIFT); + } + else + newpath->score += nbest->lwf + * (ngram_bg_score(nbest->lmset, newpath->node->basewid, + path->node->basewid, &n_used) + >> SENSCR_SHIFT); + } + + /* Insert new partial path hypothesis into sorted path_list */ + nbest->n_hyp_tried++; + total_score = newpath->score + newpath->node->info.rem_score; + + /* First see if hyp would be worse than the worst */ + if (nbest->n_path >= MAX_PATHS) { + tail_score = + nbest->path_tail->score + + nbest->path_tail->node->info.rem_score; + if (total_score < tail_score) { + listelem_free(nbest->latpath_alloc, newpath); + nbest->n_hyp_reject++; + continue; + } + } + + path_insert(nbest, newpath, total_score); + } +} + +ps_astar_t * +ps_astar_start(ps_lattice_t *dag, + ngram_model_t *lmset, + float32 lwf, + int sf, int ef, + int w1, int w2) +{ + ps_astar_t *nbest; + ps_latnode_t *node; + + nbest = ckd_calloc(1, sizeof(*nbest)); + nbest->dag = dag; + nbest->lmset = lmset; + nbest->lwf = lwf; + nbest->sf = sf; + if (ef < 0) + nbest->ef = dag->n_frames + 1; + else + nbest->ef = ef; + nbest->w1 = w1; + nbest->w2 = w2; + nbest->latpath_alloc = listelem_alloc_init(sizeof(ps_latpath_t)); + + /* Initialize rem_score (A* heuristic) to default values */ + for (node = dag->nodes; node; node = node->next) { + if (node == dag->end) + node->info.rem_score = 0; + else if (node->exits == NULL) + node->info.rem_score = WORST_SCORE; + else + node->info.rem_score = 1; /* +ve => unknown value */ + } + + /* Create initial partial hypotheses list consisting of nodes starting at sf */ + nbest->path_list = nbest->path_tail = NULL; + for (node = dag->nodes; node; node = node->next) { + if (node->sf == sf) { + ps_latpath_t *path; + int32 n_used; + + best_rem_score(nbest, node); + path = listelem_malloc(nbest->latpath_alloc); + path->node = node; + path->parent = NULL; + if (nbest->lmset) + path->score = nbest->lwf * + ((w1 < 0) + ? ngram_bg_score(nbest->lmset, node->basewid, w2, &n_used) + : ngram_tg_score(nbest->lmset, node->basewid, w2, w1, &n_used)); + else + path->score = 0; + path->score >>= SENSCR_SHIFT; + path_insert(nbest, path, path->score + node->info.rem_score); + } + } + + return nbest; +} + +ps_latpath_t * +ps_astar_next(ps_astar_t *nbest) +{ + ps_lattice_t *dag; + + dag = nbest->dag; + + /* Pop the top (best) partial hypothesis */ + while ((nbest->top = nbest->path_list) != NULL) { + nbest->path_list = nbest->path_list->next; + if (nbest->top == nbest->path_tail) + nbest->path_tail = NULL; + nbest->n_path--; + + /* Complete hypothesis? */ + if ((nbest->top->node->sf >= nbest->ef) + || ((nbest->top->node == dag->end) && + (nbest->ef > dag->end->sf))) { + /* FIXME: Verify that it is non-empty. Also we may want + * to verify that it is actually distinct from other + * paths, since often this is not the case*/ + return nbest->top; + } + else { + if (nbest->top->node->fef < nbest->ef) + path_extend(nbest, nbest->top); + } + } + + /* Did not find any more paths to extend. */ + return NULL; +} + +char const * +ps_astar_hyp(ps_astar_t *nbest, ps_latpath_t *path) +{ + ps_search_t *search; + ps_latpath_t *p; + size_t len; + char *c; + char *hyp; + + search = nbest->dag->search; + + /* Backtrace once to get hypothesis length. */ + len = 0; + for (p = path; p; p = p->parent) { + if (dict_real_word(ps_search_dict(search), p->node->basewid)) { + char *wstr = dict_wordstr(ps_search_dict(search), p->node->basewid); + if (wstr != NULL) + len += strlen(wstr) + 1; + } + } + + if (len == 0) { + return NULL; + } + + /* Backtrace again to construct hypothesis string. */ + hyp = ckd_calloc(1, len); + c = hyp + len - 1; + for (p = path; p; p = p->parent) { + if (dict_real_word(ps_search_dict(search), p->node->basewid)) { + char *wstr = dict_wordstr(ps_search_dict(search), p->node->basewid); + if (wstr != NULL) { + len = strlen(wstr); + c -= len; + memcpy(c, wstr, len); + if (c > hyp) { + --c; + *c = ' '; + } + } + } + } + + nbest->hyps = glist_add_ptr(nbest->hyps, hyp); + return hyp; +} + +static void +ps_astar_node2itor(astar_seg_t *itor) +{ + ps_seg_t *seg = (ps_seg_t *)itor; + ps_latnode_t *node; + + assert(itor->cur < itor->n_nodes); + node = itor->nodes[itor->cur]; + if (itor->cur == itor->n_nodes - 1) + seg->ef = node->lef; + else + seg->ef = itor->nodes[itor->cur + 1]->sf - 1; + seg->word = dict_wordstr(ps_search_dict(seg->search), node->wid); + seg->sf = node->sf; + seg->prob = 0; /* FIXME: implement forward-backward */ +} + +static void +ps_astar_seg_free(ps_seg_t *seg) +{ + astar_seg_t *itor = (astar_seg_t *)seg; + ckd_free(itor->nodes); + ckd_free(itor); +} + +static ps_seg_t * +ps_astar_seg_next(ps_seg_t *seg) +{ + astar_seg_t *itor = (astar_seg_t *)seg; + + ++itor->cur; + if (itor->cur == itor->n_nodes) { + ps_astar_seg_free(seg); + return NULL; + } + else { + ps_astar_node2itor(itor); + } + + return seg; +} + +static ps_segfuncs_t ps_astar_segfuncs = { + /* seg_next */ ps_astar_seg_next, + /* seg_free */ ps_astar_seg_free +}; + +ps_seg_t * +ps_astar_seg_iter(ps_astar_t *astar, ps_latpath_t *path, float32 lwf) +{ + astar_seg_t *itor; + ps_latpath_t *p; + int cur; + + /* Backtrace and make an iterator, this should look familiar by now. */ + itor = ckd_calloc(1, sizeof(*itor)); + itor->base.vt = &ps_astar_segfuncs; + itor->base.search = astar->dag->search; + itor->base.lwf = lwf; + itor->n_nodes = itor->cur = 0; + for (p = path; p; p = p->parent) { + ++itor->n_nodes; + } + itor->nodes = ckd_calloc(itor->n_nodes, sizeof(*itor->nodes)); + cur = itor->n_nodes - 1; + for (p = path; p; p = p->parent) { + itor->nodes[cur] = p->node; + --cur; + } + + ps_astar_node2itor(itor); + return (ps_seg_t *)itor; +} + +void +ps_astar_finish(ps_astar_t *nbest) +{ + gnode_t *gn; + + /* Free all hyps. */ + for (gn = nbest->hyps; gn; gn = gnode_next(gn)) { + ckd_free(gnode_ptr(gn)); + } + glist_free(nbest->hyps); + /* Free all paths. */ + listelem_alloc_free(nbest->latpath_alloc); + /* Free the Henge. */ + ckd_free(nbest); +} + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h new file mode 100644 index 0000000..39b4fbf --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h @@ -0,0 +1,298 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ps_lattice_internal.h Word graph search implementation + */ + +#ifndef __PS_LATTICE_INTERNAL_H__ +#define __PS_LATTICE_INTERNAL_H__ + +/* Local headers. */ +#include +#include "pocketsphinx_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Linked list of DAG link pointers. + * + * Because the same link structure is used for forward and reverse + * links, as well as for the agenda used in bestpath search, we can't + * store the list pointer inside latlink_t. We could use glist_t + * here, but it wastes 4 bytes per entry on 32-bit machines. + */ +typedef struct latlink_list_s { + ps_latlink_t *link; + struct latlink_list_s *next; +} latlink_list_t; + +/** + * Word graph structure used in bestpath/nbest search. + */ +struct ps_lattice_s { + int refcount; /**< Reference count. */ + + logmath_t *lmath; /**< Log-math object. */ + ps_search_t *search; /**< Search (if generated by search). */ + dict_t *dict; /**< Dictionary for this DAG. */ + int32 silence; /**< Silence word ID. */ + int32 frate; /**< Frame rate. */ + + ps_latnode_t *nodes; /**< List of all nodes. */ + ps_latnode_t *start; /**< Starting node. */ + ps_latnode_t *end; /**< Ending node. */ + + frame_idx_t n_frames; /**< Number of frames for this utterance. */ + int32 n_nodes; /**< Number of nodes in this lattice. */ + int32 final_node_ascr; /**< Acoustic score of implicit link exiting final node. */ + int32 norm; /**< Normalizer for posterior probabilities. */ + char *hyp_str; /**< Current hypothesis string. */ + + listelem_alloc_t *latnode_alloc; /**< Node allocator for this DAG. */ + listelem_alloc_t *latlink_alloc; /**< Link allocator for this DAG. */ + listelem_alloc_t *latlink_list_alloc; /**< List element allocator for this DAG. */ + + /* This will probably be replaced with a heap. */ + latlink_list_t *q_head; /**< Queue of links for traversal. */ + latlink_list_t *q_tail; /**< Queue of links for traversal. */ +}; + +/** + * Links between DAG nodes. + * + * A link corresponds to a single hypothesized instance of a word with + * a given start and end point. + + */ +struct ps_latlink_s { + struct ps_latnode_s *from; /**< From node */ + struct ps_latnode_s *to; /**< To node */ + struct ps_latlink_s *best_prev; + int32 ascr; /**< Score for from->wid (from->sf to this->ef) */ + int32 path_scr; /**< Best path score from root of DAG */ + frame_idx_t ef; /**< Ending frame of this word */ + int32 alpha; /**< Forward probability of this link P(w,o_1^{ef}) */ + int32 beta; /**< Backward probability of this link P(w|o_{ef+1}^T) */ +}; + +/** + * DAG nodes. + * + * A node corresponds to a number of hypothesized instances of a word + * which all share the same starting point. + */ +struct ps_latnode_s { + int32 id; /**< Unique id for this node */ + int32 wid; /**< Dictionary word id */ + int32 basewid; /**< Dictionary base word id */ + /* FIXME: These are (ab)used to store backpointer indices, therefore they MUST be 32 bits. */ + int32 fef; /**< First end frame */ + int32 lef; /**< Last end frame */ + frame_idx_t sf; /**< Start frame */ + int16 reachable; /**< From \verbatim
\endverbatim or \verbatim \endverbatim */ + int32 node_id; /**< Node from fsg model, used to map lattice back to model */ + union { + glist_t velist; /**< List of history entries with different lmstate (tst only) */ + int32 fanin; /**< Number nodes with links to this node */ + int32 rem_score; /**< Estimated best score from node.sf to end */ + int32 best_exit; /**< Best exit score (used for final nodes only) */ + } info; + latlink_list_t *exits; /**< Links out of this node */ + latlink_list_t *entries; /**< Links into this node */ + + struct ps_latnode_s *alt; /**< Node with alternate pronunciation for this word */ + struct ps_latnode_s *next; /**< Next node in DAG (no ordering implied) */ +}; + +/** + * Segmentation "iterator" for backpointer table results. + */ +typedef struct dag_seg_s { + ps_seg_t base; /**< Base structure. */ + ps_latlink_t **links; /**< Array of lattice links. */ + int32 norm; /**< Normalizer for posterior probabilities. */ + int16 n_links; /**< Number of lattice links. */ + int16 cur; /**< Current position in bpidx. */ +} dag_seg_t; + +/** + * Partial path structure used in N-best (A*) search. + * + * Each partial path (latpath_t) is constructed by extending another + * partial path--parent--by one node. + */ +typedef struct ps_latpath_s { + ps_latnode_t *node; /**< Node ending this path. */ + struct ps_latpath_s *parent; /**< Previous element in this path. */ + struct ps_latpath_s *next; /**< Pointer to next path in list of paths. */ + int32 score; /**< Exact score from start node up to node->sf. */ +} ps_latpath_t; + +/** + * A* search structure. + */ +typedef struct ps_astar_s { + ps_lattice_t *dag; + ngram_model_t *lmset; + float32 lwf; + + frame_idx_t sf; + frame_idx_t ef; + int32 w1; + int32 w2; + + int32 n_hyp_tried; + int32 n_hyp_insert; + int32 n_hyp_reject; + int32 insert_depth; + int32 n_path; + + ps_latpath_t *path_list; + ps_latpath_t *path_tail; + ps_latpath_t *top; + + glist_t hyps; /**< List of hypothesis strings. */ + listelem_alloc_t *latpath_alloc; /**< Path allocator for N-best search. */ +} ps_astar_t; + +/** + * Segmentation "iterator" for A* search results. + */ +typedef struct astar_seg_s { + ps_seg_t base; + ps_latnode_t **nodes; + int n_nodes; + int cur; +} astar_seg_t; + +/** + * Construct an empty word graph with reference to a search structure. + */ +ps_lattice_t *ps_lattice_init_search(ps_search_t *search, int n_frame); + +/** + * Insert penalty for fillers + */ +void ps_lattice_penalize_fillers(ps_lattice_t *dag, int32 silpen, int32 fillpen); + +/** + * Remove nodes marked as unreachable. + */ +POCKETSPHINX_EXPORT +void ps_lattice_delete_unreachable(ps_lattice_t *dag); + +/** + * Add an edge to the traversal queue. + */ +void ps_lattice_pushq(ps_lattice_t *dag, ps_latlink_t *link); + +/** + * Remove an edge from the traversal queue. + */ +ps_latlink_t *ps_lattice_popq(ps_lattice_t *dag); + +/** + * Clear and reset the traversal queue. + */ +void ps_lattice_delq(ps_lattice_t *dag); + +/** + * Create a new lattice link element. + */ +latlink_list_t *latlink_list_new(ps_lattice_t *dag, ps_latlink_t *link, + latlink_list_t *next); + +/** + * Get hypothesis string after bestpath search. + */ +POCKETSPHINX_EXPORT +char const *ps_lattice_hyp(ps_lattice_t *dag, ps_latlink_t *link); + +/** + * Get hypothesis segmentation iterator after bestpath search. + */ +ps_seg_t *ps_lattice_seg_iter(ps_lattice_t *dag, ps_latlink_t *link, + float32 lwf); + +/** + * Begin N-Gram based A* search on a word graph. + * + * @param sf Starting frame for N-best search. + * @param ef Ending frame for N-best search, or -1 for last frame. + * @param w1 First context word, or -1 for none. + * @param w2 Second context word, or -1 for none. + * @return 0 for success, <0 on error. + */ +ps_astar_t *ps_astar_start(ps_lattice_t *dag, + ngram_model_t *lmset, + float32 lwf, + int sf, int ef, + int w1, int w2); + +/** + * Find next best hypothesis of A* on a word graph. + * + * @return a complete path, or NULL if no more hypotheses exist. + */ +ps_latpath_t *ps_astar_next(ps_astar_t *nbest); + +/** + * Finish N-best search, releasing resources associated with it. + */ +void ps_astar_finish(ps_astar_t *nbest); + +/** + * Get hypothesis string from A* search. + */ +char const *ps_astar_hyp(ps_astar_t *nbest, ps_latpath_t *path); + +/** + * Get hypothesis segmentation from A* search. + */ +ps_seg_t *ps_astar_seg_iter(ps_astar_t *astar, ps_latpath_t *path, float32 lwf); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __PS_LATTICE_INTERNAL_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c new file mode 100644 index 0000000..b43f6fb --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c @@ -0,0 +1,169 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2009 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file ps_mllr.c Model-space linear transforms for speaker adaptation + */ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include + +/* Local headers. */ +#include "acmod.h" + +ps_mllr_t * +ps_mllr_read(char const *regmatfile) +{ + ps_mllr_t *mllr; + FILE *fp; + int n, i, m, j, k; + + mllr = ckd_calloc(1, sizeof(*mllr)); + mllr->refcnt = 1; + + if ((fp = fopen(regmatfile, "r")) == NULL) { + E_ERROR_SYSTEM("Failed to open MLLR file '%s' for reading", regmatfile); + goto error_out; + } + else + E_INFO("Reading MLLR transformation file '%s'\n", regmatfile); + + if ((fscanf(fp, "%d", &n) != 1) || (n < 1)) { + E_ERROR("Failed to read number of MLLR classes\n"); + goto error_out; + } + mllr->n_class = n; + + if ((fscanf(fp, "%d", &n) != 1)) { + E_ERROR("Failed to read number of feature streams\n"); + goto error_out; + } + mllr->n_feat = n; + mllr->veclen = ckd_calloc(mllr->n_feat, sizeof(*mllr->veclen)); + + mllr->A = (float32 ****) ckd_calloc(mllr->n_feat, sizeof(float32 **)); + mllr->b = (float32 ***) ckd_calloc(mllr->n_feat, sizeof(float32 *)); + mllr->h = (float32 ***) ckd_calloc(mllr->n_feat, sizeof(float32 *)); + + for (i = 0; i < mllr->n_feat; ++i) { + if (fscanf(fp, "%d", &n) != 1) { + E_ERROR("Failed to read stream length for feature %d\n", i); + goto error_out; + } + mllr->veclen[i] = n; + mllr->A[i] = + (float32 ***) ckd_calloc_3d(mllr->n_class, mllr->veclen[i], + mllr->veclen[i], sizeof(float32)); + mllr->b[i] = + (float32 **) ckd_calloc_2d(mllr->n_class, mllr->veclen[i], + sizeof(float32)); + mllr->h[i] = + (float32 **) ckd_calloc_2d(mllr->n_class, mllr->veclen[i], + sizeof(float32)); + + for (m = 0; m < mllr->n_class; ++m) { + for (j = 0; j < mllr->veclen[i]; ++j) { + for (k = 0; k < mllr->veclen[i]; ++k) { + if (fscanf(fp, "%f ", &mllr->A[i][m][j][k]) != 1) { + E_ERROR("Failed reading MLLR rotation (%d,%d,%d,%d)\n", + i, m, j, k); + goto error_out; + } + } + } + for (j = 0; j < mllr->veclen[i]; ++j) { + if (fscanf(fp, "%f ", &mllr->b[i][m][j]) != 1) { + E_ERROR("Failed reading MLLR bias (%d,%d,%d)\n", + i, m, j); + goto error_out; + } + } + for (j = 0; j < mllr->veclen[i]; ++j) { + if (fscanf(fp, "%f ", &mllr->h[i][m][j]) != 1) { + E_ERROR("Failed reading MLLR variance scale (%d,%d,%d)\n", + i, m, j); + goto error_out; + } + } + } + } + fclose(fp); + return mllr; + +error_out: + if (fp) + fclose(fp); + ps_mllr_free(mllr); + return NULL; +} + +ps_mllr_t * +ps_mllr_retain(ps_mllr_t *mllr) +{ + ++mllr->refcnt; + return mllr; +} + +int +ps_mllr_free(ps_mllr_t *mllr) +{ + int i; + + if (mllr == NULL) + return 0; + if (--mllr->refcnt > 0) + return mllr->refcnt; + + for (i = 0; i < mllr->n_feat; ++i) { + if (mllr->A) + ckd_free_3d(mllr->A[i]); + if (mllr->b) + ckd_free_2d(mllr->b[i]); + if (mllr->h) + ckd_free_2d(mllr->h[i]); + } + ckd_free(mllr->veclen); + ckd_free(mllr->A); + ckd_free(mllr->b); + ckd_free(mllr->h); + ckd_free(mllr); + + return 0; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c new file mode 100644 index 0000000..48d8578 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c @@ -0,0 +1,916 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* System headers */ +#include +#include +#include +#include +#include +#include +#if defined(__ADSPBLACKFIN__) +#elif !defined(_WIN32_WCE) +#include +#endif + +/* SphinxBase headers */ +#include +#include +#include +#include +#include +#include +#include + +/* Local headers */ +#include "tied_mgau_common.h" +#include "ptm_mgau.h" + +static ps_mgaufuncs_t ptm_mgau_funcs = { + "ptm", + ptm_mgau_frame_eval, /* frame_eval */ + ptm_mgau_mllr_transform, /* transform */ + ptm_mgau_free /* free */ +}; + +#define COMPUTE_GMM_MAP(_idx) \ + diff[_idx] = obs[_idx] - mean[_idx]; \ + sqdiff[_idx] = MFCCMUL(diff[_idx], diff[_idx]); \ + compl[_idx] = MFCCMUL(sqdiff[_idx], var[_idx]); +#define COMPUTE_GMM_REDUCE(_idx) \ + d = GMMSUB(d, compl[_idx]); + +static void +insertion_sort_topn(ptm_topn_t *topn, int i, int32 d) +{ + ptm_topn_t vtmp; + int j; + + topn[i].score = d; + if (i == 0) + return; + vtmp = topn[i]; + for (j = i - 1; j >= 0 && d > topn[j].score; j--) { + topn[j + 1] = topn[j]; + } + topn[j + 1] = vtmp; +} + +static int +eval_topn(ptm_mgau_t *s, int cb, int feat, mfcc_t *z) +{ + ptm_topn_t *topn; + int i, ceplen; + + topn = s->f->topn[cb][feat]; + ceplen = s->g->featlen[feat]; + + for (i = 0; i < s->max_topn; i++) { + mfcc_t *mean, diff[4], sqdiff[4], compl[4]; /* diff, diff^2, component likelihood */ + mfcc_t *var, d; + mfcc_t *obs; + int32 cw, j; + + cw = topn[i].cw; + mean = s->g->mean[cb][feat][0] + cw * ceplen; + var = s->g->var[cb][feat][0] + cw * ceplen; + d = s->g->det[cb][feat][cw]; + obs = z; + for (j = 0; j < ceplen % 4; ++j) { + diff[0] = *obs++ - *mean++; + sqdiff[0] = MFCCMUL(diff[0], diff[0]); + compl[0] = MFCCMUL(sqdiff[0], *var); + d = GMMSUB(d, compl[0]); + ++var; + } + /* We could vectorize this but it's unlikely to make much + * difference as the outer loop here isn't very big. */ + for (;j < ceplen; j += 4) { + COMPUTE_GMM_MAP(0); + COMPUTE_GMM_MAP(1); + COMPUTE_GMM_MAP(2); + COMPUTE_GMM_MAP(3); + COMPUTE_GMM_REDUCE(0); + COMPUTE_GMM_REDUCE(1); + COMPUTE_GMM_REDUCE(2); + COMPUTE_GMM_REDUCE(3); + var += 4; + obs += 4; + mean += 4; + } + insertion_sort_topn(topn, i, (int32)d); + } + + return topn[0].score; +} + +/* This looks bad, but it actually isn't. Less than 1% of eval_cb's + * time is spent doing this. */ +static void +insertion_sort_cb(ptm_topn_t **cur, ptm_topn_t *worst, ptm_topn_t *best, + int cw, int32 intd) +{ + for (*cur = worst - 1; *cur >= best && intd >= (*cur)->score; --*cur) + memcpy(*cur + 1, *cur, sizeof(**cur)); + ++*cur; + (*cur)->cw = cw; + (*cur)->score = intd; +} + +static int +eval_cb(ptm_mgau_t *s, int cb, int feat, mfcc_t *z) +{ + ptm_topn_t *worst, *best, *topn; + mfcc_t *mean; + mfcc_t *var, *det, *detP, *detE; + int32 i, ceplen; + + best = topn = s->f->topn[cb][feat]; + worst = topn + (s->max_topn - 1); + mean = s->g->mean[cb][feat][0]; + var = s->g->var[cb][feat][0]; + det = s->g->det[cb][feat]; + detE = det + s->g->n_density; + ceplen = s->g->featlen[feat]; + + for (detP = det; detP < detE; ++detP) { + mfcc_t diff[4], sqdiff[4], compl[4]; /* diff, diff^2, component likelihood */ + mfcc_t d, thresh; + mfcc_t *obs; + ptm_topn_t *cur; + int32 cw, j; + + d = *detP; + thresh = (mfcc_t) worst->score; /* Avoid int-to-float conversions */ + obs = z; + cw = (int)(detP - det); + + /* Unroll the loop starting with the first dimension(s). In + * theory this might be a bit faster if this Gaussian gets + * "knocked out" by C0. In practice not. */ + for (j = 0; (j < ceplen % 4) && (d >= thresh); ++j) { + diff[0] = *obs++ - *mean++; + sqdiff[0] = MFCCMUL(diff[0], diff[0]); + compl[0] = MFCCMUL(sqdiff[0], *var++); + d = GMMSUB(d, compl[0]); + } + /* Now do 4 dimensions at a time. You'd think that GCC would + * vectorize this? Apparently not. And it's right, because + * that won't make this any faster, at least on x86-64. */ + for (; j < ceplen && d >= thresh; j += 4) { + COMPUTE_GMM_MAP(0); + COMPUTE_GMM_MAP(1); + COMPUTE_GMM_MAP(2); + COMPUTE_GMM_MAP(3); + COMPUTE_GMM_REDUCE(0); + COMPUTE_GMM_REDUCE(1); + COMPUTE_GMM_REDUCE(2); + COMPUTE_GMM_REDUCE(3); + var += 4; + obs += 4; + mean += 4; + } + if (j < ceplen) { + /* terminated early, so not in topn */ + mean += (ceplen - j); + var += (ceplen - j); + continue; + } + if (d < thresh) + continue; + for (i = 0; i < s->max_topn; i++) { + /* already there, so don't need to insert */ + if (topn[i].cw == cw) + break; + } + if (i < s->max_topn) + continue; /* already there. Don't insert */ + insertion_sort_cb(&cur, worst, best, cw, (int32)d); + } + + return best->score; +} + +/** + * Compute top-N densities for active codebooks (and prune) + */ +static int +ptm_mgau_codebook_eval(ptm_mgau_t *s, mfcc_t **z, int frame) +{ + int i, j; + + /* First evaluate top-N from previous frame. */ + for (i = 0; i < s->g->n_mgau; ++i) + for (j = 0; j < s->g->n_feat; ++j) + eval_topn(s, i, j, z[j]); + + /* If frame downsampling is in effect, possibly do nothing else. */ + if (frame % s->ds_ratio) + return 0; + + /* Evaluate remaining codebooks. */ + for (i = 0; i < s->g->n_mgau; ++i) { + if (bitvec_is_clear(s->f->mgau_active, i)) + continue; + for (j = 0; j < s->g->n_feat; ++j) { + eval_cb(s, i, j, z[j]); + } + } + return 0; +} + +/** + * Normalize densities to produce "posterior probabilities", + * i.e. things with a reasonable dynamic range, then scale and + * clamp them to the acceptable range. This is actually done + * solely to ensure that we can use fast_logmath_add(). Note that + * unless we share the same normalizer across all codebooks for + * each feature stream we get defective scores (that's why these + * loops are inside out - doing it per-feature should give us + * greater precision). */ +static int +ptm_mgau_codebook_norm(ptm_mgau_t *s, mfcc_t **z, int frame) +{ + int i, j; + + (void)z; + (void)frame; + for (j = 0; j < s->g->n_feat; ++j) { + int32 norm = WORST_SCORE; + for (i = 0; i < s->g->n_mgau; ++i) { + if (bitvec_is_clear(s->f->mgau_active, i)) + continue; + if (norm < s->f->topn[i][j][0].score >> SENSCR_SHIFT) + norm = s->f->topn[i][j][0].score >> SENSCR_SHIFT; + } + assert(norm != WORST_SCORE); + for (i = 0; i < s->g->n_mgau; ++i) { + int32 k; + if (bitvec_is_clear(s->f->mgau_active, i)) + continue; + for (k = 0; k < s->max_topn; ++k) { + s->f->topn[i][j][k].score >>= SENSCR_SHIFT; + s->f->topn[i][j][k].score -= norm; + s->f->topn[i][j][k].score = -s->f->topn[i][j][k].score; + if (s->f->topn[i][j][k].score > MAX_NEG_ASCR) + s->f->topn[i][j][k].score = MAX_NEG_ASCR; + } + } + } + + return 0; +} + +static int +ptm_mgau_calc_cb_active(ptm_mgau_t *s, uint8 *senone_active, + int32 n_senone_active, int compallsen) +{ + int i, lastsen; + + if (compallsen) { + bitvec_set_all(s->f->mgau_active, s->g->n_mgau); + return 0; + } + bitvec_clear_all(s->f->mgau_active, s->g->n_mgau); + for (lastsen = i = 0; i < n_senone_active; ++i) { + int sen = senone_active[i] + lastsen; + int cb = s->sen2cb[sen]; + bitvec_set(s->f->mgau_active, cb); + lastsen = sen; + } + E_DEBUG("Active codebooks:"); + for (i = 0; i < s->g->n_mgau; ++i) { + if (bitvec_is_clear(s->f->mgau_active, i)) + continue; + E_DEBUG(" %d", i); + } + return 0; +} + +/** + * Compute senone scores from top-N densities for active codebooks. + */ +static int +ptm_mgau_senone_eval(ptm_mgau_t *s, int16 *senone_scores, + uint8 *senone_active, int32 n_senone_active, + int compall) +{ + int i, lastsen, bestscore; + + memset(senone_scores, 0, s->n_sen * sizeof(*senone_scores)); + /* FIXME: This is the non-cache-efficient way to do this. We want + * to evaluate one codeword at a time but this requires us to have + * a reverse codebook to senone mapping, which we don't have + * (yet), since different codebooks have different top-N + * codewords. */ + if (compall) + n_senone_active = s->n_sen; + bestscore = 0x7fffffff; + for (lastsen = i = 0; i < n_senone_active; ++i) { + int sen, f, cb; + int ascore; + + if (compall) + sen = i; + else + sen = senone_active[i] + lastsen; + lastsen = sen; + cb = s->sen2cb[sen]; + + if (bitvec_is_clear(s->f->mgau_active, cb)) { + int j; + /* Because senone_active is deltas we can't really "knock + * out" senones from pruned codebooks, and in any case, + * it wouldn't make any difference to the search code, + * which doesn't expect senone_active to change. */ + for (f = 0; f < s->g->n_feat; ++f) { + for (j = 0; j < s->max_topn; ++j) { + s->f->topn[cb][f][j].score = MAX_NEG_ASCR; + } + } + } + /* For each feature, log-sum codeword scores + mixw to get + * feature density, then sum (multiply) to get ascore */ + ascore = 0; + for (f = 0; f < s->g->n_feat; ++f) { + ptm_topn_t *topn; + int j, fden = 0; + topn = s->f->topn[cb][f]; + for (j = 0; j < s->max_topn; ++j) { + int mixw; + /* Find mixture weight for this codeword. */ + if (s->mixw_cb) { + int dcw = s->mixw[f][topn[j].cw][sen/2]; + dcw = (dcw & 1) ? dcw >> 4 : dcw & 0x0f; + mixw = s->mixw_cb[dcw]; + } + else { + mixw = s->mixw[f][topn[j].cw][sen]; + } + if (j == 0) + fden = mixw + topn[j].score; + else + fden = fast_logmath_add(s->lmath_8b, fden, + mixw + topn[j].score); + E_DEBUG("fden[%d][%d] l+= %d + %d = %d\n", + sen, f, mixw, topn[j].score, fden); + } + ascore += fden; + } + if (ascore < bestscore) bestscore = ascore; + senone_scores[sen] = ascore; + } + /* Normalize the scores again (finishing the job we started above + * in ptm_mgau_codebook_eval...) */ + for (i = 0; i < s->n_sen; ++i) { + senone_scores[i] -= bestscore; + } + + return 0; +} + +/** + * Compute senone scores for the active senones. + */ +int32 +ptm_mgau_frame_eval(ps_mgau_t *ps, + int16 *senone_scores, + uint8 *senone_active, + int32 n_senone_active, + mfcc_t ** featbuf, int32 frame, + int32 compallsen) +{ + ptm_mgau_t *s = (ptm_mgau_t *)ps; + int fast_eval_idx; + + /* Find the appropriate frame in the rotating history buffer + * corresponding to the requested input frame. No bounds checking + * is done here, which just means you'll get semi-random crap if + * you request a frame in the future or one that's too far in the + * past. Since the history buffer is just used for fast match + * that might not be fatal. */ + fast_eval_idx = frame % s->n_fast_hist; + s->f = s->hist + fast_eval_idx; + /* Compute the top-N codewords for every codebook, unless this + * is a past frame, in which case we already have them (we + * hope!) */ + if (frame >= ps_mgau_base(ps)->frame_idx) { + ptm_fast_eval_t *lastf; + /* Get the previous frame's top-N information (on the + * first frame of the input this is just all WORST_DIST, + * no harm in that) */ + if (fast_eval_idx == 0) + lastf = s->hist + s->n_fast_hist - 1; + else + lastf = s->hist + fast_eval_idx - 1; + /* Copy in initial top-N info */ + memcpy(s->f->topn[0][0], lastf->topn[0][0], + s->g->n_mgau * s->g->n_feat * s->max_topn * sizeof(ptm_topn_t)); + /* Generate initial active codebook list (this might not be + * necessary) */ + ptm_mgau_calc_cb_active(s, senone_active, n_senone_active, compallsen); + /* Now evaluate top-N, prune, and evaluate remaining codebooks. */ + ptm_mgau_codebook_eval(s, featbuf, frame); + ptm_mgau_codebook_norm(s, featbuf, frame); + } + /* Evaluate intersection of active senones and active codebooks. */ + ptm_mgau_senone_eval(s, senone_scores, senone_active, + n_senone_active, compallsen); + + return 0; +} + +static int32 +read_sendump(ptm_mgau_t *s, bin_mdef_t *mdef, char const *file) +{ + FILE *fp; + char line[1000]; + int32 i, n, r, c; + int32 do_swap, do_mmap; + size_t offset; + int n_clust = 0; + int n_feat = s->g->n_feat; + int n_density = s->g->n_density; + int n_sen = bin_mdef_n_sen(mdef); + int n_bits = 8; + + s->n_sen = n_sen; /* FIXME: Should have been done earlier */ + do_mmap = cmd_ln_boolean_r(s->config, "-mmap"); + + if ((fp = fopen(file, "rb")) == NULL) + return -1; + + E_INFO("Loading senones from dump file %s\n", file); + /* Read title size, title */ + if (fread(&n, sizeof(int32), 1, fp) != 1) { + E_ERROR_SYSTEM("Failed to read title size from %s", file); + goto error_out; + } + /* This is extremely bogus */ + do_swap = 0; + if (n < 1 || n > 999) { + SWAP_INT32(&n); + if (n < 1 || n > 999) { + E_ERROR("Title length %x in dump file %s out of range\n", n, file); + goto error_out; + } + do_swap = 1; + } + if (fread(line, sizeof(char), n, fp) != (size_t)n) { + E_ERROR_SYSTEM("Cannot read title"); + goto error_out; + } + if (line[n - 1] != '\0') { + E_ERROR("Bad title in dump file\n"); + goto error_out; + } + E_INFO("%s\n", line); + + /* Read header size, header */ + if (fread(&n, sizeof(n), 1, fp) != 1) { + E_ERROR_SYSTEM("Failed to read header size from %s", file); + goto error_out; + } + if (do_swap) SWAP_INT32(&n); + if (fread(line, sizeof(char), n, fp) != (size_t)n) { + E_ERROR_SYSTEM("Cannot read header"); + goto error_out; + } + if (line[n - 1] != '\0') { + E_ERROR("Bad header in dump file\n"); + goto error_out; + } + + /* Read other header strings until string length = 0 */ + for (;;) { + if (fread(&n, sizeof(n), 1, fp) != 1) { + E_ERROR_SYSTEM("Failed to read header string size from %s", file); + goto error_out; + } + if (do_swap) SWAP_INT32(&n); + if (n == 0) + break; + if (fread(line, sizeof(char), n, fp) != (size_t)n) { + E_ERROR_SYSTEM("Cannot read header"); + goto error_out; + } + /* Look for a cluster count, if present */ + if (!strncmp(line, "feature_count ", strlen("feature_count "))) { + n_feat = atoi(line + strlen("feature_count ")); + } + if (!strncmp(line, "mixture_count ", strlen("mixture_count "))) { + n_density = atoi(line + strlen("mixture_count ")); + } + if (!strncmp(line, "model_count ", strlen("model_count "))) { + n_sen = atoi(line + strlen("model_count ")); + } + if (!strncmp(line, "cluster_count ", strlen("cluster_count "))) { + n_clust = atoi(line + strlen("cluster_count ")); + } + if (!strncmp(line, "cluster_bits ", strlen("cluster_bits "))) { + n_bits = atoi(line + strlen("cluster_bits ")); + } + } + + /* Defaults for #rows, #columns in mixw array. */ + c = n_sen; + r = n_density; + if (n_clust == 0) { + /* Older mixw files have them here, and they might be padded. */ + if (fread(&r, sizeof(r), 1, fp) != 1) { + E_ERROR_SYSTEM("Cannot read #rows"); + goto error_out; + } + if (do_swap) SWAP_INT32(&r); + if (fread(&c, sizeof(c), 1, fp) != 1) { + E_ERROR_SYSTEM("Cannot read #columns"); + goto error_out; + } + if (do_swap) SWAP_INT32(&c); + E_INFO("Rows: %d, Columns: %d\n", r, c); + } + + if (n_feat != s->g->n_feat) { + E_ERROR("Number of feature streams mismatch: %d != %d\n", + n_feat, s->g->n_feat); + goto error_out; + } + if (n_density != s->g->n_density) { + E_ERROR("Number of densities mismatch: %d != %d\n", + n_density, s->g->n_density); + goto error_out; + } + if (n_sen != s->n_sen) { + E_ERROR("Number of senones mismatch: %d != %d\n", + n_sen, s->n_sen); + goto error_out; + } + + if (!((n_clust == 0) || (n_clust == 15) || (n_clust == 16))) { + E_ERROR("Cluster count must be 0, 15, or 16\n"); + goto error_out; + } + if (n_clust == 15) + ++n_clust; + + if (!((n_bits == 8) || (n_bits == 4))) { + E_ERROR("Cluster count must be 4 or 8\n"); + goto error_out; + } + + if (do_mmap) { + E_INFO("Using memory-mapped I/O for senones\n"); + } + offset = ftell(fp); + + /* Allocate memory for pdfs (or memory map them) */ + if (do_mmap) { + s->sendump_mmap = mmio_file_read(file); + /* Get cluster codebook if any. */ + if (n_clust) { + s->mixw_cb = ((uint8 *) mmio_file_ptr(s->sendump_mmap)) + offset; + offset += n_clust; + } + } + else { + /* Get cluster codebook if any. */ + if (n_clust) { + s->mixw_cb = ckd_calloc(1, n_clust); + if (fread(s->mixw_cb, 1, n_clust, fp) != (size_t) n_clust) { + E_ERROR("Failed to read %d bytes from sendump\n", n_clust); + goto error_out; + } + } + } + + /* Set up pointers, or read, or whatever */ + if (s->sendump_mmap) { + s->mixw = ckd_calloc_2d(n_feat, n_density, sizeof(*s->mixw)); + for (n = 0; n < n_feat; n++) { + int step = c; + if (n_bits == 4) + step = (step + 1) / 2; + for (i = 0; i < r; i++) { + s->mixw[n][i] = ((uint8 *) mmio_file_ptr(s->sendump_mmap)) + offset; + offset += step; + } + } + } + else { + s->mixw = ckd_calloc_3d(n_feat, n_density, n_sen, sizeof(***s->mixw)); + /* Read pdf values and ids */ + for (n = 0; n < n_feat; n++) { + int step = c; + if (n_bits == 4) + step = (step + 1) / 2; + for (i = 0; i < r; i++) { + if (fread(s->mixw[n][i], sizeof(***s->mixw), step, fp) + != (size_t) step) { + E_ERROR("Failed to read %d bytes from sendump\n", step); + goto error_out; + } + } + } + } + + fclose(fp); + return 0; +error_out: + fclose(fp); + return -1; +} + +static int32 +read_mixw(ptm_mgau_t * s, char const *file_name, double SmoothMin) +{ + char **argname, **argval; + char eofchk; + FILE *fp; + int32 byteswap, chksum_present; + uint32 chksum; + float32 *pdf; + int32 i, f, c, n; + int32 n_sen; + int32 n_feat; + int32 n_comp; + int32 n_err; + + E_INFO("Reading mixture weights file '%s'\n", file_name); + + if ((fp = fopen(file_name, "rb")) == NULL) + E_FATAL_SYSTEM("Failed to open mixture file '%s' for reading", file_name); + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) + E_FATAL("Failed to read header from '%s'\n", file_name); + + /* Parse argument-value list */ + chksum_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], MGAU_MIXW_VERSION) != 0) + E_WARN("Version mismatch(%s): %s, expecting %s\n", + file_name, argval[i], MGAU_MIXW_VERSION); + } + else if (strcmp(argname[i], "chksum0") == 0) { + chksum_present = 1; /* Ignore the associated value */ + } + } + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + /* Read #senones, #features, #codewords, arraysize */ + if ((bio_fread(&n_sen, sizeof(int32), 1, fp, byteswap, &chksum) != 1) + || (bio_fread(&n_feat, sizeof(int32), 1, fp, byteswap, &chksum) != + 1) + || (bio_fread(&n_comp, sizeof(int32), 1, fp, byteswap, &chksum) != + 1) + || (bio_fread(&n, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { + E_FATAL("bio_fread(%s) (arraysize) failed\n", file_name); + } + if (n_feat != s->g->n_feat) + E_FATAL("#Features streams(%d) != %d\n", n_feat, s->g->n_feat); + if (n != n_sen * n_feat * n_comp) { + E_FATAL + ("%s: #float32s(%d) doesn't match header dimensions: %d x %d x %d\n", + file_name, i, n_sen, n_feat, n_comp); + } + + /* n_sen = number of mixture weights per codeword, which is + * fixed at the number of senones since we have only one codebook. + */ + s->n_sen = n_sen; + + /* Quantized mixture weight arrays. */ + s->mixw = ckd_calloc_3d(s->g->n_feat, s->g->n_density, + n_sen, sizeof(***s->mixw)); + + /* Temporary structure to read in floats before conversion to (int32) logs3 */ + pdf = (float32 *) ckd_calloc(n_comp, sizeof(float32)); + + /* Read senone probs data, normalize, floor, convert to logs3, truncate to 8 bits */ + n_err = 0; + for (i = 0; i < n_sen; i++) { + for (f = 0; f < n_feat; f++) { + if (bio_fread((void *) pdf, sizeof(float32), + n_comp, fp, byteswap, &chksum) != n_comp) { + E_FATAL("bio_fread(%s) (arraydata) failed\n", file_name); + } + + /* Normalize and floor */ + if (vector_sum_norm(pdf, n_comp) <= 0.0) + n_err++; + vector_floor(pdf, n_comp, SmoothMin); + vector_sum_norm(pdf, n_comp); + + /* Convert to LOG, quantize, and transpose */ + for (c = 0; c < n_comp; c++) { + int32 qscr; + + qscr = -logmath_log(s->lmath_8b, pdf[c]); + if ((qscr > MAX_NEG_MIXW) || (qscr < 0)) + qscr = MAX_NEG_MIXW; + s->mixw[f][c][i] = qscr; + } + } + } + if (n_err > 0) + E_WARN("Weight normalization failed for %d mixture weights components\n", n_err); + + ckd_free(pdf); + + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&eofchk, 1, 1, fp) == 1) + E_FATAL("More data than expected in %s\n", file_name); + + fclose(fp); + + E_INFO("Read %d x %d x %d mixture weights\n", n_sen, n_feat, n_comp); + return n_sen; +} + +ps_mgau_t * +ptm_mgau_init(acmod_t *acmod, bin_mdef_t *mdef) +{ + ptm_mgau_t *s; + ps_mgau_t *ps; + char const *sendump_path; + int i; + + s = ckd_calloc(1, sizeof(*s)); + s->config = acmod->config; + + s->lmath = logmath_retain(acmod->lmath); + /* Log-add table. */ + s->lmath_8b = logmath_init(logmath_get_base(acmod->lmath), SENSCR_SHIFT, TRUE); + if (s->lmath_8b == NULL) + goto error_out; + /* Ensure that it is only 8 bits wide so that fast_logmath_add() works. */ + if (logmath_get_width(s->lmath_8b) != 1) { + E_ERROR("Log base %f is too small to represent add table in 8 bits\n", + logmath_get_base(s->lmath_8b)); + goto error_out; + } + + /* Read means and variances. */ + if ((s->g = gauden_init(cmd_ln_str_r(s->config, "_mean"), + cmd_ln_str_r(s->config, "_var"), + cmd_ln_float32_r(s->config, "-varfloor"), + s->lmath)) == NULL) { + E_ERROR("Failed to read means and variances\n"); + goto error_out; + } + + /* We only support 256 codebooks or less (like 640k or 2GB, this + * should be enough for anyone) */ + if (s->g->n_mgau > 256) { + E_INFO("Number of codebooks exceeds 256: %d\n", s->g->n_mgau); + goto error_out; + } + if (s->g->n_mgau != bin_mdef_n_ciphone(mdef)) { + E_INFO("Number of codebooks doesn't match number of ciphones, doesn't look like PTM: %d != %d\n", s->g->n_mgau, bin_mdef_n_ciphone(mdef)); + goto error_out; + } + /* Verify n_feat and veclen, against acmod. */ + if (s->g->n_feat != feat_dimension1(acmod->fcb)) { + E_ERROR("Number of streams does not match: %d != %d\n", + s->g->n_feat, feat_dimension1(acmod->fcb)); + goto error_out; + } + for (i = 0; i < s->g->n_feat; ++i) { + if ((uint32)s->g->featlen[i] != feat_dimension2(acmod->fcb, i)) { + E_ERROR("Dimension of stream %d does not match: %d != %d\n", + s->g->featlen[i], feat_dimension2(acmod->fcb, i)); + goto error_out; + } + } + /* Read mixture weights. */ + if ((sendump_path = cmd_ln_str_r(s->config, "_sendump"))) { + if (read_sendump(s, acmod->mdef, sendump_path) < 0) { + goto error_out; + } + } + else { + if (read_mixw(s, cmd_ln_str_r(s->config, "_mixw"), + cmd_ln_float32_r(s->config, "-mixwfloor")) < 0) { + goto error_out; + } + } + s->ds_ratio = cmd_ln_int32_r(s->config, "-ds"); + s->max_topn = cmd_ln_int32_r(s->config, "-topn"); + E_INFO("Maximum top-N: %d\n", s->max_topn); + + /* Assume mapping of senones to their base phones, though this + * will become more flexible in the future. */ + s->sen2cb = ckd_calloc(s->n_sen, sizeof(*s->sen2cb)); + for (i = 0; i < s->n_sen; ++i) + s->sen2cb[i] = bin_mdef_sen2cimap(acmod->mdef, i); + + /* Allocate fast-match history buffers. We need enough for the + * phoneme lookahead window, plus the current frame, plus one for + * good measure? (FIXME: I don't remember why) */ + s->n_fast_hist = cmd_ln_int32_r(s->config, "-pl_window") + 2; + s->hist = ckd_calloc(s->n_fast_hist, sizeof(*s->hist)); + /* s->f will be a rotating pointer into s->hist. */ + s->f = s->hist; + for (i = 0; i < s->n_fast_hist; ++i) { + int j, k, m; + /* Top-N codewords for every codebook and feature. */ + s->hist[i].topn = ckd_calloc_3d(s->g->n_mgau, s->g->n_feat, + s->max_topn, sizeof(ptm_topn_t)); + /* Initialize them to sane (yet arbitrary) defaults. */ + for (j = 0; j < s->g->n_mgau; ++j) { + for (k = 0; k < s->g->n_feat; ++k) { + for (m = 0; m < s->max_topn; ++m) { + s->hist[i].topn[j][k][m].cw = m; + s->hist[i].topn[j][k][m].score = WORST_DIST; + } + } + } + /* Active codebook mapping (just codebook, not features, + at least not yet) */ + s->hist[i].mgau_active = bitvec_alloc(s->g->n_mgau); + /* Start with them all on, prune them later. */ + bitvec_set_all(s->hist[i].mgau_active, s->g->n_mgau); + } + + ps = (ps_mgau_t *)s; + ps->vt = &ptm_mgau_funcs; + return ps; +error_out: + ptm_mgau_free(ps_mgau_base(s)); + return NULL; +} + +int +ptm_mgau_mllr_transform(ps_mgau_t *ps, + ps_mllr_t *mllr) +{ + ptm_mgau_t *s = (ptm_mgau_t *)ps; + return gauden_mllr_transform(s->g, mllr, s->config); +} + +void +ptm_mgau_free(ps_mgau_t *ps) +{ + int i; + ptm_mgau_t *s = (ptm_mgau_t *)ps; + + logmath_free(s->lmath); + logmath_free(s->lmath_8b); + if (s->sendump_mmap) { + ckd_free_2d(s->mixw); + mmio_file_unmap(s->sendump_mmap); + } + else { + ckd_free_3d(s->mixw); + } + ckd_free(s->sen2cb); + + for (i = 0; i < s->n_fast_hist; i++) { + ckd_free_3d(s->hist[i].topn); + bitvec_free(s->hist[i].mgau_active); + } + ckd_free(s->hist); + + gauden_free(s->g); + ckd_free(s); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h new file mode 100644 index 0000000..b60f25b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h @@ -0,0 +1,113 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file ptm_mgau.h Fast phonetically-tied mixture evaluation. + * @author David Huggins-Daines + */ + +#ifndef __PTM_MGAU_H__ +#define __PTM_MGAU_H__ + +/* SphinxBase headesr. */ +#include +#include +#include + +/* Local headers. */ +#include "acmod.h" +#include "hmm.h" +#include "bin_mdef.h" +#include "ms_gauden.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +typedef struct ptm_mgau_s ptm_mgau_t; + +typedef struct ptm_topn_s { + int32 cw; /**< Codeword index. */ + int32 score; /**< Score. */ +} ptm_topn_t; + +typedef struct ptm_fast_eval_s { + ptm_topn_t ***topn; /**< Top-N for each codebook (mgau x feature x topn) */ + bitvec_t *mgau_active; /**< Set of active codebooks */ +} ptm_fast_eval_t; + +struct ptm_mgau_s { + ps_mgau_t base; /**< base structure. */ + cmd_ln_t *config; /**< Configuration parameters */ + gauden_t *g; /**< Set of Gaussians. */ + int32 n_sen; /**< Number of senones. */ + uint8 *sen2cb; /**< Senone to codebook mapping. */ + uint8 ***mixw; /**< Mixture weight distributions by feature, codeword, senone */ + mmio_file_t *sendump_mmap;/* Memory map for mixw (or NULL if not mmap) */ + uint8 *mixw_cb; /* Mixture weight codebook, if any (assume it contains 16 values) */ + int16 max_topn; + int16 ds_ratio; + + ptm_fast_eval_t *hist; /**< Fast evaluation info for past frames. */ + ptm_fast_eval_t *f; /**< Fast eval info for current frame. */ + int n_fast_hist; /**< Number of past frames tracked. */ + + /* Log-add table for compressed values. */ + logmath_t *lmath_8b; + /* Log-add object for reloading means/variances. */ + logmath_t *lmath; +}; + +ps_mgau_t *ptm_mgau_init(acmod_t *acmod, bin_mdef_t *mdef); +void ptm_mgau_free(ps_mgau_t *s); +int ptm_mgau_frame_eval(ps_mgau_t *s, + int16 *senone_scores, + uint8 *senone_active, + int32 n_senone_active, + mfcc_t **featbuf, + int32 frame, + int32 compallsen); +int ptm_mgau_mllr_transform(ps_mgau_t *s, + ps_mllr_t *mllr); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __PTM_MGAU_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c new file mode 100644 index 0000000..4d54af6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c @@ -0,0 +1,1359 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* System headers */ +#include +#include +#include +#include +#include +#include +#if defined(__ADSPBLACKFIN__) +#elif !defined(_WIN32_WCE) +#include +#endif + +/* SphinxBase headers */ +#include +#include +#include +#include +#include +#include +#include + +/* Local headers */ +#include "s2_semi_mgau.h" +#include "tied_mgau_common.h" + +static ps_mgaufuncs_t s2_semi_mgau_funcs = { + "s2_semi", + s2_semi_mgau_frame_eval, /* frame_eval */ + s2_semi_mgau_mllr_transform, /* transform */ + s2_semi_mgau_free /* free */ +}; + +struct vqFeature_s { + int32 score; /* score or distance */ + int32 codeword; /* codeword (vector index) */ +}; + +static void +eval_topn(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) +{ + int i, ceplen; + vqFeature_t *topn; + + topn = s->f[feat]; + ceplen = s->g->featlen[feat]; + + for (i = 0; i < s->max_topn; i++) { + mfcc_t *mean, diff, sqdiff, compl; /* diff, diff^2, component likelihood */ + vqFeature_t vtmp; + mfcc_t *var, d; + mfcc_t *obs; + int32 cw, j; + + cw = topn[i].codeword; + mean = s->g->mean[0][feat][0] + cw * ceplen; + var = s->g->var[0][feat][0] + cw * ceplen; + d = s->g->det[0][feat][cw]; + obs = z; + for (j = 0; j < ceplen; j++) { + diff = *obs++ - *mean++; + sqdiff = MFCCMUL(diff, diff); + compl = MFCCMUL(sqdiff, *var); + d = GMMSUB(d, compl); + ++var; + } + topn[i].score = (int32)d; + if (i == 0) + continue; + vtmp = topn[i]; + for (j = i - 1; j >= 0 && (int32)d > topn[j].score; j--) { + topn[j + 1] = topn[j]; + } + topn[j + 1] = vtmp; + } +} + +static void +eval_cb(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) +{ + vqFeature_t *worst, *best, *topn; + mfcc_t *mean; + mfcc_t *var, *det, *detP, *detE; + int32 i, ceplen; + + best = topn = s->f[feat]; + worst = topn + (s->max_topn - 1); + mean = s->g->mean[0][feat][0]; + var = s->g->var[0][feat][0]; + det = s->g->det[0][feat]; + detE = det + s->g->n_density; + ceplen = s->g->featlen[feat]; + + for (detP = det; detP < detE; ++detP) { + mfcc_t diff, sqdiff, compl; /* diff, diff^2, component likelihood */ + mfcc_t d; + mfcc_t *obs; + vqFeature_t *cur; + int32 cw, j; + + d = *detP; + obs = z; + cw = (int)(detP - det); + for (j = 0; (j < ceplen) && (d >= worst->score); ++j) { + diff = *obs++ - *mean++; + sqdiff = MFCCMUL(diff, diff); + compl = MFCCMUL(sqdiff, *var); + d = GMMSUB(d, compl); + ++var; + } + if (j < ceplen) { + /* terminated early, so not in topn */ + mean += (ceplen - j); + var += (ceplen - j); + continue; + } + if ((int32)d < worst->score) + continue; + for (i = 0; i < s->max_topn; i++) { + /* already there, so don't need to insert */ + if (topn[i].codeword == cw) + break; + } + if (i < s->max_topn) + continue; /* already there. Don't insert */ + /* remaining code inserts codeword and dist in correct spot */ + for (cur = worst - 1; cur >= best && (int32)d >= cur->score; --cur) + memcpy(cur + 1, cur, sizeof(vqFeature_t)); + ++cur; + cur->codeword = cw; + cur->score = (int32)d; + } +} + +static void +mgau_dist(s2_semi_mgau_t * s, int32 frame, int32 feat, mfcc_t * z) +{ + eval_topn(s, feat, z); + + /* If this frame is skipped, do nothing else. */ + if (frame % s->ds_ratio) + return; + + /* Evaluate the rest of the codebook (or subset thereof). */ + eval_cb(s, feat, z); +} + +static int +mgau_norm(s2_semi_mgau_t *s, int feat) +{ + int32 norm; + int j; + + /* Compute quantized normalizing constant. */ + norm = s->f[feat][0].score >> SENSCR_SHIFT; + + /* Normalize the scores, negate them, and clamp their dynamic range. */ + for (j = 0; j < s->max_topn; ++j) { + s->f[feat][j].score = -((s->f[feat][j].score >> SENSCR_SHIFT) - norm); + if (s->f[feat][j].score > MAX_NEG_ASCR) + s->f[feat][j].score = MAX_NEG_ASCR; + if (s->topn_beam[feat] && s->f[feat][j].score > s->topn_beam[feat]) + break; + } + return j; +} + +static int32 +get_scores_8b_feat_6(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3, *pid_cw4, *pid_cw5; + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + pid_cw2 = s->mixw[i][s->f[i][2].codeword]; + pid_cw3 = s->mixw[i][s->f[i][3].codeword]; + pid_cw4 = s->mixw[i][s->f[i][4].codeword]; + pid_cw5 = s->mixw[i][s->f[i][5].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int sen = senone_active[j] + l; + int32 tmp = pid_cw0[sen] + s->f[i][0].score; + + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw1[sen] + s->f[i][1].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw2[sen] + s->f[i][2].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw3[sen] + s->f[i][3].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw4[sen] + s->f[i][4].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw5[sen] + s->f[i][5].score); + + senone_scores[sen] += tmp; + l = sen; + } + return 0; +} + +static int32 +get_scores_8b_feat_5(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3, *pid_cw4; + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + pid_cw2 = s->mixw[i][s->f[i][2].codeword]; + pid_cw3 = s->mixw[i][s->f[i][3].codeword]; + pid_cw4 = s->mixw[i][s->f[i][4].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int sen = senone_active[j] + l; + int32 tmp = pid_cw0[sen] + s->f[i][0].score; + + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw1[sen] + s->f[i][1].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw2[sen] + s->f[i][2].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw3[sen] + s->f[i][3].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw4[sen] + s->f[i][4].score); + + senone_scores[sen] += tmp; + l = sen; + } + return 0; +} + +static int32 +get_scores_8b_feat_4(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3; + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + pid_cw2 = s->mixw[i][s->f[i][2].codeword]; + pid_cw3 = s->mixw[i][s->f[i][3].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int sen = senone_active[j] + l; + int32 tmp = pid_cw0[sen] + s->f[i][0].score; + + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw1[sen] + s->f[i][1].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw2[sen] + s->f[i][2].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw3[sen] + s->f[i][3].score); + + senone_scores[sen] += tmp; + l = sen; + } + return 0; +} + +static int32 +get_scores_8b_feat_3(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1, *pid_cw2; + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + pid_cw2 = s->mixw[i][s->f[i][2].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int sen = senone_active[j] + l; + int32 tmp = pid_cw0[sen] + s->f[i][0].score; + + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw1[sen] + s->f[i][1].score); + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw2[sen] + s->f[i][2].score); + + senone_scores[sen] += tmp; + l = sen; + } + return 0; +} + +static int32 +get_scores_8b_feat_2(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1; + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int sen = senone_active[j] + l; + int32 tmp = pid_cw0[sen] + s->f[i][0].score; + + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw1[sen] + s->f[i][1].score); + + senone_scores[sen] += tmp; + l = sen; + } + return 0; +} + +static int32 +get_scores_8b_feat_1(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0; + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + for (l = j = 0; j < n_senone_active; j++) { + int sen = senone_active[j] + l; + int32 tmp = pid_cw0[sen] + s->f[i][0].score; + senone_scores[sen] += tmp; + l = sen; + } + return 0; +} + +static int32 +get_scores_8b_feat_any(s2_semi_mgau_t * s, int i, int topn, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, k, l; + + for (l = j = 0; j < n_senone_active; j++) { + int sen = senone_active[j] + l; + uint8 *pid_cw; + int32 tmp; + pid_cw = s->mixw[i][s->f[i][0].codeword]; + tmp = pid_cw[sen] + s->f[i][0].score; + for (k = 1; k < topn; ++k) { + pid_cw = s->mixw[i][s->f[i][k].codeword]; + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw[sen] + s->f[i][k].score); + } + senone_scores[sen] += tmp; + l = sen; + } + return 0; +} + +static int32 +get_scores_8b_feat(s2_semi_mgau_t * s, int i, int topn, + int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) +{ + switch (topn) { + case 6: + return get_scores_8b_feat_6(s, i, senone_scores, + senone_active, n_senone_active); + case 5: + return get_scores_8b_feat_5(s, i, senone_scores, + senone_active, n_senone_active); + case 4: + return get_scores_8b_feat_4(s, i, senone_scores, + senone_active, n_senone_active); + case 3: + return get_scores_8b_feat_3(s, i, senone_scores, + senone_active, n_senone_active); + case 2: + return get_scores_8b_feat_2(s, i, senone_scores, + senone_active, n_senone_active); + case 1: + return get_scores_8b_feat_1(s, i, senone_scores, + senone_active, n_senone_active); + default: + return get_scores_8b_feat_any(s, i, topn, senone_scores, + senone_active, n_senone_active); + } +} + +static int32 +get_scores_8b_feat_all(s2_semi_mgau_t * s, int i, int topn, int16 *senone_scores) +{ + int32 j, k; + + for (j = 0; j < s->n_sen; j++) { + uint8 *pid_cw; + int32 tmp; + pid_cw = s->mixw[i][s->f[i][0].codeword]; + tmp = pid_cw[j] + s->f[i][0].score; + for (k = 1; k < topn; ++k) { + pid_cw = s->mixw[i][s->f[i][k].codeword]; + tmp = fast_logmath_add(s->lmath_8b, tmp, + pid_cw[j] + s->f[i][k].score); + } + senone_scores[j] += tmp; + } + return 0; +} + +static int32 +get_scores_4b_feat_6(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3, *pid_cw4, *pid_cw5; + uint8 w_den[6][16]; + + /* Precompute scaled densities. */ + for (j = 0; j < 16; ++j) { + w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; + w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; + w_den[2][j] = s->mixw_cb[j] + s->f[i][2].score; + w_den[3][j] = s->mixw_cb[j] + s->f[i][3].score; + w_den[4][j] = s->mixw_cb[j] + s->f[i][4].score; + w_den[5][j] = s->mixw_cb[j] + s->f[i][5].score; + } + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + pid_cw2 = s->mixw[i][s->f[i][2].codeword]; + pid_cw3 = s->mixw[i][s->f[i][3].codeword]; + pid_cw4 = s->mixw[i][s->f[i][4].codeword]; + pid_cw5 = s->mixw[i][s->f[i][5].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int n = senone_active[j] + l; + int tmp, cw; + + if (n & 1) { + cw = pid_cw0[n/2] >> 4; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + cw = pid_cw2[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); + cw = pid_cw3[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); + cw = pid_cw4[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[4][cw]); + cw = pid_cw5[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[5][cw]); + } + else { + cw = pid_cw0[n/2] & 0x0f; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + cw = pid_cw2[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); + cw = pid_cw3[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); + cw = pid_cw4[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[4][cw]); + cw = pid_cw5[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[5][cw]); + } + senone_scores[n] += tmp; + l = n; + } + return 0; +} + +static int32 +get_scores_4b_feat_5(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3, *pid_cw4; + uint8 w_den[5][16]; + + /* Precompute scaled densities. */ + for (j = 0; j < 16; ++j) { + w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; + w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; + w_den[2][j] = s->mixw_cb[j] + s->f[i][2].score; + w_den[3][j] = s->mixw_cb[j] + s->f[i][3].score; + w_den[4][j] = s->mixw_cb[j] + s->f[i][4].score; + } + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + pid_cw2 = s->mixw[i][s->f[i][2].codeword]; + pid_cw3 = s->mixw[i][s->f[i][3].codeword]; + pid_cw4 = s->mixw[i][s->f[i][4].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int n = senone_active[j] + l; + int tmp, cw; + + if (n & 1) { + cw = pid_cw0[n/2] >> 4; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + cw = pid_cw2[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); + cw = pid_cw3[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); + cw = pid_cw4[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[4][cw]); + } + else { + cw = pid_cw0[n/2] & 0x0f; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + cw = pid_cw2[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); + cw = pid_cw3[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); + cw = pid_cw4[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[4][cw]); + } + senone_scores[n] += tmp; + l = n; + } + return 0; +} + +static int32 +get_scores_4b_feat_4(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3; + uint8 w_den[4][16]; + + /* Precompute scaled densities. */ + for (j = 0; j < 16; ++j) { + w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; + w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; + w_den[2][j] = s->mixw_cb[j] + s->f[i][2].score; + w_den[3][j] = s->mixw_cb[j] + s->f[i][3].score; + } + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + pid_cw2 = s->mixw[i][s->f[i][2].codeword]; + pid_cw3 = s->mixw[i][s->f[i][3].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int n = senone_active[j] + l; + int tmp, cw; + + if (n & 1) { + cw = pid_cw0[n/2] >> 4; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + cw = pid_cw2[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); + cw = pid_cw3[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); + } + else { + cw = pid_cw0[n/2] & 0x0f; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + cw = pid_cw2[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); + cw = pid_cw3[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[3][cw]); + } + senone_scores[n] += tmp; + l = n; + } + return 0; +} + +static int32 +get_scores_4b_feat_3(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1, *pid_cw2; + uint8 w_den[3][16]; + + /* Precompute scaled densities. */ + for (j = 0; j < 16; ++j) { + w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; + w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; + w_den[2][j] = s->mixw_cb[j] + s->f[i][2].score; + } + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + pid_cw2 = s->mixw[i][s->f[i][2].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int n = senone_active[j] + l; + int tmp, cw; + + if (n & 1) { + cw = pid_cw0[n/2] >> 4; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + cw = pid_cw2[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); + } + else { + cw = pid_cw0[n/2] & 0x0f; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + cw = pid_cw2[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[2][cw]); + } + senone_scores[n] += tmp; + l = n; + } + return 0; +} + +static int32 +get_scores_4b_feat_2(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0, *pid_cw1; + uint8 w_den[2][16]; + + /* Precompute scaled densities. */ + for (j = 0; j < 16; ++j) { + w_den[0][j] = s->mixw_cb[j] + s->f[i][0].score; + w_den[1][j] = s->mixw_cb[j] + s->f[i][1].score; + } + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + pid_cw1 = s->mixw[i][s->f[i][1].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int n = senone_active[j] + l; + int tmp, cw; + + if (n & 1) { + cw = pid_cw0[n/2] >> 4; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] >> 4; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + } + else { + cw = pid_cw0[n/2] & 0x0f; + tmp = w_den[0][cw]; + cw = pid_cw1[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, w_den[1][cw]); + } + senone_scores[n] += tmp; + l = n; + } + return 0; +} + +static int32 +get_scores_4b_feat_1(s2_semi_mgau_t * s, int i, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, l; + uint8 *pid_cw0; + uint8 w_den[16]; + + /* Precompute scaled densities. */ + for (j = 0; j < 16; ++j) { + w_den[j] = s->mixw_cb[j] + s->f[i][0].score; + } + + pid_cw0 = s->mixw[i][s->f[i][0].codeword]; + + for (l = j = 0; j < n_senone_active; j++) { + int n = senone_active[j] + l; + int tmp, cw; + + if (n & 1) { + cw = pid_cw0[n/2] >> 4; + tmp = w_den[cw]; + } + else { + cw = pid_cw0[n/2] & 0x0f; + tmp = w_den[cw]; + } + senone_scores[n] += tmp; + l = n; + } + return 0; +} + +static int32 +get_scores_4b_feat_any(s2_semi_mgau_t * s, int i, int topn, + int16 *senone_scores, uint8 *senone_active, + int32 n_senone_active) +{ + int32 j, k, l; + + for (l = j = 0; j < n_senone_active; j++) { + int n = senone_active[j] + l; + int tmp, cw; + uint8 *pid_cw; + + pid_cw = s->mixw[i][s->f[i][0].codeword]; + if (n & 1) + cw = pid_cw[n/2] >> 4; + else + cw = pid_cw[n/2] & 0x0f; + tmp = s->mixw_cb[cw] + s->f[i][0].score; + for (k = 1; k < topn; ++k) { + pid_cw = s->mixw[i][s->f[i][k].codeword]; + if (n & 1) + cw = pid_cw[n/2] >> 4; + else + cw = pid_cw[n/2] & 0x0f; + tmp = fast_logmath_add(s->lmath_8b, tmp, + s->mixw_cb[cw] + s->f[i][k].score); + } + senone_scores[n] += tmp; + l = n; + } + return 0; +} + +static int32 +get_scores_4b_feat(s2_semi_mgau_t * s, int i, int topn, + int16 *senone_scores, uint8 *senone_active, int32 n_senone_active) +{ + switch (topn) { + case 6: + return get_scores_4b_feat_6(s, i, senone_scores, + senone_active, n_senone_active); + case 5: + return get_scores_4b_feat_5(s, i, senone_scores, + senone_active, n_senone_active); + case 4: + return get_scores_4b_feat_4(s, i, senone_scores, + senone_active, n_senone_active); + case 3: + return get_scores_4b_feat_3(s, i, senone_scores, + senone_active, n_senone_active); + case 2: + return get_scores_4b_feat_2(s, i, senone_scores, + senone_active, n_senone_active); + case 1: + return get_scores_4b_feat_1(s, i, senone_scores, + senone_active, n_senone_active); + default: + return get_scores_4b_feat_any(s, i, topn, senone_scores, + senone_active, n_senone_active); + } +} + +static int32 +get_scores_4b_feat_all(s2_semi_mgau_t * s, int i, int topn, int16 *senone_scores) +{ + int j, last_sen; + + j = 0; + /* Number of senones is always even, but don't overrun if it isn't. */ + last_sen = s->n_sen & ~1; + while (j < last_sen) { + uint8 *pid_cw; + int32 tmp0, tmp1; + int k; + + pid_cw = s->mixw[i][s->f[i][0].codeword]; + tmp0 = s->mixw_cb[pid_cw[j/2] & 0x0f] + s->f[i][0].score; + tmp1 = s->mixw_cb[pid_cw[j/2] >> 4] + s->f[i][0].score; + for (k = 1; k < topn; ++k) { + int32 w_den0, w_den1; + + pid_cw = s->mixw[i][s->f[i][k].codeword]; + w_den0 = s->mixw_cb[pid_cw[j/2] & 0x0f] + s->f[i][k].score; + w_den1 = s->mixw_cb[pid_cw[j/2] >> 4] + s->f[i][k].score; + tmp0 = fast_logmath_add(s->lmath_8b, tmp0, w_den0); + tmp1 = fast_logmath_add(s->lmath_8b, tmp1, w_den1); + } + senone_scores[j++] += tmp0; + senone_scores[j++] += tmp1; + } + return 0; +} + +/* + * Compute senone scores for the active senones. + */ +int32 +s2_semi_mgau_frame_eval(ps_mgau_t *ps, + int16 *senone_scores, + uint8 *senone_active, + int32 n_senone_active, + mfcc_t ** featbuf, int32 frame, + int32 compallsen) +{ + s2_semi_mgau_t *s = (s2_semi_mgau_t *)ps; + int i, topn_idx; + int n_feat = s->g->n_feat; + + memset(senone_scores, 0, s->n_sen * sizeof(*senone_scores)); + /* No bounds checking is done here, which just means you'll get + * semi-random crap if you request a frame in the future or one + * that's too far in the past. */ + topn_idx = frame % s->n_topn_hist; + s->f = s->topn_hist[topn_idx]; + for (i = 0; i < n_feat; ++i) { + /* For past frames this will already be computed. */ + if (frame >= ps_mgau_base(ps)->frame_idx) { + vqFeature_t **lastf; + if (topn_idx == 0) + lastf = s->topn_hist[s->n_topn_hist-1]; + else + lastf = s->topn_hist[topn_idx-1]; + memcpy(s->f[i], lastf[i], sizeof(vqFeature_t) * s->max_topn); + mgau_dist(s, frame, i, featbuf[i]); + s->topn_hist_n[topn_idx][i] = mgau_norm(s, i); + } + if (s->mixw_cb) { + if (compallsen) + get_scores_4b_feat_all(s, i, s->topn_hist_n[topn_idx][i], senone_scores); + else + get_scores_4b_feat(s, i, s->topn_hist_n[topn_idx][i], senone_scores, + senone_active, n_senone_active); + } + else { + if (compallsen) + get_scores_8b_feat_all(s, i, s->topn_hist_n[topn_idx][i], senone_scores); + else + get_scores_8b_feat(s, i, s->topn_hist_n[topn_idx][i], senone_scores, + senone_active, n_senone_active); + } + } + + return 0; +} + +static int32 +read_sendump(s2_semi_mgau_t *s, bin_mdef_t *mdef, char const *file) +{ + FILE *fp; + char line[1000]; + int32 i, n, r, c; + int32 do_swap, do_mmap; + size_t offset; + int n_clust = 0; + int n_feat = s->g->n_feat; + int n_density = s->g->n_density; + int n_sen = bin_mdef_n_sen(mdef); + int n_bits = 8; + + s->n_sen = n_sen; /* FIXME: Should have been done earlier */ + do_mmap = cmd_ln_boolean_r(s->config, "-mmap"); + + if ((fp = fopen(file, "rb")) == NULL) + return -1; + + E_INFO("Loading senones from dump file %s\n", file); + /* Read title size, title */ + if (fread(&n, sizeof(int32), 1, fp) != 1) { + E_ERROR_SYSTEM("Failed to read title size from %s", file); + goto error_out; + } + /* This is extremely bogus */ + do_swap = 0; + if (n < 1 || n > 999) { + SWAP_INT32(&n); + if (n < 1 || n > 999) { + E_ERROR("Title length %x in dump file %s out of range\n", n, file); + goto error_out; + } + do_swap = 1; + } + if (fread(line, sizeof(char), n, fp) != (size_t)n) { + E_ERROR_SYSTEM("Cannot read title"); + goto error_out; + } + if (line[n - 1] != '\0') { + E_ERROR("Bad title in dump file\n"); + goto error_out; + } + E_INFO("%s\n", line); + + /* Read header size, header */ + if (fread(&n, sizeof(n), 1, fp) != 1) { + E_ERROR_SYSTEM("Failed to read header size from %s", file); + goto error_out; + } + if (do_swap) SWAP_INT32(&n); + if (fread(line, sizeof(char), n, fp) != (size_t)n) { + E_ERROR_SYSTEM("Cannot read header"); + goto error_out; + } + if (line[n - 1] != '\0') { + E_ERROR("Bad header in dump file\n"); + goto error_out; + } + + /* Read other header strings until string length = 0 */ + for (;;) { + if (fread(&n, sizeof(n), 1, fp) != 1) { + E_ERROR_SYSTEM("Failed to read header string size from %s", file); + goto error_out; + } + if (do_swap) SWAP_INT32(&n); + if (n == 0) + break; + if (fread(line, sizeof(char), n, fp) != (size_t)n) { + E_ERROR_SYSTEM("Cannot read header"); + goto error_out; + } + /* Look for a cluster count, if present */ + if (!strncmp(line, "feature_count ", strlen("feature_count "))) { + n_feat = atoi(line + strlen("feature_count ")); + } + if (!strncmp(line, "mixture_count ", strlen("mixture_count "))) { + n_density = atoi(line + strlen("mixture_count ")); + } + if (!strncmp(line, "model_count ", strlen("model_count "))) { + n_sen = atoi(line + strlen("model_count ")); + } + if (!strncmp(line, "cluster_count ", strlen("cluster_count "))) { + n_clust = atoi(line + strlen("cluster_count ")); + } + if (!strncmp(line, "cluster_bits ", strlen("cluster_bits "))) { + n_bits = atoi(line + strlen("cluster_bits ")); + } + } + + /* Defaults for #rows, #columns in mixw array. */ + c = n_sen; + r = n_density; + if (n_clust == 0) { + /* Older mixw files have them here, and they might be padded. */ + if (fread(&r, sizeof(r), 1, fp) != 1) { + E_ERROR_SYSTEM("Cannot read #rows"); + goto error_out; + } + if (do_swap) SWAP_INT32(&r); + if (fread(&c, sizeof(c), 1, fp) != 1) { + E_ERROR_SYSTEM("Cannot read #columns"); + goto error_out; + } + if (do_swap) SWAP_INT32(&c); + E_INFO("Rows: %d, Columns: %d\n", r, c); + } + + if (n_feat != s->g->n_feat) { + E_ERROR("Number of feature streams mismatch: %d != %d\n", + n_feat, s->g->n_feat); + goto error_out; + } + if (n_density != s->g->n_density) { + E_ERROR("Number of densities mismatch: %d != %d\n", + n_density, s->g->n_density); + goto error_out; + } + if (n_sen != s->n_sen) { + E_ERROR("Number of senones mismatch: %d != %d\n", + n_sen, s->n_sen); + goto error_out; + } + + if (!((n_clust == 0) || (n_clust == 15) || (n_clust == 16))) { + E_ERROR("Cluster count must be 0, 15, or 16\n"); + goto error_out; + } + if (n_clust == 15) + ++n_clust; + + if (!((n_bits == 8) || (n_bits == 4))) { + E_ERROR("Cluster count must be 4 or 8\n"); + goto error_out; + } + + if (do_mmap) { + E_INFO("Using memory-mapped I/O for senones\n"); + } + offset = ftell(fp); + + /* Allocate memory for pdfs (or memory map them) */ + if (do_mmap) { + s->sendump_mmap = mmio_file_read(file); + /* Get cluster codebook if any. */ + if (n_clust) { + s->mixw_cb = ((uint8 *) mmio_file_ptr(s->sendump_mmap)) + offset; + offset += n_clust; + } + } + else { + /* Get cluster codebook if any. */ + if (n_clust) { + s->mixw_cb = ckd_calloc(1, n_clust); + if (fread(s->mixw_cb, 1, n_clust, fp) != (size_t) n_clust) { + E_ERROR("Failed to read %d bytes from sendump\n", n_clust); + goto error_out; + } + } + } + + /* Set up pointers, or read, or whatever */ + if (s->sendump_mmap) { + s->mixw = ckd_calloc_2d(n_feat, n_density, sizeof(*s->mixw)); + for (n = 0; n < n_feat; n++) { + int step = c; + if (n_bits == 4) + step = (step + 1) / 2; + for (i = 0; i < r; i++) { + s->mixw[n][i] = ((uint8 *) mmio_file_ptr(s->sendump_mmap)) + offset; + offset += step; + } + } + } + else { + s->mixw = ckd_calloc_3d(n_feat, n_density, n_sen, sizeof(***s->mixw)); + /* Read pdf values and ids */ + for (n = 0; n < n_feat; n++) { + int step = c; + if (n_bits == 4) + step = (step + 1) / 2; + for (i = 0; i < r; i++) { + if (fread(s->mixw[n][i], sizeof(***s->mixw), step, fp) + != (size_t) step) { + E_ERROR("Failed to read %d bytes from sendump\n", step); + goto error_out; + } + } + } + } + + fclose(fp); + return 0; +error_out: + fclose(fp); + return -1; +} + +static int32 +read_mixw(s2_semi_mgau_t * s, char const *file_name, double SmoothMin) +{ + char **argname, **argval; + char eofchk; + FILE *fp; + int32 byteswap, chksum_present; + uint32 chksum; + float32 *pdf; + int32 i, f, c, n; + int32 n_sen; + int32 n_feat; + int32 n_comp; + int32 n_err; + + E_INFO("Reading mixture weights file '%s'\n", file_name); + + if ((fp = fopen(file_name, "rb")) == NULL) + E_FATAL_SYSTEM("Failed to open mixture weights file '%s' for reading", file_name); + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) + E_FATAL("Failed to read header from file '%s'\n", file_name); + + /* Parse argument-value list */ + chksum_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], MGAU_MIXW_VERSION) != 0) + E_WARN("Version mismatch(%s): %s, expecting %s\n", + file_name, argval[i], MGAU_MIXW_VERSION); + } + else if (strcmp(argname[i], "chksum0") == 0) { + chksum_present = 1; /* Ignore the associated value */ + } + } + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + /* Read #senones, #features, #codewords, arraysize */ + if ((bio_fread(&n_sen, sizeof(int32), 1, fp, byteswap, &chksum) != 1) + || (bio_fread(&n_feat, sizeof(int32), 1, fp, byteswap, &chksum) != + 1) + || (bio_fread(&n_comp, sizeof(int32), 1, fp, byteswap, &chksum) != + 1) + || (bio_fread(&n, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { + E_FATAL("bio_fread(%s) (arraysize) failed\n", file_name); + } + if (n_feat != s->g->n_feat) + E_FATAL("#Features streams(%d) != %d\n", n_feat, s->g->n_feat); + if (n != n_sen * n_feat * n_comp) { + E_FATAL + ("%s: #float32s(%d) doesn't match header dimensions: %d x %d x %d\n", + file_name, i, n_sen, n_feat, n_comp); + } + + /* n_sen = number of mixture weights per codeword, which is + * fixed at the number of senones since we have only one codebook. + */ + s->n_sen = n_sen; + + /* Quantized mixture weight arrays. */ + s->mixw = ckd_calloc_3d(n_feat, s->g->n_density, n_sen, sizeof(***s->mixw)); + + /* Temporary structure to read in floats before conversion to (int32) logs3 */ + pdf = (float32 *) ckd_calloc(n_comp, sizeof(float32)); + + /* Read senone probs data, normalize, floor, convert to logs3, truncate to 8 bits */ + n_err = 0; + for (i = 0; i < n_sen; i++) { + for (f = 0; f < n_feat; f++) { + if (bio_fread((void *) pdf, sizeof(float32), + n_comp, fp, byteswap, &chksum) != n_comp) { + E_FATAL("bio_fread(%s) (arraydata) failed\n", file_name); + } + + /* Normalize and floor */ + if (vector_sum_norm(pdf, n_comp) <= 0.0) + n_err++; + vector_floor(pdf, n_comp, SmoothMin); + vector_sum_norm(pdf, n_comp); + + /* Convert to LOG, quantize, and transpose */ + for (c = 0; c < n_comp; c++) { + int32 qscr; + + qscr = -logmath_log(s->lmath_8b, pdf[c]); + if ((qscr > MAX_NEG_MIXW) || (qscr < 0)) + qscr = MAX_NEG_MIXW; + s->mixw[f][c][i] = qscr; + } + } + } + if (n_err > 0) + E_WARN("Weight normalization failed for %d mixture weights components\n", n_err); + + ckd_free(pdf); + + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&eofchk, 1, 1, fp) == 1) + E_FATAL("More data than expected in %s\n", file_name); + + fclose(fp); + + E_INFO("Read %d x %d x %d mixture weights\n", n_sen, n_feat, n_comp); + return n_sen; +} + + +static int +split_topn(char const *str, uint8 *out, int nfeat) +{ + char *topn_list = ckd_salloc(str); + char *c, *cc; + int i, maxn; + + c = topn_list; + i = 0; + maxn = 0; + while (i < nfeat && (cc = strchr(c, ',')) != NULL) { + *cc = '\0'; + out[i] = atoi(c); + if (out[i] > maxn) maxn = out[i]; + c = cc + 1; + ++i; + } + if (i < nfeat && *c != '\0') { + out[i] = atoi(c); + if (out[i] > maxn) maxn = out[i]; + ++i; + } + while (i < nfeat) + out[i++] = maxn; + + ckd_free(topn_list); + return maxn; +} + + +ps_mgau_t * +s2_semi_mgau_init(acmod_t *acmod) +{ + s2_semi_mgau_t *s; + ps_mgau_t *ps; + char const *sendump_path; + int i; + int n_feat; + + s = ckd_calloc(1, sizeof(*s)); + s->config = acmod->config; + + s->lmath = logmath_retain(acmod->lmath); + /* Log-add table. */ + s->lmath_8b = logmath_init(logmath_get_base(acmod->lmath), SENSCR_SHIFT, TRUE); + if (s->lmath_8b == NULL) + goto error_out; + /* Ensure that it is only 8 bits wide so that fast_logmath_add() works. */ + if (logmath_get_width(s->lmath_8b) != 1) { + E_ERROR("Log base %f is too small to represent add table in 8 bits\n", + logmath_get_base(s->lmath_8b)); + goto error_out; + } + + /* Read means and variances. */ + if ((s->g = gauden_init(cmd_ln_str_r(s->config, "_mean"), + cmd_ln_str_r(s->config, "_var"), + cmd_ln_float32_r(s->config, "-varfloor"), + s->lmath)) == NULL) { + E_ERROR("Failed to read means and variances\n"); + goto error_out; + } + + /* Currently only a single codebook is supported. */ + if (s->g->n_mgau != 1) + goto error_out; + + n_feat = s->g->n_feat; + + /* Verify n_feat and veclen, against acmod. */ + if (n_feat != feat_dimension1(acmod->fcb)) { + E_ERROR("Number of streams does not match: %d != %d\n", + n_feat, feat_dimension1(acmod->fcb)); + goto error_out; + } + for (i = 0; i < n_feat; ++i) { + if ((uint32)s->g->featlen[i] != feat_dimension2(acmod->fcb, i)) { + E_ERROR("Dimension of stream %d does not match: %d != %d\n", + i, s->g->featlen[i], feat_dimension2(acmod->fcb, i)); + goto error_out; + } + } + /* Read mixture weights */ + if ((sendump_path = cmd_ln_str_r(s->config, "_sendump"))) { + if (read_sendump(s, acmod->mdef, sendump_path) < 0) { + goto error_out; + } + } + else { + if (read_mixw(s, cmd_ln_str_r(s->config, "_mixw"), + cmd_ln_float32_r(s->config, "-mixwfloor")) < 0) { + goto error_out; + } + } + s->ds_ratio = cmd_ln_int32_r(s->config, "-ds"); + + /* Determine top-N for each feature */ + s->topn_beam = ckd_calloc(n_feat, sizeof(*s->topn_beam)); + s->max_topn = cmd_ln_int32_r(s->config, "-topn"); + split_topn(cmd_ln_str_r(s->config, "-topn_beam"), s->topn_beam, n_feat); + E_INFO("Maximum top-N: %d ", s->max_topn); + E_INFOCONT("Top-N beams:"); + for (i = 0; i < n_feat; ++i) { + E_INFOCONT(" %d", s->topn_beam[i]); + } + E_INFOCONT("\n"); + + /* Top-N scores from recent frames */ + s->n_topn_hist = cmd_ln_int32_r(s->config, "-pl_window") + 2; + s->topn_hist = (vqFeature_t ***) + ckd_calloc_3d(s->n_topn_hist, n_feat, s->max_topn, + sizeof(***s->topn_hist)); + s->topn_hist_n = ckd_calloc_2d(s->n_topn_hist, n_feat, + sizeof(**s->topn_hist_n)); + for (i = 0; i < s->n_topn_hist; ++i) { + int j; + for (j = 0; j < n_feat; ++j) { + int k; + for (k = 0; k < s->max_topn; ++k) { + s->topn_hist[i][j][k].score = WORST_DIST; + s->topn_hist[i][j][k].codeword = k; + } + } + } + + ps = (ps_mgau_t *)s; + ps->vt = &s2_semi_mgau_funcs; + return ps; +error_out: + s2_semi_mgau_free(ps_mgau_base(s)); + return NULL; +} + +int +s2_semi_mgau_mllr_transform(ps_mgau_t *ps, + ps_mllr_t *mllr) +{ + s2_semi_mgau_t *s = (s2_semi_mgau_t *)ps; + return gauden_mllr_transform(s->g, mllr, s->config); +} + +void +s2_semi_mgau_free(ps_mgau_t *ps) +{ + s2_semi_mgau_t *s = (s2_semi_mgau_t *)ps; + + logmath_free(s->lmath); + logmath_free(s->lmath_8b); + if (s->sendump_mmap) { + ckd_free_2d(s->mixw); + mmio_file_unmap(s->sendump_mmap); + } + else { + ckd_free_3d(s->mixw); + if (s->mixw_cb) + ckd_free(s->mixw_cb); + } + gauden_free(s->g); + ckd_free(s->topn_beam); + ckd_free_2d(s->topn_hist_n); + ckd_free_3d((void **)s->topn_hist); + ckd_free(s); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h new file mode 100644 index 0000000..b45e5e3 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h @@ -0,0 +1,108 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * Interface for "semi-continuous vector quantization", a.k.a. Sphinx2 + * fast GMM computation. + */ + +#ifndef __S2_SEMI_MGAU_H__ +#define __S2_SEMI_MGAU_H__ + +/* SphinxBase headesr. */ +#include +#include +#include + +/* Local headers. */ +#include "acmod.h" +#include "hmm.h" +#include "bin_mdef.h" +#include "ms_gauden.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +typedef struct vqFeature_s vqFeature_t; + +typedef struct s2_semi_mgau_s s2_semi_mgau_t; +struct s2_semi_mgau_s { + ps_mgau_t base; /**< base structure. */ + cmd_ln_t *config; /* configuration parameters */ + + gauden_t *g; /* Set of Gaussians (pointers below point in here and will go away soon) */ + + uint8 ***mixw; /* mixture weight distributions */ + mmio_file_t *sendump_mmap;/* memory map for mixw (or NULL if not mmap) */ + + uint8 *mixw_cb; /* mixture weight codebook, if any (assume it contains 16 values) */ + int32 n_sen; /* Number of senones */ + uint8 *topn_beam; /* Beam for determining per-frame top-N densities */ + int16 max_topn; + int16 ds_ratio; + + vqFeature_t ***topn_hist; /**< Top-N scores and codewords for past frames. */ + uint8 **topn_hist_n; /**< Variable top-N for past frames. */ + vqFeature_t **f; /**< Topn-N for currently scoring frame. */ + int n_topn_hist; /**< Number of past frames tracked. */ + + /* Log-add table for compressed values. */ + logmath_t *lmath_8b; + /* Log-add object for reloading means/variances. */ + logmath_t *lmath; +}; + +ps_mgau_t *s2_semi_mgau_init(acmod_t *acmod); +void s2_semi_mgau_free(ps_mgau_t *s); +int s2_semi_mgau_frame_eval(ps_mgau_t *s, + int16 *senone_scores, + uint8 *senone_active, + int32 n_senone_active, + mfcc_t **featbuf, + int32 frame, + int32 compallsen); +int s2_semi_mgau_mllr_transform(ps_mgau_t *s, + ps_mllr_t *mllr); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __S2_SEMI_MGAU_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h new file mode 100644 index 0000000..fb3dbd6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h @@ -0,0 +1,102 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _S3_S3TYPES_H_ +#define _S3_S3TYPES_H_ + +#include +#include + +#include +#include +#include + +/** \file s3types.h + * \brief Size definition of semantically units. Common for both s3 and s3.X decoder. + */ + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * Size definitions for more semantially meaningful units. + * Illegal value definitions, limits, and tests for specific types. + * NOTE: Types will be either int32 or smaller; only smaller ones may be unsigned (i.e., + * no type will be uint32). + */ + +typedef int16 s3cipid_t; /** Ci phone id */ +#define BAD_S3CIPID ((s3cipid_t) -1) +#define NOT_S3CIPID(p) ((p)<0) +#define IS_S3CIPID(p) ((p)>=0) +#define MAX_S3CIPID 32767 + +/*#define MAX_S3CIPID 127*/ + +typedef int32 s3pid_t; /** Phone id (triphone or ciphone) */ +#define BAD_S3PID ((s3pid_t) -1) +#define NOT_S3PID(p) ((p)<0) +#define IS_S3PID(p) ((p)>=0) +#define MAX_S3PID ((int32)0x7ffffffe) + +typedef uint16 s3ssid_t; /** Senone sequence id (triphone or ciphone) */ +#define BAD_S3SSID ((s3ssid_t) 0xffff) +#define NOT_S3SSID(p) ((p) == BAD_S3SSID) +#define IS_S3SSID(p) ((p) != BAD_S3SSID) +#define MAX_S3SSID ((s3ssid_t)0xfffe) + +typedef int32 s3tmatid_t; /** Transition matrix id; there can be as many as pids */ +#define BAD_S3TMATID ((s3tmatid_t) -1) +#define NOT_S3TMATID(t) ((t)<0) +#define IS_S3TMATID(t) ((t)>=0) +#define MAX_S3TMATID ((int32)0x7ffffffe) + +typedef int32 s3wid_t; /** Dictionary word id */ +#define BAD_S3WID ((s3wid_t) -1) +#define NOT_S3WID(w) ((w)<0) +#define IS_S3WID(w) ((w)>=0) +#define MAX_S3WID ((int32)0x7ffffffe) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c new file mode 100644 index 0000000..33c851d --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c @@ -0,0 +1,433 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file state_align_search.c State (and phone and word) alignment search. + */ + +#include "state_align_search.h" + +static int +state_align_search_start(ps_search_t *search) +{ + state_align_search_t *sas = (state_align_search_t *)search; + + /* Activate the initial state. */ + hmm_enter(sas->hmms, 0, 0, 0); + + return 0; +} + +static void +renormalize_hmms(state_align_search_t *sas, int frame_idx, int32 norm) +{ + int i; + (void) frame_idx; + for (i = 0; i < sas->n_phones; ++i) + hmm_normalize(sas->hmms + i, norm); +} + +static int32 +evaluate_hmms(state_align_search_t *sas, int16 const *senscr, int frame_idx) +{ + int32 bs = WORST_SCORE; + int i; + + hmm_context_set_senscore(sas->hmmctx, senscr); + + for (i = 0; i < sas->n_phones; ++i) { + hmm_t *hmm = sas->hmms + i; + int32 score; + + if (hmm_frame(hmm) < frame_idx) + continue; + score = hmm_vit_eval(hmm); + if (score BETTER_THAN bs) { + bs = score; + } + } + return bs; +} + +static void +prune_hmms(state_align_search_t *sas, int frame_idx) +{ + int nf = frame_idx + 1; + int i; + + /* Check all phones to see if they remain active in the next frame. */ + for (i = 0; i < sas->n_phones; ++i) { + hmm_t *hmm = sas->hmms + i; + if (hmm_frame(hmm) < frame_idx) + continue; + hmm_frame(hmm) = nf; + } +} + +static void +phone_transition(state_align_search_t *sas, int frame_idx) +{ + int nf = frame_idx + 1; + int i; + + for (i = 0; i < sas->n_phones - 1; ++i) { + hmm_t *hmm, *nhmm; + int32 newphone_score; + + hmm = sas->hmms + i; + if (hmm_frame(hmm) != nf) + continue; + + newphone_score = hmm_out_score(hmm); + /* Transition into next phone using the usual Viterbi rule. */ + nhmm = hmm + 1; + if (hmm_frame(nhmm) < frame_idx + || newphone_score BETTER_THAN hmm_in_score(nhmm)) { + hmm_enter(nhmm, newphone_score, hmm_out_history(hmm), nf); + } + } +} + +#define TOKEN_STEP 20 +static void +extend_tokenstack(state_align_search_t *sas, int frame_idx) +{ + if (frame_idx >= sas->n_fr_alloc) { + sas->n_fr_alloc = frame_idx + TOKEN_STEP + 1; + sas->tokens = ckd_realloc(sas->tokens, + sas->n_emit_state * sas->n_fr_alloc + * sizeof(*sas->tokens)); + } + memset(sas->tokens + frame_idx * sas->n_emit_state, 0xff, + sas->n_emit_state * sizeof(*sas->tokens)); +} + +static void +record_transitions(state_align_search_t *sas, int frame_idx) +{ + state_align_hist_t *tokens; + int i; + + /* Push another frame of tokens on the stack. */ + extend_tokenstack(sas, frame_idx); + tokens = sas->tokens + frame_idx * sas->n_emit_state; + + /* Scan all active HMMs */ + for (i = 0; i < sas->n_phones; ++i) { + hmm_t *hmm = sas->hmms + i; + int j; + + if (hmm_frame(hmm) < frame_idx) + continue; + for (j = 0; j < sas->hmmctx->n_emit_state; ++j) { + int state_idx = i * sas->hmmctx->n_emit_state + j; + /* Record their backpointers on the token stack. */ + tokens[state_idx].id = hmm_history(hmm, j); + tokens[state_idx].score = hmm_score(hmm, j); + /* Update backpointer fields with state index. */ + hmm_history(hmm, j) = state_idx; + } + } +} + +static int +state_align_search_step(ps_search_t *search, int frame_idx) +{ + state_align_search_t *sas = (state_align_search_t *)search; + acmod_t *acmod = ps_search_acmod(search); + int16 const *senscr; + int i; + + /* Calculate senone scores. */ + for (i = 0; i < sas->n_phones; ++i) + acmod_activate_hmm(acmod, sas->hmms + i); + senscr = acmod_score(acmod, &frame_idx); + + /* Renormalize here if needed. */ + /* FIXME: Make sure to (unit-)test this!!! */ + if ((sas->best_score - 0x300000) WORSE_THAN WORST_SCORE) { + E_INFO("Renormalizing Scores at frame %d, best score %d\n", + frame_idx, sas->best_score); + renormalize_hmms(sas, frame_idx, sas->best_score); + } + + /* Viterbi step. */ + sas->best_score = evaluate_hmms(sas, senscr, frame_idx); + prune_hmms(sas, frame_idx); + + /* Transition out of non-emitting states. */ + phone_transition(sas, frame_idx); + + /* Generate new tokens from best path results. */ + record_transitions(sas, frame_idx); + + /* Update frame counter */ + sas->frame = frame_idx; + + return 0; +} + +static int +state_align_search_finish(ps_search_t *search) +{ + state_align_search_t *sas = (state_align_search_t *)search; + hmm_t *final_phone = sas->hmms + sas->n_phones - 1; + ps_alignment_iter_t *itor; + ps_alignment_entry_t *ent; + + int last_frame, cur_frame; + state_align_hist_t last, cur; + + /* Best state exiting the last cur_frame. */ + last.id = cur.id = hmm_out_history(final_phone); + last.score = hmm_out_score(final_phone); + if (last.id == 0xffff) { + E_ERROR("Failed to reach final state in alignment\n"); + return -1; + } + itor = ps_alignment_states(sas->al); + last_frame = sas->frame + 1; + for (cur_frame = sas->frame - 1; cur_frame >= 0; --cur_frame) { + cur = sas->tokens[cur_frame * sas->n_emit_state + cur.id]; + /* State boundary, update alignment entry for next state. */ + if (cur.id != last.id) { + itor = ps_alignment_iter_goto(itor, last.id); + assert(itor != NULL); + ent = ps_alignment_iter_get(itor); + ent->start = cur_frame + 1; + ent->duration = last_frame - ent->start; + ent->score = last.score - cur.score; + E_DEBUG("state %d start %d end %d\n", last.id, + ent->start, last_frame); + last = cur; + last_frame = cur_frame + 1; + } + } + /* Update alignment entry for initial state. */ + itor = ps_alignment_iter_goto(itor, 0); + assert(itor != NULL); + ent = ps_alignment_iter_get(itor); + ent->start = 0; + ent->duration = last_frame; + E_DEBUG("state %d start %d end %d\n", 0, + ent->start, last_frame); + ps_alignment_iter_free(itor); + ps_alignment_propagate(sas->al); + + return 0; +} + +static int +state_align_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) +{ + /* This does nothing, you need to make a new search for each utterance. */ + (void) search; + (void) dict; + (void) d2p; + return 0; +} + +static void +state_align_search_free(ps_search_t *search) +{ + state_align_search_t *sas = (state_align_search_t *)search; + ps_search_base_free(search); + ckd_free(sas->hmms); + ckd_free(sas->tokens); + hmm_context_free(sas->hmmctx); + ps_alignment_free(sas->al); + ckd_free(sas); +} + +struct state_align_seg_s { + ps_seg_t base; + ps_alignment_iter_t *itor; +}; +typedef struct state_align_seg_s state_align_seg_t; + +static void +state_align_search_seg_free(ps_seg_t * seg) +{ + state_align_seg_t *itor = (state_align_seg_t *)seg; + ps_alignment_iter_free(itor->itor); + ckd_free(itor); +} + +static void +state_align_search_fill_iter(ps_seg_t *seg) +{ + state_align_seg_t *itor = (state_align_seg_t *)seg; + ps_alignment_entry_t *entry = ps_alignment_iter_get(itor->itor); + + seg->sf = entry->start; + seg->ef = entry->start + entry->duration - 1; + seg->ascr = entry->score; + seg->lscr = 0; + seg->word = dict_wordstr(ps_search_dict(seg->search), entry->id.wid); +} + +static ps_seg_t * +state_align_search_seg_next(ps_seg_t * seg) +{ + state_align_seg_t *itor = (state_align_seg_t *)seg; + + itor->itor = ps_alignment_iter_next(itor->itor); + if (itor->itor == NULL) { + state_align_search_seg_free(seg); + return NULL; + } + state_align_search_fill_iter(seg); + return seg; +} + +static ps_segfuncs_t state_align_segfuncs = { + /* seg_next */ state_align_search_seg_next, + /* seg_free */ state_align_search_seg_free +}; + + +static ps_seg_t * +state_align_search_seg_iter(ps_search_t * search) +{ + state_align_search_t *sas = (state_align_search_t *) search; + state_align_seg_t *seg; + ps_alignment_iter_t *itor; + + if (sas->al == NULL) + return NULL; + /* Even though the alignment has a bunch of levels, for the + purposes of the decoder API we will just iterate over words, + which is the most likely/useful use case. We will also expose + the rest of the alignment API separately. */ + + itor = ps_alignment_words(sas->al); + if (itor == NULL) + return NULL; + seg = ckd_calloc(1, sizeof(state_align_seg_t)); + seg->base.vt = &state_align_segfuncs; + seg->base.search = search; + seg->itor = itor; + state_align_search_fill_iter((ps_seg_t *)seg); + + return (ps_seg_t *)seg; +} + +static char const * +state_align_search_hyp(ps_search_t *search, int32 *out_score) +{ + state_align_search_t *sas = (state_align_search_t *)search; + ps_alignment_iter_t *itor; + size_t hyp_len; + + if (search->hyp_str) + ckd_free(search->hyp_str); + search->hyp_str = NULL; + if (sas->al == NULL) + return NULL; + itor = ps_alignment_words(sas->al); + if (itor == NULL) + return NULL; + for (hyp_len = 0; itor; itor = ps_alignment_iter_next(itor)) { + const char *word = dict_wordstr(ps_search_dict(search), + ps_alignment_iter_get(itor)->id.wid); + if (word == NULL) { + E_ERROR("Unknown word id %d in alignment", + ps_alignment_iter_get(itor)->id.wid); + return NULL; + } + hyp_len += strlen(word) + 1; + } + search->hyp_str = ckd_calloc(hyp_len + 1, sizeof(*search->hyp_str)); + for (itor = ps_alignment_words(sas->al); + itor; itor = ps_alignment_iter_next(itor)) { + ps_alignment_entry_t *ent = ps_alignment_iter_get(itor); + const char *word = dict_wordstr(ps_search_dict(search), + ent->id.wid); + strcat(search->hyp_str, word); + strcat(search->hyp_str, " "); + *out_score = ent->score; + } + search->hyp_str[strlen(search->hyp_str) - 1] = '\0'; + return search->hyp_str; +} + +static ps_searchfuncs_t state_align_search_funcs = { + /* start: */ state_align_search_start, + /* step: */ state_align_search_step, + /* finish: */ state_align_search_finish, + /* reinit: */ state_align_search_reinit, + /* free: */ state_align_search_free, + /* lattice: */ NULL, + /* hyp: */ state_align_search_hyp, + /* prob: */ NULL, + /* seg_iter: */ state_align_search_seg_iter, +}; + +ps_search_t * +state_align_search_init(const char *name, + cmd_ln_t *config, + acmod_t *acmod, + ps_alignment_t *al) +{ + state_align_search_t *sas; + ps_alignment_iter_t *itor; + hmm_t *hmm; + + sas = ckd_calloc(1, sizeof(*sas)); + ps_search_init(ps_search_base(sas), &state_align_search_funcs, + PS_SEARCH_TYPE_STATE_ALIGN, name, + config, acmod, al->d2p->dict, al->d2p); + sas->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), + acmod->tmat->tp, NULL, acmod->mdef->sseq); + if (sas->hmmctx == NULL) { + ckd_free(sas); + return NULL; + } + sas->al = ps_alignment_retain(al); + + /* Generate HMM vector from phone level of alignment. */ + sas->n_phones = ps_alignment_n_phones(al); + sas->n_emit_state = ps_alignment_n_states(al); + sas->hmms = ckd_calloc(sas->n_phones, sizeof(*sas->hmms)); + for (hmm = sas->hmms, itor = ps_alignment_phones(al); itor; + ++hmm, itor = ps_alignment_iter_next(itor)) { + ps_alignment_entry_t *ent = ps_alignment_iter_get(itor); + hmm_init(sas->hmmctx, hmm, FALSE, + ent->id.pid.ssid, ent->id.pid.tmatid); + } + return ps_search_base(sas); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h new file mode 100644 index 0000000..95bd19b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h @@ -0,0 +1,99 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file state_align_search.h State (and phone and word) alignment search. + */ + +#ifndef __STATE_ALIGN_SEARCH_H__ +#define __STATE_ALIGN_SEARCH_H__ + +/* SphinxBase headers. */ +#include + +/* Local headers. */ +#include +#include "pocketsphinx_internal.h" +#include "ps_alignment.h" +#include "hmm.h" + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * History structure + */ +struct state_align_hist_s { + uint16 id; + int32 score; +}; +typedef struct state_align_hist_s state_align_hist_t; + +/** + * Forced alignment search structure. + */ +struct state_align_search_s { + ps_search_t base; /**< Base search structure. */ + hmm_context_t *hmmctx; /**< HMM context structure. */ + ps_alignment_t *al; /**< Alignment structure being operated on. */ + hmm_t *hmms; /**< Vector of HMMs corresponding to phone level. */ + int n_phones; /**< Number of HMMs (phones). */ + + int frame; /**< Current frame being processed. */ + int32 best_score; /**< Best score in current frame. */ + + int n_emit_state; /**< Number of emitting states (tokens per frame) */ + state_align_hist_t *tokens; /**< Tokens (backpointers) for state alignment. */ + int n_fr_alloc; /**< Number of frames of tokens allocated. */ +}; +typedef struct state_align_search_s state_align_search_t; + +POCKETSPHINX_EXPORT +ps_search_t *state_align_search_init(const char *name, + cmd_ln_t *config, + acmod_t *acmod, + ps_alignment_t *al); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __STATE_ALIGN_SEARCH_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h new file mode 100644 index 0000000..1ddd995 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h @@ -0,0 +1,132 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file tied_mgau_common.h + * @brief Common code shared between SC and PTM (tied-state) models. + */ + +#ifndef __TIED_MGAU_COMMON_H__ +#define __TIED_MGAU_COMMON_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +#define MGAU_MIXW_VERSION "1.0" /* Sphinx-3 file format version for mixw */ +#define MGAU_PARAM_VERSION "1.0" /* Sphinx-3 file format version for mean/var */ +#define NONE -1 +#define WORST_DIST (int32)(0x80000000) + +/** Subtract GMM component b (assumed to be positive) and saturate */ +#ifdef FIXED_POINT +#define GMMSUB(a,b) \ + (((a)-(b) > a) ? (INT_MIN) : ((a)-(b))) +/** Add GMM component b (assumed to be positive) and saturate */ +#define GMMADD(a,b) \ + (((a)+(b) < a) ? (INT_MAX) : ((a)+(b))) +#else +#define GMMSUB(a,b) ((a)-(b)) +#define GMMADD(a,b) ((a)+(b)) +#endif + +#ifndef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#define LOGMATH_INLINE static inline +#elif defined(_MSC_VER) +#define LOGMATH_INLINE __inline +#else +#define LOGMATH_INLINE static +#endif + +/* Allocate 0..159 for negated quantized mixture weights and 0..96 for + * negated normalized acoustic scores, so that the combination of the + * two (for a single mixture) can never exceed 255. */ +#define MAX_NEG_MIXW 159 /**< Maximum negated mixture weight value. */ +#define MAX_NEG_ASCR 96 /**< Maximum negated acoustic score value. */ + +/** + * Quickly log-add two negated log probabilities. + * + * @param lmath The log-math object + * @param mlx A negative log probability (0 < mlx < 255) + * @param mly A negative log probability (0 < mly < 255) + * @return -log(exp(-mlx)+exp(-mly)) + * + * We can do some extra-fast log addition since we know that + * mixw+ascr is always less than 256 and hence x-y is also always less + * than 256. This relies on some cooperation from logmath_t which + * will never produce a logmath table smaller than 256 entries. + * + * Note that the parameters are *negated* log probabilities (and + * hence, are positive numbers), as is the return value. This is the + * key to the "fastness" of this function. + */ +LOGMATH_INLINE int +fast_logmath_add(logmath_t *lmath, int mlx, int mly) +{ + logadd_t *t = LOGMATH_TABLE(lmath); + int d, r; + + /* d must be positive, obviously. */ + if (mlx > mly) { + d = (mlx - mly); + r = mly; + } + else { + d = (mly - mlx); + r = mlx; + } + + return r - (((uint8 *)t->table)[d]); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __TIED_MGAU_COMMON_H__ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c new file mode 100644 index 0000000..cd32ea5 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c @@ -0,0 +1,284 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include +#include +#include +#include + +/* Local headers. */ +#include "tmat.h" +#include "hmm.h" +#include "vector.h" + +#define TMAT_PARAM_VERSION "1.0" + + +/** + * Checks that no transition matrix in the given object contains backward arcs. + * @returns 0 if successful, -1 if check failed. + */ +static int32 tmat_chk_uppertri(tmat_t *tmat, logmath_t *lmath); + + +/** + * Checks that transition matrix arcs in the given object skip over + * at most 1 state. + * @returns 0 if successful, -1 if check failed. + */ + +static int32 tmat_chk_1skip(tmat_t *tmat, logmath_t *lmath); + + +void +tmat_dump(tmat_t * tmat, FILE * fp) +{ + int32 i, src, dst; + + for (i = 0; i < tmat->n_tmat; i++) { + fprintf(fp, "TMAT %d = %d x %d\n", i, tmat->n_state, + tmat->n_state + 1); + for (src = 0; src < tmat->n_state; src++) { + for (dst = 0; dst <= tmat->n_state; dst++) + fprintf(fp, " %12d", tmat->tp[i][src][dst]); + fprintf(fp, "\n"); + } + fprintf(fp, "\n"); + } + fflush(fp); +} + + +/* + * Check model tprob matrices that they conform to upper-triangular assumption; + * i.e. no "backward" transitions allowed. + */ +int32 +tmat_chk_uppertri(tmat_t * tmat, logmath_t *lmath) +{ + int32 i, src, dst; + + (void) lmath; + /* Check that each tmat is upper-triangular */ + for (i = 0; i < tmat->n_tmat; i++) { + for (dst = 0; dst < tmat->n_state; dst++) + for (src = dst + 1; src < tmat->n_state; src++) + if (tmat->tp[i][src][dst] < 255) { + E_ERROR("tmat[%d][%d][%d] = %d\n", + i, src, dst, tmat->tp[i][src][dst]); + return -1; + } + } + + return 0; +} + + +int32 +tmat_chk_1skip(tmat_t * tmat, logmath_t *lmath) +{ + int32 i, src, dst; + + (void) lmath; + for (i = 0; i < tmat->n_tmat; i++) { + for (src = 0; src < tmat->n_state; src++) + for (dst = src + 3; dst <= tmat->n_state; dst++) + if (tmat->tp[i][src][dst] < 255) { + E_ERROR("tmat[%d][%d][%d] = %d\n", + i, src, dst, tmat->tp[i][src][dst]); + return -1; + } + } + + return 0; +} + + +tmat_t * +tmat_init(char const *file_name, logmath_t *lmath, float64 tpfloor, int32 breport) +{ + char tmp; + int32 n_src, n_dst, n_tmat; + FILE *fp; + int32 byteswap, chksum_present; + uint32 chksum; + float32 **tp; + int32 i, j, k, tp_per_tmat; + char **argname, **argval; + tmat_t *t; + + + if (breport) { + E_INFO("Reading HMM transition probability matrices: %s\n", + file_name); + } + + t = (tmat_t *) ckd_calloc(1, sizeof(tmat_t)); + + if ((fp = fopen(file_name, "rb")) == NULL) + E_FATAL_SYSTEM("Failed to open transition file '%s' for reading", file_name); + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) + E_FATAL("Failed to read header from file '%s'\n", file_name); + + /* Parse argument-value list */ + chksum_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + if (strcmp(argval[i], TMAT_PARAM_VERSION) != 0) + E_WARN("Version mismatch(%s): %s, expecting %s\n", + file_name, argval[i], TMAT_PARAM_VERSION); + } + else if (strcmp(argname[i], "chksum0") == 0) { + chksum_present = 1; /* Ignore the associated value */ + } + } + bio_hdrarg_free(argname, argval); + argname = argval = NULL; + + chksum = 0; + + /* Read #tmat, #from-states, #to-states, arraysize */ + if ((bio_fread(&n_tmat, sizeof(int32), 1, fp, byteswap, &chksum) + != 1) + || (bio_fread(&n_src, sizeof(int32), 1, fp, byteswap, &chksum) != + 1) + || (bio_fread(&n_dst, sizeof(int32), 1, fp, byteswap, &chksum) != + 1) + || (bio_fread(&i, sizeof(int32), 1, fp, byteswap, &chksum) != 1)) { + E_FATAL("Failed to read header from '%s'\n", file_name); + } + if (n_tmat >= MAX_INT16) + E_FATAL("%s: Number of transition matrices (%d) exceeds limit (%d)\n", file_name, + n_tmat, MAX_INT16); + t->n_tmat = n_tmat; + + if (n_dst != n_src + 1) + E_FATAL("%s: Unsupported transition matrix. Number of source states (%d) != number of target states (%d)-1\n", file_name, + n_src, n_dst); + t->n_state = n_src; + + if (i != t->n_tmat * n_src * n_dst) { + E_FATAL + ("%s: Invalid transitions. Number of coefficients (%d) doesn't match expected array dimension: %d x %d x %d\n", + file_name, i, t->n_tmat, n_src, n_dst); + } + + /* Allocate memory for tmat data */ + t->tp = ckd_calloc_3d(t->n_tmat, n_src, n_dst, sizeof(***t->tp)); + + /* Temporary structure to read in the float data */ + tp = ckd_calloc_2d(n_src, n_dst, sizeof(**tp)); + + /* Read transition matrices, normalize and floor them, and convert to log domain */ + tp_per_tmat = n_src * n_dst; + for (i = 0; i < t->n_tmat; i++) { + if (bio_fread(tp[0], sizeof(float32), tp_per_tmat, fp, + byteswap, &chksum) != tp_per_tmat) { + E_FATAL("Failed to read transition matrix %d from '%s'\n", i, file_name); + } + + /* Normalize and floor */ + for (j = 0; j < n_src; j++) { + if (vector_sum_norm(tp[j], n_dst) == 0.0) + E_WARN("Normalization failed for transition matrix %d from state %d\n", + i, j); + vector_nz_floor(tp[j], n_dst, tpfloor); + vector_sum_norm(tp[j], n_dst); + + /* Convert to logs3. */ + for (k = 0; k < n_dst; k++) { + int ltp; +#if 0 /* No, don't do this! It will subtly break 3-state HMMs. */ + /* For these ones, we floor them even if they are + * zero, otherwise HMM evaluation goes nuts. */ + if (k >= j && k-j < 3 && tp[j][k] == 0.0f) + tp[j][k] = tpfloor; +#endif + /* Log and quantize them. */ + ltp = -logmath_log(lmath, tp[j][k]) >> SENSCR_SHIFT; + if (ltp > 255) ltp = 255; + t->tp[i][j][k] = (uint8)ltp; + } + } + } + + ckd_free_2d(tp); + + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&tmp, 1, 1, fp) == 1) + E_ERROR("Non-empty file beyond end of data\n"); + + fclose(fp); + + if (tmat_chk_uppertri(t, lmath) < 0) + E_FATAL("Tmat not upper triangular\n"); + if (tmat_chk_1skip(t, lmath) < 0) + E_FATAL("Topology not Left-to-Right or Bakis\n"); + + return t; +} + +void +tmat_report(tmat_t * t) +{ + E_INFO_NOFN("Initialization of tmat_t, report:\n"); + E_INFO_NOFN("Read %d transition matrices of size %dx%d\n", + t->n_tmat, t->n_state, t->n_state + 1); + E_INFO_NOFN("\n"); + +} + +/* + * RAH, Free memory allocated in tmat_init () + */ +void +tmat_free(tmat_t * t) +{ + if (t) { + if (t->tp) + ckd_free_3d(t->tp); + ckd_free(t); + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h new file mode 100644 index 0000000..a8929ac --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h @@ -0,0 +1,101 @@ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifndef _S3_TMAT_H_ +#define _S3_TMAT_H_ + +#include +#include + +/** \file tmat.h + * \brief Transition matrix data structure. + */ +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +/** + * \struct tmat_t + * \brief Transition matrix data structure. All phone HMMs are assumed to have the same + * topology. + */ +typedef struct tmat_s { + uint8 ***tp; /**< The transition matrices; kept in the same scale as acoustic scores; + tp[tmatid][from-state][to-state] */ + int16 n_tmat; /**< Number matrices */ + int16 n_state; /**< Number source states in matrix (only the emitting states); + Number destination states = n_state+1, it includes the exit state */ +} tmat_t; + + +/** Initialize transition matrix */ + +tmat_t *tmat_init (char const *tmatfile,/**< In: input file */ + logmath_t *lmath, /**< In: log math parameters */ + float64 tpfloor, /**< In: floor value for each non-zero transition probability */ + int32 breport /**< In: whether reporting the process of tmat_t */ + ); + + + +/** Dumping the transition matrix for debugging */ + +void tmat_dump (tmat_t *tmat, /**< In: transition matrix */ + FILE *fp /**< In: file pointer */ + ); + + +/** + * RAH, add code to remove memory allocated by tmat_init + */ + +void tmat_free (tmat_t *t /**< In: transition matrix */ + ); + +/** + * Report the detail of the transition matrix structure. + */ +void tmat_report(tmat_t *t /**< In: transition matrix*/ + ); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python new file mode 100644 index 0000000..cfcca6b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python @@ -0,0 +1,41 @@ +Regenerating lapack_lite source +=============================== + +:Author: David M. Cooke +:Modified by David Huggins-Daines for Sphinx + +``blas_lite.c``, ``slapack_lite.c``, are ``f2c``'d versions of the +LAPACK routines required by the ``LinearAlgebra`` module, and wrapped +by the ``lapack_lite`` module. The scripts in this directory can be +used to create these files automatically from a directory of LAPACK +source files. + +You'll need `Plex 1.1.4`_ installed to do the appropriate scrubbing. + +.. _Plex 1.1.4: http://www.cosc.canterbury.ac.nz/~greg/python/Plex/ + +The routines that ``lapack_litemodule.c`` wraps are listed in +``wrapped_routines``, along with a few exceptions that aren't picked up +properly. Assuming that you have an unpacked LAPACK source tree in +``~/LAPACK``, you generate the new routines in a directory ``new-lite/`` with:: + +$ python ./make_lite.py wrapped_routines ~/LAPACK new-lite/ + +This will grab the right routines, with dependencies, put them into the +appropiate ``blas_lite.f``, ``dlapack_lite.f``, or ``zlapack_lite.f`` files, +run ``f2c`` over them, then do some scrubbing similiar to that done to +generate the CLAPACK_ distribution. + +.. _CLAPACK: http://netlib.org/clapack/index.html + +The versions in CVS as of 2005-04-12 use the LAPACK source from the +`Debian package lapack3`_, version 3.0.20000531a-6. It was found that these +(being regularly maintained) worked better than the patches to the last +released version of LAPACK available at the LAPACK_ page. + +.. _Debian package lapack3: http://packages.debian.org/unstable/libs/lapack3 +.. _LAPACK: http://netlib.org/lapack/index.html + +A slightly-patched ``f2c`` was used to add parentheses around ``||`` expressions +and the arguments to ``<<`` to silence gcc warnings. Edit +the ``src/output.c`` in the ``f2c`` source to do this. diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c new file mode 100644 index 0000000..8a66a48 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c @@ -0,0 +1,645 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bio.c -- Sphinx-3 binary file I/O functions. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1996 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log$ + * Revision 1.4 2005/06/21 20:40:46 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add the $ keyword. + * + * Revision 1.3 2005/03/30 01:22:46 archan + * Fixed mistakes in last updates. Add + * + * + * 02-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Bugfix: Added byteswapping in bio_verify_chksum(). + * + * 18-Dec-1996 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/bio.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" + + +#define BIO_HDRARG_MAX 32 +#define END_COMMENT "*end_comment*\n" + + +static void +bcomment_read(FILE * fp) +{ + __BIGSTACKVARIABLE__ char iline[16384]; + + while (fgets(iline, sizeof(iline), fp) != NULL) { + if (strcmp(iline, END_COMMENT) == 0) + return; + } + E_FATAL("Missing %s marker\n", END_COMMENT); +} + + +static int32 +swap_check(FILE * fp) +{ + uint32 magic; + + if (fread(&magic, sizeof(uint32), 1, fp) != 1) { + E_ERROR("Cannot read BYTEORDER MAGIC NO.\n"); + return -1; + } + + if (magic != BYTE_ORDER_MAGIC) { + /* either need to swap or got bogus magic number */ + SWAP_INT32(&magic); + + if (magic == BYTE_ORDER_MAGIC) + return 1; + + SWAP_INT32(&magic); + E_ERROR("Bad BYTEORDER MAGIC NO: %08x, expecting %08x\n", + magic, BYTE_ORDER_MAGIC); + return -1; + } + + return 0; +} + + +void +bio_hdrarg_free(char **argname, char **argval) +{ + int32 i; + + if (argname == NULL) + return; + for (i = 0; argname[i]; i++) { + ckd_free(argname[i]); + ckd_free(argval[i]); + } + ckd_free(argname); + ckd_free(argval); +} + + +int32 +bio_writehdr_version(FILE * fp, char *version) +{ + uint32 b; + + fprintf(fp, "s3\n"); + fprintf(fp, "version %s\n", version); + fprintf(fp, "endhdr\n"); + fflush(fp); + + b = (uint32) BYTE_ORDER_MAGIC; + fwrite(&b, sizeof(uint32), 1, fp); + fflush(fp); + + return 0; +} + + +int32 +bio_writehdr(FILE *fp, ...) +{ + char const *key; + va_list args; + uint32 b; + + fprintf(fp, "s3\n"); + va_start(args, fp); + while ((key = va_arg(args, char const *)) != NULL) { + char const *val = va_arg(args, char const *); + if (val == NULL) { + E_ERROR("Wrong number of arguments\n"); + va_end(args); + return -1; + } + fprintf(fp, "%s %s\n", key, val); + } + va_end(args); + + fprintf(fp, "endhdr\n"); + fflush(fp); + + b = (uint32) BYTE_ORDER_MAGIC; + if (fwrite(&b, sizeof(uint32), 1, fp) != 1) + return -1; + fflush(fp); + + return 0; +} + + +int32 +bio_readhdr(FILE * fp, char ***argname, char ***argval, int32 * swap) +{ + __BIGSTACKVARIABLE__ char line[16384], word[4096]; + int32 i, l; + int32 lineno; + + *argname = (char **) ckd_calloc(BIO_HDRARG_MAX + 1, sizeof(char *)); + *argval = (char **) ckd_calloc(BIO_HDRARG_MAX, sizeof(char *)); + + lineno = 0; + if (fgets(line, sizeof(line), fp) == NULL){ + E_ERROR("Premature EOF, line %d\n", lineno); + goto error_out; + } + lineno++; + + if ((line[0] == 's') && (line[1] == '3') && (line[2] == '\n')) { + /* New format (post Dec-1996, including checksums); read argument-value pairs */ + for (i = 0;;) { + if (fgets(line, sizeof(line), fp) == NULL) { + E_ERROR("Premature EOF, line %d\n", lineno); + goto error_out; + } + lineno++; + + if (sscanf(line, "%s%n", word, &l) != 1) { + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + if (strcmp(word, "endhdr") == 0) + break; + if (word[0] == '#') /* Skip comments */ + continue; + + if (i >= BIO_HDRARG_MAX) { + E_ERROR + ("Max arg-value limit(%d) exceeded; increase BIO_HDRARG_MAX\n", + BIO_HDRARG_MAX); + goto error_out; + } + + (*argname)[i] = ckd_salloc(word); + if (sscanf(line + l, "%s", word) != 1) { /* Multi-word values not allowed */ + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + (*argval)[i] = ckd_salloc(word); + i++; + } + } + else { + /* Old format (without checksums); the first entry must be the version# */ + if (sscanf(line, "%s", word) != 1) { + E_ERROR("Header format error, line %d\n", lineno); + goto error_out; + } + + (*argname)[0] = ckd_salloc("version"); + (*argval)[0] = ckd_salloc(word); + i = 1; + + bcomment_read(fp); + } + (*argname)[i] = NULL; + + if ((*swap = swap_check(fp)) < 0) { + E_ERROR("swap_check failed\n"); + goto error_out; + } + + return 0; +error_out: + bio_hdrarg_free(*argname, *argval); + *argname = *argval = NULL; + return -1; +} + + +static uint32 +chksum_accum(const void *buf, int32 el_sz, int32 n_el, uint32 sum) +{ + int32 i; + uint8 *i8; + uint16 *i16; + uint32 *i32; + + switch (el_sz) { + case 1: + i8 = (uint8 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 5 | sum >> 27) + i8[i]; + break; + case 2: + i16 = (uint16 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 10 | sum >> 22) + i16[i]; + break; + case 4: + i32 = (uint32 *) buf; + for (i = 0; i < n_el; i++) + sum = (sum << 20 | sum >> 12) + i32[i]; + break; + default: + E_FATAL("Unsupported elemsize for checksum: %d\n", el_sz); + break; + } + + return sum; +} + + +static void +swap_buf(void *buf, int32 el_sz, int32 n_el) +{ + int32 i; + uint16 *buf16; + uint32 *buf32; + + switch (el_sz) { + case 1: + break; + case 2: + buf16 = (uint16 *) buf; + for (i = 0; i < n_el; i++) + SWAP_INT16(buf16 + i); + break; + case 4: + buf32 = (uint32 *) buf; + for (i = 0; i < n_el; i++) + SWAP_INT32(buf32 + i); + break; + default: + E_FATAL("Unsupported elemsize for byteswapping: %d\n", el_sz); + break; + } +} + + +int32 +bio_fread(void *buf, int32 el_sz, int32 n_el, FILE * fp, int32 swap, + uint32 * chksum) +{ + if (fread(buf, el_sz, n_el, fp) != (size_t) n_el) + return -1; + + if (swap) + swap_buf(buf, el_sz, n_el); + + if (chksum) + *chksum = chksum_accum(buf, el_sz, n_el, *chksum); + + return n_el; +} + +int32 +bio_fwrite(const void *buf, int32 el_sz, int32 n_el, FILE *fp, + int32 swap, uint32 *chksum) +{ + if (chksum) + *chksum = chksum_accum(buf, el_sz, n_el, *chksum); + if (swap) { + void *nbuf; + int rv; + + nbuf = ckd_calloc(n_el, el_sz); + memcpy(nbuf, buf, n_el * el_sz); + swap_buf(nbuf, el_sz, n_el); + rv = fwrite(nbuf, el_sz, n_el, fp); + ckd_free(nbuf); + return rv; + } + else { + return fwrite(buf, el_sz, n_el, fp); + } +} + +int32 +bio_fread_1d(void **buf, size_t el_sz, uint32 * n_el, FILE * fp, + int32 sw, uint32 * ck) +{ + /* Read 1-d array size */ + if (bio_fread(n_el, sizeof(int32), 1, fp, sw, ck) != 1) + E_FATAL("fread(arraysize) failed\n"); + if (*n_el <= 0) + E_FATAL("Bad arraysize: %d\n", *n_el); + + /* Allocate memory for array data */ + *buf = (void *) ckd_calloc(*n_el, el_sz); + + /* Read array data */ + if (bio_fread(*buf, el_sz, *n_el, fp, sw, ck) != (int32)*n_el) + E_FATAL("fread(arraydata) failed\n"); + + return *n_el; +} + +int32 +bio_fread_2d(void ***arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + FILE *fp, + uint32 swap, + uint32 *chksum) +{ + uint32 l_d1, l_d2; + uint32 n; + size_t ret; + void *raw; + + ret = bio_fread(&l_d1, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_2d"); + } + return -1; + } + ret = bio_fread(&l_d2, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_2d"); + } + return -1; + } + if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != (int32)n) + return -1; + + assert(n == l_d1*l_d2); + + *d1 = l_d1; + *d2 = l_d2; + *arr = ckd_alloc_2d_ptr(l_d1, l_d2, raw, e_sz); + + return n; +} + +int32 +bio_fread_3d(void ****arr, + size_t e_sz, + uint32 *d1, + uint32 *d2, + uint32 *d3, + FILE *fp, + uint32 swap, + uint32 *chksum) +{ + uint32 l_d1; + uint32 l_d2; + uint32 l_d3; + uint32 n; + void *raw; + size_t ret; + + ret = bio_fread(&l_d1, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + ret = bio_fread(&l_d2, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + ret = bio_fread(&l_d3, sizeof(uint32), 1, fp, swap, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to read complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fread_3d"); + } + return -1; + } + + if (bio_fread_1d(&raw, e_sz, &n, fp, swap, chksum) != (int32)n) { + return -1; + } + + assert(n == l_d1 * l_d2 * l_d3); + + *arr = ckd_alloc_3d_ptr(l_d1, l_d2, l_d3, raw, e_sz); + *d1 = l_d1; + *d2 = l_d2; + *d3 = l_d3; + + return n; +} + +void +bio_verify_chksum(FILE * fp, int32 byteswap, uint32 chksum) +{ + uint32 file_chksum; + + if (fread(&file_chksum, sizeof(uint32), 1, fp) != 1) + E_FATAL("fread(chksum) failed\n"); + if (byteswap) + SWAP_INT32(&file_chksum); + if (file_chksum != chksum) + E_FATAL + ("Checksum error; file-checksum %08x, computed %08x\n", + file_chksum, chksum); +} + +int +bio_fwrite_3d(void ***arr, + size_t e_sz, + uint32 d1, + uint32 d2, + uint32 d3, + FILE *fp, + uint32 *chksum) +{ + size_t ret; + + /* write out first dimension 1 */ + ret = bio_fwrite(&d1, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out first dimension 2 */ + ret = bio_fwrite(&d2, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out first dimension 3 */ + ret = bio_fwrite(&d3, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_3d"); + } + return -1; + } + + /* write out the data in the array as one big block */ + return bio_fwrite_1d(arr[0][0], e_sz, d1 * d2 * d3, fp, chksum); +} + +int +bio_fwrite_1d(void *arr, + size_t e_sz, + uint32 d1, + FILE *fp, + uint32 *chksum) +{ + size_t ret; + ret = bio_fwrite(&d1, sizeof(uint32), 1, fp, 0, chksum); + if (ret != 1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_1d"); + } + return -1; + } + + ret = bio_fwrite(arr, e_sz, d1, fp, 0, chksum); + if (ret != d1) { + if (ret == 0) { + E_ERROR_SYSTEM("Unable to write complete data"); + } + else { + E_ERROR_SYSTEM("OS error in bio_fwrite_1d"); + } + + return -1; + } + + return ret; +} + +int16* +bio_read_wavfile(char const *directory, + char const *filename, + char const *extension, + int32 header, + int32 endian, + size_t *nsamps) +{ + FILE *uttfp; + char *inputfile; + size_t n, l; + int16 *data; + + (void)endian; + n = strlen(extension); + l = strlen(filename); + if ((n <= l) && (0 == strcmp(filename + l - n, extension))) + extension = ""; + inputfile = ckd_calloc(strlen(directory) + l + n + 2, 1); + if (directory) { + sprintf(inputfile, "%s/%s%s", directory, filename, extension); + } else { + sprintf(inputfile, "%s%s", filename, extension); + } + + if ((uttfp = fopen(inputfile, "rb")) == NULL) { + E_FATAL_SYSTEM("Failed to open file '%s' for reading", inputfile); + } + fseek(uttfp, 0, SEEK_END); + n = ftell(uttfp); + fseek(uttfp, 0, SEEK_SET); + if (header > 0) { + if (fseek(uttfp, header, SEEK_SET) < 0) { + E_ERROR_SYSTEM("Failed to move to an offset %d in a file '%s'", header, inputfile); + fclose(uttfp); + ckd_free(inputfile); + return NULL; + } + n -= header; + } + n /= sizeof(int16); + data = ckd_calloc(n, sizeof(*data)); + if ((l = fread(data, sizeof(int16), n, uttfp)) < n) { + E_ERROR_SYSTEM("Failed to read %d samples from %s: %d", n, inputfile, l); + ckd_free(data); + ckd_free(inputfile); + fclose(uttfp); + return NULL; + } + ckd_free(inputfile); + fclose(uttfp); + if (nsamps) *nsamps = n; + + return data; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c new file mode 100644 index 0000000..bb880a9 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c @@ -0,0 +1,108 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * bitarr.c -- Bit array manipulations implementation. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "sphinxbase/err.h" +#include "sphinxbase/bitarr.h" +#include "sphinxbase/byteorder.h" + +uint64 bitarr_read_int57(bitarr_address_t address, uint8 length, uint64 mask) +{ + uint64 value64; + const uint8 *base_off = (const uint8 *)(address.base) + (address.offset >> 3); + (void)length; /* Yeah, what is this for anyway? */ + memcpy(&value64, base_off, sizeof(value64)); + SWAP_LE_64(&value64); + return (value64 >> (address.offset & 7)) & mask; +} + +void bitarr_write_int57(bitarr_address_t address, uint8 length, uint64 value) +{ + uint64 value64; + uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3); + (void)length; /* Yeah, what is this for anyway? */ + memcpy(&value64, base_off, sizeof(value64)); + SWAP_LE_64(&value64); + value64 |= (value << (address.offset & 7)); + SWAP_LE_64(&value64); + memcpy(base_off, &value64, sizeof(value64)); +} + +uint32 bitarr_read_int25(bitarr_address_t address, uint8 length, uint32 mask) +{ + uint32 value32; + const uint8 *base_off = (const uint8*)(address.base) + (address.offset >> 3); + (void)length; /* Yeah, what is this for anyway? */ + memcpy(&value32, base_off, sizeof(value32)); + SWAP_LE_32(&value32); + return (value32 >> (address.offset & 7)) & mask; +} + +void bitarr_write_int25(bitarr_address_t address, uint8 length, uint32 value) +{ + uint32 value32; + uint8 *base_off = (uint8 *)(address.base) + (address.offset >> 3); + (void)length; /* Yeah, what is this for anyway? */ + memcpy(&value32, base_off, sizeof(value32)); + SWAP_LE_32(&value32); + value32 |= (value << (address.offset & 7)); + SWAP_LE_32(&value32); + memcpy(base_off, &value32, sizeof(value32)); +} + +void bitarr_mask_from_max(bitarr_mask_t *bit_mask, uint32 max_value) +{ + bit_mask->bits = bitarr_required_bits(max_value); + bit_mask->mask = (uint32)((1ULL << bit_mask->bits) - 1); +} + +uint8 bitarr_required_bits(uint32 max_value) +{ + uint8 res; + + if (!max_value) return 0; + res = 1; + while (max_value >>= 1) res++; + return res; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c new file mode 100644 index 0000000..2d13901 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c @@ -0,0 +1,101 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * bitvec.c -- Bit vector type. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: bitvec.c,v $ + * Revision 1.4 2005/06/22 02:58:22 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Started. + */ + + +#include "sphinxbase/bitvec.h" + +bitvec_t * +bitvec_realloc(bitvec_t *vec, + size_t old_len, + size_t new_len) +{ + bitvec_t *new_vec; + size_t old_size = bitvec_size(old_len); + size_t new_size = bitvec_size(new_len); + + new_vec = ckd_realloc(vec, new_size * sizeof(bitvec_t)); + if (new_size > old_size) + memset(new_vec + old_size, 0, (new_size - old_size) * sizeof(bitvec_t)); + + return new_vec; +} + +size_t +bitvec_count_set(bitvec_t *vec, size_t len) +{ + size_t words, bits, w, b, n; + bitvec_t *v; + + words = len / BITVEC_BITS; + bits = len % BITVEC_BITS; + v = vec; + n = 0; + for (w = 0; w < words; ++w, ++v) { + if (*v == 0) + continue; + for (b = 0; b < BITVEC_BITS; ++b) + if (*v & (1<= 97 && inta <= 122) { + inta += -32; + } + if (intb >= 97 && intb <= 122) { + intb += -32; + } + + } else if (zcode == 233 || zcode == 169) { + +/* + EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or + upper case 'Z'. +*/ + + if ((inta >= 129 && inta <= 137) || (inta >= 145 && inta <= 153) || + (inta >= 162 && inta <= 169)) { + inta += 64; + } + if ((intb >= 129 && intb <= 137) || (intb >= 145 && intb <= 153) || + (intb >= 162 && intb <= 169)) { + intb += 64; + } + + } else if (zcode == 218 || zcode == 250) { + +/* + ASCII is assumed, on Prime machines - ZCODE is the ASCII code + plus 128 of either lower or upper case 'Z'. +*/ + + if (inta >= 225 && inta <= 250) { + inta += -32; + } + if (intb >= 225 && intb <= 250) { + intb += -32; + } + } + ret_val = inta == intb; + +/* + RETURN + + End of LSAME +*/ + + return ret_val; +} /* lsame_ */ + +doublereal sdot_(integer *n, real *sx, integer *incx, real *sy, integer *incy) +{ + /* System generated locals */ + integer i__1; + real ret_val; + + /* Local variables */ + static integer i__, m, ix, iy, mp1; + static real stemp; + + +/* + forms the dot product of two vectors. + uses unrolled loops for increments equal to one. + jack dongarra, linpack, 3/11/78. + modified 12/3/93, array(1) declarations changed to array(*) +*/ + + + /* Parameter adjustments */ + --sy; + --sx; + + /* Function Body */ + stemp = 0.f; + ret_val = 0.f; + if (*n <= 0) { + return ret_val; + } + if (*incx == 1 && *incy == 1) { + goto L20; + } + +/* + code for unequal increments or equal increments + not equal to 1 +*/ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + stemp += sx[ix] * sy[iy]; + ix += *incx; + iy += *incy; +/* L10: */ + } + ret_val = stemp; + return ret_val; + +/* + code for both increments equal to 1 + + + clean-up loop +*/ + +L20: + m = *n % 5; + if (m == 0) { + goto L40; + } + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + stemp += sx[i__] * sy[i__]; +/* L30: */ + } + if (*n < 5) { + goto L60; + } +L40: + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 5) { + stemp = stemp + sx[i__] * sy[i__] + sx[i__ + 1] * sy[i__ + 1] + sx[ + i__ + 2] * sy[i__ + 2] + sx[i__ + 3] * sy[i__ + 3] + sx[i__ + + 4] * sy[i__ + 4]; +/* L50: */ + } +L60: + ret_val = stemp; + return ret_val; +} /* sdot_ */ + +/* Subroutine */ int sgemm_(char *transa, char *transb, integer *m, integer * + n, integer *k, real *alpha, real *a, integer *lda, real *b, integer * + ldb, real *beta, real *c__, integer *ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + static integer i__, j, l, info; + static logical nota, notb; + static real temp; + static integer ncola; + extern logical lsame_(char *, char *); + static integer nrowa, nrowb; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SGEMM performs one of the matrix-matrix operations + + C := alpha*op( A )*op( B ) + beta*C, + + where op( X ) is one of + + op( X ) = X or op( X ) = X', + + alpha and beta are scalars, and A, B and C are matrices, with op( A ) + an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. + + Parameters + ========== + + TRANSA - CHARACTER*1. + On entry, TRANSA specifies the form of op( A ) to be used in + the matrix multiplication as follows: + + TRANSA = 'N' or 'n', op( A ) = A. + + TRANSA = 'T' or 't', op( A ) = A'. + + TRANSA = 'C' or 'c', op( A ) = A'. + + Unchanged on exit. + + TRANSB - CHARACTER*1. + On entry, TRANSB specifies the form of op( B ) to be used in + the matrix multiplication as follows: + + TRANSB = 'N' or 'n', op( B ) = B. + + TRANSB = 'T' or 't', op( B ) = B'. + + TRANSB = 'C' or 'c', op( B ) = B'. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix + op( A ) and of the matrix C. M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix + op( B ) and the number of columns of the matrix C. N must be + at least zero. + Unchanged on exit. + + K - INTEGER. + On entry, K specifies the number of columns of the matrix + op( A ) and the number of rows of the matrix op( B ). K must + be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + k when TRANSA = 'N' or 'n', and is m otherwise. + Before entry with TRANSA = 'N' or 'n', the leading m by k + part of the array A must contain the matrix A, otherwise + the leading k by m part of the array A must contain the + matrix A. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When TRANSA = 'N' or 'n' then + LDA must be at least max( 1, m ), otherwise LDA must be at + least max( 1, k ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, kb ), where kb is + n when TRANSB = 'N' or 'n', and is k otherwise. + Before entry with TRANSB = 'N' or 'n', the leading k by n + part of the array B must contain the matrix B, otherwise + the leading n by k part of the array B must contain the + matrix B. + Unchanged on exit. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. When TRANSB = 'N' or 'n' then + LDB must be at least max( 1, k ), otherwise LDB must be at + least max( 1, n ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then C need not be set on input. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry, the leading m by n part of the array C must + contain the matrix C, except when beta is zero, in which + case C need not be set on entry. + On exit, the array C is overwritten by the m by n matrix + ( alpha*op( A )*op( B ) + beta*C ). + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Set NOTA and NOTB as true if A and B respectively are not + transposed and set NROWA, NCOLA and NROWB as the number of rows + and columns of A and the number of rows of B respectively. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + nota = lsame_(transa, "N"); + notb = lsame_(transb, "N"); + if (nota) { + nrowa = *m; + ncola = *k; + } else { + nrowa = *k; + ncola = *m; + } + if (notb) { + nrowb = *k; + } else { + nrowb = *n; + } + (void) ncola; +/* Test the input parameters. */ + + info = 0; + if (! nota && ! lsame_(transa, "C") && ! lsame_( + transa, "T")) { + info = 1; + } else if (! notb && ! lsame_(transb, "C") && ! + lsame_(transb, "T")) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*k < 0) { + info = 5; + } else if (*lda < max(1,nrowa)) { + info = 8; + } else if (*ldb < max(1,nrowb)) { + info = 10; + } else if (*ldc < max(1,*m)) { + info = 13; + } + if (info != 0) { + xerbla_("SGEMM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || ((*alpha == 0.f || *k == 0) && *beta == 1.f)) { + return 0; + } + +/* And if alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (notb) { + if (nota) { + +/* Form C := alpha*A*B + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L50: */ + } + } else if (*beta != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L60: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (b[l + j * b_dim1] != 0.f) { + temp = *alpha * b[l + j * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L70: */ + } + } +/* L80: */ + } +/* L90: */ + } + } else { + +/* Form C := alpha*A'*B + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; +/* L100: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L110: */ + } +/* L120: */ + } + } + } else { + if (nota) { + +/* Form C := alpha*A*B' + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L130: */ + } + } else if (*beta != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L140: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (b[j + l * b_dim1] != 0.f) { + temp = *alpha * b[j + l * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L150: */ + } + } +/* L160: */ + } +/* L170: */ + } + } else { + +/* Form C := alpha*A'*B' + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; +/* L180: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L190: */ + } +/* L200: */ + } + } + } + + return 0; + +/* End of SGEMM . */ + +} /* sgemm_ */ + +/* Subroutine */ int sgemv_(char *trans, integer *m, integer *n, real *alpha, + real *a, integer *lda, real *x, integer *incx, real *beta, real *y, + integer *incy) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + static integer i__, j, ix, iy, jx, jy, kx, ky, info; + static real temp; + static integer lenx, leny; + extern logical lsame_(char *, char *); + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SGEMV performs one of the matrix-vector operations + + y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, + + where alpha and beta are scalars, x and y are vectors and A is an + m by n matrix. + + Parameters + ========== + + TRANS - CHARACTER*1. + On entry, TRANS specifies the operation to be performed as + follows: + + TRANS = 'N' or 'n' y := alpha*A*x + beta*y. + + TRANS = 'T' or 't' y := alpha*A'*x + beta*y. + + TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix A. + M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix A. + N must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, n ). + Before entry, the leading m by n part of the array A must + contain the matrix of coefficients. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. LDA must be at least + max( 1, m ). + Unchanged on exit. + + X - REAL array of DIMENSION at least + ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' + and at least + ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. + Before entry, the incremented array X must contain the + vector x. + Unchanged on exit. + + INCX - INTEGER. + On entry, INCX specifies the increment for the elements of + X. INCX must not be zero. + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then Y need not be set on input. + Unchanged on exit. + + Y - REAL array of DIMENSION at least + ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' + and at least + ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. + Before entry with BETA non-zero, the incremented array Y + must contain the vector y. On exit, Y is overwritten by the + updated vector y. + + INCY - INTEGER. + On entry, INCY specifies the increment for the elements of + Y. INCY must not be zero. + Unchanged on exit. + + + Level 2 Blas routine. + + -- Written on 22-October-1986. + Jack Dongarra, Argonne National Lab. + Jeremy Du Croz, Nag Central Office. + Sven Hammarling, Nag Central Office. + Richard Hanson, Sandia National Labs. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --y; + + /* Function Body */ + info = 0; + if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C") + ) { + info = 1; + } else if (*m < 0) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*lda < max(1,*m)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } else if (*incy == 0) { + info = 11; + } + if (info != 0) { + xerbla_("SGEMV ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || (*alpha == 0.f && *beta == 1.f)) { + return 0; + } + +/* + Set LENX and LENY, the lengths of the vectors x and y, and set + up the start points in X and Y. +*/ + + if (lsame_(trans, "N")) { + lenx = *n; + leny = *m; + } else { + lenx = *m; + leny = *n; + } + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (lenx - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (leny - 1) * *incy; + } + +/* + Start the operations. In this version the elements of A are + accessed sequentially with one pass through A. + + First form y := beta*y. +*/ + + if (*beta != 1.f) { + if (*incy == 1) { + if (*beta == 0.f) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = 0.f; +/* L10: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = *beta * y[i__]; +/* L20: */ + } + } + } else { + iy = ky; + if (*beta == 0.f) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = 0.f; + iy += *incy; +/* L30: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = *beta * y[iy]; + iy += *incy; +/* L40: */ + } + } + } + } + if (*alpha == 0.f) { + return 0; + } + if (lsame_(trans, "N")) { + +/* Form y := alpha*A*x + y. */ + + jx = kx; + if (*incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.f) { + temp = *alpha * x[jx]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[i__] += temp * a[i__ + j * a_dim1]; +/* L50: */ + } + } + jx += *incx; +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.f) { + temp = *alpha * x[jx]; + iy = ky; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[iy] += temp * a[i__ + j * a_dim1]; + iy += *incy; +/* L70: */ + } + } + jx += *incx; +/* L80: */ + } + } + } else { + +/* Form y := alpha*A'*x + y. */ + + jy = ky; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.f; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[i__]; +/* L90: */ + } + y[jy] += *alpha * temp; + jy += *incy; +/* L100: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.f; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[ix]; + ix += *incx; +/* L110: */ + } + y[jy] += *alpha * temp; + jy += *incy; +/* L120: */ + } + } + } + + return 0; + +/* End of SGEMV . */ + +} /* sgemv_ */ + +/* Subroutine */ int sscal_(integer *n, real *sa, real *sx, integer *incx) +{ + /* System generated locals */ + integer i__1, i__2; + + /* Local variables */ + static integer i__, m, mp1, nincx; + + +/* + scales a vector by a constant. + uses unrolled loops for increment equal to 1. + jack dongarra, linpack, 3/11/78. + modified 3/93 to return if incx .le. 0. + modified 12/3/93, array(1) declarations changed to array(*) +*/ + + + /* Parameter adjustments */ + --sx; + + /* Function Body */ + if (*n <= 0 || *incx <= 0) { + return 0; + } + if (*incx == 1) { + goto L20; + } + +/* code for increment not equal to 1 */ + + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + sx[i__] = *sa * sx[i__]; +/* L10: */ + } + return 0; + +/* + code for increment equal to 1 + + + clean-up loop +*/ + +L20: + m = *n % 5; + if (m == 0) { + goto L40; + } + i__2 = m; + for (i__ = 1; i__ <= i__2; ++i__) { + sx[i__] = *sa * sx[i__]; +/* L30: */ + } + if (*n < 5) { + return 0; + } +L40: + mp1 = m + 1; + i__2 = *n; + for (i__ = mp1; i__ <= i__2; i__ += 5) { + sx[i__] = *sa * sx[i__]; + sx[i__ + 1] = *sa * sx[i__ + 1]; + sx[i__ + 2] = *sa * sx[i__ + 2]; + sx[i__ + 3] = *sa * sx[i__ + 3]; + sx[i__ + 4] = *sa * sx[i__ + 4]; +/* L50: */ + } + return 0; +} /* sscal_ */ + +/* Subroutine */ int ssymm_(char *side, char *uplo, integer *m, integer *n, + real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, + real *c__, integer *ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + static integer i__, j, k, info; + static real temp1, temp2; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SSYMM performs one of the matrix-matrix operations + + C := alpha*A*B + beta*C, + + or + + C := alpha*B*A + beta*C, + + where alpha and beta are scalars, A is a symmetric matrix and B and + C are m by n matrices. + + Parameters + ========== + + SIDE - CHARACTER*1. + On entry, SIDE specifies whether the symmetric matrix A + appears on the left or right in the operation as follows: + + SIDE = 'L' or 'l' C := alpha*A*B + beta*C, + + SIDE = 'R' or 'r' C := alpha*B*A + beta*C, + + Unchanged on exit. + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the upper or lower + triangular part of the symmetric matrix A is to be + referenced as follows: + + UPLO = 'U' or 'u' Only the upper triangular part of the + symmetric matrix is to be referenced. + + UPLO = 'L' or 'l' Only the lower triangular part of the + symmetric matrix is to be referenced. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of the matrix C. + M must be at least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of the matrix C. + N must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + m when SIDE = 'L' or 'l' and is n otherwise. + Before entry with SIDE = 'L' or 'l', the m by m part of + the array A must contain the symmetric matrix, such that + when UPLO = 'U' or 'u', the leading m by m upper triangular + part of the array A must contain the upper triangular part + of the symmetric matrix and the strictly lower triangular + part of A is not referenced, and when UPLO = 'L' or 'l', + the leading m by m lower triangular part of the array A + must contain the lower triangular part of the symmetric + matrix and the strictly upper triangular part of A is not + referenced. + Before entry with SIDE = 'R' or 'r', the n by n part of + the array A must contain the symmetric matrix, such that + when UPLO = 'U' or 'u', the leading n by n upper triangular + part of the array A must contain the upper triangular part + of the symmetric matrix and the strictly lower triangular + part of A is not referenced, and when UPLO = 'L' or 'l', + the leading n by n lower triangular part of the array A + must contain the lower triangular part of the symmetric + matrix and the strictly upper triangular part of A is not + referenced. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When SIDE = 'L' or 'l' then + LDA must be at least max( 1, m ), otherwise LDA must be at + least max( 1, n ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, n ). + Before entry, the leading m by n part of the array B must + contain the matrix B. + Unchanged on exit. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. LDB must be at least + max( 1, m ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. When BETA is + supplied as zero then C need not be set on input. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry, the leading m by n part of the array C must + contain the matrix C, except when beta is zero, in which + case C need not be set on entry. + On exit, the array C is overwritten by the m by n updated + matrix. + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Set NROWA as the number of rows of A. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(side, "L")) { + nrowa = *m; + } else { + nrowa = *n; + } + upper = lsame_(uplo, "U"); + +/* Test the input parameters. */ + + info = 0; + if (! lsame_(side, "L") && ! lsame_(side, "R")) { + info = 1; + } else if (! upper && ! lsame_(uplo, "L")) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldb < max(1,*m)) { + info = 9; + } else if (*ldc < max(1,*m)) { + info = 12; + } + if (info != 0) { + xerbla_("SSYMM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || (*alpha == 0.f && *beta == 1.f)) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(side, "L")) { + +/* Form C := alpha*A*B + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.f; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; +/* L50: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } +/* L60: */ + } +/* L70: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.f; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; +/* L80: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } +/* L90: */ + } +/* L100: */ + } + } + } else { + +/* Form C := alpha*B*A + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * a[j + j * a_dim1]; + if (*beta == 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = temp1 * b[i__ + j * b_dim1]; +/* L110: */ + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * b[i__ + j * b_dim1]; +/* L120: */ + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[k + j * a_dim1]; + } else { + temp1 = *alpha * a[j + k * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; +/* L130: */ + } +/* L140: */ + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[j + k * a_dim1]; + } else { + temp1 = *alpha * a[k + j * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; +/* L150: */ + } +/* L160: */ + } +/* L170: */ + } + } + + return 0; + +/* End of SSYMM . */ + +} /* ssymm_ */ + +/* Subroutine */ int ssyrk_(char *uplo, char *trans, integer *n, integer *k, + real *alpha, real *a, integer *lda, real *beta, real *c__, integer * + ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; + + /* Local variables */ + static integer i__, j, l, info; + static real temp; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + Purpose + ======= + + SSYRK performs one of the symmetric rank k operations + + C := alpha*A*A' + beta*C, + + or + + C := alpha*A'*A + beta*C, + + where alpha and beta are scalars, C is an n by n symmetric matrix + and A is an n by k matrix in the first case and a k by n matrix + in the second case. + + Parameters + ========== + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the upper or lower + triangular part of the array C is to be referenced as + follows: + + UPLO = 'U' or 'u' Only the upper triangular part of C + is to be referenced. + + UPLO = 'L' or 'l' Only the lower triangular part of C + is to be referenced. + + Unchanged on exit. + + TRANS - CHARACTER*1. + On entry, TRANS specifies the operation to be performed as + follows: + + TRANS = 'N' or 'n' C := alpha*A*A' + beta*C. + + TRANS = 'T' or 't' C := alpha*A'*A + beta*C. + + TRANS = 'C' or 'c' C := alpha*A'*A + beta*C. + + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the order of the matrix C. N must be + at least zero. + Unchanged on exit. + + K - INTEGER. + On entry with TRANS = 'N' or 'n', K specifies the number + of columns of the matrix A, and on entry with + TRANS = 'T' or 't' or 'C' or 'c', K specifies the number + of rows of the matrix A. K must be at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, ka ), where ka is + k when TRANS = 'N' or 'n', and is n otherwise. + Before entry with TRANS = 'N' or 'n', the leading n by k + part of the array A must contain the matrix A, otherwise + the leading k by n part of the array A must contain the + matrix A. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When TRANS = 'N' or 'n' + then LDA must be at least max( 1, n ), otherwise LDA must + be at least max( 1, k ). + Unchanged on exit. + + BETA - REAL . + On entry, BETA specifies the scalar beta. + Unchanged on exit. + + C - REAL array of DIMENSION ( LDC, n ). + Before entry with UPLO = 'U' or 'u', the leading n by n + upper triangular part of the array C must contain the upper + triangular part of the symmetric matrix and the strictly + lower triangular part of C is not referenced. On exit, the + upper triangular part of the array C is overwritten by the + upper triangular part of the updated matrix. + Before entry with UPLO = 'L' or 'l', the leading n by n + lower triangular part of the array C must contain the lower + triangular part of the symmetric matrix and the strictly + upper triangular part of C is not referenced. On exit, the + lower triangular part of the array C is overwritten by the + lower triangular part of the updated matrix. + + LDC - INTEGER. + On entry, LDC specifies the first dimension of C as declared + in the calling (sub) program. LDC must be at least + max( 1, n ). + Unchanged on exit. + + + Level 3 Blas routine. + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(trans, "N")) { + nrowa = *n; + } else { + nrowa = *k; + } + upper = lsame_(uplo, "U"); + + info = 0; + if (! upper && ! lsame_(uplo, "L")) { + info = 1; + } else if (! lsame_(trans, "N") && ! lsame_(trans, + "T") && ! lsame_(trans, "C")) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*k < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldc < max(1,*n)) { + info = 10; + } + if (info != 0) { + xerbla_("SSYRK ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || ((*alpha == 0.f || *k == 0) && *beta == 1.f)) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + if (upper) { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + } else { + if (*beta == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L70: */ + } +/* L80: */ + } + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(trans, "N")) { + +/* Form C := alpha*A*A' + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L90: */ + } + } else if (*beta != 1.f) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L100: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.f) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = j; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L110: */ + } + } +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.f) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.f; +/* L140: */ + } + } else if (*beta != 1.f) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L150: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.f) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = *n; + for (i__ = j; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L160: */ + } + } +/* L170: */ + } +/* L180: */ + } + } + } else { + +/* Form C := alpha*A'*A + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; +/* L190: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L200: */ + } +/* L210: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp = 0.f; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; +/* L220: */ + } + if (*beta == 0.f) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L230: */ + } +/* L240: */ + } + } + } + + return 0; + +/* End of SSYRK . */ + +} /* ssyrk_ */ + +/* Subroutine */ int strsm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, real *alpha, real *a, integer *lda, real *b, + integer *ldb) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; + + /* Local variables */ + static integer i__, j, k, info; + static real temp; + static logical lside; + extern logical lsame_(char *, char *); + static integer nrowa; + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + static logical nounit; + + +/* + Purpose + ======= + + STRSM solves one of the matrix equations + + op( A )*X = alpha*B, or X*op( A ) = alpha*B, + + where alpha is a scalar, X and B are m by n matrices, A is a unit, or + non-unit, upper or lower triangular matrix and op( A ) is one of + + op( A ) = A or op( A ) = A'. + + The matrix X is overwritten on B. + + Parameters + ========== + + SIDE - CHARACTER*1. + On entry, SIDE specifies whether op( A ) appears on the left + or right of X as follows: + + SIDE = 'L' or 'l' op( A )*X = alpha*B. + + SIDE = 'R' or 'r' X*op( A ) = alpha*B. + + Unchanged on exit. + + UPLO - CHARACTER*1. + On entry, UPLO specifies whether the matrix A is an upper or + lower triangular matrix as follows: + + UPLO = 'U' or 'u' A is an upper triangular matrix. + + UPLO = 'L' or 'l' A is a lower triangular matrix. + + Unchanged on exit. + + TRANSA - CHARACTER*1. + On entry, TRANSA specifies the form of op( A ) to be used in + the matrix multiplication as follows: + + TRANSA = 'N' or 'n' op( A ) = A. + + TRANSA = 'T' or 't' op( A ) = A'. + + TRANSA = 'C' or 'c' op( A ) = A'. + + Unchanged on exit. + + DIAG - CHARACTER*1. + On entry, DIAG specifies whether or not A is unit triangular + as follows: + + DIAG = 'U' or 'u' A is assumed to be unit triangular. + + DIAG = 'N' or 'n' A is not assumed to be unit + triangular. + + Unchanged on exit. + + M - INTEGER. + On entry, M specifies the number of rows of B. M must be at + least zero. + Unchanged on exit. + + N - INTEGER. + On entry, N specifies the number of columns of B. N must be + at least zero. + Unchanged on exit. + + ALPHA - REAL . + On entry, ALPHA specifies the scalar alpha. When alpha is + zero then A is not referenced and B need not be set before + entry. + Unchanged on exit. + + A - REAL array of DIMENSION ( LDA, k ), where k is m + when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. + Before entry with UPLO = 'U' or 'u', the leading k by k + upper triangular part of the array A must contain the upper + triangular matrix and the strictly lower triangular part of + A is not referenced. + Before entry with UPLO = 'L' or 'l', the leading k by k + lower triangular part of the array A must contain the lower + triangular matrix and the strictly upper triangular part of + A is not referenced. + Note that when DIAG = 'U' or 'u', the diagonal elements of + A are not referenced either, but are assumed to be unity. + Unchanged on exit. + + LDA - INTEGER. + On entry, LDA specifies the first dimension of A as declared + in the calling (sub) program. When SIDE = 'L' or 'l' then + LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' + then LDA must be at least max( 1, n ). + Unchanged on exit. + + B - REAL array of DIMENSION ( LDB, n ). + Before entry, the leading m by n part of the array B must + contain the right-hand side matrix B, and on exit is + overwritten by the solution matrix X. + + LDB - INTEGER. + On entry, LDB specifies the first dimension of B as declared + in the calling (sub) program. LDB must be at least + max( 1, m ). + Unchanged on exit. + + + Level 3 Blas routine. + + + -- Written on 8-February-1989. + Jack Dongarra, Argonne National Laboratory. + Iain Duff, AERE Harwell. + Jeremy Du Croz, Numerical Algorithms Group Ltd. + Sven Hammarling, Numerical Algorithms Group Ltd. + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + lside = lsame_(side, "L"); + if (lside) { + nrowa = *m; + } else { + nrowa = *n; + } + nounit = lsame_(diag, "N"); + upper = lsame_(uplo, "U"); + + info = 0; + if (! lside && ! lsame_(side, "R")) { + info = 1; + } else if (! upper && ! lsame_(uplo, "L")) { + info = 2; + } else if (! lsame_(transa, "N") && ! lsame_(transa, + "T") && ! lsame_(transa, "C")) { + info = 3; + } else if (! lsame_(diag, "U") && ! lsame_(diag, + "N")) { + info = 4; + } else if (*m < 0) { + info = 5; + } else if (*n < 0) { + info = 6; + } else if (*lda < max(1,nrowa)) { + info = 9; + } else if (*ldb < max(1,*m)) { + info = 11; + } + if (info != 0) { + xerbla_("STRSM ", &info); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.f) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = 0.f; +/* L10: */ + } +/* L20: */ + } + return 0; + } + +/* Start the operations. */ + + if (lside) { + if (lsame_(transa, "N")) { + +/* Form B := alpha*inv( A )*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L30: */ + } + } + for (k = *m; k >= 1; --k) { + if (b[k + j * b_dim1] != 0.f) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__2 = k - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; +/* L40: */ + } + } +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L70: */ + } + } + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + if (b[k + j * b_dim1] != 0.f) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__3 = *m; + for (i__ = k + 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; +/* L80: */ + } + } +/* L90: */ + } +/* L100: */ + } + } + } else { + +/* Form B := alpha*inv( A' )*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L110: */ + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L140: */ + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; +/* L150: */ + } +/* L160: */ + } + } + } + } else { + if (lsame_(transa, "N")) { + +/* Form B := alpha*B*inv( A ). */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L170: */ + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (a[k + j * a_dim1] != 0.f) { + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; +/* L180: */ + } + } +/* L190: */ + } + if (nounit) { + temp = 1.f / a[j + j * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L200: */ + } + } +/* L210: */ + } + } else { + for (j = *n; j >= 1; --j) { + if (*alpha != 1.f) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L220: */ + } + } + i__1 = *n; + for (k = j + 1; k <= i__1; ++k) { + if (a[k + j * a_dim1] != 0.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; +/* L230: */ + } + } +/* L240: */ + } + if (nounit) { + temp = 1.f / a[j + j * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L250: */ + } + } +/* L260: */ + } + } + } else { + +/* Form B := alpha*B*inv( A' ). */ + + if (upper) { + for (k = *n; k >= 1; --k) { + if (nounit) { + temp = 1.f / a[k + k * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L270: */ + } + } + i__1 = k - 1; + for (j = 1; j <= i__1; ++j) { + if (a[j + k * a_dim1] != 0.f) { + temp = a[j + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; +/* L280: */ + } + } +/* L290: */ + } + if (*alpha != 1.f) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; +/* L300: */ + } + } +/* L310: */ + } + } else { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + if (nounit) { + temp = 1.f / a[k + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L320: */ + } + } + i__2 = *n; + for (j = k + 1; j <= i__2; ++j) { + if (a[j + k * a_dim1] != 0.f) { + temp = a[j + k * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; +/* L330: */ + } + } +/* L340: */ + } + if (*alpha != 1.f) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; +/* L350: */ + } + } +/* L360: */ + } + } + } + } + + return 0; + +/* End of STRSM . */ + +} /* strsm_ */ + +/* Subroutine */ int xerbla_(char *srname, integer *info) +{ + /* Format strings */ + static char fmt_9999[] = "(\002 ** On entry to \002,a6,\002 parameter nu" + "mber \002,i2,\002 had \002,\002an illegal value\002)"; + + /* Builtin functions */ + integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); + /* Subroutine */ int s_stop(char *, ftnlen); + + /* Fortran I/O blocks */ + static cilist io___60 = { 0, 6, 0, fmt_9999, 0 }; + + +/* + -- LAPACK auxiliary routine (preliminary version) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + February 29, 1992 + + + Purpose + ======= + + XERBLA is an error handler for the LAPACK routines. + It is called by an LAPACK routine if an input parameter has an + invalid value. A message is printed and execution stops. + + Installers may consider modifying the STOP statement in order to + call system-specific exception-handling facilities. + + Arguments + ========= + + SRNAME (input) CHARACTER*6 + The name of the routine which called XERBLA. + + INFO (input) INTEGER + The position of the invalid parameter in the parameter list + of the calling routine. +*/ + + + s_wsfe(&io___60); + do_fio(&c__1, srname, (ftnlen)6); + do_fio(&c__1, (char *)&(*info), (ftnlen)sizeof(integer)); + e_wsfe(); + + s_stop("", (ftnlen)0); + + +/* End of XERBLA */ + + return 0; +} /* xerbla_ */ + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c new file mode 100644 index 0000000..f9e24ac --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c @@ -0,0 +1,141 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * case.c -- Upper/lower case conversion routines + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: case.c,v $ + * Revision 1.7 2005/06/22 02:58:54 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added strcmp_nocase. Moved UPPER_CASE and LOWER_CASE definitions to .h. + * + * 16-Feb-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#include +#include + +#include "sphinxbase/case.h" +#include "sphinxbase/err.h" + + +void +lcase(register char *cp) +{ + if (cp) { + while (*cp) { + *cp = LOWER_CASE(*cp); + cp++; + } + } +} + +void +ucase(register char *cp) +{ + if (cp) { + while (*cp) { + *cp = UPPER_CASE(*cp); + cp++; + } + } +} + +int32 +strcmp_nocase(const char *str1, const char *str2) +{ + char c1, c2; + + if (str1 == str2) + return 0; + if (str1 && str2) { + for (;;) { + c1 = *(str1++); + c1 = UPPER_CASE(c1); + c2 = *(str2++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + if (c1 == '\0') + return 0; + } + } + else + return (str1 == NULL) ? -1 : 1; + + return 0; +} + +int32 +strncmp_nocase(const char *str1, const char *str2, size_t len) +{ + char c1, c2; + + if (str1 && str2) { + size_t n; + + for (n = 0; n < len; ++n) { + c1 = *(str1++); + c1 = UPPER_CASE(c1); + c2 = *(str2++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + if (c1 == '\0') + return 0; + } + } + else + return (str1 == NULL) ? -1 : 1; + + return 0; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c new file mode 100644 index 0000000..45dc84a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c @@ -0,0 +1,427 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * ckd_alloc.c -- Memory allocation package. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: ckd_alloc.c,v $ + * Revision 1.6 2005/06/22 02:59:25 arthchan2003 + * Added keyword + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Removed file,line arguments from free functions. + * Removed debugging stuff. + * + * 01-Jan-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + + +/********************************************************************* + * + * $Header: /cvsroot/cmusphinx/sphinx3/src/libutil/ckd_alloc.c,v 1.6 2005/06/22 02:59:25 arthchan2003 Exp $ + * + * Carnegie Mellon ARPA Speech Group + * + * Copyright (c) 1994 Carnegie Mellon University. + * All rights reserved. + * + ********************************************************************* + * + * file: ckd_alloc.c + * + * traceability: + * + * description: + * + * author: + * + *********************************************************************/ + + +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" + +/** + * Target for longjmp() on failure. + * + * FIXME: This should be in thread-local storage. + */ +static jmp_buf *ckd_target; +static int jmp_abort; + +jmp_buf * +ckd_set_jump(jmp_buf *env, int abort) +{ + jmp_buf *old; + + if (abort) + jmp_abort = 1; + + old = ckd_target; + ckd_target = env; + return old; +} + +void +ckd_fail(char *format, ...) +{ + va_list args; + + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + + if (jmp_abort) + /* abort() doesn't exist in Windows CE */ + #if defined(_WIN32_WCE) + exit(-1); + #else + abort(); + #endif + else if (ckd_target) + longjmp(*ckd_target, 1); + else + exit(-1); +} + +void * +__ckd_calloc__(size_t n_elem, size_t elem_size, + const char *caller_file, int caller_line) +{ + void *mem; + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_calloc(heap_lookup(1),n_elem, elem_size)) == NULL) + if ((mem = heap_calloc(heap_lookup(0),n_elem, elem_size)) == NULL) + { + ckd_fail("calloc(%d,%d) failed from %s(%d), free space: %d\n", n_elem, + elem_size, caller_file, caller_line,space_unused()); + } +#else + if ((mem = calloc(n_elem, elem_size)) == NULL) { + ckd_fail("calloc(%d,%d) failed from %s(%d)\n", n_elem, + elem_size, caller_file, caller_line); + } +#endif + + + return mem; +} + + +void * +__ckd_malloc__(size_t size, const char *caller_file, int caller_line) +{ + void *mem; + +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_malloc(heap_lookup(0),size)) == NULL) + if ((mem = heap_malloc(heap_lookup(1),size)) == NULL) +#else + if ((mem = malloc(size)) == NULL) +#endif + ckd_fail("malloc(%d) failed from %s(%d)\n", size, + caller_file, caller_line); + + return mem; +} + + +void * +__ckd_realloc__(void *ptr, size_t new_size, + const char *caller_file, int caller_line) +{ + void *mem; +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if ((mem = heap_realloc(heap_lookup(0),ptr, new_size)) == NULL) { +#else + if ((mem = realloc(ptr, new_size)) == NULL) { +#endif + ckd_fail("malloc(%d) failed from %s(%d)\n", new_size, + caller_file, caller_line); + } + + return mem; +} + + +char * +__ckd_salloc__(const char *orig, const char *caller_file, + int caller_line) +{ + size_t len; + char *buf; + + if (!orig) + return NULL; + + len = strlen(orig) + 1; + buf = (char *) __ckd_malloc__(len, caller_file, caller_line); + + strcpy(buf, orig); + return (buf); +} + + +void * +__ckd_calloc_2d__(size_t d1, size_t d2, size_t elemsize, + const char *caller_file, int caller_line) +{ + char **ref, *mem; + size_t i, offset; + + mem = + (char *) __ckd_calloc__(d1 * d2, elemsize, caller_file, + caller_line); + ref = + (char **) __ckd_malloc__(d1 * sizeof(void *), caller_file, + caller_line); + + for (i = 0, offset = 0; i < d1; i++, offset += d2 * elemsize) + ref[i] = mem + offset; + + return ref; +} + + +void +ckd_free(void *ptr) +{ +#if defined(__ADSPBLACKFIN__) && !defined(__linux__) + if (ptr) + heap_free(0,ptr); +#else + free(ptr); +#endif +} + +void +ckd_free_2d(void *tmpptr) +{ + void **ptr = (void **)tmpptr; + if (ptr) + ckd_free(ptr[0]); + ckd_free(ptr); +} + + +void * +__ckd_calloc_3d__(size_t d1, size_t d2, size_t d3, size_t elemsize, + const char *caller_file, int caller_line) +{ + char ***ref1, **ref2, *mem; + size_t i, j, offset; + + mem = + (char *) __ckd_calloc__(d1 * d2 * d3, elemsize, caller_file, + caller_line); + ref1 = + (char ***) __ckd_malloc__(d1 * sizeof(void **), caller_file, + caller_line); + ref2 = + (char **) __ckd_malloc__(d1 * d2 * sizeof(void *), caller_file, + caller_line); + + for (i = 0, offset = 0; i < d1; i++, offset += d2) + ref1[i] = ref2 + offset; + + offset = 0; + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + ref1[i][j] = mem + offset; + offset += d3 * elemsize; + } + } + + return ref1; +} + + +void +ckd_free_3d(void *inptr) +{ + void ***ptr = (void ***)inptr; + + if (ptr && ptr[0]) + ckd_free(ptr[0][0]); + if (ptr) + ckd_free(ptr[0]); + ckd_free(ptr); +} + + +void **** +__ckd_calloc_4d__(size_t d1, + size_t d2, + size_t d3, + size_t d4, + size_t elem_size, + char *file, + int line) +{ + void *store; + void **tmp1; + void ***tmp2; + void ****out; + size_t i, j; + + store = calloc(d1 * d2 * d3 * d4, elem_size); + if (store == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + tmp1 = calloc(d1 * d2 * d3, sizeof(void *)); + if (tmp1 == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + tmp2 = ckd_calloc(d1 * d2, sizeof(void **)); + if (tmp2 == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + out = ckd_calloc(d1, sizeof(void ***)); + if (out == NULL) { + E_FATAL("ckd_calloc_4d failed for caller at %s(%d) at %s(%d)\n", + file, line, __FILE__, __LINE__); + } + + for (i = 0, j = 0; i < d1*d2*d3; i++, j += d4) { + tmp1[i] = &((char *)store)[j*elem_size]; + } + + for (i = 0, j = 0; i < d1*d2; i++, j += d3) { + tmp2[i] = &tmp1[j]; + } + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &tmp2[j]; + } + + return out; +} + +void +ckd_free_4d(void *inptr) +{ + void ****ptr = (void ****)inptr; + if (ptr == NULL) + return; + /* free the underlying store */ + ckd_free(ptr[0][0][0]); + + /* free the access overhead */ + ckd_free(ptr[0][0]); + ckd_free(ptr[0]); + ckd_free(ptr); +} + +/* Layers a 3d array access structure over a preallocated storage area */ +void * +__ckd_alloc_3d_ptr(size_t d1, + size_t d2, + size_t d3, + void *store, + size_t elem_size, + char *file, + int line) +{ + void **tmp1; + void ***out; + size_t i, j; + + tmp1 = __ckd_calloc__(d1 * d2, sizeof(void *), file, line); + + out = __ckd_calloc__(d1, sizeof(void **), file, line); + + for (i = 0, j = 0; i < d1*d2; i++, j += d3) { + tmp1[i] = &((char *)store)[j*elem_size]; + } + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &tmp1[j]; + } + + return out; +} + +void * +__ckd_alloc_2d_ptr(size_t d1, + size_t d2, + void *store, + size_t elem_size, + char *file, + int line) +{ + void **out; + size_t i, j; + + out = __ckd_calloc__(d1, sizeof(void *), file, line); + + for (i = 0, j = 0; i < d1; i++, j += d2) { + out[i] = &((char *)store)[j*elem_size]; + } + + return out; +} + +/* vim: set ts=4 sw=4: */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py new file mode 100644 index 0000000..b98b937 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python2.4 + +import sys, os +from cStringIO import StringIO +import re + +from Plex import * +from Plex.Traditional import re as Re + +class MyScanner(Scanner): + def __init__(self, info, name=''): + Scanner.__init__(self, self.lexicon, info, name) + + def begin(self, state_name): +# if self.state_name == '': +# print '' +# else: +# print self.state_name + Scanner.begin(self, state_name) + +def sep_seq(sequence, sep): + pat = Str(sequence[0]) + for s in sequence[1:]: + pat += sep + Str(s) + return pat + +def runScanner(data, scanner_class, lexicon=None): + info = StringIO(data) + outfo = StringIO() + if lexicon is not None: + scanner = scanner_class(lexicon, info) + else: + scanner = scanner_class(info) + while 1: + value, text = scanner.read() + if value is None: + break + elif value is IGNORE: + pass + else: + outfo.write(value) + return outfo.getvalue(), scanner + +class LenSubsScanner(MyScanner): + """Following clapack, we remove ftnlen arguments, which f2c puts after + a char * argument to hold the length of the passed string. This is just + a nuisance in C. + """ + def __init__(self, info, name=''): + MyScanner.__init__(self, info, name) + self.paren_count = 0 + + def beginArgs(self, text): + if self.paren_count == 0: + self.begin('args') + self.paren_count += 1 + return text + + def endArgs(self, text): + self.paren_count -= 1 + if self.paren_count == 0: + self.begin('') + return text + + digits = Re('[0-9]+') + iofun = Re(r'\([^;]*;') + decl = Re(r'\([^)]*\)[,;'+'\n]') + any = Re('[.]*') + S = Re('[ \t\n]*') + cS = Str(',') + S + len_ = Re('[a-z][a-z0-9]*_len') + + iofunctions = Str("s_cat", "s_copy", "s_stop", "s_cmp", + "i_len", "do_fio", "do_lio") + iofun + + # Routines to not scrub the ftnlen argument from + keep_ftnlen = (Str('ilaenv_') | Str('s_rnge')) + Str('(') + + lexicon = Lexicon([ + (iofunctions, TEXT), + (keep_ftnlen, beginArgs), + State('args', [ + (Str(')'), endArgs), + (Str('('), beginArgs), + (AnyChar, TEXT), + ]), + (cS+Re(r'[1-9][0-9]*L'), IGNORE), + (cS+Str('ftnlen')+Opt(S+len_), IGNORE), + (cS+sep_seq(['(', 'ftnlen', ')'], S)+S+digits, IGNORE), + (Bol+Str('ftnlen ')+len_+Str(';\n'), IGNORE), + (cS+len_, TEXT), + (AnyChar, TEXT), + ]) + +def scrubFtnlen(source): + return runScanner(source, LenSubsScanner)[0] + +def cleanSource(source): + # remove whitespace at end of lines + source = re.sub(r'[\t ]+\n', '\n', source) + # remove comments like .. Scalar Arguments .. + source = re.sub(r'(?m)^[\t ]*/\* *\.\. .*?\n', '', source) + # collapse blanks of more than two in-a-row to two + source = re.sub(r'\n\n\n\n+', r'\n\n\n', source) + return source + +class LineQueue(object): + def __init__(self): + object.__init__(self) + self._queue = [] + + def add(self, line): + self._queue.append(line) + + def clear(self): + self._queue = [] + + def flushTo(self, other_queue): + for line in self._queue: + other_queue.add(line) + self.clear() + + def getValue(self): + q = LineQueue() + self.flushTo(q) + s = ''.join(q._queue) + self.clear() + return s + +class CommentQueue(LineQueue): + def __init__(self): + LineQueue.__init__(self) + + def add(self, line): + if line.strip() == '': + LineQueue.add(self, '\n') + else: + line = ' ' + line[2:-3].rstrip() + '\n' + LineQueue.add(self, line) + + def flushTo(self, other_queue): + if len(self._queue) == 0: + pass + elif len(self._queue) == 1: + other_queue.add('/*' + self._queue[0][2:].rstrip() + ' */\n') + else: + other_queue.add('/*\n') + LineQueue.flushTo(self, other_queue) + other_queue.add('*/\n') + self.clear() + +# This really seems to be about 4x longer than it needs to be +def cleanComments(source): + lines = LineQueue() + comments = CommentQueue() + def isCommentLine(line): + return line.startswith('/*') and line.endswith('*/\n') + + blanks = LineQueue() + def isBlank(line): + return line.strip() == '' + + def SourceLines(line): + if isCommentLine(line): + comments.add(line) + return HaveCommentLines + else: + lines.add(line) + return SourceLines + def HaveCommentLines(line): + if isBlank(line): + blanks.add('\n') + return HaveBlankLines + elif isCommentLine(line): + comments.add(line) + return HaveCommentLines + else: + comments.flushTo(lines) + lines.add(line) + return SourceLines + def HaveBlankLines(line): + if isBlank(line): + blanks.add('\n') + return HaveBlankLines + elif isCommentLine(line): + blanks.flushTo(comments) + comments.add(line) + return HaveCommentLines + else: + comments.flushTo(lines) + blanks.flushTo(lines) + lines.add(line) + return SourceLines + + state = SourceLines + for line in StringIO(source): + state = state(line) + comments.flushTo(lines) + return lines.getValue() + +def removeHeader(source): + lines = LineQueue() + + def LookingForHeader(line): + m = re.match(r'/\*[^\n]*-- translated', line) + if m: + return InHeader + else: + lines.add(line) + return LookingForHeader + def InHeader(line): + if line.startswith('*/'): + return OutOfHeader + else: + return InHeader + def OutOfHeader(line): + if line.startswith('#include "f2c.h"'): + pass + else: + lines.add(line) + return OutOfHeader + + state = LookingForHeader + for line in StringIO(source): + state = state(line) + return lines.getValue() + +def replaceSlamch(source): + """Replace slamch_ calls with appropiate macros""" + def repl(m): + s = m.group(1) + return dict(E='EPSILON', P='PRECISION', S='SAFEMINIMUM', + B='BASE')[s[0]] + source = re.sub(r'slamch_\("(.*?)"\)', repl, source) + source = re.sub(r'^\s+extern.*? slamch_.*?;$(?m)', '', source) + return source + +# do it + +def scrubSource(source, nsteps=None, verbose=False): + steps = [ + ('scrubbing ftnlen', scrubFtnlen), + ('remove header', removeHeader), + ('clean source', cleanSource), + ('clean comments', cleanComments), + ('replace slamch_() calls', replaceSlamch), + ] + + if nsteps is not None: + steps = steps[:nsteps] + + for msg, step in steps: + if verbose: + print msg + source = step(source) + + return source + +if __name__ == '__main__': + filename = sys.argv[1] + outfilename = os.path.join(sys.argv[2], os.path.basename(filename)) + fo = open(filename, 'r') + source = fo.read() + fo.close() + + if len(sys.argv) > 3: + nsteps = int(sys.argv[3]) + else: + nsteps = None + + source = scrub_source(source, nsteps, verbose=True) + + writefo = open(outfilename, 'w') + writefo.write(source) + writefo.close() + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c new file mode 100644 index 0000000..ba77694 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c @@ -0,0 +1,999 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * cmd_ln.c -- Command line argument parsing. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 10-Sep-1998 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Changed strcasecmp() call in cmp_name() to strcmp_nocase() call. + * + * 15-Jul-1997 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added required arguments handling. + * + * 07-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created, based on Eric's implementation. Basically, combined several + * functions into one, eliminated validation, and simplified the interface. + */ + + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4996 4018) +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "sphinxbase/cmd_ln.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/hash_table.h" +#include "sphinxbase/case.h" +#include "sphinxbase/strfuncs.h" + +static void +arg_log_r(cmd_ln_t *, arg_t const *, int32, int32); + +static cmd_ln_t * +parse_options(cmd_ln_t *, const arg_t *, int32, char* [], int32); + +/* + * Find max length of name and default fields in the given defn array. + * Return #items in defn array. + */ +static int32 +arg_strlen(const arg_t * defn, int32 * namelen, int32 * deflen) +{ + int32 i, l; + + *namelen = *deflen = 0; + for (i = 0; defn[i].name; i++) { + l = strlen(defn[i].name); + if (*namelen < l) + *namelen = l; + + if (defn[i].deflt) + l = strlen(defn[i].deflt); + else + l = strlen("(null)"); + /* E_INFO("string default, %s , name %s, length %d\n",defn[i].deflt,defn[i].name,l); */ + if (*deflen < l) + *deflen = l; + } + + return i; +} + + +static int32 +cmp_name(const void *a, const void *b) +{ + return (strcmp_nocase + ((* (arg_t**) a)->name, + (* (arg_t**) b)->name)); +} + +static arg_t const ** +arg_sort(const arg_t * defn, int32 n) +{ + const arg_t ** pos; + int32 i; + + pos = (arg_t const **) ckd_calloc(n, sizeof(arg_t *)); + for (i = 0; i < n; ++i) + pos[i] = &defn[i]; + qsort(pos, n, sizeof(arg_t *), cmp_name); + + return pos; +} + +static size_t +strnappend(char **dest, size_t *dest_allocation, + const char *source, size_t n) +{ + size_t source_len, required_allocation; + + if (dest == NULL || dest_allocation == NULL) + return -1; + if (*dest == NULL && *dest_allocation != 0) + return -1; + if (source == NULL) + return *dest_allocation; + + source_len = strlen(source); + if (n && n < source_len) + source_len = n; + + required_allocation = (*dest ? strlen(*dest) : 0) + source_len + 1; + if (*dest_allocation < required_allocation) { + if (*dest_allocation == 0) { + *dest = (char *)ckd_calloc(required_allocation * 2, 1); + } else { + *dest = (char *)ckd_realloc(*dest, required_allocation * 2); + } + *dest_allocation = required_allocation * 2; + } + + strncat(*dest, source, source_len); + + return *dest_allocation; +} + +static size_t +strappend(char **dest, size_t *dest_allocation, + const char *source) +{ + return strnappend(dest, dest_allocation, source, 0); +} + +static char* +arg_resolve_env(const char *str) +{ + char *resolved_str = NULL; + char env_name[100]; + const char *env_val; + size_t alloced = 0; + const char *i = str, *j; + + /* calculate required resolved_str size */ + do { + j = strstr(i, "$("); + if (j != NULL) { + if (j != i) { + strnappend(&resolved_str, &alloced, i, j - i); + i = j; + } + j = strchr(i + 2, ')'); + if (j != NULL) { + if (j - (i + 2) < 100) { + strncpy(env_name, i + 2, j - (i + 2)); + env_name[j - (i + 2)] = '\0'; + #if !defined(_WIN32_WCE) + env_val = getenv(env_name); + if (env_val) + strappend(&resolved_str, &alloced, env_val); + #else + env_val = 0; + #endif + } + i = j + 1; + } else { + /* unclosed, copy and skip */ + j = i + 2; + strnappend(&resolved_str, &alloced, i, j - i); + i = j; + } + } else { + strappend(&resolved_str, &alloced, i); + } + } while(j != NULL); + + return resolved_str; +} + +static void +arg_log_r(cmd_ln_t *cmdln, const arg_t * defn, int32 doc, int32 lineno) +{ + arg_t const **pos; + int32 i, n; + size_t l; + int32 namelen, deflen; + cmd_ln_val_t const *vp; + char const **array; + + /* No definitions, do nothing. */ + if (defn == NULL) + return; + + /* Find max lengths of name and default value fields, and #entries in defn */ + n = arg_strlen(defn, &namelen, &deflen); + namelen += 4; + deflen += 4; + if (lineno) + E_INFO("%-*s", namelen, "[NAME]"); + else + E_INFOCONT("%-*s", namelen, "[NAME]"); + E_INFOCONT("%-*s", deflen, "[DEFLT]"); + if (doc) { + E_INFOCONT(" [DESCR]\n"); + } + else { + E_INFOCONT(" [VALUE]\n"); + } + + /* Print current configuration, sorted by name */ + pos = arg_sort(defn, n); + for (i = 0; i < n; i++) { + if (lineno) + E_INFO("%-*s", namelen, pos[i]->name); + else + E_INFOCONT("%-*s", namelen, pos[i]->name); + if (pos[i]->deflt) + E_INFOCONT("%-*s", deflen, pos[i]->deflt); + else + E_INFOCONT("%-*s", deflen, ""); + if (doc) { + if (pos[i]->doc) + E_INFOCONT(" %s", pos[i]->doc); + } + else { + vp = cmd_ln_access_r(cmdln, pos[i]->name); + if (vp) { + switch (pos[i]->type) { + case ARG_INTEGER: + case REQARG_INTEGER: + E_INFOCONT(" %ld", vp->val.i); + break; + case ARG_FLOATING: + case REQARG_FLOATING: + E_INFOCONT(" %e", vp->val.fl); + break; + case ARG_STRING: + case REQARG_STRING: + if (vp->val.ptr) + E_INFOCONT(" %s", (char *)vp->val.ptr); + break; + case ARG_STRING_LIST: + array = (char const**)vp->val.ptr; + if (array) + E_INFOCONT(" "); + for (l = 0; array[l] != 0; l++) { + E_INFOCONT("%s,", array[l]); + } + break; + case ARG_BOOLEAN: + case REQARG_BOOLEAN: + E_INFOCONT(" %s", vp->val.i ? "yes" : "no"); + break; + default: + E_ERROR("Unknown argument type: %d\n", pos[i]->type); + } + } + } + + E_INFOCONT("\n"); + } + ckd_free(pos); + E_INFOCONT("\n"); +} + +static char ** +parse_string_list(const char *str) +{ + int count, i, j; + const char *p; + char **result; + + p = str; + count = 1; + while (*p) { + if (*p == ',') + count++; + p++; + } + /* Should end with NULL */ + result = (char **) ckd_calloc(count + 1, sizeof(char *)); + p = str; + for (i = 0; i < count; i++) { + for (j = 0; p[j] != ',' && p[j] != 0; j++); + result[i] = (char *)ckd_calloc(j + 1, sizeof(char)); + strncpy( result[i], p, j); + p = p + j + 1; + } + return result; +} + +static cmd_ln_val_t * +cmd_ln_val_init(int t, const char *name, const char *str) +{ + cmd_ln_val_t *v; + anytype_t val; + char *e_str; + + if (!str) { + /* For lack of a better default value. */ + memset(&val, 0, sizeof(val)); + } + else { + int valid = 1; + e_str = arg_resolve_env(str); + + switch (t) { + case ARG_INTEGER: + case REQARG_INTEGER: + if (sscanf(e_str, "%ld", &val.i) != 1) + valid = 0; + break; + case ARG_FLOATING: + case REQARG_FLOATING: + if (e_str == NULL || e_str[0] == 0) + valid = 0; + val.fl = atof_c(e_str); + break; + case ARG_BOOLEAN: + case REQARG_BOOLEAN: + if ((e_str[0] == 'y') || (e_str[0] == 't') || + (e_str[0] == 'Y') || (e_str[0] == 'T') || (e_str[0] == '1')) { + val.i = TRUE; + } + else if ((e_str[0] == 'n') || (e_str[0] == 'f') || + (e_str[0] == 'N') || (e_str[0] == 'F') | + (e_str[0] == '0')) { + val.i = FALSE; + } + else { + E_ERROR("Unparsed boolean value '%s'\n", str); + valid = 0; + } + break; + case ARG_STRING: + case REQARG_STRING: + val.ptr = ckd_salloc(e_str); + break; + case ARG_STRING_LIST: + val.ptr = parse_string_list(e_str); + break; + default: + E_ERROR("Unknown argument type: %d\n", t); + valid = 0; + } + + ckd_free(e_str); + if (valid == 0) + return NULL; + } + + v = (cmd_ln_val_t *)ckd_calloc(1, sizeof(*v)); + memcpy(v, &val, sizeof(val)); + v->type = t; + v->name = ckd_salloc(name); + + return v; +} + +/* + * Handles option parsing for cmd_ln_parse_file_r() and cmd_ln_init() + * also takes care of storing argv. + * DO NOT call it from cmd_ln_parse_r() + */ +static cmd_ln_t * +parse_options(cmd_ln_t *cmdln, const arg_t *defn, int32 argc, char* argv[], int32 strict) +{ + cmd_ln_t *new_cmdln; + + new_cmdln = cmd_ln_parse_r(cmdln, defn, argc, argv, strict); + /* If this failed then clean up and return NULL. */ + if (new_cmdln == NULL) { + int32 i; + for (i = 0; i < argc; ++i) + ckd_free(argv[i]); + ckd_free(argv); + return NULL; + } + + /* Otherwise, we need to add the contents of f_argv to the new object. */ + if (new_cmdln == cmdln) { + /* If we are adding to a previously passed-in cmdln, then + * store our allocated strings in its f_argv. */ + new_cmdln->f_argv = (char **)ckd_realloc(new_cmdln->f_argv, + (new_cmdln->f_argc + argc) + * sizeof(*new_cmdln->f_argv)); + memcpy(new_cmdln->f_argv + new_cmdln->f_argc, argv, + argc * sizeof(*argv)); + ckd_free(argv); + new_cmdln->f_argc += argc; + } + else { + /* Otherwise, store f_argc and f_argv. */ + new_cmdln->f_argc = argc; + new_cmdln->f_argv = argv; + } + + return new_cmdln; +} + +void +cmd_ln_val_free(cmd_ln_val_t *val) +{ + int i; + if (val->type & ARG_STRING_LIST) { + char ** array = (char **)val->val.ptr; + if (array) { + for (i = 0; array[i] != NULL; i++) { + ckd_free(array[i]); + } + ckd_free(array); + } + } + if (val->type & ARG_STRING) + ckd_free(val->val.ptr); + ckd_free(val->name); + ckd_free(val); +} + + +cmd_ln_t * +cmd_ln_parse_r(cmd_ln_t *inout_cmdln, const arg_t * defn, + int32 argc, char *argv[], int strict) +{ + int32 i, j, n, argstart; + hash_table_t *defidx = NULL; + cmd_ln_t *cmdln; + + /* Construct command-line object */ + if (inout_cmdln == NULL) { + cmdln = (cmd_ln_t*)ckd_calloc(1, sizeof(*cmdln)); + cmdln->refcount = 1; + } + else + cmdln = inout_cmdln; + cmdln->defn = defn; + + /* Build a hash table for argument definitions */ + defidx = hash_table_new(50, 0); + if (defn) { + for (n = 0; defn[n].name; n++) { + void *v; + + v = hash_table_enter(defidx, defn[n].name, (void *)&defn[n]); + if (strict && (v != &defn[n])) { + E_ERROR("Duplicate argument name in definition: %s\n", defn[n].name); + goto error; + } + } + } + else { + /* No definitions. */ + n = 0; + } + + /* Allocate memory for argument values */ + if (cmdln->ht == NULL) + cmdln->ht = hash_table_new(n, 0 /* argument names are case-sensitive */ ); + + + /* skip argv[0] if it doesn't start with dash */ + argstart = 0; + if (argc > 0 && argv[0][0] != '-') { + argstart = 1; + } + + /* Parse command line arguments (name-value pairs) */ + for (j = argstart; j < argc; j += 2) { + arg_t *argdef; + cmd_ln_val_t *val; + void *v; + + if (hash_table_lookup(defidx, argv[j], &v) < 0) { + if (strict) { + E_ERROR("Unknown argument name '%s'\n", argv[j]); + goto error; + } + else if (defn == NULL) + v = NULL; + else + continue; + } + argdef = (arg_t *)v; + + /* Enter argument value */ + if (j + 1 >= argc) { + E_ERROR("Argument value for '%s' missing\n", argv[j]); + goto error; + } + + if (argdef == NULL) + val = cmd_ln_val_init(ARG_STRING, argv[j], argv[j + 1]); + else { + if ((val = cmd_ln_val_init(argdef->type, argv[j], argv[j + 1])) == NULL) { + E_ERROR("Bad argument value for %s: %s\n", argv[j], + argv[j + 1]); + goto error; + } + } + + if ((v = hash_table_enter(cmdln->ht, val->name, (void *)val)) != + (void *)val) + { + if (strict) { + cmd_ln_val_free(val); + E_ERROR("Duplicate argument name in arguments: %s\n", + argdef->name); + goto error; + } + else { + v = hash_table_replace(cmdln->ht, val->name, (void *)val); + cmd_ln_val_free((cmd_ln_val_t *)v); + } + } + } + + /* Fill in default values, if any, for unspecified arguments */ + for (i = 0; i < n; i++) { + cmd_ln_val_t *val; + void *v; + + if (hash_table_lookup(cmdln->ht, defn[i].name, &v) < 0) { + if ((val = cmd_ln_val_init(defn[i].type, defn[i].name, defn[i].deflt)) == NULL) { + E_ERROR + ("Bad default argument value for %s: %s\n", + defn[i].name, defn[i].deflt); + goto error; + } + hash_table_enter(cmdln->ht, val->name, (void *)val); + } + } + + /* Check for required arguments; exit if any missing */ + j = 0; + for (i = 0; i < n; i++) { + if (defn[i].type & ARG_REQUIRED) { + void *v; + if (hash_table_lookup(cmdln->ht, defn[i].name, &v) != 0) + E_ERROR("Missing required argument %s\n", defn[i].name); + } + } + if (j > 0) { + goto error; + } + + if (strict && argc == 1) { + E_ERROR("No arguments given\n"); + if (defidx) + hash_table_free(defidx); + if (inout_cmdln == NULL) + cmd_ln_free_r(cmdln); + return NULL; + } + + hash_table_free(defidx); + return cmdln; + + error: + if (defidx) + hash_table_free(defidx); + if (inout_cmdln == NULL) + cmd_ln_free_r(cmdln); + E_ERROR("Failed to parse arguments list\n"); + return NULL; +} + +cmd_ln_t * +cmd_ln_init(cmd_ln_t *inout_cmdln, const arg_t *defn, int32 strict, ...) +{ + va_list args; + const char *arg, *val; + char **f_argv; + int32 f_argc; + + va_start(args, strict); + f_argc = 0; + while ((arg = va_arg(args, const char *))) { + ++f_argc; + val = va_arg(args, const char*); + if (val == NULL) { + E_ERROR("Number of arguments must be even!\n"); + return NULL; + } + ++f_argc; + } + va_end(args); + + /* Now allocate f_argv */ + f_argv = (char**)ckd_calloc(f_argc, sizeof(*f_argv)); + va_start(args, strict); + f_argc = 0; + while ((arg = va_arg(args, const char *))) { + f_argv[f_argc] = ckd_salloc(arg); + ++f_argc; + val = va_arg(args, const char*); + f_argv[f_argc] = ckd_salloc(val); + ++f_argc; + } + va_end(args); + + return parse_options(inout_cmdln, defn, f_argc, f_argv, strict); +} + +cmd_ln_t * +cmd_ln_parse_file_r(cmd_ln_t *inout_cmdln, const arg_t * defn, const char *filename, int32 strict) +{ + FILE *file; + int argc; + int argv_size; + char *str; + int arg_max_length = 512; + int len = 0; + int quoting, ch; + char **f_argv; + int rv = 0; + const char separator[] = " \t\r\n"; + + if ((file = fopen(filename, "r")) == NULL) { + E_ERROR("Cannot open configuration file %s for reading\n", + filename); + return NULL; + } + + ch = fgetc(file); + /* Skip to the next interesting character */ + for (; ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + + if (ch == EOF) { + fclose(file); + return NULL; + } + + /* + * Initialize default argv, argc, and argv_size. + */ + argv_size = 30; + argc = 0; + f_argv = (char **)ckd_calloc(argv_size, sizeof(char *)); + /* Silently make room for \0 */ + str = (char* )ckd_calloc(arg_max_length + 1, sizeof(char)); + quoting = 0; + + do { + /* Handle arguments that are commented out */ + if (len == 0 && argc % 2 == 0) { + while (ch == '#') { + /* Skip everything until newline */ + for (ch = fgetc(file); ch != EOF && ch != '\n'; ch = fgetc(file)) ; + /* Skip to the next interesting character */ + for (ch = fgetc(file); ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + } + + /* Check if we are at the last line (without anything interesting in it) */ + if (ch == EOF) + break; + } + + /* Handle quoted arguments */ + if (ch == '"' || ch == '\'') { + if (quoting == ch) /* End a quoted section with the same type */ + quoting = 0; + else if (quoting) { + E_ERROR("Nesting quotations is not supported!\n"); + rv = 1; + break; + } + else + quoting = ch; /* Start a quoted section */ + } + else if (ch == EOF || (!quoting && strchr(separator, ch))) { + /* Reallocate argv so it is big enough to contain all the arguments */ + if (argc >= argv_size) { + char **tmp_argv; + if (!(tmp_argv = + (char **)ckd_realloc(f_argv, argv_size * 2 * sizeof(char *)))) { + rv = 1; + break; + } + f_argv = tmp_argv; + argv_size *= 2; + } + + /* Add the string to the list of arguments */ + f_argv[argc] = ckd_salloc(str); + len = 0; + str[0] = '\0'; + argc++; + + if (quoting) + E_WARN("Unclosed quotation, having EOF close it...\n"); + + /* Skip to the next interesting character */ + for (; ch != EOF && strchr(separator, ch); ch = fgetc(file)) ; + + if (ch == EOF) + break; + + /* We already have the next character */ + continue; + } + else { + if (len >= arg_max_length) { + /* Make room for more chars (including the \0 !) */ + char *tmp_str = str; + if ((tmp_str = (char *)ckd_realloc(str, (1 + arg_max_length * 2) * sizeof(char))) == NULL) { + rv = 1; + break; + } + str = tmp_str; + arg_max_length *= 2; + } + /* Add the char to the argument string */ + str[len++] = ch; + /* Always null terminate */ + str[len] = '\0'; + } + + ch = fgetc(file); + } while (1); + + fclose(file); + + ckd_free(str); + + if (rv) { + for (ch = 0; ch < argc; ++ch) + ckd_free(f_argv[ch]); + ckd_free(f_argv); + return NULL; + } + + return parse_options(inout_cmdln, defn, argc, f_argv, strict); +} + +void +cmd_ln_log_help_r(cmd_ln_t *cmdln, arg_t const* defn) +{ + if (defn == NULL) + return; + E_INFO("Arguments list definition:\n"); + if (cmdln == NULL) { + cmdln = cmd_ln_parse_r(NULL, defn, 0, NULL, FALSE); + arg_log_r(cmdln, defn, TRUE, FALSE); + cmd_ln_free_r(cmdln); + } + else + arg_log_r(cmdln, defn, TRUE, FALSE); +} + +void +cmd_ln_log_values_r(cmd_ln_t *cmdln, arg_t const* defn) +{ + if (defn == NULL) + return; + E_INFO("Current configuration:\n"); + arg_log_r(cmdln, defn, FALSE, FALSE); +} + +int +cmd_ln_exists_r(cmd_ln_t *cmdln, const char *name) +{ + void *val; + if (cmdln == NULL) + return FALSE; + return (hash_table_lookup(cmdln->ht, name, &val) == 0); +} + +cmd_ln_val_t * +cmd_ln_access_r(cmd_ln_t *cmdln, const char *name) +{ + void *val; + if (hash_table_lookup(cmdln->ht, name, &val) < 0) { + E_ERROR("Unknown argument: %s\n", name); + return NULL; + } + return (cmd_ln_val_t *)val; +} + +int +cmd_ln_type_r(cmd_ln_t *cmdln, char const *name) +{ + cmd_ln_val_t *val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return 0; + return val->type; +} + + +char const * +cmd_ln_str_r(cmd_ln_t *cmdln, char const *name) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return NULL; + if (!(val->type & ARG_STRING)) { + E_ERROR("Argument %s does not have string type\n", name); + return NULL; + } + return (char const *)val->val.ptr; +} + +char const ** +cmd_ln_str_list_r(cmd_ln_t *cmdln, char const *name) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return NULL; + if (!(val->type & ARG_STRING_LIST)) { + E_ERROR("Argument %s does not have string list type\n", name); + return NULL; + } + return (char const **)val->val.ptr; +} + +long +cmd_ln_int_r(cmd_ln_t *cmdln, char const *name) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return 0L; + if (!(val->type & (ARG_INTEGER | ARG_BOOLEAN))) { + E_ERROR("Argument %s does not have integer type\n", name); + return 0L; + } + return val->val.i; +} + +double +cmd_ln_float_r(cmd_ln_t *cmdln, char const *name) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) + return 0.0; + if (!(val->type & ARG_FLOATING)) { + E_ERROR("Argument %s does not have floating-point type\n", name); + return 0.0; + } + return val->val.fl; +} + +void +cmd_ln_set_str_r(cmd_ln_t *cmdln, char const *name, char const *str) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) { + E_ERROR("Unknown argument: %s\n", name); + return; + } + if (!(val->type & ARG_STRING)) { + E_ERROR("Argument %s does not have string type\n", name); + return; + } + ckd_free(val->val.ptr); + val->val.ptr = ckd_salloc(str); +} + +void +cmd_ln_set_str_extra_r(cmd_ln_t *cmdln, char const *name, char const *str) +{ + cmd_ln_val_t *val; + if (hash_table_lookup(cmdln->ht, name, (void **)&val) < 0) { + val = cmd_ln_val_init(ARG_STRING, name, str); + hash_table_enter(cmdln->ht, val->name, (void *)val); + } else { + if (!(val->type & ARG_STRING)) { + E_ERROR("Argument %s does not have string type\n", name); + return; + } + ckd_free(val->val.ptr); + val->val.ptr = ckd_salloc(str); + } +} + +void +cmd_ln_set_int_r(cmd_ln_t *cmdln, char const *name, long iv) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) { + E_ERROR("Unknown argument: %s\n", name); + return; + } + if (!(val->type & (ARG_INTEGER | ARG_BOOLEAN))) { + E_ERROR("Argument %s does not have integer type\n", name); + return; + } + val->val.i = iv; +} + +void +cmd_ln_set_float_r(cmd_ln_t *cmdln, char const *name, double fv) +{ + cmd_ln_val_t *val; + val = cmd_ln_access_r(cmdln, name); + if (val == NULL) { + E_ERROR("Unknown argument: %s\n", name); + return; + } + if (!(val->type & ARG_FLOATING)) { + E_ERROR("Argument %s does not have floating-point type\n", name); + return; + } + val->val.fl = fv; +} + +cmd_ln_t * +cmd_ln_retain(cmd_ln_t *cmdln) +{ + ++cmdln->refcount; + return cmdln; +} + +int +cmd_ln_free_r(cmd_ln_t *cmdln) +{ + if (cmdln == NULL) + return 0; + if (--cmdln->refcount > 0) + return cmdln->refcount; + + if (cmdln->ht) { + glist_t entries; + gnode_t *gn; + int32 n; + + entries = hash_table_tolist(cmdln->ht, &n); + for (gn = entries; gn; gn = gnode_next(gn)) { + hash_entry_t *e = (hash_entry_t *)gnode_ptr(gn); + cmd_ln_val_free((cmd_ln_val_t *)e->val); + } + glist_free(entries); + hash_table_free(cmdln->ht); + cmdln->ht = NULL; + } + + if (cmdln->f_argv) { + int32 i; + for (i = 0; i < (int32)cmdln->f_argc; ++i) { + ckd_free(cmdln->f_argv[i]); + } + ckd_free(cmdln->f_argv); + cmdln->f_argv = NULL; + cmdln->f_argc = 0; + } + ckd_free(cmdln); + return 0; +} + +/* vim: set ts=4 sw=4: */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c new file mode 100644 index 0000000..f8801d6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c @@ -0,0 +1,2985 @@ +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/**************************************************************** + * This is dtoa.c by David M. Gay, downloaded from + * http://www.netlib.org/fp/dtoa.c on April 15, 2009 and modified for + * inclusion into the Python core by Mark E. T. Dickinson and Eric V. Smith. + * It was taken from Python distribution then and imported into sphinxbase. + * Python version is preferred due to cleanups, though original + * version at netlib is still maintained. + * + * Please remember to check http://www.netlib.org/fp regularly for bugfixes and updates. + * + * The major modifications from Gay's original code are as follows: + * + * 0. The original code has been specialized to Sphinxbase's needs by removing + * many of the #ifdef'd sections. In particular, code to support VAX and + * IBM floating-point formats, hex NaNs, hex floats, locale-aware + * treatment of the decimal point, and setting of the inexact flag have + * been removed. + * + * 1. We use cdk_calloc and ckd_free in place of malloc and free. + * + * 2. The public functions strtod, dtoa and freedtoa all now have + * a sb_ prefix. + * + * 3. Instead of assuming that malloc always succeeds, we thread + * malloc failures through the code. The functions + * + * Balloc, multadd, s2b, i2b, mult, pow5mult, lshift, diff, d2b + * + * of return type *Bigint all return NULL to indicate a malloc failure. + * Similarly, rv_alloc and nrv_alloc (return type char *) return NULL on + * failure. bigcomp now has return type int (it used to be void) and + * returns -1 on failure and 0 otherwise. sb_dtoa returns NULL + * on failure. sb_strtod indicates failure due to malloc failure + * by returning -1.0, setting errno=ENOMEM and *se to s00. + * + * 4. The static variable dtoa_result has been removed. Callers of + * sb_dtoa are expected to call sb_freedtoa to free the memory allocated + * by sb_dtoa. + * + * 5. The code has been reformatted to better fit with C style. + * + * 6. A bug in the memory allocation has been fixed: to avoid FREEing memory + * that hasn't been MALLOC'ed, private_mem should only be used when k <= + * Kmax. + * + * 7. sb_strtod has been modified so that it doesn't accept strings with + * leading whitespace. + * + * 8. Global static variables are not used due to memory access issues. Fixes + * usage from multiple threads. + * + ***************************************************************/ + +/* Please send bug reports for the original dtoa.c code to David M. Gay (dmg + * at acm dot org, with " at " changed at "@" and " dot " changed to "."). + */ + +/* On a machine with IEEE extended-precision registers, it is + * necessary to specify double-precision (53-bit) rounding precision + * before invoking strtod or dtoa. If the machine uses (the equivalent + * of) Intel 80x87 arithmetic, the call + * _control87(PC_53, MCW_PC); + * does this with many compilers. Whether this or another call is + * appropriate depends on the compiler; for this to work, it may be + * necessary to #include "float.h" or another system-dependent header + * file. + */ + +/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. + * + * This strtod returns a nearest machine number to the input decimal + * string (or sets errno to ERANGE). With IEEE arithmetic, ties are + * broken by the IEEE round-even rule. Otherwise ties are broken by + * biased rounding (add half and chop). + * + * Inspired loosely by William D. Clinger's paper "How to Read Floating + * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. + * + * Modifications: + * + * 1. We only require IEEE, IBM, or VAX double-precision + * arithmetic (not IEEE double-extended). + * 2. We get by with floating-point arithmetic in a case that + * Clinger missed -- when we're computing d * 10^n + * for a small integer d and the integer n is not too + * much larger than 22 (the maximum integer k for which + * we can represent 10^k exactly), we may be able to + * compute (d*10^k) * 10^(e-k) with just one roundoff. + * 3. Rather than a bit-at-a-time adjustment of the binary + * result in the hard case, we use floating-point + * arithmetic to determine the adjustment to within + * one bit; only in really hard cases do we need to + * compute a second residual. + * 4. Because of 3., we don't need a large table of powers of 10 + * for ten-to-e (just some small tables, e.g. of 10^k + * for 0 <= k <= 22). + */ + +/* Linking of sphinxbase's #defines to Gay's #defines starts here. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include +#include + +#ifdef WORDS_BIGENDIAN +#define IEEE_MC68k +#else +#define IEEE_8087 +#endif + +#define Long int32 /* ZOMG */ +#define ULong uint32 /* WTF */ +#ifdef HAVE_LONG_LONG +#define ULLong uint64 +#endif + +#define MALLOC ckd_malloc +#define FREE ckd_free + +#define DBL_DIG 15 +#define DBL_MAX_10_EXP 308 +#define DBL_MAX_EXP 1024 +#define FLT_RADIX 2 + +/* maximum permitted exponent value for strtod; exponents larger than + MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP. MAX_ABS_EXP + should fit into an int. */ +#ifndef MAX_ABS_EXP +#define MAX_ABS_EXP 1100000000U +#endif +/* Bound on length of pieces of input strings in sb_strtod; specifically, + this is used to bound the total number of digits ignoring leading zeros and + the number of digits that follow the decimal point. Ideally, MAX_DIGITS + should satisfy MAX_DIGITS + 400 < MAX_ABS_EXP; that ensures that the + exponent clipping in sb_strtod can't affect the value of the output. */ +#ifndef MAX_DIGITS +#define MAX_DIGITS 1000000000U +#endif + +/* End sphinxbase #define linking */ + +#ifdef DEBUG +#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef union { double d; ULong L[2]; } U; + +#ifdef IEEE_8087 +#define word0(x) (x)->L[1] +#define word1(x) (x)->L[0] +#else +#define word0(x) (x)->L[0] +#define word1(x) (x)->L[1] +#endif +#define dval(x) (x)->d + +#ifndef STRTOD_DIGLIM +#define STRTOD_DIGLIM 40 +#endif + +/* maximum permitted exponent value for strtod; exponents larger than + MAX_ABS_EXP in absolute value get truncated to +-MAX_ABS_EXP. MAX_ABS_EXP + should fit into an int. */ +#ifndef MAX_ABS_EXP +#define MAX_ABS_EXP 1100000000U +#endif +/* Bound on length of pieces of input strings in sb_strtod; specifically, + this is used to bound the total number of digits ignoring leading zeros and + the number of digits that follow the decimal point. Ideally, MAX_DIGITS + should satisfy MAX_DIGITS + 400 < MAX_ABS_EXP; that ensures that the + exponent clipping in sb_strtod can't affect the value of the output. */ +#ifndef MAX_DIGITS +#define MAX_DIGITS 1000000000U +#endif + +/* Guard against trying to use the above values on unusual platforms with ints + * of width less than 32 bits. */ +#if MAX_ABS_EXP > 0x7fffffff +#error "MAX_ABS_EXP should fit in an int" +#endif +#if MAX_DIGITS > 0x7fffffff +#error "MAX_DIGITS should fit in an int" +#endif + +/* The following definition of Storeinc is appropriate for MIPS processors. + * An alternative that might be better on some machines is + * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) + */ +#if defined(IEEE_8087) +#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ + ((unsigned short *)a)[0] = (unsigned short)c, a++) +#else +#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ + ((unsigned short *)a)[1] = (unsigned short)c, a++) +#endif + +/* #define P DBL_MANT_DIG */ +/* Ten_pmax = floor(P*log(2)/log(5)) */ +/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ +/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ +/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ + +#define Exp_shift 20 +#define Exp_shift1 20 +#define Exp_msk1 0x100000 +#define Exp_msk11 0x100000 +#define Exp_mask 0x7ff00000 +#define P 53 +#define Nbits 53 +#define Bias 1023 +#define Emax 1023 +#define Emin (-1022) +#define Etiny (-1074) /* smallest denormal is 2**Etiny */ +#define Exp_1 0x3ff00000 +#define Exp_11 0x3ff00000 +#define Ebits 11 +#define Frac_mask 0xfffff +#define Frac_mask1 0xfffff +#define Ten_pmax 22 +#define Bletch 0x10 +#define Bndry_mask 0xfffff +#define Bndry_mask1 0xfffff +#define Sign_bit 0x80000000 +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 14 +#define Int_max 14 + +#ifndef Flt_Rounds +#ifdef FLT_ROUNDS +#define Flt_Rounds FLT_ROUNDS +#else +#define Flt_Rounds 1 +#endif +#endif /*Flt_Rounds*/ + +#define Rounding Flt_Rounds + +#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) +#define Big1 0xffffffff + +/* Standard NaN used by sb_stdnan. */ + +#define NAN_WORD0 0x7ff80000 +#define NAN_WORD1 0 + +/* Bits of the representation of positive infinity. */ + +#define POSINF_WORD0 0x7ff00000 +#define POSINF_WORD1 0 + +/* struct BCinfo is used to pass information from sb_strtod to bigcomp */ + +typedef struct BCinfo BCinfo; +struct +BCinfo { + int e0, nd, nd0, scale; +}; + +#define FFFFFFFF 0xffffffffUL + +#define Kmax 7 + +/* struct Bigint is used to represent arbitrary-precision integers. These + integers are stored in sign-magnitude format, with the magnitude stored as + an array of base 2**32 digits. Bigints are always normalized: if x is a + Bigint then x->wds >= 1, and either x->wds == 1 or x[wds-1] is nonzero. + + The Bigint fields are as follows: + + - next is a header used by Balloc and Bfree to keep track of lists + of freed Bigints; it's also used for the linked list of + powers of 5 of the form 5**2**i used by pow5mult. + - k indicates which pool this Bigint was allocated from + - maxwds is the maximum number of words space was allocated for + (usually maxwds == 2**k) + - sign is 1 for negative Bigints, 0 for positive. The sign is unused + (ignored on inputs, set to 0 on outputs) in almost all operations + involving Bigints: a notable exception is the diff function, which + ignores signs on inputs but sets the sign of the output correctly. + - wds is the actual number of significant words + - x contains the vector of words (digits) for this Bigint, from least + significant (x[0]) to most significant (x[wds-1]). +*/ + +struct +Bigint { + struct Bigint *next; + int k, maxwds, sign, wds; + ULong x[1]; +}; + +typedef struct Bigint Bigint; + +#define SPHINXBASE_USING_MEMORY_DEBUGGER 1 + +#ifndef SPHINXBASE_USING_MEMORY_DEBUGGER + +#ifndef PRIVATE_MEM +#define PRIVATE_MEM 2304 +#endif +#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) +static double private_mem[PRIVATE_mem], *pmem_next = private_mem; + +/* Memory management: memory is allocated from, and returned to, Kmax+1 pools + of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds == + 1 << k. These pools are maintained as linked lists, with freelist[k] + pointing to the head of the list for pool k. + + On allocation, if there's no free slot in the appropriate pool, MALLOC is + called to get more memory. This memory is not returned to the system until + Python quits. There's also a private memory pool that's allocated from + in preference to using MALLOC. + + For Bigints with more than (1 << Kmax) digits (which implies at least 1233 + decimal digits), memory is directly allocated using MALLOC, and freed using + FREE. + + XXX: it would be easy to bypass this memory-management system and + translate each call to Balloc into a call to PyMem_Malloc, and each + Bfree to PyMem_Free. Investigate whether this has any significant + performance on impact. */ + +static Bigint *freelist[Kmax+1]; + +/* Allocate space for a Bigint with up to 1<next; + else { + x = 1 << k; + len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) + /sizeof(double); + if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { + rv = (Bigint*)pmem_next; + pmem_next += len; + } + else { + rv = (Bigint*)MALLOC(len*sizeof(double)); + if (rv == NULL) + return NULL; + } + rv->k = k; + rv->maxwds = x; + } + rv->sign = rv->wds = 0; + return rv; +} + +/* Free a Bigint allocated with Balloc */ + +static void +Bfree(Bigint *v) +{ + if (v) { + if (v->k > Kmax) + FREE((void*)v); + else { + v->next = freelist[v->k]; + freelist[v->k] = v; + } + } +} + +#else + +/* Alternative versions of Balloc and Bfree that use PyMem_Malloc and + PyMem_Free directly in place of the custom memory allocation scheme above. + These are provided for the benefit of memory debugging tools like + Valgrind. */ + +/* Allocate space for a Bigint with up to 1<k = k; + rv->maxwds = x; + rv->sign = rv->wds = 0; + return rv; +} + +/* Free a Bigint allocated with Balloc */ + +static void +Bfree(Bigint *v) +{ + if (v) { + FREE((void*)v); + } +} + +#endif /* SPHINXBASE_USING_MEMORY_DEBUGGER */ + +#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ + y->wds*sizeof(Long) + 2*sizeof(int)) + +/* Multiply a Bigint b by m and add a. Either modifies b in place and returns + a pointer to the modified b, or Bfrees b and returns a pointer to a copy. + On failure, return NULL. In this case, b will have been already freed. */ + +static Bigint * +multadd(Bigint *b, int m, int a) /* multiply by m and add a */ +{ + int i, wds; +#ifdef ULLong + ULong *x; + ULLong carry, y; +#else + ULong carry, *x, y; + ULong xi, z; +#endif + Bigint *b1; + + wds = b->wds; + x = b->x; + i = 0; + carry = a; + do { +#ifdef ULLong + y = *x * (ULLong)m + carry; + carry = y >> 32; + *x++ = (ULong)(y & FFFFFFFF); +#else + xi = *x; + y = (xi & 0xffff) * m + carry; + z = (xi >> 16) * m + (y >> 16); + carry = z >> 16; + *x++ = (z << 16) + (y & 0xffff); +#endif + } + while(++i < wds); + if (carry) { + if (wds >= b->maxwds) { + b1 = Balloc(b->k+1); + if (b1 == NULL){ + Bfree(b); + return NULL; + } + Bcopy(b1, b); + Bfree(b); + b = b1; + } + b->x[wds++] = (ULong)carry; + b->wds = wds; + } + return b; +} + +/* convert a string s containing nd decimal digits (possibly containing a + decimal separator at position nd0, which is ignored) to a Bigint. This + function carries on where the parsing code in sb_strtod leaves off: on + entry, y9 contains the result of converting the first 9 digits. Returns + NULL on failure. */ + +static Bigint * +s2b(const char *s, int nd0, int nd, ULong y9) +{ + Bigint *b; + int i, k; + Long x, y; + + x = (nd + 8) / 9; + for(k = 0, y = 1; x > y; y <<= 1, k++) ; + b = Balloc(k); + if (b == NULL) + return NULL; + b->x[0] = y9; + b->wds = 1; + + if (nd <= 9) + return b; + + s += 9; + for (i = 9; i < nd0; i++) { + b = multadd(b, 10, *s++ - '0'); + if (b == NULL) + return NULL; + } + s++; + for(; i < nd; i++) { + b = multadd(b, 10, *s++ - '0'); + if (b == NULL) + return NULL; + } + return b; +} + +/* count leading 0 bits in the 32-bit integer x. */ + +static int +hi0bits(ULong x) +{ + int k = 0; + + if (!(x & 0xffff0000)) { + k = 16; + x <<= 16; + } + if (!(x & 0xff000000)) { + k += 8; + x <<= 8; + } + if (!(x & 0xf0000000)) { + k += 4; + x <<= 4; + } + if (!(x & 0xc0000000)) { + k += 2; + x <<= 2; + } + if (!(x & 0x80000000)) { + k++; + if (!(x & 0x40000000)) + return 32; + } + return k; +} + +/* count trailing 0 bits in the 32-bit integer y, and shift y right by that + number of bits. */ + +static int +lo0bits(ULong *y) +{ + int k; + ULong x = *y; + + if (x & 7) { + if (x & 1) + return 0; + if (x & 2) { + *y = x >> 1; + return 1; + } + *y = x >> 2; + return 2; + } + k = 0; + if (!(x & 0xffff)) { + k = 16; + x >>= 16; + } + if (!(x & 0xff)) { + k += 8; + x >>= 8; + } + if (!(x & 0xf)) { + k += 4; + x >>= 4; + } + if (!(x & 0x3)) { + k += 2; + x >>= 2; + } + if (!(x & 1)) { + k++; + x >>= 1; + if (!x) + return 32; + } + *y = x; + return k; +} + +/* convert a small nonnegative integer to a Bigint */ + +static Bigint * +i2b(int i) +{ + Bigint *b; + + b = Balloc(1); + if (b == NULL) + return NULL; + b->x[0] = i; + b->wds = 1; + return b; +} + +/* multiply two Bigints. Returns a new Bigint, or NULL on failure. Ignores + the signs of a and b. */ + +static Bigint * +mult(Bigint *a, Bigint *b) +{ + Bigint *c; + int k, wa, wb, wc; + ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; + ULong y; +#ifdef ULLong + ULLong carry, z; +#else + ULong carry, z; + ULong z2; +#endif + + if ((!a->x[0] && a->wds == 1) || (!b->x[0] && b->wds == 1)) { + c = Balloc(0); + if (c == NULL) + return NULL; + c->wds = 1; + c->x[0] = 0; + return c; + } + + if (a->wds < b->wds) { + c = a; + a = b; + b = c; + } + k = a->k; + wa = a->wds; + wb = b->wds; + wc = wa + wb; + if (wc > a->maxwds) + k++; + c = Balloc(k); + if (c == NULL) + return NULL; + for(x = c->x, xa = x + wc; x < xa; x++) + *x = 0; + xa = a->x; + xae = xa + wa; + xb = b->x; + xbe = xb + wb; + xc0 = c->x; +#ifdef ULLong + for(; xb < xbe; xc0++) { + if ((y = *xb++)) { + x = xa; + xc = xc0; + carry = 0; + do { + z = *x++ * (ULLong)y + *xc + carry; + carry = z >> 32; + *xc++ = (ULong)(z & FFFFFFFF); + } + while(x < xae); + *xc = (ULong)carry; + } + } +#else + for(; xb < xbe; xb++, xc0++) { + if (y = *xb & 0xffff) { + x = xa; + xc = xc0; + carry = 0; + do { + z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; + carry = z >> 16; + z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; + carry = z2 >> 16; + Storeinc(xc, z2, z); + } + while(x < xae); + *xc = carry; + } + if (y = *xb >> 16) { + x = xa; + xc = xc0; + carry = 0; + z2 = *xc; + do { + z = (*x & 0xffff) * y + (*xc >> 16) + carry; + carry = z >> 16; + Storeinc(xc, z, z2); + z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; + carry = z2 >> 16; + } + while(x < xae); + *xc = z2; + } + } +#endif + for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; + c->wds = wc; + return c; +} + +#ifndef SPHINXBASE_USING_MEMORY_DEBUGGER + +/* p5s is a linked list of powers of 5 of the form 5**(2**i), i >= 2 */ + +static Bigint *p5s; + +/* multiply the Bigint b by 5**k. Returns a pointer to the result, or NULL on + failure; if the returned pointer is distinct from b then the original + Bigint b will have been Bfree'd. Ignores the sign of b. */ + +static Bigint * +pow5mult(Bigint *b, int k) +{ + Bigint *b1, *p5, *p51; + int i; + static int p05[3] = { 5, 25, 125 }; + + if ((i = k & 3)) { + b = multadd(b, p05[i-1], 0); + if (b == NULL) + return NULL; + } + + if (!(k >>= 2)) + return b; + p5 = p5s; + if (!p5) { + /* first time */ + p5 = i2b(625); + if (p5 == NULL) { + Bfree(b); + return NULL; + } + p5s = p5; + p5->next = 0; + } + for(;;) { + if (k & 1) { + b1 = mult(b, p5); + Bfree(b); + b = b1; + if (b == NULL) + return NULL; + } + if (!(k >>= 1)) + break; + p51 = p5->next; + if (!p51) { + p51 = mult(p5,p5); + if (p51 == NULL) { + Bfree(b); + return NULL; + } + p51->next = 0; + p5->next = p51; + } + p5 = p51; + } + return b; +} + +#else + +/* Version of pow5mult that doesn't cache powers of 5. Provided for + the benefit of memory debugging tools like Valgrind. */ + +static Bigint * +pow5mult(Bigint *b, int k) +{ + Bigint *b1, *p5, *p51; + int i; + static int p05[3] = { 5, 25, 125 }; + + if ((i = k & 3)) { + b = multadd(b, p05[i-1], 0); + if (b == NULL) + return NULL; + } + + if (!(k >>= 2)) + return b; + p5 = i2b(625); + if (p5 == NULL) { + Bfree(b); + return NULL; + } + + for(;;) { + if (k & 1) { + b1 = mult(b, p5); + Bfree(b); + b = b1; + if (b == NULL) { + Bfree(p5); + return NULL; + } + } + if (!(k >>= 1)) + break; + p51 = mult(p5, p5); + Bfree(p5); + p5 = p51; + if (p5 == NULL) { + Bfree(b); + return NULL; + } + } + Bfree(p5); + return b; +} + +#endif /* SPHINXBASE_USING_MEMORY_DEBUGGER */ + +/* shift a Bigint b left by k bits. Return a pointer to the shifted result, + or NULL on failure. If the returned pointer is distinct from b then the + original b will have been Bfree'd. Ignores the sign of b. */ + +static Bigint * +lshift(Bigint *b, int k) +{ + int i, k1, n, n1; + Bigint *b1; + ULong *x, *x1, *xe, z; + + if (!k || (!b->x[0] && b->wds == 1)) + return b; + + n = k >> 5; + k1 = b->k; + n1 = n + b->wds + 1; + for(i = b->maxwds; n1 > i; i <<= 1) + k1++; + b1 = Balloc(k1); + if (b1 == NULL) { + Bfree(b); + return NULL; + } + x1 = b1->x; + for(i = 0; i < n; i++) + *x1++ = 0; + x = b->x; + xe = x + b->wds; + if (k &= 0x1f) { + k1 = 32 - k; + z = 0; + do { + *x1++ = *x << k | z; + z = *x++ >> k1; + } + while(x < xe); + if ((*x1 = z)) + ++n1; + } + else do + *x1++ = *x++; + while(x < xe); + b1->wds = n1 - 1; + Bfree(b); + return b1; +} + +/* Do a three-way compare of a and b, returning -1 if a < b, 0 if a == b and + 1 if a > b. Ignores signs of a and b. */ + +static int +cmp(Bigint *a, Bigint *b) +{ + ULong *xa, *xa0, *xb, *xb0; + int i, j; + + i = a->wds; + j = b->wds; +#ifdef DEBUG + if (i > 1 && !a->x[i-1]) + Bug("cmp called with a->x[a->wds-1] == 0"); + if (j > 1 && !b->x[j-1]) + Bug("cmp called with b->x[b->wds-1] == 0"); +#endif + if (i -= j) + return i; + xa0 = a->x; + xa = xa0 + j; + xb0 = b->x; + xb = xb0 + j; + for(;;) { + if (*--xa != *--xb) + return *xa < *xb ? -1 : 1; + if (xa <= xa0) + break; + } + return 0; +} + +/* Take the difference of Bigints a and b, returning a new Bigint. Returns + NULL on failure. The signs of a and b are ignored, but the sign of the + result is set appropriately. */ + +static Bigint * +diff(Bigint *a, Bigint *b) +{ + Bigint *c; + int i, wa, wb; + ULong *xa, *xae, *xb, *xbe, *xc; +#ifdef ULLong + ULLong borrow, y; +#else + ULong borrow, y; + ULong z; +#endif + + i = cmp(a,b); + if (!i) { + c = Balloc(0); + if (c == NULL) + return NULL; + c->wds = 1; + c->x[0] = 0; + return c; + } + if (i < 0) { + c = a; + a = b; + b = c; + i = 1; + } + else + i = 0; + c = Balloc(a->k); + if (c == NULL) + return NULL; + c->sign = i; + wa = a->wds; + xa = a->x; + xae = xa + wa; + wb = b->wds; + xb = b->x; + xbe = xb + wb; + xc = c->x; + borrow = 0; +#ifdef ULLong + do { + y = (ULLong)*xa++ - *xb++ - borrow; + borrow = y >> 32 & (ULong)1; + *xc++ = (ULong)(y & FFFFFFFF); + } + while(xb < xbe); + while(xa < xae) { + y = *xa++ - borrow; + borrow = y >> 32 & (ULong)1; + *xc++ = (ULong)(y & FFFFFFFF); + } +#else + do { + y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } + while(xb < xbe); + while(xa < xae) { + y = (*xa & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } +#endif + while(!*--xc) + wa--; + c->wds = wa; + return c; +} + +/* Given a positive normal double x, return the difference between x and the + next double up. Doesn't give correct results for subnormals. */ + +static double +ulp(U *x) +{ + Long L; + U u; + + L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; + word0(&u) = L; + word1(&u) = 0; + return dval(&u); +} + +/* Convert a Bigint to a double plus an exponent */ + +static double +b2d(Bigint *a, int *e) +{ + ULong *xa, *xa0, w, y, z; + int k; + U d; + + xa0 = a->x; + xa = xa0 + a->wds; + y = *--xa; +#ifdef DEBUG + if (!y) Bug("zero y in b2d"); +#endif + k = hi0bits(y); + *e = 32 - k; + if (k < Ebits) { + word0(&d) = Exp_1 | y >> (Ebits - k); + w = xa > xa0 ? *--xa : 0; + word1(&d) = y << ((32-Ebits) + k) | w >> (Ebits - k); + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + if (k -= Ebits) { + word0(&d) = Exp_1 | y << k | z >> (32 - k); + y = xa > xa0 ? *--xa : 0; + word1(&d) = z << k | y >> (32 - k); + } + else { + word0(&d) = Exp_1 | y; + word1(&d) = z; + } + ret_d: + return dval(&d); +} + +/* Convert a scaled double to a Bigint plus an exponent. Similar to d2b, + except that it accepts the scale parameter used in sb_strtod (which + should be either 0 or 2*P), and the normalization for the return value is + different (see below). On input, d should be finite and nonnegative, and d + / 2**scale should be exactly representable as an IEEE 754 double. + + Returns a Bigint b and an integer e such that + + dval(d) / 2**scale = b * 2**e. + + Unlike d2b, b is not necessarily odd: b and e are normalized so + that either 2**(P-1) <= b < 2**P and e >= Etiny, or b < 2**P + and e == Etiny. This applies equally to an input of 0.0: in that + case the return values are b = 0 and e = Etiny. + + The above normalization ensures that for all possible inputs d, + 2**e gives ulp(d/2**scale). + + Returns NULL on failure. +*/ + +static Bigint * +sd2b(U *d, int scale, int *e) +{ + Bigint *b; + + b = Balloc(1); + if (b == NULL) + return NULL; + + /* First construct b and e assuming that scale == 0. */ + b->wds = 2; + b->x[0] = word1(d); + b->x[1] = word0(d) & Frac_mask; + *e = Etiny - 1 + (int)((word0(d) & Exp_mask) >> Exp_shift); + if (*e < Etiny) + *e = Etiny; + else + b->x[1] |= Exp_msk1; + + /* Now adjust for scale, provided that b != 0. */ + if (scale && (b->x[0] || b->x[1])) { + *e -= scale; + if (*e < Etiny) { + scale = Etiny - *e; + *e = Etiny; + /* We can't shift more than P-1 bits without shifting out a 1. */ + assert(0 < scale && scale <= P - 1); + if (scale >= 32) { + /* The bits shifted out should all be zero. */ + assert(b->x[0] == 0); + b->x[0] = b->x[1]; + b->x[1] = 0; + scale -= 32; + } + if (scale) { + /* The bits shifted out should all be zero. */ + assert(b->x[0] << (32 - scale) == 0); + b->x[0] = (b->x[0] >> scale) | (b->x[1] << (32 - scale)); + b->x[1] >>= scale; + } + } + } + /* Ensure b is normalized. */ + if (!b->x[1]) + b->wds = 1; + + return b; +} + +/* Convert a double to a Bigint plus an exponent. Return NULL on failure. + + Given a finite nonzero double d, return an odd Bigint b and exponent *e + such that fabs(d) = b * 2**e. On return, *bbits gives the number of + significant bits of b; that is, 2**(*bbits-1) <= b < 2**(*bbits). + + If d is zero, then b == 0, *e == -1010, *bbits = 0. + */ + +static Bigint * +d2b(U *d, int *e, int *bits) +{ + Bigint *b; + int de, k; + ULong *x, y, z; + int i; + + b = Balloc(1); + if (b == NULL) + return NULL; + x = b->x; + + z = word0(d) & Frac_mask; + word0(d) &= 0x7fffffff; /* clear sign bit, which we ignore */ + if ((de = (int)(word0(d) >> Exp_shift))) + z |= Exp_msk1; + if ((y = word1(d))) { + if ((k = lo0bits(&y))) { + x[0] = y | z << (32 - k); + z >>= k; + } + else + x[0] = y; + i = + b->wds = (x[1] = z) ? 2 : 1; + } + else { + k = lo0bits(&z); + x[0] = z; + i = + b->wds = 1; + k += 32; + } + if (de) { + *e = de - Bias - (P-1) + k; + *bits = P - k; + } + else { + *e = de - Bias - (P-1) + 1 + k; + *bits = 32*i - hi0bits(x[i-1]); + } + return b; +} + +/* Compute the ratio of two Bigints, as a double. The result may have an + error of up to 2.5 ulps. */ + +static double +ratio(Bigint *a, Bigint *b) +{ + U da, db; + int k, ka, kb; + + dval(&da) = b2d(a, &ka); + dval(&db) = b2d(b, &kb); + k = ka - kb + 32*(a->wds - b->wds); + if (k > 0) + word0(&da) += k*Exp_msk1; + else { + k = -k; + word0(&db) += k*Exp_msk1; + } + return dval(&da) / dval(&db); +} + +static const double +tens[] = { + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22 +}; + +static const double +bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; +static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, + 9007199254740992.*9007199254740992.e-256 + /* = 2^106 * 1e-256 */ +}; +/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ +/* flag unnecessarily. It leads to a song and dance at the end of strtod. */ +#define Scale_Bit 0x10 +#define n_bigtens 5 + +#define ULbits 32 +#define kshift 5 +#define kmask 31 + + +static int +dshift(Bigint *b, int p2) +{ + int rv = hi0bits(b->x[b->wds-1]) - 4; + if (p2 > 0) + rv -= p2; + return rv & kmask; +} + +/* special case of Bigint division. The quotient is always in the range 0 <= + quotient < 10, and on entry the divisor S is normalized so that its top 4 + bits (28--31) are zero and bit 27 is set. */ + +static int +quorem(Bigint *b, Bigint *S) +{ + int n; + ULong *bx, *bxe, q, *sx, *sxe; +#ifdef ULLong + ULLong borrow, carry, y, ys; +#else + ULong borrow, carry, y, ys; + ULong si, z, zs; +#endif + + n = S->wds; +#ifdef DEBUG + /*debug*/ if (b->wds > n) + /*debug*/ Bug("oversize b in quorem"); +#endif + if (b->wds < n) + return 0; + sx = S->x; + sxe = sx + --n; + bx = b->x; + bxe = bx + n; + q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ +#ifdef DEBUG + /*debug*/ if (q > 9) + /*debug*/ Bug("oversized quotient in quorem"); +#endif + if (q) { + borrow = 0; + carry = 0; + do { +#ifdef ULLong + ys = *sx++ * (ULLong)q + carry; + carry = ys >> 32; + y = *bx - (ys & FFFFFFFF) - borrow; + borrow = y >> 32 & (ULong)1; + *bx++ = (ULong)(y & FFFFFFFF); +#else + si = *sx++; + ys = (si & 0xffff) * q + carry; + zs = (si >> 16) * q + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#endif + } + while(sx <= sxe); + if (!*bxe) { + bx = b->x; + while(--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + if (cmp(b, S) >= 0) { + q++; + borrow = 0; + carry = 0; + bx = b->x; + sx = S->x; + do { +#ifdef ULLong + ys = *sx++ + carry; + carry = ys >> 32; + y = *bx - (ys & FFFFFFFF) - borrow; + borrow = y >> 32 & (ULong)1; + *bx++ = (ULong)(y & FFFFFFFF); +#else + si = *sx++; + ys = (si & 0xffff) + carry; + zs = (si >> 16) + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#endif + } + while(sx <= sxe); + bx = b->x; + bxe = bx + n; + if (!*bxe) { + while(--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + return q; +} + +/* sulp(x) is a version of ulp(x) that takes bc.scale into account. + + Assuming that x is finite and nonnegative (positive zero is fine + here) and x / 2^bc.scale is exactly representable as a double, + sulp(x) is equivalent to 2^bc.scale * ulp(x / 2^bc.scale). */ + +static double +sulp(U *x, BCinfo *bc) +{ + U u; + + if (bc->scale && 2*P + 1 > (int)((word0(x) & Exp_mask) >> Exp_shift)) { + /* rv/2^bc->scale is subnormal */ + word0(&u) = (P+2)*Exp_msk1; + word1(&u) = 0; + return u.d; + } + else { + assert(word0(x) || word1(x)); /* x != 0.0 */ + return ulp(x); + } +} + +/* The bigcomp function handles some hard cases for strtod, for inputs + with more than STRTOD_DIGLIM digits. It's called once an initial + estimate for the double corresponding to the input string has + already been obtained by the code in sb_strtod. + + The bigcomp function is only called after sb_strtod has found a + double value rv such that either rv or rv + 1ulp represents the + correctly rounded value corresponding to the original string. It + determines which of these two values is the correct one by + computing the decimal digits of rv + 0.5ulp and comparing them with + the corresponding digits of s0. + + In the following, write dv for the absolute value of the number represented + by the input string. + + Inputs: + + s0 points to the first significant digit of the input string. + + rv is a (possibly scaled) estimate for the closest double value to the + value represented by the original input to sb_strtod. If + bc->scale is nonzero, then rv/2^(bc->scale) is the approximation to + the input value. + + bc is a struct containing information gathered during the parsing and + estimation steps of sb_strtod. Description of fields follows: + + bc->e0 gives the exponent of the input value, such that dv = (integer + given by the bd->nd digits of s0) * 10**e0 + + bc->nd gives the total number of significant digits of s0. It will + be at least 1. + + bc->nd0 gives the number of significant digits of s0 before the + decimal separator. If there's no decimal separator, bc->nd0 == + bc->nd. + + bc->scale is the value used to scale rv to avoid doing arithmetic with + subnormal values. It's either 0 or 2*P (=106). + + Outputs: + + On successful exit, rv/2^(bc->scale) is the closest double to dv. + + Returns 0 on success, -1 on failure (e.g., due to a failed malloc call). */ + +static int +bigcomp(U *rv, const char *s0, BCinfo *bc) +{ + Bigint *b, *d; + int b2, d2, dd, i, nd, nd0, odd, p2, p5; + + nd = bc->nd; + nd0 = bc->nd0; + p5 = nd + bc->e0; + b = sd2b(rv, bc->scale, &p2); + if (b == NULL) + return -1; + + /* record whether the lsb of rv/2^(bc->scale) is odd: in the exact halfway + case, this is used for round to even. */ + odd = b->x[0] & 1; + + /* left shift b by 1 bit and or a 1 into the least significant bit; + this gives us b * 2**p2 = rv/2^(bc->scale) + 0.5 ulp. */ + b = lshift(b, 1); + if (b == NULL) + return -1; + b->x[0] |= 1; + p2--; + + p2 -= p5; + d = i2b(1); + if (d == NULL) { + Bfree(b); + return -1; + } + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + */ + if (p5 > 0) { + d = pow5mult(d, p5); + if (d == NULL) { + Bfree(b); + return -1; + } + } + else if (p5 < 0) { + b = pow5mult(b, -p5); + if (b == NULL) { + Bfree(d); + return -1; + } + } + if (p2 > 0) { + b2 = p2; + d2 = 0; + } + else { + b2 = 0; + d2 = -p2; + } + i = dshift(d, d2); + if ((b2 += i) > 0) { + b = lshift(b, b2); + if (b == NULL) { + Bfree(d); + return -1; + } + } + if ((d2 += i) > 0) { + d = lshift(d, d2); + if (d == NULL) { + Bfree(b); + return -1; + } + } + + /* Compare s0 with b/d: set dd to -1, 0, or 1 according as s0 < b/d, s0 == + * b/d, or s0 > b/d. Here the digits of s0 are thought of as representing + * a number in the range [0.1, 1). */ + if (cmp(b, d) >= 0) + /* b/d >= 1 */ + dd = -1; + else { + i = 0; + for(;;) { + b = multadd(b, 10, 0); + if (b == NULL) { + Bfree(d); + return -1; + } + dd = s0[i < nd0 ? i : i+1] - '0' - quorem(b, d); + i++; + + if (dd) + break; + if (!b->x[0] && b->wds == 1) { + /* b/d == 0 */ + dd = i < nd; + break; + } + if (!(i < nd)) { + /* b/d != 0, but digits of s0 exhausted */ + dd = -1; + break; + } + } + } + Bfree(b); + Bfree(d); + if (dd > 0 || (dd == 0 && odd)) + dval(rv) += sulp(rv, bc); + return 0; +} + +/* Return a 'standard' NaN value. + + There are exactly two quiet NaNs that don't arise by 'quieting' signaling + NaNs (see IEEE 754-2008, section 6.2.1). If sign == 0, return the one whose + sign bit is cleared. Otherwise, return the one whose sign bit is set. +*/ + +double +sb_stdnan(int sign) +{ + U rv; + word0(&rv) = NAN_WORD0; + word1(&rv) = NAN_WORD1; + if (sign) + word0(&rv) |= Sign_bit; + return dval(&rv); +} + +/* Return positive or negative infinity, according to the given sign (0 for + * positive infinity, 1 for negative infinity). */ + +double +sb_infinity(int sign) +{ + U rv; + word0(&rv) = POSINF_WORD0; + word1(&rv) = POSINF_WORD1; + return sign ? -dval(&rv) : dval(&rv); +} + +double +sb_strtod(const char *s00, char **se) +{ + int bb2, bb5, bbe, bd2, bd5, bs2, c, dsign, e, e1, error; + int esign, i, j, k, lz, nd, nd0, odd, sign; + const char *s, *s0, *s1; + double aadj, aadj1; + U aadj2, adj, rv, rv0; + ULong y, z, abs_exp; + Long L; + BCinfo bc; + Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; + size_t ndigits, fraclen; + + dval(&rv) = 0.; + + /* Start parsing. */ + c = *(s = s00); + + /* Parse optional sign, if present. */ + sign = 0; + switch (c) { + case '-': + sign = 1; + /* FALLTHRU */ + case '+': + c = *++s; + } + + /* Skip leading zeros: lz is true iff there were leading zeros. */ + s1 = s; + while (c == '0') + c = *++s; + lz = s != s1; + + /* Point s0 at the first nonzero digit (if any). fraclen will be the + number of digits between the decimal point and the end of the + digit string. ndigits will be the total number of digits ignoring + leading zeros. */ + s0 = s1 = s; + while ('0' <= c && c <= '9') + c = *++s; + ndigits = s - s1; + fraclen = 0; + + /* Parse decimal point and following digits. */ + if (c == '.') { + c = *++s; + if (!ndigits) { + s1 = s; + while (c == '0') + c = *++s; + lz = lz || s != s1; + fraclen += (s - s1); + s0 = s; + } + s1 = s; + while ('0' <= c && c <= '9') + c = *++s; + ndigits += s - s1; + fraclen += s - s1; + } + + /* Now lz is true if and only if there were leading zero digits, and + ndigits gives the total number of digits ignoring leading zeros. A + valid input must have at least one digit. */ + if (!ndigits && !lz) { + if (se) + *se = (char *)s00; + goto parse_error; + } + + /* Range check ndigits and fraclen to make sure that they, and values + computed with them, can safely fit in an int. */ + if (ndigits > MAX_DIGITS || fraclen > MAX_DIGITS) { + if (se) + *se = (char *)s00; + goto parse_error; + } + nd = (int)ndigits; + nd0 = (int)ndigits - (int)fraclen; + + /* Parse exponent. */ + e = 0; + if (c == 'e' || c == 'E') { + s00 = s; + c = *++s; + + /* Exponent sign. */ + esign = 0; + switch (c) { + case '-': + esign = 1; + /* FALLTHRU */ + case '+': + c = *++s; + } + + /* Skip zeros. lz is true iff there are leading zeros. */ + s1 = s; + while (c == '0') + c = *++s; + lz = s != s1; + + /* Get absolute value of the exponent. */ + s1 = s; + abs_exp = 0; + while ('0' <= c && c <= '9') { + abs_exp = 10*abs_exp + (c - '0'); + c = *++s; + } + + /* abs_exp will be correct modulo 2**32. But 10**9 < 2**32, so if + there are at most 9 significant exponent digits then overflow is + impossible. */ + if (s - s1 > 9 || abs_exp > MAX_ABS_EXP) + e = (int)MAX_ABS_EXP; + else + e = (int)abs_exp; + if (esign) + e = -e; + + /* A valid exponent must have at least one digit. */ + if (s == s1 && !lz) + s = s00; + } + + /* Adjust exponent to take into account position of the point. */ + e -= nd - nd0; + if (nd0 <= 0) + nd0 = nd; + + /* Finished parsing. Set se to indicate how far we parsed */ + if (se) + *se = (char *)s; + + /* If all digits were zero, exit with return value +-0.0. Otherwise, + strip trailing zeros: scan back until we hit a nonzero digit. */ + if (!nd) + goto ret; + for (i = nd; i > 0; ) { + --i; + if (s0[i < nd0 ? i : i+1] != '0') { + ++i; + break; + } + } + e += nd - i; + nd = i; + if (nd0 > nd) + nd0 = nd; + + /* Summary of parsing results. After parsing, and dealing with zero + * inputs, we have values s0, nd0, nd, e, sign, where: + * + * - s0 points to the first significant digit of the input string + * + * - nd is the total number of significant digits (here, and + * below, 'significant digits' means the set of digits of the + * significand of the input that remain after ignoring leading + * and trailing zeros). + * + * - nd0 indicates the position of the decimal point, if present; it + * satisfies 1 <= nd0 <= nd. The nd significant digits are in + * s0[0:nd0] and s0[nd0+1:nd+1] using the usual Python half-open slice + * notation. (If nd0 < nd, then s0[nd0] contains a '.' character; if + * nd0 == nd, then s0[nd0] could be any non-digit character.) + * + * - e is the adjusted exponent: the absolute value of the number + * represented by the original input string is n * 10**e, where + * n is the integer represented by the concatenation of + * s0[0:nd0] and s0[nd0+1:nd+1] + * + * - sign gives the sign of the input: 1 for negative, 0 for positive + * + * - the first and last significant digits are nonzero + */ + + /* put first DBL_DIG+1 digits into integer y and z. + * + * - y contains the value represented by the first min(9, nd) + * significant digits + * + * - if nd > 9, z contains the value represented by significant digits + * with indices in [9, min(16, nd)). So y * 10**(min(16, nd) - 9) + z + * gives the value represented by the first min(16, nd) sig. digits. + */ + + bc.e0 = e1 = e; + y = z = 0; + for (i = 0; i < nd; i++) { + if (i < 9) + y = 10*y + s0[i < nd0 ? i : i+1] - '0'; + else if (i < DBL_DIG+1) + z = 10*z + s0[i < nd0 ? i : i+1] - '0'; + else + break; + } + + k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; + dval(&rv) = y; + if (k > 9) { + dval(&rv) = tens[k - 9] * dval(&rv) + z; + } + bd0 = 0; + if (nd <= DBL_DIG + && Flt_Rounds == 1 + ) { + if (!e) + goto ret; + if (e > 0) { + if (e <= Ten_pmax) { + dval(&rv) *= tens[e]; + goto ret; + } + i = DBL_DIG - nd; + if (e <= Ten_pmax + i) { + /* A fancier test would sometimes let us do + * this for larger i values. + */ + e -= i; + dval(&rv) *= tens[i]; + dval(&rv) *= tens[e]; + goto ret; + } + } + else if (e >= -Ten_pmax) { + dval(&rv) /= tens[-e]; + goto ret; + } + } + e1 += nd - k; + + bc.scale = 0; + + /* Get starting approximation = rv * 10**e1 */ + + if (e1 > 0) { + if ((i = e1 & 15)) + dval(&rv) *= tens[i]; + if (e1 &= ~15) { + if (e1 > DBL_MAX_10_EXP) + goto ovfl; + e1 >>= 4; + for(j = 0; e1 > 1; j++, e1 >>= 1) + if (e1 & 1) + dval(&rv) *= bigtens[j]; + /* The last multiplication could overflow. */ + word0(&rv) -= P*Exp_msk1; + dval(&rv) *= bigtens[j]; + if ((z = word0(&rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-P)) + goto ovfl; + if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { + /* set to largest number */ + /* (Can't trust DBL_MAX) */ + word0(&rv) = Big0; + word1(&rv) = Big1; + } + else + word0(&rv) += P*Exp_msk1; + } + } + else if (e1 < 0) { + /* The input decimal value lies in [10**e1, 10**(e1+16)). + + If e1 <= -512, underflow immediately. + If e1 <= -256, set bc.scale to 2*P. + + So for input value < 1e-256, bc.scale is always set; + for input value >= 1e-240, bc.scale is never set. + For input values in [1e-256, 1e-240), bc.scale may or may + not be set. */ + + e1 = -e1; + if ((i = e1 & 15)) + dval(&rv) /= tens[i]; + if (e1 >>= 4) { + if (e1 >= 1 << n_bigtens) + goto undfl; + if (e1 & Scale_Bit) + bc.scale = 2*P; + for(j = 0; e1 > 0; j++, e1 >>= 1) + if (e1 & 1) + dval(&rv) *= tinytens[j]; + if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask) + >> Exp_shift)) > 0) { + /* scaled rv is denormal; clear j low bits */ + if (j >= 32) { + word1(&rv) = 0; + if (j >= 53) + word0(&rv) = (P+2)*Exp_msk1; + else + word0(&rv) &= 0xffffffff << (j-32); + } + else + word1(&rv) &= 0xffffffff << j; + } + if (!dval(&rv)) + goto undfl; + } + } + + /* Now the hard part -- adjusting rv to the correct value.*/ + + /* Put digits into bd: true value = bd * 10^e */ + + bc.nd = nd; + bc.nd0 = nd0; /* Only needed if nd > STRTOD_DIGLIM, but done here */ + /* to silence an erroneous warning about bc.nd0 */ + /* possibly not being initialized. */ + if (nd > STRTOD_DIGLIM) { + /* ASSERT(STRTOD_DIGLIM >= 18); 18 == one more than the */ + /* minimum number of decimal digits to distinguish double values */ + /* in IEEE arithmetic. */ + + /* Truncate input to 18 significant digits, then discard any trailing + zeros on the result by updating nd, nd0, e and y suitably. (There's + no need to update z; it's not reused beyond this point.) */ + for (i = 18; i > 0; ) { + /* scan back until we hit a nonzero digit. significant digit 'i' + is s0[i] if i < nd0, s0[i+1] if i >= nd0. */ + --i; + if (s0[i < nd0 ? i : i+1] != '0') { + ++i; + break; + } + } + e += nd - i; + nd = i; + if (nd0 > nd) + nd0 = nd; + if (nd < 9) { /* must recompute y */ + y = 0; + for(i = 0; i < nd0; ++i) + y = 10*y + s0[i] - '0'; + for(; i < nd; ++i) + y = 10*y + s0[i+1] - '0'; + } + } + bd0 = s2b(s0, nd0, nd, y); + if (bd0 == NULL) + goto failed_malloc; + + /* Notation for the comments below. Write: + + - dv for the absolute value of the number represented by the original + decimal input string. + + - if we've truncated dv, write tdv for the truncated value. + Otherwise, set tdv == dv. + + - srv for the quantity rv/2^bc.scale; so srv is the current binary + approximation to tdv (and dv). It should be exactly representable + in an IEEE 754 double. + */ + + for(;;) { + + /* This is the main correction loop for sb_strtod. + + We've got a decimal value tdv, and a floating-point approximation + srv=rv/2^bc.scale to tdv. The aim is to determine whether srv is + close enough (i.e., within 0.5 ulps) to tdv, and to compute a new + approximation if not. + + To determine whether srv is close enough to tdv, compute integers + bd, bb and bs proportional to tdv, srv and 0.5 ulp(srv) + respectively, and then use integer arithmetic to determine whether + |tdv - srv| is less than, equal to, or greater than 0.5 ulp(srv). + */ + + bd = Balloc(bd0->k); + if (bd == NULL) { + Bfree(bd0); + goto failed_malloc; + } + Bcopy(bd, bd0); + bb = sd2b(&rv, bc.scale, &bbe); /* srv = bb * 2^bbe */ + if (bb == NULL) { + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + /* Record whether lsb of bb is odd, in case we need this + for the round-to-even step later. */ + odd = bb->x[0] & 1; + + /* tdv = bd * 10**e; srv = bb * 2**bbe */ + bs = i2b(1); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + + if (e >= 0) { + bb2 = bb5 = 0; + bd2 = bd5 = e; + } + else { + bb2 = bb5 = -e; + bd2 = bd5 = 0; + } + if (bbe >= 0) + bb2 += bbe; + else + bd2 -= bbe; + bs2 = bb2; + bb2++; + bd2++; + + /* At this stage bd5 - bb5 == e == bd2 - bb2 + bbe, bb2 - bs2 == 1, + and bs == 1, so: + + tdv == bd * 10**e = bd * 2**(bbe - bb2 + bd2) * 5**(bd5 - bb5) + srv == bb * 2**bbe = bb * 2**(bbe - bb2 + bb2) + 0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2) + + It follows that: + + M * tdv = bd * 2**bd2 * 5**bd5 + M * srv = bb * 2**bb2 * 5**bb5 + M * 0.5 ulp(srv) = bs * 2**bs2 * 5**bb5 + + for some constant M. (Actually, M == 2**(bb2 - bbe) * 5**bb5, but + this fact is not needed below.) + */ + + /* Remove factor of 2**i, where i = min(bb2, bd2, bs2). */ + i = bb2 < bd2 ? bb2 : bd2; + if (i > bs2) + i = bs2; + if (i > 0) { + bb2 -= i; + bd2 -= i; + bs2 -= i; + } + + /* Scale bb, bd, bs by the appropriate powers of 2 and 5. */ + if (bb5 > 0) { + bs = pow5mult(bs, bb5); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + bb1 = mult(bs, bb); + Bfree(bb); + bb = bb1; + if (bb == NULL) { + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + if (bb2 > 0) { + bb = lshift(bb, bb2); + if (bb == NULL) { + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + if (bd5 > 0) { + bd = pow5mult(bd, bd5); + if (bd == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd0); + goto failed_malloc; + } + } + if (bd2 > 0) { + bd = lshift(bd, bd2); + if (bd == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd0); + goto failed_malloc; + } + } + if (bs2 > 0) { + bs = lshift(bs, bs2); + if (bs == NULL) { + Bfree(bb); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + } + + /* Now bd, bb and bs are scaled versions of tdv, srv and 0.5 ulp(srv), + respectively. Compute the difference |tdv - srv|, and compare + with 0.5 ulp(srv). */ + + delta = diff(bb, bd); + if (delta == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + dsign = delta->sign; + delta->sign = 0; + i = cmp(delta, bs); + if (bc.nd > nd && i <= 0) { + if (dsign) + break; /* Must use bigcomp(). */ + + /* Here rv overestimates the truncated decimal value by at most + 0.5 ulp(rv). Hence rv either overestimates the true decimal + value by <= 0.5 ulp(rv), or underestimates it by some small + amount (< 0.1 ulp(rv)); either way, rv is within 0.5 ulps of + the true decimal value, so it's possible to exit. + + Exception: if scaled rv is a normal exact power of 2, but not + DBL_MIN, then rv - 0.5 ulp(rv) takes us all the way down to the + next double, so the correctly rounded result is either rv - 0.5 + ulp(rv) or rv; in this case, use bigcomp to distinguish. */ + + if (!word1(&rv) && !(word0(&rv) & Bndry_mask)) { + /* rv can't be 0, since it's an overestimate for some + nonzero value. So rv is a normal power of 2. */ + j = (int)(word0(&rv) & Exp_mask) >> Exp_shift; + /* rv / 2^bc.scale = 2^(j - 1023 - bc.scale); use bigcomp if + rv / 2^bc.scale >= 2^-1021. */ + if (j - bc.scale >= 2) { + dval(&rv) -= 0.5 * sulp(&rv, &bc); + break; /* Use bigcomp. */ + } + } + + { + bc.nd = nd; + i = -1; /* Discarded digits make delta smaller. */ + } + } + + if (i < 0) { + /* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */ + if (dsign || word1(&rv) || word0(&rv) & Bndry_mask + || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1 + ) { + break; + } + if (!delta->x[0] && delta->wds <= 1) { + /* exact result */ + break; + } + delta = lshift(delta,Log2P); + if (delta == NULL) { + Bfree(bb); + Bfree(bs); + Bfree(bd); + Bfree(bd0); + goto failed_malloc; + } + if (cmp(delta, bs) > 0) + goto drop_down; + break; + } + if (i == 0) { + /* exactly half-way between */ + if (dsign) { + if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 + && word1(&rv) == ( + (bc.scale && + (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ? + (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : + 0xffffffff)) { + /*boundary case -- increment exponent*/ + word0(&rv) = (word0(&rv) & Exp_mask) + + Exp_msk1 + ; + word1(&rv) = 0; + /* dsign = 0; */ + break; + } + } + else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { + drop_down: + /* boundary case -- decrement exponent */ + if (bc.scale) { + L = word0(&rv) & Exp_mask; + if (L <= (2*P+1)*Exp_msk1) { + if (L > (P+2)*Exp_msk1) + /* round even ==> */ + /* accept rv */ + break; + /* rv = smallest denormal */ + if (bc.nd > nd) + break; + goto undfl; + } + } + L = (word0(&rv) & Exp_mask) - Exp_msk1; + word0(&rv) = L | Bndry_mask1; + word1(&rv) = 0xffffffff; + break; + } + if (!odd) + break; + if (dsign) + dval(&rv) += sulp(&rv, &bc); + else { + dval(&rv) -= sulp(&rv, &bc); + if (!dval(&rv)) { + if (bc.nd >nd) + break; + goto undfl; + } + } + /* dsign = 1 - dsign; */ + break; + } + if ((aadj = ratio(delta, bs)) <= 2.) { + if (dsign) + aadj = aadj1 = 1.; + else if (word1(&rv) || word0(&rv) & Bndry_mask) { + if (word1(&rv) == Tiny1 && !word0(&rv)) { + if (bc.nd >nd) + break; + goto undfl; + } + aadj = 1.; + aadj1 = -1.; + } + else { + /* special case -- power of FLT_RADIX to be */ + /* rounded down... */ + + if (aadj < 2./FLT_RADIX) + aadj = 1./FLT_RADIX; + else + aadj *= 0.5; + aadj1 = -aadj; + } + } + else { + aadj *= 0.5; + aadj1 = dsign ? aadj : -aadj; + if (Flt_Rounds == 0) + aadj1 += 0.5; + } + y = word0(&rv) & Exp_mask; + + /* Check for overflow */ + + if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { + dval(&rv0) = dval(&rv); + word0(&rv) -= P*Exp_msk1; + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; + if ((word0(&rv) & Exp_mask) >= + Exp_msk1*(DBL_MAX_EXP+Bias-P)) { + if (word0(&rv0) == Big0 && word1(&rv0) == Big1) { + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + goto ovfl; + } + word0(&rv) = Big0; + word1(&rv) = Big1; + goto cont; + } + else + word0(&rv) += P*Exp_msk1; + } + else { + if (bc.scale && y <= 2*P*Exp_msk1) { + if (aadj <= 0x7fffffff) { + if ((z = (ULong)aadj) <= 0) + z = 1; + aadj = z; + aadj1 = dsign ? aadj : -aadj; + } + dval(&aadj2) = aadj1; + word0(&aadj2) += (2*P+1)*Exp_msk1 - y; + aadj1 = dval(&aadj2); + } + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; + } + z = word0(&rv) & Exp_mask; + if (bc.nd == nd) { + if (!bc.scale) + if (y == z) { + /* Can we stop now? */ + L = (Long)aadj; + aadj -= L; + /* The tolerances below are conservative. */ + if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) { + if (aadj < .4999999 || aadj > .5000001) + break; + } + else if (aadj < .4999999/FLT_RADIX) + break; + } + } + cont: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(delta); + } + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + if (bc.nd > nd) { + error = bigcomp(&rv, s0, &bc); + if (error) + goto failed_malloc; + } + + if (bc.scale) { + word0(&rv0) = Exp_1 - 2*P*Exp_msk1; + word1(&rv0) = 0; + dval(&rv) *= dval(&rv0); + } + + ret: + return sign ? -dval(&rv) : dval(&rv); + + parse_error: + return 0.0; + + failed_malloc: + errno = ENOMEM; + return -1.0; + + undfl: + return sign ? -0.0 : 0.0; + + ovfl: + errno = ERANGE; + /* Can't trust HUGE_VAL */ + word0(&rv) = Exp_mask; + word1(&rv) = 0; + return sign ? -dval(&rv) : dval(&rv); + +} + +static char * +rv_alloc(int i) +{ + int j, k, *r; + + j = sizeof(ULong); + for(k = 0; + sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned)i; + j <<= 1) + k++; + r = (int*)Balloc(k); + if (r == NULL) + return NULL; + *r = k; + return (char *)(r+1); +} + +static char * +nrv_alloc(char *s, char **rve, int n) +{ + char *rv, *t; + + rv = rv_alloc(n); + if (rv == NULL) + return NULL; + t = rv; + while((*t = *s++)) t++; + if (rve) + *rve = t; + return rv; +} + +/* freedtoa(s) must be used to free values s returned by dtoa + * when MULTIPLE_THREADS is #defined. It should be used in all cases, + * but for consistency with earlier versions of dtoa, it is optional + * when MULTIPLE_THREADS is not defined. + */ + +void +sb_freedtoa(char *s) +{ + Bigint *b = (Bigint *)((int *)s - 1); + b->maxwds = 1 << (b->k = *(int*)b); + Bfree(b); +} + +/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d)). We scale relevant + * quantities using O(log2(k)) rather than O(k) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15) that we must resort to the Long + * calculation. + */ + +/* Additional notes (METD): (1) returns NULL on failure. (2) to avoid memory + leakage, a successful call to sb_dtoa should always be matched by a + call to sb_freedtoa. */ + +char * +sb_dtoa(double dd, int mode, int ndigits, + int *decpt, int *sign, char **rve) +{ + /* Arguments ndigits, decpt, sign are similar to those + of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4,5 ==> similar to 2 and 3, respectively, but (in + round-nearest mode) with the tests of mode 0 to + possibly return a shorter string that rounds to d. + With IEEE arithmetic and compilation with + -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same + as modes 2 and 3 when FLT_ROUNDS != 1. + 6-9 ==> Debugging modes similar to mode - 4: don't try + fast floating-point estimate (if applicable). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */ + + int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, + j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, + spec_case, try_quick; + Long L; + int denorm; + ULong x; + Bigint *b, *b1, *delta, *mlo, *mhi, *S; + U d2, eps, u; + double ds; + char *s, *s0; + + /* set pointers to NULL, to silence gcc compiler warnings and make + cleanup easier on error */ + mlo = mhi = S = 0; + s0 = 0; + + u.d = dd; + if (word0(&u) & Sign_bit) { + /* set sign for everything, including 0's and NaNs */ + *sign = 1; + word0(&u) &= ~Sign_bit; /* clear sign bit */ + } + else + *sign = 0; + + /* quick return for Infinities, NaNs and zeros */ + if ((word0(&u) & Exp_mask) == Exp_mask) + { + /* Infinity or NaN */ + *decpt = 9999; + if (!word1(&u) && !(word0(&u) & 0xfffff)) + return nrv_alloc("Infinity", rve, 8); + return nrv_alloc("NaN", rve, 3); + } + if (!dval(&u)) { + *decpt = 1; + return nrv_alloc("0", rve, 1); + } + + /* compute k = floor(log10(d)). The computation may leave k + one too large, but should never leave k too small. */ + b = d2b(&u, &be, &bbits); + if (b == NULL) + goto failed_malloc; + if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) { + dval(&d2) = dval(&u); + word0(&d2) &= Frac_mask1; + word0(&d2) |= Exp_11; + + /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 + * log10(x) = log(x) / log(10) + * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) + * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) + * + * This suggests computing an approximation k to log10(d) by + * + * k = (i - Bias)*0.301029995663981 + * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.) + */ + + i -= Bias; + denorm = 0; + } + else { + /* d is denormalized */ + + i = bbits + be + (Bias + (P-1) - 1); + x = i > 32 ? word0(&u) << (64 - i) | word1(&u) >> (i - 32) + : word1(&u) << (32 - i); + dval(&d2) = x; + word0(&d2) -= 31*Exp_msk1; /* adjust exponent */ + i -= (Bias + (P-1) - 1) + 1; + denorm = 1; + } + ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + + i*0.301029995663981; + k = (int)ds; + if (ds < 0. && ds != k) + k--; /* want k = floor(ds) */ + k_check = 1; + if (k >= 0 && k <= Ten_pmax) { + if (dval(&u) < tens[k]) + k--; + k_check = 0; + } + j = bbits - i - 1; + if (j >= 0) { + b2 = 0; + s2 = j; + } + else { + b2 = -j; + s2 = 0; + } + if (k >= 0) { + b5 = 0; + s5 = k; + s2 += k; + } + else { + b2 -= k; + b5 = -k; + s5 = 0; + } + if (mode < 0 || mode > 9) + mode = 0; + + try_quick = 1; + + if (mode > 5) { + mode -= 4; + try_quick = 0; + } + leftright = 1; + ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ + /* silence erroneous "gcc -Wall" warning. */ + switch(mode) { + case 0: + case 1: + i = 18; + ndigits = 0; + break; + case 2: + leftright = 0; + /* FALLTHRU */ + case 4: + if (ndigits <= 0) + ndigits = 1; + ilim = ilim1 = i = ndigits; + break; + case 3: + leftright = 0; + /* FALLTHRU */ + case 5: + i = ndigits + k + 1; + ilim = i; + ilim1 = i - 1; + if (i <= 0) + i = 1; + } + s0 = rv_alloc(i); + if (s0 == NULL) + goto failed_malloc; + s = s0; + + + if (ilim >= 0 && ilim <= Quick_max && try_quick) { + + /* Try to get by with floating-point arithmetic. */ + + i = 0; + dval(&d2) = dval(&u); + k0 = k; + ilim0 = ilim; + ieps = 2; /* conservative */ + if (k > 0) { + ds = tens[k&0xf]; + j = k >> 4; + if (j & Bletch) { + /* prevent overflows */ + j &= Bletch - 1; + dval(&u) /= bigtens[n_bigtens-1]; + ieps++; + } + for(; j; j >>= 1, i++) + if (j & 1) { + ieps++; + ds *= bigtens[i]; + } + dval(&u) /= ds; + } + else if ((j1 = -k)) { + dval(&u) *= tens[j1 & 0xf]; + for(j = j1 >> 4; j; j >>= 1, i++) + if (j & 1) { + ieps++; + dval(&u) *= bigtens[i]; + } + } + if (k_check && dval(&u) < 1. && ilim > 0) { + if (ilim1 <= 0) + goto fast_failed; + ilim = ilim1; + k--; + dval(&u) *= 10.; + ieps++; + } + dval(&eps) = ieps*dval(&u) + 7.; + word0(&eps) -= (P-1)*Exp_msk1; + if (ilim == 0) { + S = mhi = 0; + dval(&u) -= 5.; + if (dval(&u) > dval(&eps)) + goto one_digit; + if (dval(&u) < -dval(&eps)) + goto no_digits; + goto fast_failed; + } + if (leftright) { + /* Use Steele & White method of only + * generating digits needed. + */ + dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); + for(i = 0;;) { + L = (Long)dval(&u); + dval(&u) -= L; + *s++ = '0' + (int)L; + if (dval(&u) < dval(&eps)) + goto ret1; + if (1. - dval(&u) < dval(&eps)) + goto bump_up; + if (++i >= ilim) + break; + dval(&eps) *= 10.; + dval(&u) *= 10.; + } + } + else { + /* Generate ilim digits, then fix them up. */ + dval(&eps) *= tens[ilim-1]; + for(i = 1;; i++, dval(&u) *= 10.) { + L = (Long)(dval(&u)); + if (!(dval(&u) -= L)) + ilim = i; + *s++ = '0' + (int)L; + if (i == ilim) { + if (dval(&u) > 0.5 + dval(&eps)) + goto bump_up; + else if (dval(&u) < 0.5 - dval(&eps)) { + while(*--s == '0'); + s++; + goto ret1; + } + break; + } + } + } + fast_failed: + s = s0; + dval(&u) = dval(&d2); + k = k0; + ilim = ilim0; + } + + /* Do we have a "small" integer? */ + + if (be >= 0 && k <= Int_max) { + /* Yes. */ + ds = tens[k]; + if (ndigits < 0 && ilim <= 0) { + S = mhi = 0; + if (ilim < 0 || dval(&u) <= 5*ds) + goto no_digits; + goto one_digit; + } + for(i = 1;; i++, dval(&u) *= 10.) { + L = (Long)(dval(&u) / ds); + dval(&u) -= L*ds; + *s++ = '0' + (int)L; + if (!dval(&u)) { + break; + } + if (i == ilim) { + dval(&u) += dval(&u); + if (dval(&u) > ds || (dval(&u) == ds && L & 1)) { + bump_up: + while(*--s == '9') + if (s == s0) { + k++; + *s = '0'; + break; + } + ++*s++; + } + break; + } + } + goto ret1; + } + + m2 = b2; + m5 = b5; + if (leftright) { + i = + denorm ? be + (Bias + (P-1) - 1 + 1) : + 1 + P - bbits; + b2 += i; + s2 += i; + mhi = i2b(1); + if (mhi == NULL) + goto failed_malloc; + } + if (m2 > 0 && s2 > 0) { + i = m2 < s2 ? m2 : s2; + b2 -= i; + m2 -= i; + s2 -= i; + } + if (b5 > 0) { + if (leftright) { + if (m5 > 0) { + mhi = pow5mult(mhi, m5); + if (mhi == NULL) + goto failed_malloc; + b1 = mult(mhi, b); + Bfree(b); + b = b1; + if (b == NULL) + goto failed_malloc; + } + if ((j = b5 - m5)) { + b = pow5mult(b, j); + if (b == NULL) + goto failed_malloc; + } + } + else { + b = pow5mult(b, b5); + if (b == NULL) + goto failed_malloc; + } + } + S = i2b(1); + if (S == NULL) + goto failed_malloc; + if (s5 > 0) { + S = pow5mult(S, s5); + if (S == NULL) + goto failed_malloc; + } + + /* Check for special case that d is a normalized power of 2. */ + + spec_case = 0; + if ((mode < 2 || leftright) + ) { + if (!word1(&u) && !(word0(&u) & Bndry_mask) + && word0(&u) & (Exp_mask & ~Exp_msk1) + ) { + /* The special case */ + b2 += Log2P; + s2 += Log2P; + spec_case = 1; + } + } + + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */ +#define iInc 28 + i = dshift(S, s2); + b2 += i; + m2 += i; + s2 += i; + if (b2 > 0) { + b = lshift(b, b2); + if (b == NULL) + goto failed_malloc; + } + if (s2 > 0) { + S = lshift(S, s2); + if (S == NULL) + goto failed_malloc; + } + if (k_check) { + if (cmp(b,S) < 0) { + k--; + b = multadd(b, 10, 0); /* we botched the k estimate */ + if (b == NULL) + goto failed_malloc; + if (leftright) { + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + goto failed_malloc; + } + ilim = ilim1; + } + } + if (ilim <= 0 && (mode == 3 || mode == 5)) { + if (ilim < 0) { + /* no digits, fcvt style */ + no_digits: + k = -1 - ndigits; + goto ret; + } + else { + S = multadd(S, 5, 0); + if (S == NULL) + goto failed_malloc; + if (cmp(b, S) <= 0) + goto no_digits; + } + one_digit: + *s++ = '1'; + k++; + goto ret; + } + if (leftright) { + if (m2 > 0) { + mhi = lshift(mhi, m2); + if (mhi == NULL) + goto failed_malloc; + } + + /* Compute mlo -- check for special case + * that d is a normalized power of 2. + */ + + mlo = mhi; + if (spec_case) { + mhi = Balloc(mhi->k); + if (mhi == NULL) + goto failed_malloc; + Bcopy(mhi, mlo); + mhi = lshift(mhi, Log2P); + if (mhi == NULL) + goto failed_malloc; + } + + for(i = 1;;i++) { + dig = quorem(b,S) + '0'; + /* Do we yet have the shortest decimal string + * that will round to d? + */ + j = cmp(b, mlo); + delta = diff(S, mhi); + if (delta == NULL) + goto failed_malloc; + j1 = delta->sign ? 1 : cmp(b, delta); + Bfree(delta); + if (j1 == 0 && mode != 1 && !(word1(&u) & 1) + ) { + if (dig == '9') + goto round_9_up; + if (j > 0) + dig++; + *s++ = dig; + goto ret; + } + if (j < 0 || (j == 0 && mode != 1 + && !(word1(&u) & 1) + )) { + if (!b->x[0] && b->wds <= 1) { + goto accept_dig; + } + if (j1 > 0) { + b = lshift(b, 1); + if (b == NULL) + goto failed_malloc; + j1 = cmp(b, S); + if ((j1 > 0 || (j1 == 0 && dig & 1)) + && dig++ == '9') + goto round_9_up; + } + accept_dig: + *s++ = dig; + goto ret; + } + if (j1 > 0) { + if (dig == '9') { /* possible if i == 1 */ + round_9_up: + *s++ = '9'; + goto roundoff; + } + *s++ = dig + 1; + goto ret; + } + *s++ = dig; + if (i == ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + goto failed_malloc; + if (mlo == mhi) { + mlo = mhi = multadd(mhi, 10, 0); + if (mlo == NULL) + goto failed_malloc; + } + else { + mlo = multadd(mlo, 10, 0); + if (mlo == NULL) + goto failed_malloc; + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + goto failed_malloc; + } + } + } + else + for(i = 1;; i++) { + *s++ = dig = quorem(b,S) + '0'; + if (!b->x[0] && b->wds <= 1) { + goto ret; + } + if (i >= ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + goto failed_malloc; + } + + /* Round off last digit */ + + b = lshift(b, 1); + if (b == NULL) + goto failed_malloc; + j = cmp(b, S); + if (j > 0 || (j == 0 && dig & 1)) { + roundoff: + while(*--s == '9') + if (s == s0) { + k++; + *s++ = '1'; + goto ret; + } + ++*s++; + } + else { + while(*--s == '0'); + s++; + } + ret: + Bfree(S); + if (mhi) { + if (mlo && mlo != mhi) + Bfree(mlo); + Bfree(mhi); + } + ret1: + Bfree(b); + *s = 0; + *decpt = k + 1; + if (rve) + *rve = s; + return s0; + failed_malloc: + if (S) + Bfree(S); + if (mlo && mlo != mhi) + Bfree(mlo); + if (mhi) + Bfree(mhi); + if (b) + Bfree(b); + if (s0) + sb_freedtoa(s0); + return NULL; +} +#ifdef __cplusplus +} +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c new file mode 100644 index 0000000..8eb2c2b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c @@ -0,0 +1,305 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/** + * @file err.c + * @brief Somewhat antiquated logging and error interface. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include "sphinxbase/err.h" +#include "sphinxbase/prim_type.h" +#include "sphinxbase/filename.h" +#include "sphinxbase/ckd_alloc.h" + +static FILE* logfp = NULL; +static int logfp_disabled = FALSE; + +#if defined(__ANDROID__) +#include +static void +err_logcat_cb(void* user_data, err_lvl_t level, const char *fmt, ...); +#elif defined(_WIN32_WCE) +#include +#define vsnprintf _vsnprintf +static void +err_wince_cb(void* user_data, err_lvl_t level, const char *fmt, ...); +#endif + +#if defined(__ANDROID__) +static err_cb_f err_cb = err_logcat_cb; +#elif defined(_WIN32_WCE) +static err_cb_f err_cb = err_wince_cb; +#else +static err_cb_f err_cb = err_logfp_cb; +#endif +static void* err_user_data; +static err_lvl_t min_loglevel = ERR_WARN; +static const char *err_level[ERR_MAX] = + { + "DEBUG", "INFO", "WARN", "ERROR", "FATAL" + }; + +int +err_set_loglevel(err_lvl_t lvl) +{ + int rv = min_loglevel; + min_loglevel = lvl; + return rv; +} + +const char * +err_set_loglevel_str(char const *lvl) +{ + const char *rv = err_level[min_loglevel]; + int i; + + if (lvl == NULL) + return NULL; + if (!strncmp(lvl, "ERR_", 4)) + lvl += 4; + for (i = 0; i < ERR_MAX; ++i) { + if (!strcmp(lvl, err_level[i])) { + min_loglevel = i; + return rv; + } + } + return NULL; +} + +void +err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + + char msg[1024]; + va_list ap; + + if (!err_cb) + return; + if (lvl < min_loglevel) + return; + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s", err_level[lvl], fname, ln, msg); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s", err_level[lvl], fname, ln, msg); + } else { + err_cb(err_user_data, lvl, "%s", msg); + } +} + +#ifdef _WIN32_WCE /* No strerror for WinCE, so a separate implementation */ +void +err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + va_list ap; + LPVOID error_wstring; + DWORD error; + char msg[1024]; + char error_string[1024]; + + if (!err_cb) + return; + if (lvl < min_loglevel) + return; + + error = GetLastError(); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + error, + 0, // Default language + (LPTSTR) &error_wstring, + 0, + NULL); + wcstombs(error_string, error_wstring, 1023); + LocalFree(error_wstring); + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); + } else { + err_cb(err_user_data, lvl, "%s: %s\n", msg, error_string); + } +} +#else +void +err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) +{ + int local_errno = errno; + + char msg[1024]; + va_list ap; + + if (!err_cb) + return; + if (lvl < min_loglevel) + return; + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + if (path) { + const char *fname = path2basename(path); + if (lvl == ERR_INFO) + err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_level[lvl], fname, ln, msg, strerror(local_errno)); + else + err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_level[lvl], fname, ln, msg, strerror(local_errno)); + } else { + err_cb(err_user_data, lvl, "%s: %s\n", msg, strerror(local_errno)); + } +} +#endif + +#if defined(__ANDROID__) +static void +err_logcat_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + static const int android_level[ERR_MAX] = {ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, + ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_ERROR}; + + va_list ap; + va_start(ap, fmt); + __android_log_vprint(android_level[lvl], "cmusphinx", fmt, ap); + va_end(ap); +} +#elif defined(_WIN32_WCE) +static void +err_wince_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + char msg[1024]; + WCHAR *wmsg; + size_t size; + va_list ap; + + va_start(ap, fmt); + _vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + + size = mbstowcs(NULL, msg, 0) + 1; + wmsg = ckd_calloc(size, sizeof(*wmsg)); + mbstowcs(wmsg, msg, size); + + OutputDebugStringW(wmsg); + ckd_free(wmsg); +} +#else +void +err_logfp_cb(void *user_data, err_lvl_t lvl, const char *fmt, ...) +{ + va_list ap; + FILE *fp = err_get_logfp(); + + (void)user_data; + (void)lvl; /* FIXME?!?! */ + + if (!fp) + return; + + va_start(ap, fmt); + vfprintf(fp, fmt, ap); + va_end(ap); + fflush(fp); +} +#endif + +int +err_set_logfile(const char *path) +{ + FILE *newfp; + + if ((newfp = fopen(path, "a")) == NULL) + return -1; + err_set_logfp(newfp); + return 0; +} + +void +err_set_logfp(FILE *stream) +{ + if (logfp != NULL && logfp != stdout && logfp != stderr) + fclose(logfp); + if (stream == NULL) { + logfp_disabled = TRUE; + logfp = NULL; + return; + } + logfp_disabled = FALSE; + logfp = stream; + return; +} + +FILE * +err_get_logfp(void) +{ + if (logfp_disabled) + return NULL; + if (logfp == NULL) + return stderr; + + return logfp; +} + +void +err_set_callback(err_cb_f cb, void* user_data) +{ + err_cb = cb; + err_user_data= user_data; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c new file mode 100644 index 0000000..844b6f5 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c @@ -0,0 +1,51 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + */ +/********************************************************************* + * + * File: errno.c + * + * Description: functions and variables missing from Windows CE standard + * library + * + * Author: Silvio Moioli + * + *********************************************************************/ + +#include + +#if defined(_WIN32_WCE) +int errno; +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c new file mode 100644 index 0000000..cbbefea --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c @@ -0,0 +1,551 @@ +#include +#include +#include +#include +#include + +#include "sphinxbase/f2c.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + + +extern void +s_wsfe(cilist * f) +{(void)f; +} +extern void +e_wsfe(void) +{; +} +extern void +do_fio(integer * c, char *s, ftnlen l) +{(void)c;(void)s;(void)l; +} + +/* You'll want this if you redo the *_lite.c files with the -C option + * to f2c for checking array subscripts. (It's not suggested you do that + * for production use, of course.) */ +extern int +s_rnge(char *var, int index, char *routine, int lineno) +{ + fprintf(stderr, + "array index out-of-bounds for %s[%d] in routine %s:%d\n", var, + index, routine, lineno); + fflush(stderr); + assert(2+2 == 5); + return 0; +} + + +#ifdef KR_headers +extern double sqrt(); +float +f__cabs(real, imag) +float real, imag; +#else +#undef abs + +float +f__cabs(float real, float imag) +#endif +{ + float temp; + + if (real < 0) + real = -real; + if (imag < 0) + imag = -imag; + if (imag > real) { + temp = real; + real = imag; + imag = temp; + } + if ((imag + real) == real) + return ((float) real); + + temp = imag / real; + temp = real * sqrt(1.0 + temp * temp); /*overflow!! */ + return (temp); +} + + +VOID +#ifdef KR_headers +s_cnjg(r, z) +complex *r, *z; +#else +s_cnjg(complex * r, complex * z) +#endif +{ + r->r = z->r; + r->i = -z->i; +} + + +#ifdef KR_headers +float +r_imag(z) +complex *z; +#else +float +r_imag(complex * z) +#endif +{ + return (z->i); +} + + +#define log10e 0.43429448190325182765 + +#ifdef KR_headers +double log(); +float +r_lg10(x) +real *x; +#else +#undef abs + +float +r_lg10(real * x) +#endif +{ + return (log10e * log(*x)); +} + + +#ifdef KR_headers +float +r_sign(a, b) +real *a, *b; +#else +float +r_sign(real * a, real * b) +#endif +{ + float x; + x = (*a >= 0 ? *a : -*a); + return (*b >= 0 ? x : -x); +} + + +#ifdef KR_headers +double floor(); +integer +i_dnnt(x) +real *x; +#else +#undef abs + +integer +i_dnnt(real * x) +#endif +{ + return ((*x) >= 0 ? floor(*x + .5) : -floor(.5 - *x)); +} + + +#ifdef KR_headers +double pow(); +double +pow_dd(ap, bp) +doublereal *ap, *bp; +#else +#undef abs + +double +pow_dd(doublereal * ap, doublereal * bp) +#endif +{ + return (pow(*ap, *bp)); +} + + +#ifdef KR_headers +float +pow_ri(ap, bp) +real *ap; +integer *bp; +#else +float +pow_ri(real * ap, integer * bp) +#endif +{ + float pow, x; + integer n; + unsigned long u; + + pow = 1; + x = *ap; + n = *bp; + + if (n != 0) { + if (n < 0) { + n = -n; + x = 1 / x; + } + for (u = n;;) { + if (u & 01) + pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + } + return (pow); +} + +/* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the + * target of a concatenation to appear on its right-hand side (contrary + * to the Fortran 77 Standard, but in accordance with Fortran 90). + */ +#define NO_OVERWRITE + + +#ifndef NO_OVERWRITE + +#undef abs +#ifdef KR_headers +extern char *F77_aloc(); +extern void free(); +extern void exit_(); +#else + +extern char *F77_aloc(ftnlen, char *); +#endif + +#endif /* NO_OVERWRITE */ + +VOID +#ifdef KR_headers +s_cat(lp, rpp, rnp, np, ll) +char *lp, *rpp[]; +ftnlen rnp[], *np, ll; +#else +s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen * np, ftnlen ll) +#endif +{ + ftnlen i, nc; + char *rp; + ftnlen n = *np; +#ifndef NO_OVERWRITE + ftnlen L, m; + char *lp0, *lp1; + + lp0 = 0; + lp1 = lp; + L = ll; + i = 0; + while (i < n) { + rp = rpp[i]; + m = rnp[i++]; + if (rp >= lp1 || rp + m <= lp) { + if ((L -= m) <= 0) { + n = i; + break; + } + lp1 += m; + continue; + } + lp0 = lp; + lp = lp1 = F77_aloc(L = ll, "s_cat"); + break; + } + lp1 = lp; +#endif /* NO_OVERWRITE */ + for (i = 0; i < n; ++i) { + nc = ll; + if (rnp[i] < nc) + nc = rnp[i]; + ll -= nc; + rp = rpp[i]; + while (--nc >= 0) + *lp++ = *rp++; + } + while (--ll >= 0) + *lp++ = ' '; +#ifndef NO_OVERWRITE + if (lp0) { + memmove(lp0, lp1, L); + free(lp1); + } +#endif +} + + +/* compare two strings */ + +#ifdef KR_headers +integer +s_cmp(a0, b0, la, lb) +char *a0, *b0; +ftnlen la, lb; +#else +integer +s_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) +#endif +{ + register unsigned char *a, *aend, *b, *bend; + a = (unsigned char *) a0; + b = (unsigned char *) b0; + aend = a + la; + bend = b + lb; + + if (la <= lb) { + while (a < aend) + if (*a != *b) + return (*a - *b); + else { + ++a; + ++b; + } + + while (b < bend) + if (*b != ' ') + return (' ' - *b); + else + ++b; + } + + else { + while (b < bend) + if (*a == *b) { + ++a; + ++b; + } + else + return (*a - *b); + while (a < aend) + if (*a != ' ') + return (*a - ' '); + else + ++a; + } + return (0); +} + +/* Unless compiled with -DNO_OVERWRITE, this variant of s_copy allows the + * target of an assignment to appear on its right-hand side (contrary + * to the Fortran 77 Standard, but in accordance with Fortran 90), + * as in a(2:5) = a(4:7) . + */ + + + +/* assign strings: a = b */ + +#ifdef KR_headers +VOID +s_copy(a, b, la, lb) +register char *a, *b; +ftnlen la, lb; +#else +void +s_copy(register char *a, register char *b, ftnlen la, ftnlen lb) +#endif +{ + register char *aend, *bend; + + aend = a + la; + + if (la <= lb) +#ifndef NO_OVERWRITE + if (a <= b || a >= b + la) +#endif + while (a < aend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else + for (b += la; a < aend;) + *--aend = *--b; +#endif + + else { + bend = b + lb; +#ifndef NO_OVERWRITE + if (a <= b || a >= bend) +#endif + while (b < bend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else { + a += lb; + while (b < bend) + *--a = *--bend; + a += lb; + } +#endif + while (a < aend) + *a++ = ' '; + } +} + + +#ifdef KR_headers +float f__cabs(); +float +z_abs(z) +complex *z; +#else +float f__cabs(float, float); +float +z_abs(complex * z) +#endif +{ + return (f__cabs(z->r, z->i)); +} + + +#ifdef KR_headers +extern void sig_die(); +VOID +z_div(c, a, b) +complex *a, *b, *c; +#else +extern void sig_die(char *, int); +void +z_div(complex * c, complex * a, complex * b) +#endif +{ + float ratio, den; + float abr, abi; + + if ((abr = b->r) < 0.) + abr = -abr; + if ((abi = b->i) < 0.) + abi = -abi; + if (abr <= abi) { + /*Let IEEE Infinties handle this ;( */ + /*if(abi == 0) + sig_die("complex division by zero", 1); */ + ratio = b->r / b->i; + den = b->i * (1 + ratio * ratio); + c->r = (a->r * ratio + a->i) / den; + c->i = (a->i * ratio - a->r) / den; + } + + else { + ratio = b->i / b->r; + den = b->r * (1 + ratio * ratio); + c->r = (a->r + a->i * ratio) / den; + c->i = (a->i - a->r * ratio) / den; + } + +} + + +#ifdef KR_headers +double sqrt(); +double f__cabs(); +VOID +z_sqrt(r, z) +complex *r, *z; +#else +#undef abs + +extern float f__cabs(float, float); +void +z_sqrt(complex * r, complex * z) +#endif +{ + float mag; + + if ((mag = f__cabs(z->r, z->i)) == 0.) + r->r = r->i = 0.; + else if (z->r > 0) { + r->r = sqrt(0.5 * (mag + z->r)); + r->i = z->i / r->r / 2; + } + else { + r->i = sqrt(0.5 * (mag - z->r)); + if (z->i < 0) + r->i = -r->i; + r->r = z->i / r->i / 2; + } +} + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers + integer pow_ii(ap, bp) integer *ap, *bp; +#else + integer pow_ii(integer * ap, integer * bp) +#endif + { + integer pow, x, n; + unsigned long u; + + x = *ap; + n = *bp; + + if (n <= 0) { + if (n == 0 || x == 1) + return 1; + if (x != -1) + return x != 0 ? 1 / x : 0; + n = -n; + } u = n; + for (pow = 1;;) { + if (u & 01) + pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + return (pow); + } +#ifdef __cplusplus +} +#endif + +#ifdef KR_headers +extern void f_exit(); +VOID +s_stop(s, n) +char *s; +ftnlen n; +#else +#undef abs +#undef min +#undef max +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus + extern "C" { +#endif + void f_exit(void); + + int s_stop(char *s, ftnlen n) +#endif + { + int i; + + if (n > 0) { + fprintf(stderr, "STOP "); + for (i = 0; i < n; ++i) + putc(*s++, stderr); + fprintf(stderr, " statement executed\n"); + } +#ifdef NO_ONEXIT + f_exit(); +#endif + exit(0); + +/* We cannot avoid (useless) compiler diagnostics here: */ +/* some compilers complain if there is no return statement, */ +/* and others complain that this one cannot be reached. */ + + return 0; /* NOT REACHED */ + } +#ifdef __cplusplus + } +#endif +#ifdef __cplusplus +} +#endif diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c new file mode 100644 index 0000000..3f4ae47 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c @@ -0,0 +1,120 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * filename.c -- File and path name operations. + */ + +#include +#include +#include +#include + +#include "sphinxbase/filename.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +const char * +path2basename(const char *path) +{ + const char *result; + +#if defined(_WIN32) || defined(__CYGWIN__) + result = strrchr(path, '\\'); +#else + result = strrchr(path, '/'); +#endif + + return (result == NULL ? path : result + 1); +} + +/* Return all leading pathname components */ +void +path2dirname(const char *path, char *dir) +{ + size_t i, l; + + l = strlen(path); +#if defined(_WIN32) || defined(__CYGWIN__) + for (i = l - 1; (i > 0) && !(path[i] == '/' || path[i] == '\\'); --i); +#else + for (i = l - 1; (i > 0) && !(path[i] == '/'); --i); +#endif + if (i == 0) { + dir[0] = '.'; + dir[1] = '\0'; + } else { + memcpy(dir, path, i); + dir[i] = '\0'; + } +} + + +/* Strip off the shortest trailing .xyz suffix */ +void +strip_fileext(const char *path, char *root) +{ + size_t i, l; + + l = strlen(path); + for (i = l - 1; (i > 0) && (path[i] != '.'); --i); + if (i == 0) { + strcpy(root, path); /* Didn't find a . */ + } else { + strncpy(root, path, i); + } +} + +/* Test if this path is absolute. */ +int +path_is_absolute(const char *path) +{ +#if defined(_WIN32) && !defined(_WIN32_WCE) /* FIXME: Also SymbianOS */ + return /* Starts with drive letter : \ or / */ + (strlen(path) >= 3 + && + ((path[0] >= 'A' && path[0] <= 'Z') + || (path[0] >= 'a' && path[0] <= 'z')) + && path[1] == ':' + && (path[2] == '/' || path[2] == '\\')); +#elif defined(_WIN32_WCE) + return path[0] == '\\' || path[0] == '/'; +#else /* Assume Unix */ + return path[0] == '/'; +#endif +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py new file mode 100644 index 0000000..7be986a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py @@ -0,0 +1,114 @@ +import re +import itertools + +def isBlank(line): + return not line +def isLabel(line): + return line[0].isdigit() +def isComment(line): + return line[0] != ' ' +def isContinuation(line): + return line[5] != ' ' + +COMMENT, STATEMENT, CONTINUATION = 0, 1, 2 +def lineType(line): + """Return the type of a line of Fortan code.""" + if isBlank(line): + return COMMENT + elif isLabel(line): + return STATEMENT + elif isComment(line): + return COMMENT + elif isContinuation(line): + return CONTINUATION + else: + return STATEMENT + +class LineIterator(object): + """LineIterator(iterable) + + Return rstrip()'d lines from iterable, while keeping a count of the + line number in the .lineno attribute. + """ + def __init__(self, iterable): + object.__init__(self) + self.iterable = iter(iterable) + self.lineno = 0 + def __iter__(self): + return self + def next(self): + self.lineno += 1 + line = self.iterable.next() + line = line.rstrip() + return line + +class PushbackIterator(object): + """PushbackIterator(iterable) + + Return an iterator for which items can be pushed back into. + Call the .pushback(item) method to have item returned as the next + value of .next(). + """ + def __init__(self, iterable): + object.__init__(self) + self.iterable = iter(iterable) + self.buffer = [] + + def __iter__(self): + return self + + def next(self): + if self.buffer: + return self.buffer.pop() + else: + return self.iterable.next() + + def pushback(self, item): + self.buffer.append(item) + +def fortranSourceLines(fo): + """Return an iterator over statement lines of a Fortran source file. + + Comment and blank lines are stripped out, and continuation lines are + merged. + """ + numberingiter = LineIterator(fo) + # add an extra '' at the end + with_extra = itertools.chain(numberingiter, ['']) + pushbackiter = PushbackIterator(with_extra) + for line in pushbackiter: + t = lineType(line) + if t == COMMENT: + continue + elif t == STATEMENT: + lines = [line] + # this is where we need the extra '', so we don't finish reading + # the iterator when we don't want to handle that + for next_line in pushbackiter: + t = lineType(next_line) + if t == CONTINUATION: + lines.append(next_line[6:]) + else: + pushbackiter.pushback(next_line) + break + yield numberingiter.lineno, ''.join(lines) + else: + raise ValueError("jammed: continuation line not expected: %s:%d" % + (fo.name, numberingiter.lineno)) + +def getDependencies(filename): + """For a Fortran source file, return a list of routines declared as EXTERNAL + in it. + """ + fo = open(filename) + external_pat = re.compile(r'^\s*EXTERNAL\s', re.I) + routines = [] + for lineno, line in fortranSourceLines(fo): + m = external_pat.match(line) + if m: + names = line = line[m.end():].strip().split(',') + names = [n.strip().lower() for n in names] + names = [n for n in names if n] + routines.extend(names) + fo.close() + return routines diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c new file mode 100644 index 0000000..ca75c59 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c @@ -0,0 +1,198 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright +` notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp +*/ + +#include + +#include "sphinxbase/genrand.h" + +/* Period parameters */ +#define N 624 +#define M 397 +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define UPPER_MASK 0x80000000UL /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffffUL /* least significant r bits */ + +void init_genrand(unsigned long s); + +void +genrand_seed(unsigned long s) +{ + init_genrand(s); +} + + +static unsigned long mt[N]; /* the array for the state vector */ +static int mti = N + 1; /* mti==N+1 means mt[N] is not initialized */ + +/* initializes mt[N] with a seed */ +void +init_genrand(unsigned long s) +{ + mt[0] = s & 0xffffffffUL; + for (mti = 1; mti < N; mti++) { + mt[mti] = + (1812433253UL * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti); + /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ + /* In the previous versions, MSBs of the seed affect */ + /* only MSBs of the array mt[]. */ + /* 2002/01/09 modified by Makoto Matsumoto */ + mt[mti] &= 0xffffffffUL; + /* for >32 bit machines */ + } +} + +/* generates a random number on [0,0xffffffff]-interval */ +unsigned long +genrand_int32(void) +{ + unsigned long y; + static unsigned long mag01[2] = { 0x0UL, MATRIX_A }; + /* mag01[x] = x * MATRIX_A for x=0,1 */ + + if (mti >= N) { /* generate N words at one time */ + int kk; + + if (mti == N + 1) /* if init_genrand() has not been called, */ + init_genrand(5489UL); /* a default initial seed is used */ + + for (kk = 0; kk < N - M; kk++) { + y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK); + mt[kk] = mt[kk + M] ^ (y >> 1) ^ mag01[y & 0x1UL]; + } + for (; kk < N - 1; kk++) { + y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK); + mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1UL]; + } + y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK); + mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x1UL]; + + mti = 0; + } + + y = mt[mti++]; + + /* Tempering */ + y ^= (y >> 11); + y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 15) & 0xefc60000UL; + y ^= (y >> 18); + + return y; +} + +/* generates a random number on [0,0x7fffffff]-interval */ +long +genrand_int31(void) +{ + return (long) (genrand_int32() >> 1); +} + +/* generates a random number on [0,1]-real-interval */ +double +genrand_real1(void) +{ + return genrand_int32() * (1.0 / 4294967295.0); + /* divided by 2^32-1 */ +} + +/* generates a random number on [0,1)-real-interval */ +double +genrand_real2(void) +{ + return genrand_int32() * (1.0 / 4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on (0,1)-real-interval */ +double +genrand_real3(void) +{ + return (((double) genrand_int32()) + 0.5) * (1.0 / 4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on [0,1) with 53-bit resolution*/ +double +genrand_res53(void) +{ + unsigned long a = genrand_int32() >> 5, b = genrand_int32() >> 6; + return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0); +} + +/* These real versions are due to Isaku Wada, 2002/01/09 added */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c new file mode 100644 index 0000000..a97e719 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c @@ -0,0 +1,271 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * glist.h -- Module for maintaining a generic, linear linked-list structure. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: glist.c,v $ + * Revision 1.8 2005/06/22 03:02:51 arthchan2003 + * 1, Fixed doxygen documentation, 2, add keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 09-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added glist_chkdup_*(). + * + * 13-Feb-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created from earlier version. + */ + + +#include +#include +#include +#include + +#include "sphinxbase/glist.h" +#include "sphinxbase/ckd_alloc.h" + + +glist_t +glist_add_ptr(glist_t g, void *ptr) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.ptr = ptr; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_int32(glist_t g, int32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.i = (long)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_uint32(glist_t g, uint32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.ui = (unsigned long)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_float32(glist_t g, float32 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.fl = (double)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + + +glist_t +glist_add_float64(glist_t g, float64 val) +{ + gnode_t *gn; + + gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + gn->data.fl = (double)val; + gn->next = g; + return ((glist_t) gn); /* Return the new head of the list */ +} + +void +glist_free(glist_t g) +{ + gnode_t *gn; + + while (g) { + gn = g; + g = gn->next; + ckd_free((void *) gn); + } +} + +int32 +glist_count(glist_t g) +{ + gnode_t *gn; + int32 n; + + for (gn = g, n = 0; gn; gn = gn->next, n++); + return n; +} + + +gnode_t * +glist_tail(glist_t g) +{ + gnode_t *gn; + + if (!g) + return NULL; + + for (gn = g; gn->next; gn = gn->next); + return gn; +} + + +glist_t +glist_reverse(glist_t g) +{ + gnode_t *gn, *nextgn; + gnode_t *rev; + + rev = NULL; + for (gn = g; gn; gn = nextgn) { + nextgn = gn->next; + + gn->next = rev; + rev = gn; + } + + return rev; +} + + +gnode_t * +glist_insert_ptr(gnode_t * gn, void *ptr) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.ptr = ptr; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_int32(gnode_t * gn, int32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.i = val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_uint32(gnode_t * gn, uint32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.ui = val; + newgn->next = gn->next; + + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_float32(gnode_t * gn, float32 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.fl = (double)val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + + +gnode_t * +glist_insert_float64(gnode_t * gn, float64 val) +{ + gnode_t *newgn; + + newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); + newgn->data.fl = (double)val; + newgn->next = gn->next; + gn->next = newgn; + + return newgn; +} + +gnode_t * +gnode_free(gnode_t * gn, gnode_t * pred) +{ + gnode_t *next; + + next = gn->next; + if (pred) { + assert(pred->next == gn); + + pred->next = next; + } + + ckd_free((char *) gn); + + return next; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c new file mode 100644 index 0000000..6a94406 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c @@ -0,0 +1,706 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * hash.c -- Hash table module. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: hash.c,v $ + * Revision 1.5 2005/06/22 03:04:01 arthchan2003 + * 1, Implemented hash_delete and hash_display, 2, Fixed doxygen documentation, 3, Added keyword. + * + * Revision 1.9 2005/05/25 06:17:53 archan + * Delete the test code in cmd_ln.c and fixed platform specific code of hash.c + * + * Revision 1.8 2005/05/24 01:10:54 archan + * Fix a bug when the value only appear in the hash but there is no chain. Also make sure that prev was initialized to NULL. All success cases were tested, but not tested with the deletion is tested. + * + * Revision 1.6 2005/05/24 00:00:45 archan + * Added basic functionalities to hash_t: 1, display and 2, delete a key from a hash. \n + * + * Revision 1.5 2005/05/11 07:01:38 archan + * Added comments on the usage of the current implementation of hash tables. + * + * Revision 1.4 2005/05/03 04:09:11 archan + * Implemented the heart of word copy search. For every ci-phone, every word end, a tree will be allocated to preserve its pathscore. This is different from 3.5 or below, only the best score for a particular ci-phone, regardless of the word-ends will be preserved at every frame. The graph propagation will not collect unused word tree at this point. srch_WST_propagate_wd_lv2 is also as the most stupid in the century. But well, after all, everything needs a start. I will then really get the results from the search and see how it looks. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-May-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Removed hash_key2hash(). Added hash_enter_bkey() and hash_lookup_bkey(), + * and len attribute to hash_entry_t. + * + * 30-Apr-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Added hash_key2hash(). + * + * 18-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Included case sensitive/insensitive option. Removed local, static + * maintenance of all hash tables. + * + * 31-Jul-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon + * Created. + */ + + +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable: 4018) +#endif + +#include "sphinxbase/hash_table.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/case.h" + + +#if 0 +static void +prime_sieve(int32 max) +{ + char *notprime; + int32 p, pp; + + notprime = (char *) ckd_calloc(max + 1, 1); + p = 2; + for (;;) { + printf("%d\n", p); + for (pp = p + p; pp <= max; pp += p) + notprime[pp] = 1; + for (++p; (p <= max) && notprime[p]; p++); + if (p > max) + break; + } +} +#endif + + +/* + * HACK!! Initial hash table size is restricted by this set of primes. (Of course, + * collision resolution by chaining will accommodate more entries indefinitely, but + * efficiency will drop.) + */ +const int32 prime[] = { + 101, 211, 307, 401, 503, 601, 701, 809, 907, + 1009, 1201, 1601, 2003, 2411, 3001, 4001, 5003, 6007, 7001, 8009, + 9001, + 10007, 12007, 16001, 20011, 24001, 30011, 40009, 50021, 60013, + 70001, 80021, 90001, + 100003, 120011, 160001, 200003, 240007, 300007, 400009, 500009, + 600011, 700001, 800011, 900001, + -1 +}; + + +/** + * This function returns a very large prime. + */ +static int32 +prime_size(int32 size) +{ + int32 i; + + for (i = 0; (prime[i] > 0) && (prime[i] < size); i++); + if (prime[i] <= 0) { + E_WARN("Very large hash table requested (%d entries)\n", size); + --i; + } + return (prime[i]); +} + + +hash_table_t * +hash_table_new(int32 size, int32 casearg) +{ + hash_table_t *h; + + h = (hash_table_t *) ckd_calloc(1, sizeof(hash_table_t)); + h->size = prime_size(size + (size >> 1)); + h->nocase = (casearg == HASH_CASE_NO); + h->table = (hash_entry_t *) ckd_calloc(h->size, sizeof(hash_entry_t)); + /* The above calloc clears h->table[*].key and .next to NULL, i.e. an empty table */ + + return h; +} + + +/* + * Compute hash value for given key string. + * Somewhat tuned for English text word strings. + */ +static uint32 +key2hash(hash_table_t * h, const char *key) +{ + + register const char *cp; + + /* This is a hack because the best way to solve it is to make sure + all character representation is unsigned character in the first place. + (or better unicode.) */ + register unsigned char c; + register int32 s; + register uint32 hash; + + hash = 0; + s = 0; + + if (h->nocase) { + for (cp = key; *cp; cp++) { + c = *cp; + c = UPPER_CASE(c); + hash += c << s; + s += 5; + if (s >= 25) + s -= 24; + } + } + else { + for (cp = key; *cp; cp++) { + hash += (*cp) << s; + s += 5; + if (s >= 25) + s -= 24; + } + } + + return (hash % h->size); +} + + +static char * +makekey(uint8 * data, size_t len, char *key) +{ + size_t i, j; + + if (!key) + key = (char *) ckd_calloc(len * 2 + 1, sizeof(char)); + + for (i = 0, j = 0; i < len; i++, j += 2) { + key[j] = 'A' + (data[i] & 0x000f); + key[j + 1] = 'J' + ((data[i] >> 4) & 0x000f); + } + key[j] = '\0'; + + return key; +} + + +static int32 +keycmp_nocase(hash_entry_t * entry, const char *key) +{ + char c1, c2; + int32 i; + const char *str; + + str = entry->key; + for (i = 0; (uint32)i < entry->len; i++) { + c1 = *(str++); + c1 = UPPER_CASE(c1); + c2 = *(key++); + c2 = UPPER_CASE(c2); + if (c1 != c2) + return (c1 - c2); + } + + return 0; +} + + +static int32 +keycmp_case(hash_entry_t * entry, const char *key) +{ + char c1, c2; + int32 i; + const char *str; + + str = entry->key; + for (i = 0; (uint32)i < entry->len; i++) { + c1 = *(str++); + c2 = *(key++); + if (c1 != c2) + return (c1 - c2); + } + + return 0; +} + + +/* + * Lookup entry with hash-value hash in table h for given key + * Return value: hash_entry_t for key + */ +static hash_entry_t * +lookup(hash_table_t * h, uint32 hash, const char *key, size_t len) +{ + hash_entry_t *entry; + + entry = &(h->table[hash]); + if (entry->key == NULL) + return NULL; + + if (h->nocase) { + while (entry && ((entry->len != len) + || (keycmp_nocase(entry, key) != 0))) + entry = entry->next; + } + else { + while (entry && ((entry->len != len) + || (keycmp_case(entry, key) != 0))) + entry = entry->next; + } + + return entry; +} + + +int32 +hash_table_lookup(hash_table_t * h, const char *key, void ** val) +{ + hash_entry_t *entry; + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + + entry = lookup(h, hash, key, len); + if (entry) { + if (val) + *val = entry->val; + return 0; + } + else + return -1; +} + +int32 +hash_table_lookup_int32(hash_table_t * h, const char *key, int32 *val) +{ + void *vval; + int32 rv; + + rv = hash_table_lookup(h, key, &vval); + if (rv != 0) + return rv; + if (val) + *val = (int32)(long)vval; + return 0; +} + + +int32 +hash_table_lookup_bkey(hash_table_t * h, const char *key, size_t len, void ** val) +{ + hash_entry_t *entry; + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + entry = lookup(h, hash, key, len); + if (entry) { + if (val) + *val = entry->val; + return 0; + } + else + return -1; +} + +int32 +hash_table_lookup_bkey_int32(hash_table_t * h, const char *key, size_t len, int32 *val) +{ + void *vval; + int32 rv; + + rv = hash_table_lookup_bkey(h, key, len, &vval); + if (rv != 0) + return rv; + if (val) + *val = (int32)(long)vval; + return 0; +} + + +static void * +enter(hash_table_t * h, uint32 hash, const char *key, size_t len, void *val, int32 replace) +{ + hash_entry_t *cur, *new; + + if ((cur = lookup(h, hash, key, len)) != NULL) { + void *oldval; + /* Key already exists. */ + oldval = cur->val; + if (replace) { + /* Replace the pointer if replacement is requested, + * because this might be a different instance of the same + * string (this verges on magic, sorry) */ + cur->key = key; + cur->val = val; + } + return oldval; + } + + cur = &(h->table[hash]); + if (cur->key == NULL) { + /* Empty slot at hashed location; add this entry */ + cur->key = key; + cur->len = len; + cur->val = val; + + /* Added by ARCHAN at 20050515. This allows deletion could work. */ + cur->next = NULL; + + } + else { + /* Key collision; create new entry and link to hashed location */ + new = (hash_entry_t *) ckd_calloc(1, sizeof(hash_entry_t)); + new->key = key; + new->len = len; + new->val = val; + new->next = cur->next; + cur->next = new; + } + ++h->inuse; + + return val; +} + +/* 20050523 Added by ARCHAN to delete a key from a hash table */ +static void * +delete(hash_table_t * h, uint32 hash, const char *key, size_t len) +{ + hash_entry_t *entry, *prev; + void *val; + + prev = NULL; + entry = &(h->table[hash]); + if (entry->key == NULL) + return NULL; + + if (h->nocase) { + while (entry && ((entry->len != len) + || (keycmp_nocase(entry, key) != 0))) { + prev = entry; + entry = entry->next; + } + } + else { + while (entry && ((entry->len != len) + || (keycmp_case(entry, key) != 0))) { + prev = entry; + entry = entry->next; + } + } + + if (entry == NULL) + return NULL; + + /* At this point, entry will be the one required to be deleted, prev + will contain the previous entry + */ + val = entry->val; + + if (prev == NULL) { + /* That is to say the entry in the hash table (not the chain) matched the key. */ + /* We will then copy the things from the next entry to the hash table */ + prev = entry; + if (entry->next) { /* There is a next entry, great, copy it. */ + entry = entry->next; + prev->key = entry->key; + prev->len = entry->len; + prev->val = entry->val; + prev->next = entry->next; + ckd_free(entry); + } + else { /* There is not a next entry, just set the key to null */ + prev->key = NULL; + prev->len = 0; + prev->next = NULL; + } + + } + else { /* This case is simple */ + prev->next = entry->next; + ckd_free(entry); + } + + /* Do wiring and free the entry */ + + --h->inuse; + + return val; +} + +void +hash_table_empty(hash_table_t *h) +{ + hash_entry_t *e, *e2; + int32 i; + + for (i = 0; i < h->size; i++) { + /* Free collision lists. */ + for (e = h->table[i].next; e; e = e2) { + e2 = e->next; + ckd_free((void *) e); + } + memset(&h->table[i], 0, sizeof(h->table[i])); + } + h->inuse = 0; +} + + +void * +hash_table_enter(hash_table_t * h, const char *key, void *val) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + return (enter(h, hash, key, len, val, 0)); +} + +void * +hash_table_replace(hash_table_t * h, const char *key, void *val) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + return (enter(h, hash, key, len, val, 1)); +} + +void * +hash_table_delete(hash_table_t * h, const char *key) +{ + uint32 hash; + size_t len; + + hash = key2hash(h, key); + len = strlen(key); + + return (delete(h, hash, key, len)); +} + +void * +hash_table_enter_bkey(hash_table_t * h, const char *key, size_t len, void *val) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (enter(h, hash, key, len, val, 0)); +} + +void * +hash_table_replace_bkey(hash_table_t * h, const char *key, size_t len, void *val) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (enter(h, hash, key, len, val, 1)); +} + +void * +hash_table_delete_bkey(hash_table_t * h, const char *key, size_t len) +{ + uint32 hash; + char *str; + + str = makekey((uint8 *) key, len, NULL); + hash = key2hash(h, str); + ckd_free(str); + + return (delete(h, hash, key, len)); +} + +void +hash_table_display(hash_table_t * h, int32 showdisplay) +{ + hash_entry_t *e; + int i, j; + j = 0; + + printf("Hash with chaining representation of the hash table\n"); + + for (i = 0; i < h->size; i++) { + e = &(h->table[i]); + if (e->key != NULL) { + printf("|key:"); + if (showdisplay) + printf("%s", e->key); + else + printf("%p", e->key); + + printf("|len:%zd|val=%ld|->", e->len, (long)e->val); + if (e->next == NULL) { + printf("NULL\n"); + } + j++; + + for (e = e->next; e; e = e->next) { + printf("|key:"); + if (showdisplay) + printf("%s", e->key); + + printf("|len:%zd|val=%ld|->", e->len, (long)e->val); + if (e->next == NULL) { + printf("NULL\n"); + } + j++; + } + } + } + + printf("The total number of keys =%d\n", j); +} + + +glist_t +hash_table_tolist(hash_table_t * h, int32 * count) +{ + glist_t g; + hash_entry_t *e; + int32 i, j; + + g = NULL; + + j = 0; + for (i = 0; i < h->size; i++) { + e = &(h->table[i]); + + if (e->key != NULL) { + g = glist_add_ptr(g, (void *) e); + j++; + + for (e = e->next; e; e = e->next) { + g = glist_add_ptr(g, (void *) e); + j++; + } + } + } + + if (count) + *count = j; + + return g; +} + +hash_iter_t * +hash_table_iter(hash_table_t *h) +{ + hash_iter_t *itor; + + itor = ckd_calloc(1, sizeof(*itor)); + itor->ht = h; + return hash_table_iter_next(itor); +} + +hash_iter_t * +hash_table_iter_next(hash_iter_t *itor) +{ + /* If there is an entry, walk down its list. */ + if (itor->ent) + itor->ent = itor->ent->next; + /* If we got to the end of the chain, or we had no entry, scan + * forward in the table to find the next non-empty bucket. */ + if (itor->ent == NULL) { + while (itor->idx < (size_t)itor->ht->size + && itor->ht->table[itor->idx].key == NULL) + ++itor->idx; + /* If we did not find one then delete the iterator and + * return NULL. */ + if (itor->idx == (size_t)itor->ht->size) { + hash_table_iter_free(itor); + return NULL; + } + /* Otherwise use this next entry. */ + itor->ent = itor->ht->table + itor->idx; + /* Increase idx for the next time around. */ + ++itor->idx; + } + return itor; +} + +void +hash_table_iter_free(hash_iter_t *itor) +{ + ckd_free(itor); +} + +void +hash_table_free(hash_table_t * h) +{ + hash_entry_t *e, *e2; + int32 i; + + if (h == NULL) + return; + + /* Free additional entries created for key collision cases */ + for (i = 0; i < h->size; i++) { + for (e = h->table[i].next; e; e = e2) { + e2 = e->next; + ckd_free((void *) e); + } + } + + ckd_free((void *) h->table); + ckd_free((void *) h); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c new file mode 100644 index 0000000..e3b4421 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c @@ -0,0 +1,292 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * heap.c -- Generic heap structure for inserting in any and popping in sorted + * order. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: heap.c,v $ + * Revision 1.4 2005/06/22 03:05:49 arthchan2003 + * 1, Fixed doxygen documentation, 2, Add keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 05-Mar-99 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Fixed bug in heap_destroy() (in while loop exit condition). + * + * 23-Dec-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Started. + */ + + +#include +#include +#include +#include + +#include "sphinxbase/heap.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" + +/** + * One node on the heap + */ +typedef struct heapnode_s { + void *data; /**< Application data at this node */ + int32 val; /**< Associated with above application data; according to which + heap is sorted (in ascending order) */ + int32 nl, nr; /**< left/right descendants of this node (for balancing heap) */ + struct heapnode_s *l; /**< Root of left descendant heap */ + struct heapnode_s *r; /**< Root of right descendant heap */ +} heapnode_t; + +/** + * Internal heap data structure. + */ +struct heap_s { + heapnode_t *top; +}; + + +#if 0 +static void +heap_dump(heapnode_t * top, int32 level) +{ + int32 i; + + if (!top) + return; + + for (i = 0; i < level; i++) + printf(" "); + /* print top info */ + heap_dump(top->l, level + 1); + heap_dump(top->r, level + 1); +} +#endif + + +heap_t * +heap_new(void) +{ + heap_t *h = ckd_calloc(1, sizeof(*h)); + return h; +} + + +static heapnode_t * +subheap_insert(heapnode_t * root, void *data, int32 val) +{ + heapnode_t *h; + void *tmpdata; + int32 tmpval; + + if (!root) { + h = (heapnode_t *) ckd_calloc(1, sizeof(heapnode_t)); + h->data = data; + h->val = val; + h->l = h->r = NULL; + h->nl = h->nr = 0; + return h; + } + + /* Root already exists; if new value is less, replace root node */ + if (root->val > val) { + tmpdata = root->data; + tmpval = root->val; + root->data = data; + root->val = val; + data = tmpdata; + val = tmpval; + } + + /* Insert new or old (replaced) node in right or left subtree; keep them balanced */ + if (root->nl > root->nr) { + root->r = subheap_insert(root->r, data, val); + root->nr++; + } + else { + root->l = subheap_insert(root->l, data, val); + root->nl++; + } + + return root; +} + + +int +heap_insert(heap_t *heap, void *data, int32 val) +{ + heap->top = subheap_insert(heap->top, data, val); + return 0; +} + + +static heapnode_t * +subheap_pop(heapnode_t * root) +{ + heapnode_t *l, *r; + + /* Propagate best value from below into root, if any */ + l = root->l; + r = root->r; + + if (!l) { + if (!r) { + ckd_free((char *) root); + return NULL; + } + else { + root->data = r->data; + root->val = r->val; + root->r = subheap_pop(r); + root->nr--; + } + } + else { + if ((!r) || (l->val < r->val)) { + root->data = l->data; + root->val = l->val; + root->l = subheap_pop(l); + root->nl--; + } + else { + root->data = r->data; + root->val = r->val; + root->r = subheap_pop(r); + root->nr--; + } + } + + return root; +} + + +int +heap_pop(heap_t *heap, void **data, int32 * val) +{ + if (heap->top == NULL) + return 0; + *data = heap->top->data; + *val = heap->top->val; + heap->top = subheap_pop(heap->top); + return 1; +} + + +int +heap_top(heap_t *heap, void **data, int32 * val) +{ + if (heap->top == NULL) + return 0; + *data = heap->top->data; + *val = heap->top->val; + return 1; +} + +static int +heap_remove_one(heap_t *heap, heapnode_t *top, void *data) +{ + if (top == NULL) + return -1; + else if (top->data == data) { + assert(top == heap->top); + heap->top = subheap_pop(heap->top); + return 0; + } + if (top->l) { + if (top->l->data == data) { + top->l = subheap_pop(top->l); + --top->nl; + return 0; + } + else if (heap_remove_one(heap, top->l, data) == 0) { + --top->nl; + return 0; + } + } + if (top->r) { + if (top->r->data == data) { + top->r = subheap_pop(top->r); + --top->nr; + return 0; + } + else if (heap_remove_one(heap, top->r, data) == 0) { + --top->nr; + return 0; + } + } + return -1; +} + +int +heap_remove(heap_t *heap, void *data) +{ + return heap_remove_one(heap, heap->top, data); +} + + +size_t +heap_size(heap_t *heap) +{ + if (heap->top == NULL) + return 0; + return heap->top->nl + heap->top->nr + 1; +} + +int +heap_destroy(heap_t *heap) +{ + void *data; + int32 val; + + /* Empty the heap and free it */ + while (heap_pop(heap, &data, &val) > 0) + ; + ckd_free(heap); + + return 0; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c new file mode 100644 index 0000000..4374c84 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c @@ -0,0 +1,295 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include + +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/listelem_alloc.h" +#include "sphinxbase/glist.h" + +/** + * Fast linked list allocator. + * + * We keep a separate linked list for each element-size. Element-size + * must be a multiple of pointer-size. + * + * Initially a block of empty elements is allocated, where the first + * machine word in each element points to the next available element. + * To allocate, we use this pointer to move the freelist to the next + * element, then return the current element. + * + * The last element in the list starts with a NULL pointer, which is + * used as a signal to allocate a new block of elements. + * + * In order to be able to actually release the memory allocated, we + * have to add a linked list of block pointers. This shouldn't create + * much overhead since we never access it except when freeing the + * allocator. + */ +struct listelem_alloc_s { + char **freelist; /**< ptr to first element in freelist */ + glist_t blocks; /**< Linked list of blocks allocated. */ + glist_t blocksize; /**< Number of elements in each block */ + size_t elemsize; /**< Number of (char *) in element */ + size_t blk_alloc; /**< Number of alloc operations before increasing blocksize */ + size_t n_blocks; + size_t n_alloc; + size_t n_freed; +}; + +#define MIN_ALLOC 50 /**< Minimum number of elements to allocate in one block */ +#define BLKID_SHIFT 16 /**< Bit position of block number in element ID */ +#define BLKID_MASK ((1<freelist = NULL; + list->blocks = NULL; + list->elemsize = elemsize; + /* Intent of this is to increase block size once we allocate + * 256KiB (i.e. 1<<18). If somehow the element size is big enough + * to overflow that, just fail, people should use malloc anyway. */ + list->blk_alloc = (1 << 18) / (MIN_ALLOC * elemsize); + if (list->blk_alloc <= 0) { + E_ERROR("Element size * block size exceeds 256k, use malloc instead.\n"); + ckd_free(list); + return NULL; + } + list->n_alloc = 0; + list->n_freed = 0; + + /* Allocate an initial block to minimize latency. */ + listelem_add_block(list, __FILE__, __LINE__); + return list; +} + +void +listelem_alloc_free(listelem_alloc_t *list) +{ + gnode_t *gn; + if (list == NULL) + return; + for (gn = list->blocks; gn; gn = gnode_next(gn)) + ckd_free(gnode_ptr(gn)); + glist_free(list->blocks); + glist_free(list->blocksize); + ckd_free(list); +} + +static void +listelem_add_block(listelem_alloc_t *list, char *caller_file, int caller_line) +{ + char **cpp, *cp; + size_t j; + int32 blocksize; + + blocksize = list->blocksize ? gnode_int32(list->blocksize) : MIN_ALLOC; + /* Check if block size should be increased (if many requests for this size) */ + if (list->blk_alloc == 0) { + /* See above. No sense in allocating blocks bigger than + * 256KiB (well, actually, there might be, but we'll worry + * about that later). */ + blocksize <<= 1; + if (blocksize * list->elemsize > (1 << 18)) + blocksize = (1 << 18) / list->elemsize; + list->blk_alloc = (1 << 18) / (blocksize * list->elemsize); + } + + /* Allocate block */ + cpp = list->freelist = + (char **) __ckd_calloc__(blocksize, list->elemsize, + caller_file, caller_line); + list->blocks = glist_add_ptr(list->blocks, cpp); + list->blocksize = glist_add_int32(list->blocksize, blocksize); + cp = (char *) cpp; + /* Link up the blocks via their first machine word. */ + for (j = blocksize - 1; j > 0; --j) { + cp += list->elemsize; + *cpp = cp; + cpp = (char **) cp; + } + /* Make sure the last element's forward pointer is NULL */ + *cpp = NULL; + --list->blk_alloc; + ++list->n_blocks; +} + + +void * +__listelem_malloc__(listelem_alloc_t *list, char *caller_file, int caller_line) +{ + char **ptr; + + /* Allocate a new block if list empty */ + if (list->freelist == NULL) + listelem_add_block(list, caller_file, caller_line); + + /* Unlink and return first element in freelist */ + ptr = list->freelist; + list->freelist = (char **) (*(list->freelist)); + (list->n_alloc)++; + + return (void *)ptr; +} + +void * +__listelem_malloc_id__(listelem_alloc_t *list, char *caller_file, + int caller_line, int32 *out_id) +{ + char **ptr; + + /* Allocate a new block if list empty */ + if (list->freelist == NULL) + listelem_add_block(list, caller_file, caller_line); + + /* Unlink and return first element in freelist */ + ptr = list->freelist; + list->freelist = (char **) (*(list->freelist)); + (list->n_alloc)++; + + if (out_id) { + int32 blksize, blkidx, ptridx; + gnode_t *gn, *gn2; + char **block; + + gn2 = list->blocksize; + block = NULL; + blkidx = 0; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + block = gnode_ptr(gn); + blksize = gnode_int32(gn2) * list->elemsize / sizeof(*block); + if (ptr >= block && ptr < block + blksize) + break; + gn2 = gnode_next(gn2); + ++blkidx; + } + if (gn == NULL) { + E_ERROR("Failed to find block index for pointer %p!\n", ptr); + } + ptridx = (ptr - block) / (list->elemsize / sizeof(*block)); + E_DEBUG("ptr %p block %p blkidx %d ptridx %d\n", + ptr, block, list->n_blocks - blkidx - 1, ptridx); + *out_id = ((list->n_blocks - blkidx - 1) << BLKID_SHIFT) | ptridx; + } + + return ptr; +} + +void * +listelem_get_item(listelem_alloc_t *list, int32 id) +{ + int32 blkidx, ptridx, i; + gnode_t *gn; + + blkidx = (id >> BLKID_SHIFT) & BLKID_MASK; + ptridx = id & BLKID_MASK; + + i = 0; + blkidx = list->n_blocks - blkidx; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + if (++i == blkidx) + break; + } + if (gn == NULL) { + E_ERROR("Failed to find block index %d\n", blkidx); + return NULL; + } + + return (void *)((char **)gnode_ptr(gn) + + ptridx * (list->elemsize / sizeof(void *))); +} + +void +__listelem_free__(listelem_alloc_t *list, void *elem, + char *caller_file, int caller_line) +{ + char **cpp; + (void)caller_file; + (void)caller_line; + /* + * Insert freed item at head of list. + */ + cpp = (char **) elem; + *cpp = (char *) list->freelist; + list->freelist = cpp; + (list->n_freed)++; +} + + +void +listelem_stats(listelem_alloc_t *list) +{ + gnode_t *gn, *gn2; + char **cpp; + size_t n; + + E_INFO("Linklist stats:\n"); + for (n = 0, cpp = list->freelist; cpp; + cpp = (char **) (*cpp), n++); + E_INFO + ("elemsize %lu, #alloc %lu, #freed %lu, #freelist %lu\n", + (unsigned long)list->elemsize, + (unsigned long)list->n_alloc, + (unsigned long)list->n_freed, + (unsigned long)n); + E_INFO("Allocated blocks:\n"); + gn2 = list->blocksize; + for (gn = list->blocks; gn; gn = gnode_next(gn)) { + E_INFO("%p (%d * %d bytes)\n", gnode_ptr(gn), gnode_int32(gn2), list->elemsize); + gn2 = gnode_next(gn2); + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c new file mode 100644 index 0000000..78a042a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c @@ -0,0 +1,503 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2007 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#include +#include +#include + +#include "sphinxbase/logmath.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/mmio.h" +#include "sphinxbase/bio.h" +#include "sphinxbase/strfuncs.h" + +struct logmath_s { + logadd_t t; + int refcount; + mmio_file_t *filemap; + float64 base; + float64 log_of_base; + float64 log10_of_base; + float64 inv_log_of_base; + float64 inv_log10_of_base; + int32 zero; +}; + +logmath_t * +logmath_init(float64 base, int shift, int use_table) +{ + logmath_t *lmath; + uint32 maxyx, i; + float64 byx; + int width; + + /* Check that the base is correct. */ + if (base <= 1.0) { + E_ERROR("Base must be greater than 1.0\n"); + return NULL; + } + + /* Set up various necessary constants. */ + lmath = ckd_calloc(1, sizeof(*lmath)); + lmath->refcount = 1; + lmath->base = base; + lmath->log_of_base = log(base); + lmath->log10_of_base = log10(base); + lmath->inv_log_of_base = 1.0/lmath->log_of_base; + lmath->inv_log10_of_base = 1.0/lmath->log10_of_base; + lmath->t.shift = shift; + /* Shift this sufficiently that overflows can be avoided. */ + lmath->zero = MAX_NEG_INT32 >> (shift + 2); + + if (!use_table) + return lmath; + + /* Create a logadd table with the appropriate width */ + maxyx = (uint32) (log(2.0) / log(base) + 0.5) >> shift; + /* Poor man's log2 */ + if (maxyx < 256) width = 1; + else if (maxyx < 65536) width = 2; + else width = 4; + + lmath->t.width = width; + /* Figure out size of add table required. */ + byx = 1.0; /* Maximum possible base^{y-x} value - note that this implies that y-x == 0 */ + for (i = 0;; ++i) { + float64 lobyx = log(1.0 + byx) * lmath->inv_log_of_base; /* log_{base}(1 + base^{y-x}); */ + int32 k = (int32) (lobyx + 0.5 * (1<> shift; /* Round to shift */ + + /* base^{y-x} has reached the smallest representable value. */ + if (k <= 0) + break; + + /* This table is indexed by -(y-x), so we multiply byx by + * base^{-1} here which is equivalent to subtracting one from + * (y-x). */ + byx /= base; + } + i >>= shift; + + /* Never produce a table smaller than 256 entries. */ + if (i < 255) i = 255; + + lmath->t.table = ckd_calloc(i+1, width); + lmath->t.table_size = i + 1; + /* Create the add table (see above). */ + byx = 1.0; + for (i = 0;; ++i) { + float64 lobyx = log(1.0 + byx) * lmath->inv_log_of_base; + int32 k = (int32) (lobyx + 0.5 * (1<> shift; /* Round to shift */ + uint32 prev = 0; + + /* Check any previous value - if there is a shift, we want to + * only store the highest one. */ + switch (width) { + case 1: + prev = ((uint8 *)lmath->t.table)[i >> shift]; + break; + case 2: + prev = ((uint16 *)lmath->t.table)[i >> shift]; + break; + case 4: + prev = ((uint32 *)lmath->t.table)[i >> shift]; + break; + } + if (prev == 0) { + switch (width) { + case 1: + ((uint8 *)lmath->t.table)[i >> shift] = (uint8) k; + break; + case 2: + ((uint16 *)lmath->t.table)[i >> shift] = (uint16) k; + break; + case 4: + ((uint32 *)lmath->t.table)[i >> shift] = (uint32) k; + break; + } + } + if (k <= 0) + break; + + /* Decay base^{y-x} exponentially according to base. */ + byx /= base; + } + + return lmath; +} + +logmath_t * +logmath_read(const char *file_name) +{ + logmath_t *lmath; + char **argname, **argval; + int32 byteswap, i; + int chksum_present, do_mmap; + uint32 chksum; + long pos; + FILE *fp; + + E_INFO("Reading log table file '%s'\n", file_name); + if ((fp = fopen(file_name, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open log table file '%s' for reading", file_name); + return NULL; + } + + /* Read header, including argument-value info and 32-bit byteorder magic */ + if (bio_readhdr(fp, &argname, &argval, &byteswap) < 0) { + E_ERROR("Failed to read the header from the file '%s'\n", file_name); + fclose(fp); + return NULL; + } + + lmath = ckd_calloc(1, sizeof(*lmath)); + /* Default values. */ + lmath->t.shift = 0; + lmath->t.width = 2; + lmath->base = 1.0001; + + /* Parse argument-value list */ + chksum_present = 0; + for (i = 0; argname[i]; i++) { + if (strcmp(argname[i], "version") == 0) { + } + else if (strcmp(argname[i], "chksum0") == 0) { + if (strcmp(argval[i], "yes") == 0) + chksum_present = 1; + } + else if (strcmp(argname[i], "width") == 0) { + lmath->t.width = atoi(argval[i]); + } + else if (strcmp(argname[i], "shift") == 0) { + lmath->t.shift = atoi(argval[i]); + } + else if (strcmp(argname[i], "logbase") == 0) { + lmath->base = atof_c(argval[i]); + } + } + bio_hdrarg_free(argname, argval); + chksum = 0; + + /* Set up various necessary constants. */ + lmath->log_of_base = log(lmath->base); + lmath->log10_of_base = log10(lmath->base); + lmath->inv_log_of_base = 1.0/lmath->log_of_base; + lmath->inv_log10_of_base = 1.0/lmath->log10_of_base; + /* Shift this sufficiently that overflows can be avoided. */ + lmath->zero = MAX_NEG_INT32 >> (lmath->t.shift + 2); + + /* #Values to follow */ + if (bio_fread(&lmath->t.table_size, sizeof(int32), 1, fp, byteswap, &chksum) != 1) { + E_ERROR("Failed to read values from the file '%s'", file_name); + goto error_out; + } + + /* Check alignment constraints for memory mapping */ + do_mmap = 1; + pos = ftell(fp); + if (pos & ((long)lmath->t.width - 1)) { + E_WARN("%s: Data start %ld is not aligned on %d-byte boundary, will not memory map\n", + file_name, pos, lmath->t.width); + do_mmap = 0; + } + /* Check byte order for memory mapping */ + if (byteswap) { + E_WARN("%s: Data is wrong-endian, will not memory map\n", file_name); + do_mmap = 0; + } + + if (do_mmap) { + lmath->filemap = mmio_file_read(file_name); + lmath->t.table = (char *)mmio_file_ptr(lmath->filemap) + pos; + } + else { + lmath->t.table = ckd_calloc(lmath->t.table_size, lmath->t.width); + if ((uint32)bio_fread(lmath->t.table, lmath->t.width, lmath->t.table_size, + fp, byteswap, &chksum) != lmath->t.table_size) { + E_ERROR("Failed to read data (%d x %d bytes) from the file '%s' failed", + lmath->t.table_size, lmath->t.width, file_name); + goto error_out; + } + if (chksum_present) + bio_verify_chksum(fp, byteswap, chksum); + + if (fread(&i, 1, 1, fp) == 1) { + E_ERROR("%s: More data than expected\n", file_name); + goto error_out; + } + } + fclose(fp); + + return lmath; +error_out: + logmath_free(lmath); + return NULL; +} + +int32 +logmath_write(logmath_t *lmath, const char *file_name) +{ + FILE *fp; + long pos; + uint32 chksum; + + if (lmath->t.table == NULL) { + E_ERROR("No log table to write!\n"); + return -1; + } + + E_INFO("Writing log table file '%s'\n", file_name); + if ((fp = fopen(file_name, "wb")) == NULL) { + E_ERROR_SYSTEM("Failed to open logtable file '%s' for writing", file_name); + return -1; + } + + /* For whatever reason, we have to do this manually at the + * moment. */ + fprintf(fp, "s3\nversion 1.0\nchksum0 yes\n"); + fprintf(fp, "width %d\n", lmath->t.width); + fprintf(fp, "shift %d\n", lmath->t.shift); + fprintf(fp, "logbase %f\n", lmath->base); + /* Pad it out to ensure alignment. */ + pos = ftell(fp) + strlen("endhdr\n"); + if (pos & ((long)lmath->t.width - 1)) { + size_t align = lmath->t.width - (pos & ((long)lmath->t.width - 1)); + assert(lmath->t.width <= 8); + fwrite(" " /* 8 spaces */, 1, align, fp); + } + fprintf(fp, "endhdr\n"); + + /* Now write the binary data. */ + chksum = (uint32)BYTE_ORDER_MAGIC; + fwrite(&chksum, sizeof(uint32), 1, fp); + chksum = 0; + /* #Values to follow */ + if (bio_fwrite(&lmath->t.table_size, sizeof(uint32), + 1, fp, 0, &chksum) != 1) { + E_ERROR("Failed to write data to a file '%s'", file_name); + goto error_out; + } + + if ((uint32)bio_fwrite(lmath->t.table, lmath->t.width, lmath->t.table_size, + fp, 0, &chksum) != lmath->t.table_size) { + E_ERROR("Failed to write data (%d x %d bytes) to the file '%s'", + lmath->t.table_size, lmath->t.width, file_name); + goto error_out; + } + if (bio_fwrite(&chksum, sizeof(uint32), 1, fp, 0, NULL) != 1) { + E_ERROR("Failed to write checksum to the file '%s'", file_name); + goto error_out; + } + + fclose(fp); + return 0; + +error_out: + fclose(fp); + return -1; +} + +logmath_t * +logmath_retain(logmath_t *lmath) +{ + ++lmath->refcount; + return lmath; +} + +int +logmath_free(logmath_t *lmath) +{ + if (lmath == NULL) + return 0; + if (--lmath->refcount > 0) + return lmath->refcount; + if (lmath->filemap) + mmio_file_unmap(lmath->filemap); + else + ckd_free(lmath->t.table); + ckd_free(lmath); + return 0; +} + +int32 +logmath_get_table_shape(logmath_t *lmath, uint32 *out_size, + uint32 *out_width, uint32 *out_shift) +{ + if (out_size) *out_size = lmath->t.table_size; + if (out_width) *out_width = lmath->t.width; + if (out_shift) *out_shift = lmath->t.shift; + + return lmath->t.table_size * lmath->t.width; +} + +float64 +logmath_get_base(logmath_t *lmath) +{ + return lmath->base; +} + +int +logmath_get_zero(logmath_t *lmath) +{ + return lmath->zero; +} + +int +logmath_get_width(logmath_t *lmath) +{ + return lmath->t.width; +} + +int +logmath_get_shift(logmath_t *lmath) +{ + return lmath->t.shift; +} + +int +logmath_add(logmath_t *lmath, int logb_x, int logb_y) +{ + logadd_t *t = LOGMATH_TABLE(lmath); + int d, r; + + /* handle 0 + x = x case. */ + if (logb_x <= lmath->zero) + return logb_y; + if (logb_y <= lmath->zero) + return logb_x; + + if (t->table == NULL) + return logmath_add_exact(lmath, logb_x, logb_y); + + /* d must be positive, obviously. */ + if (logb_x > logb_y) { + d = (logb_x - logb_y); + r = logb_x; + } + else { + d = (logb_y - logb_x); + r = logb_y; + } + + if (d < 0) { + /* Some kind of overflow has occurred, fail gracefully. */ + return r; + } + if ((size_t)d >= t->table_size) { + /* If this happens, it's not actually an error, because the + * last entry in the logadd table is guaranteed to be zero. + * Therefore we just return the larger of the two values. */ + return r; + } + + switch (t->width) { + case 1: + return r + (((uint8 *)t->table)[d]); + case 2: + return r + (((uint16 *)t->table)[d]); + case 4: + return r + (((uint32 *)t->table)[d]); + } + return r; +} + +int +logmath_add_exact(logmath_t *lmath, int logb_p, int logb_q) +{ + return logmath_log(lmath, + logmath_exp(lmath, logb_p) + + logmath_exp(lmath, logb_q)); +} + +int +logmath_log(logmath_t *lmath, float64 p) +{ + if (p <= 0) { + return lmath->zero; + } + return (int)(log(p) * lmath->inv_log_of_base) >> lmath->t.shift; +} + +float64 +logmath_exp(logmath_t *lmath, int logb_p) +{ + return pow(lmath->base, (float64)(logb_p << lmath->t.shift)); +} + +int +logmath_ln_to_log(logmath_t *lmath, float64 log_p) +{ + return (int)(log_p * lmath->inv_log_of_base) >> lmath->t.shift; +} + +float64 +logmath_log_to_ln(logmath_t *lmath, int logb_p) +{ + return (float64)(logb_p << lmath->t.shift) * lmath->log_of_base; +} + +int +logmath_log10_to_log(logmath_t *lmath, float64 log_p) +{ + return (int)(log_p * lmath->inv_log10_of_base) >> lmath->t.shift; +} + +float +logmath_log10_to_log_float(logmath_t *lmath, float64 log_p) +{ + int i; + float res = (float)(log_p * lmath->inv_log10_of_base); + for (i = 0; i < lmath->t.shift; i++) + res /= 2.0f; + return res; +} + +float64 +logmath_log_to_log10(logmath_t *lmath, int logb_p) +{ + return (float64)(logb_p << lmath->t.shift) * lmath->log10_of_base; +} + +float64 +logmath_log_float_to_log10(logmath_t *lmath, float log_p) +{ + int i; + for (i = 0; i < lmath->t.shift; i++) { + log_p *= 2; + } + return log_p * lmath->log10_of_base; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py new file mode 100644 index 0000000..b0ea263 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python + +import sys, os +import fortran +import clapack_scrub + +try: set +except NameError: + from sets import Set as set + +# Arguments to pass to f2c. You'll always want -A for ANSI C prototypes +# Others of interest: -a to not make variables static by default +# -C to check array subscripts +F2C_ARGS = '-A' + +# The header to add to the top of the *_lite.c file. Note that slamch_() calls +# will be replaced by the macros below by clapack_scrub.scrub_source() +HEADER = '''\ +/* +NOTE: This is generated code. Look in README.python for information on + remaking this file. +*/ +#include "f2c.h" + +#ifdef HAVE_CONFIG +#include "config.h" +#else +extern doublereal slamch_(char *); +#define EPSILON slamch_("Epsilon") +#define SAFEMINIMUM slamch_("Safe minimum") +#define PRECISION slamch_("Precision") +#define BASE slamch_("Base") +#endif + + +extern doublereal slapy2_(real *, real *); + +''' + +class FortranRoutine: + """Wrapper for a Fortran routine in a file. + """ + type = 'generic' + def __init__(self, name=None, filename=None): + self.filename = filename + if name is None: + root, ext = os.path.splitext(filename) + name = root + self.name = name + self._dependencies = None + + def dependencies(self): + if self._dependencies is None: + deps = fortran.getDependencies(self.filename) + self._dependencies = [d.lower() for d in deps] + return self._dependencies + +class UnknownFortranRoutine(FortranRoutine): + """Wrapper for a Fortran routine for which the corresponding file + is not known. + """ + type = 'unknown' + def __init__(self, name): + FortranRoutine.__init__(self, name=name, filename='') + + def dependencies(self): + return [] + +class FortranLibrary: + """Container for a bunch of Fortran routines. + """ + def __init__(self, src_dirs): + self._src_dirs = src_dirs + self.names_to_routines = {} + + def _findRoutine(self, rname): + rname = rname.lower() + for s in self._src_dirs: + ffilename = os.path.join(s, rname + '.f') + if os.path.exists(ffilename): + return self._newFortranRoutine(rname, ffilename) + return UnknownFortranRoutine(rname) + + def _newFortranRoutine(self, rname, filename): + return FortranRoutine(rname, filename) + + def addIgnorableRoutine(self, rname): + """Add a routine that we don't want to consider when looking at + dependencies. + """ + rname = rname.lower() + routine = UnknownFortranRoutine(rname) + self.names_to_routines[rname] = routine + + def addRoutine(self, rname): + """Add a routine to the library. + """ + self.getRoutine(rname) + + def getRoutine(self, rname): + """Get a routine from the library. Will add if it's not found. + """ + unique = [] + rname = rname.lower() + routine = self.names_to_routines.get(rname, unique) + if routine is unique: + routine = self._findRoutine(rname) + self.names_to_routines[rname] = routine + return routine + + def allRoutineNames(self): + """Return the names of all the routines. + """ + return self.names_to_routines.keys() + + def allRoutines(self): + """Return all the routines. + """ + return self.names_to_routines.values() + + def resolveAllDependencies(self): + """Try to add routines to the library to satisfy all the dependencies + for each routine in the library. + + Returns a set of routine names that have the dependencies unresolved. + """ + done_this = set() + last_todo = set() + while 1: + todo = set(self.allRoutineNames()) - done_this + if todo == last_todo: + break + for rn in todo: + r = self.getRoutine(rn) + deps = r.dependencies() + for d in deps: + self.addRoutine(d) + done_this.add(rn) + last_todo = todo + return todo + +class LapackLibrary(FortranLibrary): + def _newFortranRoutine(self, rname, filename): + routine = FortranLibrary._newFortranRoutine(self, rname, filename) + if filename.find('BLAS') != -1: + routine.type = 'blas' + elif rname.startswith('z'): + routine.type = 'zlapack' + else: + routine.type = 'slapack' + return routine + + def allRoutinesByType(self, typename): + routines = [(r.name,r) for r in self.allRoutines() if r.type == typename] + routines.sort() + return [a[1] for a in routines] + +def printRoutineNames(desc, routines): + print desc + for r in routines: + print '\t%s' % r.name + +def getLapackRoutines(wrapped_routines, ignores, lapack_dir): + blas_src_dir = os.path.join(lapack_dir, 'BLAS', 'SRC') + if not os.path.exists(blas_src_dir): + blas_src_dir = os.path.join(lapack_dir, 'blas', 'src') + lapack_src_dir = os.path.join(lapack_dir, 'SRC') + if not os.path.exists(lapack_src_dir): + lapack_src_dir = os.path.join(lapack_dir, 'src') + library = LapackLibrary([blas_src_dir, lapack_src_dir]) + + for r in ignores: + library.addIgnorableRoutine(r) + + for w in wrapped_routines: + library.addRoutine(w) + + library.resolveAllDependencies() + + return library + +def getWrappedRoutineNames(wrapped_routines_file): + fo = open(wrapped_routines_file) + routines = [] + ignores = [] + for line in fo: + line = line.strip() + if not line or line.startswith('#'): + continue + if line.startswith('IGNORE:'): + line = line[7:].strip() + ig = line.split() + ignores.extend(ig) + else: + routines.append(line) + return routines, ignores + +def dumpRoutineNames(library, output_dir): + for typename in ['unknown', 'blas', 'slapack', 'zlapack']: + routines = library.allRoutinesByType(typename) + filename = os.path.join(output_dir, typename + '_routines.lst') + fo = open(filename, 'w') + for r in routines: + deps = r.dependencies() + fo.write('%s: %s\n' % (r.name, ' '.join(deps))) + fo.close() + +def concatenateRoutines(routines, output_file): + output_fo = open(output_file, 'w') + for r in routines: + fo = open(r.filename, 'r') + source = fo.read() + fo.close() + output_fo.write(source) + output_fo.close() + +class F2CError(Exception): + pass + +def runF2C(fortran_filename, output_dir): + # we're assuming no funny business that needs to be quoted for the shell + cmd = "f2c %s -d %s %s" % (F2C_ARGS, output_dir, fortran_filename) + rc = os.system(cmd) + if rc != 0: + raise F2CError + +def scrubF2CSource(c_file): + fo = open(c_file, 'r') + source = fo.read() + fo.close() + source = clapack_scrub.scrubSource(source, verbose=True) + fo = open(c_file, 'w') + fo.write(HEADER) + fo.write(source) + fo.close() + +def main(): + if len(sys.argv) != 4: + print 'Usage: %s wrapped_routines_file lapack_dir output_dir' % \ + (sys.argv[0],) + return + wrapped_routines_file = sys.argv[1] + lapack_src_dir = sys.argv[2] + output_dir = sys.argv[3] + + wrapped_routines, ignores = getWrappedRoutineNames(wrapped_routines_file) + library = getLapackRoutines(wrapped_routines, ignores, lapack_src_dir) + + dumpRoutineNames(library, output_dir) + + for typename in ['blas', 'slapack']: + print 'creating %s_lite.c ...' % typename + routines = library.allRoutinesByType(typename) + fortran_file = os.path.join(output_dir, typename+'_lite.f') + c_file = fortran_file[:-2] + '.c' + concatenateRoutines(routines, fortran_file) + try: + runF2C(fortran_file, output_dir) + except F2CError: + print 'f2c failed on %s' % fortran_file + break + scrubF2CSource(c_file) + +if __name__ == '__main__': + main() diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c new file mode 100644 index 0000000..120152b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c @@ -0,0 +1,279 @@ +/* -*- c-basic-offset: 4 -*- */ +/* ==================================================================== + * Copyright (c) 1997-2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "sphinxbase/clapack_lite.h" +#include "sphinxbase/matrix.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" + +void +norm_3d(float32 ***arr, + uint32 d1, + uint32 d2, + uint32 d3) +{ + uint32 i, j, k; + float64 s; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + + /* compute sum (i, j) as over all k */ + for (k = 0, s = 0; k < d3; k++) { + s += arr[i][j][k]; + } + + /* do 1 floating point divide */ + s = 1.0 / s; + + /* divide all k by sum over k */ + for (k = 0; k < d3; k++) { + arr[i][j][k] *= s; + } + } + } +} + +void +accum_3d(float32 ***out, + float32 ***in, + uint32 d1, + uint32 d2, + uint32 d3) +{ + uint32 i, j, k; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + for (k = 0; k < d3; k++) { + out[i][j][k] += in[i][j][k]; + } + } + } +} + +void +floor_nz_3d(float32 ***m, + uint32 d1, + uint32 d2, + uint32 d3, + float32 floor) +{ + uint32 i, j, k; + + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + for (k = 0; k < d3; k++) { + if ((m[i][j][k] != 0) && (m[i][j][k] < floor)) + m[i][j][k] = floor; + } + } + } +} +void +floor_nz_1d(float32 *v, + uint32 d1, + float32 floor) +{ + uint32 i; + + for (i = 0; i < d1; i++) { + if ((v[i] != 0) && (v[i] < floor)) + v[i] = floor; + } +} + +void +band_nz_1d(float32 *v, + uint32 d1, + float32 band) +{ + uint32 i; + + for (i = 0; i < d1; i++) { + if (v[i] != 0) { + if ((v[i] > 0) && (v[i] < band)) { + v[i] = band; + } + else if ((v[i] < 0) && (v[i] > -band)) { + v[i] = -band; + } + } + } +} + +/* Find determinant through LU decomposition. */ +float64 +determinant(float32 ** a, int32 n) +{ + float32 **tmp_a; + float64 det; + char uplo; + int32 info, i; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + + uplo = 'L'; + spotrf_(&uplo, &n, tmp_a[0], &n, &info); + det = tmp_a[0][0]; + /* det = prod(diag(l))^2 */ + for (i = 1; i < n; ++i) + det *= tmp_a[i][i]; + ckd_free_2d((void **)tmp_a); + if (info > 0) + return -1.0; /* Generic "not positive-definite" answer */ + else + return det * det; +} + +int32 +solve(float32 **a, /*Input : an n*n matrix A */ + float32 *b, /*Input : a n dimesion vector b */ + float32 *out_x, /*Output : a n dimesion vector x */ + int32 n) +{ + char uplo; + float32 **tmp_a; + int32 info, nrhs; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + memcpy(out_x, b, n*sizeof(float32)); + uplo = 'L'; + nrhs = 1; + sposv_(&uplo, &n, &nrhs, tmp_a[0], &n, out_x, &n, &info); + ckd_free_2d((void **)tmp_a); + + if (info != 0) + return -1; + else + return info; +} + +/* Find inverse by solving AX=I. */ +int32 +invert(float32 ** ainv, float32 ** a, int32 n) +{ + char uplo; + float32 **tmp_a; + int32 info, nrhs, i; + + /* a is assumed to be symmetric, so we don't need to switch the + * ordering of the data. But we do need to copy it since it is + * overwritten by LAPACK. */ + tmp_a = (float32 **)ckd_calloc_2d(n, n, sizeof(float32)); + memcpy(tmp_a[0], a[0], n*n*sizeof(float32)); + + /* Construct an identity matrix. */ + memset(ainv[0], 0, sizeof(float32) * n * n); + for (i = 0; i < n; i++) + ainv[i][i] = 1.0; + + uplo = 'L'; + nrhs = n; + sposv_(&uplo, &n, &nrhs, tmp_a[0], &n, ainv[0], &n, &info); + + ckd_free_2d((void **)tmp_a); + + if (info != 0) + return -1; + else + return info; +} + +void +matrixmultiply(float32 ** c, float32 ** a, float32 ** b, int32 n) +{ + char side, uplo; + float32 alpha; + + side = 'L'; + uplo = 'L'; + alpha = 1.0; + ssymm_(&side, &uplo, &n, &n, &alpha, a[0], &n, b[0], &n, &alpha, c[0], &n); +} + +void +outerproduct(float32 ** a, float32 * x, float32 * y, int32 len) +{ + int32 i, j; + + for (i = 0; i < len; ++i) { + a[i][i] = x[i] * y[i]; + for (j = i + 1; j < len; ++j) { + a[i][j] = x[i] * y[j]; + a[j][i] = x[j] * y[i]; + } + } +} + +void +scalarmultiply(float32 ** a, float32 x, int32 n) +{ + int32 i, j; + + for (i = 0; i < n; ++i) { + a[i][i] *= x; + for (j = i+1; j < n; ++j) { + a[i][j] *= x; + a[j][i] *= x; + } + } +} + +void +matrixadd(float32 ** a, float32 ** b, int32 n) +{ + int32 i, j; + + for (i = 0; i < n; ++i) + for (j = 0; j < n; ++j) + a[i][j] += b[i][j]; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c new file mode 100644 index 0000000..dde0d7f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c @@ -0,0 +1,257 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2005 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/********************************************************************* + * + * File: mmio.c + * + * Description: mmap() wrappers for Unix/Windows + * + * Author: David Huggins-Daines + * + *********************************************************************/ + +#include +#include + + +#ifdef GNUWINCE +# include +# include +# include +# include +#elif defined(__SYMBIAN32__) /* SYMBIAN32 must be before WIN32 since Symbian SDK defines WIN32 as well */ +# include +# include +# include +# include +#elif defined(_WIN32) +# include +#else +# include +# include +# include +# include +# include +#endif + +#include "sphinxbase/prim_type.h" +#include "sphinxbase/err.h" +#include "sphinxbase/mmio.h" +#include "sphinxbase/ckd_alloc.h" + +#if defined(_WIN32_WCE) || defined(GNUWINCE) +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + HANDLE ffm, fd; + WCHAR *wfilename; + void *rv; + int len; + + len = mbstowcs(NULL, filename, 0) + 1; + wfilename = malloc(len * sizeof(WCHAR)); + mbstowcs(wfilename, filename, len); + + if ((ffm = + CreateFileForMappingW(wfilename, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + NULL)) == INVALID_HANDLE_VALUE) { + E_ERROR("Failed to create mapping for the file '%s': %08x\n", filename, + GetLastError()); + return NULL; + } + if ((fd = + CreateFileMappingW(ffm, NULL, PAGE_READONLY, 0, 0, NULL)) == NULL) { + E_ERROR("Failed to CreateFileMapping: %08x\n", GetLastError()); + CloseHandle(ffm); + return NULL; + } + rv = MapViewOfFile(fd, FILE_MAP_READ, 0, 0, 0); + free(wfilename); + CloseHandle(ffm); + CloseHandle(fd); + + return (mmio_file_t *) rv; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (!UnmapViewOfFile((void *)mf)) { + E_ERROR("Failed to UnmapViewOfFile: %08x\n", GetLastError()); + } +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return (void *)mf; +} + +#elif defined(_WIN32) && !defined(_WIN32_WP) /* !WINCE */ +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + HANDLE ffm, fd; + void *rv; + + if ((ffm = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + NULL)) == INVALID_HANDLE_VALUE) { + E_ERROR("Failed to create file '%s': %08x\n", + filename, GetLastError()); + return NULL; + } + if ((fd = CreateFileMapping(ffm, NULL, + PAGE_READONLY, 0, 0, NULL)) == NULL) { + E_ERROR("Failed to CreateFileMapping: %08x\n", GetLastError()); + CloseHandle(ffm); + } + rv = MapViewOfFile(fd, FILE_MAP_READ, 0, 0, 0); + CloseHandle(ffm); + CloseHandle(fd); + + return (mmio_file_t *)rv; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (!UnmapViewOfFile((void *)mf)) { + E_ERROR("Failed to UnmapViewOfFile: %08x\n", GetLastError()); + } +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return (void *)mf; +} + +#else /* !WIN32, !WINCE */ +#if defined(__ADSPBLACKFIN__) || defined(_WIN32_WP) + /* This is true for both uClinux and VisualDSP++, + but actually we need a better way to detect it. */ +struct mmio_file_s { + int dummy; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + E_ERROR("mmio is not implemented on this platform!"); + return NULL; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + E_ERROR("mmio is not implemented on this platform!"); +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + E_ERROR("mmio is not implemented on this platform!"); + return NULL; +} +#else /* !__ADSPBLACKFIN__ */ +struct mmio_file_s { + void *ptr; + size_t mapsize; +}; + +mmio_file_t * +mmio_file_read(const char *filename) +{ + mmio_file_t *mf; + struct stat buf; + void *ptr; + int fd; + size_t pagesize; + + if ((fd = open(filename, O_RDONLY)) == -1) { + E_ERROR_SYSTEM("Failed to open %s", filename); + return NULL; + } + if (fstat(fd, &buf) == -1) { + E_ERROR_SYSTEM("Failed to stat %s", filename); + close(fd); + return NULL; + } + ptr = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (ptr == (void *)-1) { + E_ERROR_SYSTEM("Failed to mmap %lld bytes", (unsigned long long)buf.st_size); + close(fd); + return NULL; + } + close(fd); + mf = ckd_calloc(1, sizeof(*mf)); + mf->ptr = ptr; + /* Align map size to next page. */ + pagesize = sysconf(_SC_PAGESIZE); + mf->mapsize = (buf.st_size + pagesize - 1) / pagesize * pagesize; + + return mf; +} + +void +mmio_file_unmap(mmio_file_t *mf) +{ + if (mf == NULL) + return; + if (munmap(mf->ptr, mf->mapsize) < 0) { + E_ERROR_SYSTEM("Failed to unmap %ld bytes at %p", mf->mapsize, mf->ptr); + } + ckd_free(mf); +} + +void * +mmio_file_ptr(mmio_file_t *mf) +{ + return mf->ptr; +} +#endif /* !__ADSPBLACKFIN__ */ +#endif /* !(WINCE || WIN32) */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c new file mode 100644 index 0000000..72cf8e9 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c @@ -0,0 +1,657 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_SYS_STAT_H +#include +#endif + +#if defined(_WIN32) && !defined(CYGWIN) +#include +#endif + +#include "sphinxbase/pio.h" +#include "sphinxbase/filename.h" +#include "sphinxbase/err.h" +#include "sphinxbase/strfuncs.h" +#include "sphinxbase/ckd_alloc.h" + +#ifndef EXEEXT +#define EXEEXT "" +#endif + +enum { + COMP_NONE, + COMP_COMPRESS, + COMP_GZIP, + COMP_BZIP2 +}; + +static void +guess_comptype(char const *file, int32 *ispipe, int32 *isgz) +{ + size_t k; + + k = strlen(file); + *ispipe = 0; + *isgz = COMP_NONE; + if ((k > 2) + && ((strcmp(file + k - 2, ".Z") == 0) + || (strcmp(file + k - 2, ".z") == 0))) { + *ispipe = 1; + *isgz = COMP_COMPRESS; + } + else if ((k > 3) && ((strcmp(file + k - 3, ".gz") == 0) + || (strcmp(file + k - 3, ".GZ") == 0))) { + *ispipe = 1; + *isgz = COMP_GZIP; + } + else if ((k > 4) && ((strcmp(file + k - 4, ".bz2") == 0) + || (strcmp(file + k - 4, ".BZ2") == 0))) { + *ispipe = 1; + *isgz = COMP_BZIP2; + } +} + +FILE * +fopen_comp(const char *file, const char *mode, int32 * ispipe) +{ + FILE *fp; + +#ifndef HAVE_POPEN + *ispipe = 0; /* No popen() on WinCE */ +#else /* HAVE_POPEN */ + int32 isgz; + guess_comptype(file, ispipe, &isgz); +#endif /* HAVE_POPEN */ + + if (*ispipe) { +#ifndef HAVE_POPEN + /* Shouldn't get here, anyway */ + E_FATAL("No popen() on WinCE\n"); +#else + if (strcmp(mode, "r") == 0) { + char *command; + switch (isgz) { + case COMP_GZIP: + command = string_join("gunzip" EXEEXT, " -c ", file, NULL); + break; + case COMP_COMPRESS: + command = string_join("zcat" EXEEXT, " ", file, NULL); + break; + case COMP_BZIP2: + command = string_join("bunzip2" EXEEXT, " -c ", file, NULL); + break; + default: + command = NULL; /* Make compiler happy. */ + E_FATAL("Unknown compression type %d\n", isgz); + } + if ((fp = popen(command, mode)) == NULL) { + E_ERROR_SYSTEM("Failed to open a pipe for a command '%s' mode '%s'", command, mode); + ckd_free(command); + return NULL; + } + ckd_free(command); + } + else if (strcmp(mode, "w") == 0) { + char *command; + switch (isgz) { + case COMP_GZIP: + command = string_join("gzip" EXEEXT, " > ", file, NULL); + break; + case COMP_COMPRESS: + command = string_join("compress" EXEEXT, " -c > ", file, NULL); + break; + case COMP_BZIP2: + command = string_join("bzip2" EXEEXT, " > ", file, NULL); + break; + default: + command = NULL; /* Make compiler happy. */ + E_FATAL("Unknown compression type %d\n", isgz); + } + if ((fp = popen(command, mode)) == NULL) { + E_ERROR_SYSTEM("Failed to open a pipe for a command '%s' mode '%s'", command, mode); + ckd_free(command); + return NULL; + } + ckd_free(command); + } + else { + E_ERROR("Compressed file operation for mode %s is not supported\n", mode); + return NULL; + } +#endif /* HAVE_POPEN */ + } + else { + fp = fopen(file, mode); + } + + return (fp); +} + + +void +fclose_comp(FILE * fp, int32 ispipe) +{ + if (ispipe) { +#ifdef HAVE_POPEN +#if defined(_WIN32) && (!defined(__SYMBIAN32__)) + _pclose(fp); +#else + pclose(fp); +#endif +#endif + } + else + fclose(fp); +} + + +FILE * +fopen_compchk(const char *file, int32 * ispipe) +{ +#ifndef HAVE_POPEN + *ispipe = 0; /* No popen() on WinCE */ + /* And therefore the rest of this function is useless. */ + return (fopen_comp(file, "r", ispipe)); +#else /* HAVE_POPEN */ + int32 isgz; + FILE *fh; + + /* First just try to fopen_comp() it */ + if ((fh = fopen_comp(file, "r", ispipe)) != NULL) + return fh; + else { + char *tmpfile; + size_t k; + + /* File doesn't exist; try other compressed/uncompressed form, as appropriate */ + guess_comptype(file, ispipe, &isgz); + k = strlen(file); + tmpfile = ckd_calloc(k+5, 1); + strcpy(tmpfile, file); + switch (isgz) { + case COMP_GZIP: + tmpfile[k - 3] = '\0'; + break; + case COMP_BZIP2: + tmpfile[k - 4] = '\0'; + break; + case COMP_COMPRESS: + tmpfile[k - 2] = '\0'; + break; + case COMP_NONE: + strcpy(tmpfile + k, ".gz"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + strcpy(tmpfile + k, ".bz2"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + strcpy(tmpfile + k, ".Z"); + if ((fh = fopen_comp(tmpfile, "r", ispipe)) != NULL) { + E_WARN("Using %s instead of %s\n", tmpfile, file); + ckd_free(tmpfile); + return fh; + } + ckd_free(tmpfile); + return NULL; + } + E_WARN("Using %s instead of %s\n", tmpfile, file); + fh = fopen_comp(tmpfile, "r", ispipe); + ckd_free(tmpfile); + return NULL; + } +#endif /* HAVE_POPEN */ +} + +lineiter_t * +lineiter_start(FILE *fh) +{ + lineiter_t *li; + + li = (lineiter_t *)ckd_calloc(1, sizeof(*li)); + li->buf = (char *)ckd_malloc(128); + li->buf[0] = '\0'; + li->bsiz = 128; + li->len = 0; + li->fh = fh; + + li = lineiter_next(li); + + /* Strip the UTF-8 BOM */ + + if (li && 0 == strncmp(li->buf, "\xef\xbb\xbf", 3)) { + memmove(li->buf, li->buf + 3, strlen(li->buf + 1)); + li->len -= 3; + } + + return li; +} + +lineiter_t * +lineiter_start_clean(FILE *fh) +{ + lineiter_t *li; + + li = lineiter_start(fh); + + if (li == NULL) + return li; + + li->clean = TRUE; + + if (li->buf && li->buf[0] == '#') { + li = lineiter_next(li); + } else { + string_trim(li->buf, STRING_BOTH); + } + + return li; +} + + +static lineiter_t * +lineiter_next_plain(lineiter_t *li) +{ + /* We are reading the next line */ + li->lineno++; + + /* Read a line and check for EOF. */ + if (fgets(li->buf, li->bsiz, li->fh) == NULL) { + lineiter_free(li); + return NULL; + } + /* If we managed to read the whole thing, then we are done + * (this will be by far the most common result). */ + li->len = (int32)strlen(li->buf); + if (li->len < li->bsiz - 1 || li->buf[li->len - 1] == '\n') + return li; + + /* Otherwise we have to reallocate and keep going. */ + while (1) { + li->bsiz *= 2; + li->buf = (char *)ckd_realloc(li->buf, li->bsiz); + /* If we get an EOF, we are obviously done. */ + if (fgets(li->buf + li->len, li->bsiz - li->len, li->fh) == NULL) { + li->len += strlen(li->buf + li->len); + return li; + } + li->len += strlen(li->buf + li->len); + /* If we managed to read the whole thing, then we are done. */ + if (li->len < li->bsiz - 1 || li->buf[li->len - 1] == '\n') + return li; + } + + /* Shouldn't get here. */ + return li; +} + + +lineiter_t * +lineiter_next(lineiter_t *li) +{ + if (!li->clean) + return lineiter_next_plain(li); + + for (li = lineiter_next_plain(li); li; li = lineiter_next_plain(li)) { + if (li->buf) { + li->buf = string_trim(li->buf, STRING_BOTH); + if (li->buf[0] != 0 && li->buf[0] != '#') + break; + } + } + return li; +} + +int lineiter_lineno(lineiter_t *li) +{ + return li->lineno; +} + +void +lineiter_free(lineiter_t *li) +{ + if (li == NULL) + return; + ckd_free(li->buf); + ckd_free(li); +} + +char * +fread_line(FILE *stream, size_t *out_len) +{ + char *output, *outptr; + char buf[128]; + + output = outptr = NULL; + while (fgets(buf, sizeof(buf), stream)) { + size_t len = strlen(buf); + /* Append this data to the buffer. */ + if (output == NULL) { + output = (char *)ckd_malloc(len + 1); + outptr = output; + } + else { + size_t cur = outptr - output; + output = (char *)ckd_realloc(output, cur + len + 1); + outptr = output + cur; + } + memcpy(outptr, buf, len + 1); + outptr += len; + /* Stop on a short read or end of line. */ + if (len < sizeof(buf)-1 || buf[len-1] == '\n') + break; + } + if (out_len) *out_len = outptr - output; + return output; +} + +#define FREAD_RETRY_COUNT 60 + +int32 +fread_retry(void *pointer, int32 size, int32 num_items, FILE * stream) +{ + char *data; + size_t n_items_read; + size_t n_items_rem; + uint32 n_retry_rem; + int32 loc; + + n_retry_rem = FREAD_RETRY_COUNT; + + data = (char *)pointer; + loc = 0; + n_items_rem = num_items; + + do { + n_items_read = fread(&data[loc], size, n_items_rem, stream); + + n_items_rem -= n_items_read; + + if (n_items_rem > 0) { + /* an incomplete read occurred */ + + if (n_retry_rem == 0) + return -1; + + if (n_retry_rem == FREAD_RETRY_COUNT) { + E_ERROR_SYSTEM("fread() failed; retrying...\n"); + } + + --n_retry_rem; + + loc += n_items_read * size; +#if !defined(_WIN32) && defined(HAVE_UNISTD_H) + sleep(1); +#endif + } + } while (n_items_rem > 0); + + return num_items; +} + + +#ifdef _WIN32_WCE /* No stat() on WinCE */ +int32 +stat_retry(const char *file, struct stat * statbuf) +{ + WIN32_FIND_DATAW file_data; + HANDLE *h; + wchar_t *wfile; + size_t len; + + len = mbstowcs(NULL, file, 0) + 1; + wfile = ckd_calloc(len, sizeof(*wfile)); + mbstowcs(wfile, file, len); + if ((h = FindFirstFileW(wfile, &file_data)) == INVALID_HANDLE_VALUE) { + ckd_free(wfile); + return -1; + } + ckd_free(wfile); + memset(statbuf, 0, sizeof(*statbuf)); + statbuf->st_mtime = file_data.ftLastWriteTime.dwLowDateTime; + statbuf->st_size = file_data.nFileSizeLow; + FindClose(h); + + return 0; +} + + +int32 +stat_mtime(const char *file) +{ + struct stat statbuf; + + if (stat_retry(file, &statbuf) != 0) + return -1; + + return ((int32) statbuf.st_mtime); +} +#else +#define STAT_RETRY_COUNT 10 +int32 +stat_retry(const char *file, struct stat * statbuf) +{ + int32 i; + + for (i = 0; i < STAT_RETRY_COUNT; i++) { +#ifndef HAVE_SYS_STAT_H + FILE *fp; + + if ((fp = (FILE *)fopen(file, "r")) != 0) { + fseek(fp, 0, SEEK_END); + statbuf->st_size = ftell(fp); + fclose(fp); + return 0; + } +#else /* HAVE_SYS_STAT_H */ + if (stat(file, statbuf) == 0) + return 0; +#endif + if (i == 0) { + E_ERROR_SYSTEM("Failed to stat file '%s'; retrying...", file); + } +#ifdef HAVE_UNISTD_H + sleep(1); +#endif + } + + return -1; +} + +int32 +stat_mtime(const char *file) +{ + struct stat statbuf; + +#ifdef HAVE_SYS_STAT_H + if (stat(file, &statbuf) != 0) + return -1; +#else /* HAVE_SYS_STAT_H */ + if (stat_retry(file, &statbuf) != 0) + return -1; +#endif /* HAVE_SYS_STAT_H */ + + return ((int32) statbuf.st_mtime); +} +#endif /* !_WIN32_WCE */ + +struct bit_encode_s { + FILE *fh; + unsigned char buf, bbits; + int16 refcount; +}; + +bit_encode_t * +bit_encode_attach(FILE *outfh) +{ + bit_encode_t *be; + + be = (bit_encode_t *)ckd_calloc(1, sizeof(*be)); + be->refcount = 1; + be->fh = outfh; + return be; +} + +bit_encode_t * +bit_encode_retain(bit_encode_t *be) +{ + ++be->refcount; + return be; +} + +int +bit_encode_free(bit_encode_t *be) +{ + if (be == NULL) + return 0; + if (--be->refcount > 0) + return be->refcount; + ckd_free(be); + + return 0; +} + +int +bit_encode_write(bit_encode_t *be, unsigned char const *bits, int nbits) +{ + int tbits; + + tbits = nbits + be->bbits; + if (tbits < 8) { + /* Append to buffer. */ + be->buf |= ((bits[0] >> (8 - nbits)) << (8 - tbits)); + } + else { + int i = 0; + while (tbits >= 8) { + /* Shift bits out of the buffer and splice with high-order bits */ + fputc(be->buf | ((bits[i]) >> be->bbits), be->fh); + /* Put low-order bits back into buffer */ + be->buf = (bits[i] << (8 - be->bbits)) & 0xff; + tbits -= 8; + ++i; + } + } + /* tbits contains remaining number of bits. */ + be->bbits = tbits; + + return nbits; +} + +int +bit_encode_write_cw(bit_encode_t *be, uint32 codeword, int nbits) +{ + unsigned char bits[4]; + codeword <<= (32 - nbits); + bits[0] = (codeword >> 24) & 0xff; + bits[1] = (codeword >> 16) & 0xff; + bits[2] = (codeword >> 8) & 0xff; + bits[3] = codeword & 0xff; + return bit_encode_write(be, bits, nbits); +} + +int +bit_encode_flush(bit_encode_t *be) +{ + if (be->bbits) { + fputc(be->buf, be->fh); + be->bbits = 0; + } + return 0; +} + +int +build_directory(const char *path) +{ + int rv; + + /* Utterly failed... */ + if (strlen(path) == 0) + return -1; + +#if defined(_WIN32) && !defined(CYGWIN) + else if ((rv = _mkdir(path)) == 0) + return 0; +#elif defined(HAVE_SYS_STAT_H) /* Unix, Cygwin, doesn't work on MINGW */ + else if ((rv = mkdir(path, 0777)) == 0) + return 0; +#endif + + /* Or, it already exists... */ + else if (errno == EEXIST) + return 0; + else if (errno != ENOENT) { + E_ERROR_SYSTEM("Failed to create %s", path); + return -1; + } + else { + char *dirname = ckd_salloc(path); + path2dirname(path, dirname); + build_directory(dirname); + ckd_free(dirname); + +#if defined(_WIN32) && !defined(CYGWIN) + return _mkdir(path); +#elif defined(HAVE_SYS_STAT_H) /* Unix, Cygwin, doesn't work on MINGW */ + return mkdir(path, 0777); +#endif + } + return -1; //control should never reach here; fixes some compiler warnings +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c new file mode 100644 index 0000000..fdfb569 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c @@ -0,0 +1,144 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2015 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +struct priority_queue_s { + void **pointers; + size_t alloc_size; + size_t size; + void *max_element; + int (*compare)(const void *a, const void *b); +}; + +priority_queue_t* priority_queue_create(size_t len, int (*compare)(const void *a, const void *b)) +{ + priority_queue_t* queue; + + queue = (priority_queue_t *)ckd_calloc(1, sizeof(*queue)); + queue->alloc_size = len; + queue->pointers = (void **)ckd_calloc(len, sizeof(*queue->pointers)); + queue->size = 0; + queue->max_element = NULL; + queue->compare = compare; + + return queue; +} + +void* priority_queue_poll(priority_queue_t *queue) +{ + + size_t i; + void *res; + + if (queue->size == 0) { + E_WARN("Trying to poll from empty queue\n"); + return NULL; + } + if (queue->max_element == NULL) { + E_ERROR("Trying to poll from queue and max element is undefined\n"); + return NULL; + } + res = queue->max_element; + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == queue->max_element) { + queue->pointers[i] = NULL; + break; + } + } + queue->max_element = NULL; + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == 0) + continue; + if (queue->max_element == NULL) { + queue->max_element = queue->pointers[i]; + } else { + if (queue->compare(queue->pointers[i], queue->max_element) < 0) + queue->max_element = queue->pointers[i]; + } + } + queue->size--; + return res; +} + +void priority_queue_add(priority_queue_t *queue, void *element) +{ + size_t i; + if (queue->size == queue->alloc_size) { + E_ERROR("Trying to add element into full queue\n"); + return; + } + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] == NULL) { + queue->pointers[i] = element; + break; + } + } + + if (queue->max_element == NULL || queue->compare(element, queue->max_element) < 0) { + queue->max_element = element; + } + queue->size++; +} + +size_t priority_queue_size(priority_queue_t *queue) +{ + return queue->size; +} + +void priority_queue_free(priority_queue_t *queue, void (*free_ptr)(void *a)) +{ + size_t i; + + for (i = 0; i < queue->alloc_size; i++) { + if (queue->pointers[i] != NULL) { + if (free_ptr == NULL) { + ckd_free(queue->pointers[i]); + } else { + free_ptr(queue->pointers[i]); + } + } + } + ckd_free(queue->pointers); + ckd_free(queue); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c new file mode 100644 index 0000000..c8d84ca --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c @@ -0,0 +1,345 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2001 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * profile.c -- For timing and event counting. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1999 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * $Log: profile.c,v $ + * Revision 1.7 2005/06/22 03:10:59 arthchan2003 + * 1, Fixed doxygen documentation, 2, Added keyword. + * + * Revision 1.3 2005/03/30 01:22:48 archan + * Fixed mistakes in last updates. Add + * + * + * 11-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Added ptmr_init(). + * + * 19-Jun-97 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Created. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +# include +# ifndef _WIN32_WCE +# include +# endif +#elif defined(HAVE_UNISTD_H) /* I know this, this is Unix... */ +# include +# include +# include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4996) +#endif + +#include "sphinxbase/profile.h" +#include "sphinxbase/err.h" +#include "sphinxbase/ckd_alloc.h" + +#if defined(_WIN32_WCE) || defined(_WIN32_WP) +DWORD unlink(const char *filename) +{ + WCHAR *wfilename; + DWORD rv; + size_t len; + + len = mbstowcs(NULL, filename, 0); + wfilename = ckd_calloc(len+1, sizeof(*wfilename)); + mbstowcs(wfilename, filename, len); + rv = DeleteFileW(wfilename); + ckd_free(wfilename); + + return rv; +} +#endif + +pctr_t * +pctr_new(char *nm) +{ + pctr_t *pc; + + pc = ckd_calloc(1, sizeof(pctr_t)); + pc->name = ckd_salloc(nm); + pc->count = 0; + + return pc; +} + +void +pctr_reset(pctr_t * ctr) +{ + ctr->count = 0; +} + + +void +pctr_increment(pctr_t * ctr, int32 inc) +{ + ctr->count += inc; + /* E_INFO("Name %s, Count %d, inc %d\n",ctr->name, ctr->count, inc); */ +} + +void +pctr_print(FILE * fp, pctr_t * ctr) +{ + fprintf(fp, "CTR:"); + fprintf(fp, "[%d %s]", ctr->count, ctr->name); +} + +void +pctr_free(pctr_t * pc) +{ + if (pc) { + if (pc->name) + ckd_free(pc->name); + } + ckd_free(pc); +} + + +#if defined(_WIN32) && !defined(GNUWINCE) && !defined(__SYMBIAN32__) + +#define TM_LOWSCALE 1e-7 +#define TM_HIGHSCALE (4294967296.0 * TM_LOWSCALE); + +static float64 +make_sec(FILETIME * tm) +{ + float64 dt; + + dt = tm->dwLowDateTime * TM_LOWSCALE; + dt += tm->dwHighDateTime * TM_HIGHSCALE; + + return (dt); +} + +#else /* NOT WINDOWS */ + +static float64 +make_sec(struct timeval *s) +{ + return (s->tv_sec + s->tv_usec * 0.000001); +} + +#endif + + +void +ptmr_start(ptmr_t * tm) +{ +#if (! defined(_WIN32)) || defined(GNUWINCE) || defined(__SYMBIAN32__) + struct timeval e_start; /* Elapsed time */ + +#if (! defined(_HPUX_SOURCE)) && (! defined(__SYMBIAN32__)) + struct rusage start; /* CPU time */ + + /* Unix but not HPUX */ + getrusage(RUSAGE_SELF, &start); + tm->start_cpu = make_sec(&start.ru_utime) + make_sec(&start.ru_stime); +#endif + /* Unix + HP */ + gettimeofday(&e_start, 0); + tm->start_elapsed = make_sec(&e_start); +#elif defined(_WIN32_WP) + tm->start_cpu = GetTickCount64() / 1000; + tm->start_elapsed = GetTickCount64() / 1000; +#elif defined(_WIN32_WCE) + /* No GetProcessTimes() on WinCE. (Note CPU time will be bogus) */ + tm->start_cpu = GetTickCount() / 1000; + tm->start_elapsed = GetTickCount() / 1000; +#else + HANDLE pid; + FILETIME t_create, t_exit, kst, ust; + + /* PC */ + pid = GetCurrentProcess(); + GetProcessTimes(pid, &t_create, &t_exit, &kst, &ust); + tm->start_cpu = make_sec(&ust) + make_sec(&kst); + + tm->start_elapsed = (float64) clock() / CLOCKS_PER_SEC; +#endif +} + + +void +ptmr_stop(ptmr_t * tm) +{ + float64 dt_cpu, dt_elapsed; + +#if (! defined(_WIN32)) || defined(GNUWINCE) || defined(__SYMBIAN32__) + struct timeval e_stop; /* Elapsed time */ + +#if (! defined(_HPUX_SOURCE)) && (! defined(__SYMBIAN32__)) + struct rusage stop; /* CPU time */ + + /* Unix but not HPUX */ + getrusage(RUSAGE_SELF, &stop); + dt_cpu = + make_sec(&stop.ru_utime) + make_sec(&stop.ru_stime) - + tm->start_cpu; +#else + dt_cpu = 0.0; +#endif + /* Unix + HP */ + gettimeofday(&e_stop, 0); + dt_elapsed = (make_sec(&e_stop) - tm->start_elapsed); +#elif defined(_WIN32_WP) + dt_cpu = GetTickCount64() / 1000 - tm->start_cpu; + dt_elapsed = GetTickCount64() / 1000 - tm->start_elapsed; +#elif defined(_WIN32_WCE) + /* No GetProcessTimes() on WinCE. (Note CPU time will be bogus) */ + dt_cpu = GetTickCount() / 1000 - tm->start_cpu; + dt_elapsed = GetTickCount() / 1000 - tm->start_elapsed; +#else + HANDLE pid; + FILETIME t_create, t_exit, kst, ust; + + /* PC */ + pid = GetCurrentProcess(); + GetProcessTimes(pid, &t_create, &t_exit, &kst, &ust); + dt_cpu = make_sec(&ust) + make_sec(&kst) - tm->start_cpu; + dt_elapsed = ((float64) clock() / CLOCKS_PER_SEC) - tm->start_elapsed; +#endif + + tm->t_cpu += dt_cpu; + tm->t_elapsed += dt_elapsed; + + tm->t_tot_cpu += dt_cpu; + tm->t_tot_elapsed += dt_elapsed; +} + + +void +ptmr_reset(ptmr_t * tm) +{ + tm->t_cpu = 0.0; + tm->t_elapsed = 0.0; +} + + +void +ptmr_init(ptmr_t * tm) +{ + tm->t_cpu = 0.0; + tm->t_elapsed = 0.0; + tm->t_tot_cpu = 0.0; + tm->t_tot_elapsed = 0.0; +} + + +void +ptmr_reset_all(ptmr_t * tm) +{ + for (; tm->name; tm++) + ptmr_reset(tm); +} + + +void +ptmr_print_all(FILE * fp, ptmr_t * tm, float64 norm) +{ + if (norm != 0.0) { + norm = 1.0 / norm; + for (; tm->name; tm++) + fprintf(fp, " %6.2fx %s", tm->t_cpu * norm, tm->name); + } +} + + +int32 +host_endian(void) +{ + FILE *fp; + int32 BYTE_ORDER_MAGIC; + char *file; + char buf[8]; + int32 k, endian; + + file = "/tmp/__EnDiAn_TeSt__"; + + if ((fp = fopen(file, "wb")) == NULL) { + E_ERROR("Failed to open file '%s' for writing", file); + return -1; + } + + BYTE_ORDER_MAGIC = (int32) 0x11223344; + + k = (int32) BYTE_ORDER_MAGIC; + if (fwrite(&k, sizeof(int32), 1, fp) != 1) { + E_ERROR("Failed to write to file '%s'\n", file); + fclose(fp); + unlink(file); + return -1; + } + + fclose(fp); + if ((fp = fopen(file, "rb")) == NULL) { + E_ERROR_SYSTEM("Failed to open file '%s' for reading", file); + unlink(file); + return -1; + } + if (fread(buf, 1, sizeof(int32), fp) != sizeof(int32)) { + E_ERROR("Failed to read from file '%s'\n", file); + fclose(fp); + unlink(file); + return -1; + } + fclose(fp); + unlink(file); + + /* If buf[0] == lsB of BYTE_ORDER_MAGIC, we are little-endian */ + endian = (buf[0] == (BYTE_ORDER_MAGIC & 0x000000ff)) ? 1 : 0; + + return (endian); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c new file mode 100644 index 0000000..7c3bfec --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c @@ -0,0 +1,739 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 2008 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/** + * @file sbthread.c + * @brief Simple portable thread functions + * @author David Huggins-Daines + */ + +#include + +#include "sphinxbase/sbthread.h" +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/err.h" + +/* + * Platform-specific parts: threads, mutexes, and signals. + */ +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(__SYMBIAN32__) +#define _WIN32_WINNT 0x0400 +#include + +struct sbthread_s { + cmd_ln_t *config; + sbmsgq_t *msgq; + sbthread_main func; + void *arg; + HANDLE th; + DWORD tid; +}; + +struct sbmsgq_s { + /* Ringbuffer for passing messages. */ + char *data; + size_t depth; + size_t out; + size_t nbytes; + + /* Current message is stored here. */ + char *msg; + size_t msglen; + CRITICAL_SECTION mtx; + HANDLE evt; +}; + +struct sbevent_s { + HANDLE evt; +}; + +struct sbmtx_s { + CRITICAL_SECTION mtx; +}; + +DWORD WINAPI +sbthread_internal_main(LPVOID arg) +{ + sbthread_t *th = (sbthread_t *)arg; + int rv; + + rv = (*th->func)(th); + return (DWORD)rv; +} + +sbthread_t * +sbthread_start(cmd_ln_t *config, sbthread_main func, void *arg) +{ + sbthread_t *th; + + th = ckd_calloc(1, sizeof(*th)); + th->config = config; + th->func = func; + th->arg = arg; + th->msgq = sbmsgq_init(256); + th->th = CreateThread(NULL, 0, sbthread_internal_main, th, 0, &th->tid); + if (th->th == NULL) { + sbthread_free(th); + return NULL; + } + return th; +} + +int +sbthread_wait(sbthread_t *th) +{ + DWORD rv, exit; + + /* It has already been joined. */ + if (th->th == NULL) + return -1; + + rv = WaitForSingleObject(th->th, INFINITE); + if (rv == WAIT_FAILED) { + E_ERROR("Failed to join thread: WAIT_FAILED\n"); + return -1; + } + GetExitCodeThread(th->th, &exit); + CloseHandle(th->th); + th->th = NULL; + return (int)exit; +} + +static DWORD +cond_timed_wait(HANDLE cond, int sec, int nsec) +{ + DWORD rv; + if (sec == -1) { + rv = WaitForSingleObject(cond, INFINITE); + } + else { + DWORD ms; + + ms = sec * 1000 + nsec / (1000*1000); + rv = WaitForSingleObject(cond, ms); + } + return rv; +} + +/* Updated to use Unicode */ +sbevent_t * +sbevent_init(void) +{ + sbevent_t *evt; + + evt = ckd_calloc(1, sizeof(*evt)); + evt->evt = CreateEventW(NULL, FALSE, FALSE, NULL); + if (evt->evt == NULL) { + ckd_free(evt); + return NULL; + } + return evt; +} + +void +sbevent_free(sbevent_t *evt) +{ + CloseHandle(evt->evt); + ckd_free(evt); +} + +int +sbevent_signal(sbevent_t *evt) +{ + return SetEvent(evt->evt) ? 0 : -1; +} + +int +sbevent_wait(sbevent_t *evt, int sec, int nsec) +{ + DWORD rv; + + rv = cond_timed_wait(evt->evt, sec, nsec); + return rv; +} + +sbmtx_t * +sbmtx_init(void) +{ + sbmtx_t *mtx; + + mtx = ckd_calloc(1, sizeof(*mtx)); + InitializeCriticalSection(&mtx->mtx); + return mtx; +} + +int +sbmtx_trylock(sbmtx_t *mtx) +{ + return TryEnterCriticalSection(&mtx->mtx) ? 0 : -1; +} + +int +sbmtx_lock(sbmtx_t *mtx) +{ + EnterCriticalSection(&mtx->mtx); + return 0; +} + +int +sbmtx_unlock(sbmtx_t *mtx) +{ + LeaveCriticalSection(&mtx->mtx); + return 0; +} + +void +sbmtx_free(sbmtx_t *mtx) +{ + DeleteCriticalSection(&mtx->mtx); + ckd_free(mtx); +} + +sbmsgq_t * +sbmsgq_init(size_t depth) +{ + sbmsgq_t *msgq; + + msgq = ckd_calloc(1, sizeof(*msgq)); + msgq->depth = depth; + msgq->evt = CreateEventW(NULL, FALSE, FALSE, NULL); + if (msgq->evt == NULL) { + ckd_free(msgq); + return NULL; + } + InitializeCriticalSection(&msgq->mtx); + msgq->data = ckd_calloc(depth, 1); + msgq->msg = ckd_calloc(depth, 1); + return msgq; +} + +void +sbmsgq_free(sbmsgq_t *msgq) +{ + CloseHandle(msgq->evt); + ckd_free(msgq->data); + ckd_free(msgq->msg); + ckd_free(msgq); +} + +int +sbmsgq_send(sbmsgq_t *q, size_t len, void const *data) +{ + char const *cdata = (char const *)data; + size_t in; + + /* Don't allow things bigger than depth to be sent! */ + if (len + sizeof(len) > q->depth) + return -1; + + if (q->nbytes + len + sizeof(len) > q->depth) + WaitForSingleObject(q->evt, INFINITE); + + /* Lock things while we manipulate the buffer (FIXME: this + actually should have been atomic with the wait above ...) */ + EnterCriticalSection(&q->mtx); + in = (q->out + q->nbytes) % q->depth; + /* First write the size of the message. */ + if (in + sizeof(len) > q->depth) { + /* Handle the annoying case where the size field gets wrapped around. */ + size_t len1 = q->depth - in; + memcpy(q->data + in, &len, len1); + memcpy(q->data, ((char *)&len) + len1, sizeof(len) - len1); + q->nbytes += sizeof(len); + in = sizeof(len) - len1; + } + else { + memcpy(q->data + in, &len, sizeof(len)); + q->nbytes += sizeof(len); + in += sizeof(len); + } + + /* Now write the message body. */ + if (in + len > q->depth) { + /* Handle wraparound. */ + size_t len1 = q->depth - in; + memcpy(q->data + in, cdata, len1); + q->nbytes += len1; + cdata += len1; + len -= len1; + in = 0; + } + memcpy(q->data + in, cdata, len); + q->nbytes += len; + + /* Signal the condition variable. */ + SetEvent(q->evt); + /* Unlock. */ + LeaveCriticalSection(&q->mtx); + + return 0; +} + +void * +sbmsgq_wait(sbmsgq_t *q, size_t *out_len, int sec, int nsec) +{ + char *outptr; + size_t len; + + /* Wait for data to be available. */ + if (q->nbytes == 0) { + if (cond_timed_wait(q->evt, sec, nsec) == WAIT_FAILED) + /* Timed out or something... */ + return NULL; + } + /* Lock to manipulate the queue (FIXME) */ + EnterCriticalSection(&q->mtx); + /* Get the message size. */ + if (q->out + sizeof(q->msglen) > q->depth) { + /* Handle annoying wraparound case. */ + size_t len1 = q->depth - q->out; + memcpy(&q->msglen, q->data + q->out, len1); + memcpy(((char *)&q->msglen) + len1, q->data, + sizeof(q->msglen) - len1); + q->out = sizeof(q->msglen) - len1; + } + else { + memcpy(&q->msglen, q->data + q->out, sizeof(q->msglen)); + q->out += sizeof(q->msglen); + } + q->nbytes -= sizeof(q->msglen); + /* Get the message body. */ + outptr = q->msg; + len = q->msglen; + if (q->out + q->msglen > q->depth) { + /* Handle wraparound. */ + size_t len1 = q->depth - q->out; + memcpy(outptr, q->data + q->out, len1); + outptr += len1; + len -= len1; + q->nbytes -= len1; + q->out = 0; + } + memcpy(outptr, q->data + q->out, len); + q->nbytes -= len; + q->out += len; + + /* Signal the condition variable. */ + SetEvent(q->evt); + /* Unlock. */ + LeaveCriticalSection(&q->mtx); + if (out_len) + *out_len = q->msglen; + return q->msg; +} + +#else /* POSIX */ +#include +#include + +struct sbthread_s { + cmd_ln_t *config; + sbmsgq_t *msgq; + sbthread_main func; + void *arg; + pthread_t th; +}; + +struct sbmsgq_s { + /* Ringbuffer for passing messages. */ + char *data; + size_t depth; + size_t out; + size_t nbytes; + + /* Current message is stored here. */ + char *msg; + size_t msglen; + pthread_mutex_t mtx; + pthread_cond_t cond; +}; + +struct sbevent_s { + pthread_mutex_t mtx; + pthread_cond_t cond; + int signalled; +}; + +struct sbmtx_s { + pthread_mutex_t mtx; +}; + +static void * +sbthread_internal_main(void *arg) +{ + sbthread_t *th = (sbthread_t *)arg; + int rv; + + rv = (*th->func)(th); + return (void *)(long)rv; +} + +sbthread_t * +sbthread_start(cmd_ln_t *config, sbthread_main func, void *arg) +{ + sbthread_t *th; + int rv; + + th = ckd_calloc(1, sizeof(*th)); + th->config = config; + th->func = func; + th->arg = arg; + th->msgq = sbmsgq_init(1024); + if ((rv = pthread_create(&th->th, NULL, &sbthread_internal_main, th)) != 0) { + E_ERROR("Failed to create thread: %d\n", rv); + sbthread_free(th); + return NULL; + } + return th; +} + +int +sbthread_wait(sbthread_t *th) +{ + void *exit; + int rv; + + /* It has already been joined. */ + if (th->th == (pthread_t)-1) + return -1; + + rv = pthread_join(th->th, &exit); + if (rv != 0) { + E_ERROR("Failed to join thread: %d\n", rv); + return -1; + } + th->th = (pthread_t)-1; + return (int)(long)exit; +} + +sbmsgq_t * +sbmsgq_init(size_t depth) +{ + sbmsgq_t *msgq; + + msgq = ckd_calloc(1, sizeof(*msgq)); + msgq->depth = depth; + if (pthread_cond_init(&msgq->cond, NULL) != 0) { + ckd_free(msgq); + return NULL; + } + if (pthread_mutex_init(&msgq->mtx, NULL) != 0) { + pthread_cond_destroy(&msgq->cond); + ckd_free(msgq); + return NULL; + } + msgq->data = ckd_calloc(depth, 1); + msgq->msg = ckd_calloc(depth, 1); + return msgq; +} + +void +sbmsgq_free(sbmsgq_t *msgq) +{ + pthread_mutex_destroy(&msgq->mtx); + pthread_cond_destroy(&msgq->cond); + ckd_free(msgq->data); + ckd_free(msgq->msg); + ckd_free(msgq); +} + +int +sbmsgq_send(sbmsgq_t *q, size_t len, void const *data) +{ + size_t in; + + /* Don't allow things bigger than depth to be sent! */ + if (len + sizeof(len) > q->depth) + return -1; + + /* Lock the condition variable while we manipulate the buffer. */ + pthread_mutex_lock(&q->mtx); + if (q->nbytes + len + sizeof(len) > q->depth) { + /* Unlock and wait for space to be available. */ + if (pthread_cond_wait(&q->cond, &q->mtx) != 0) { + /* Timed out, don't send anything. */ + pthread_mutex_unlock(&q->mtx); + return -1; + } + /* Condition is now locked again. */ + } + in = (q->out + q->nbytes) % q->depth; + + /* First write the size of the message. */ + if (in + sizeof(len) > q->depth) { + /* Handle the annoying case where the size field gets wrapped around. */ + size_t len1 = q->depth - in; + memcpy(q->data + in, &len, len1); + memcpy(q->data, ((char *)&len) + len1, sizeof(len) - len1); + q->nbytes += sizeof(len); + in = sizeof(len) - len1; + } + else { + memcpy(q->data + in, &len, sizeof(len)); + q->nbytes += sizeof(len); + in += sizeof(len); + } + + /* Now write the message body. */ + if (in + len > q->depth) { + /* Handle wraparound. */ + size_t len1 = q->depth - in; + memcpy(q->data + in, data, len1); + q->nbytes += len1; + data = (char const *)data + len1; + len -= len1; + in = 0; + } + memcpy(q->data + in, data, len); + q->nbytes += len; + + /* Signal the condition variable. */ + pthread_cond_signal(&q->cond); + /* Unlock it, we have nothing else to do. */ + pthread_mutex_unlock(&q->mtx); + return 0; +} + +static int +cond_timed_wait(pthread_cond_t *cond, pthread_mutex_t *mtx, int sec, int nsec) +{ + int rv; + if (sec == -1) { + rv = pthread_cond_wait(cond, mtx); + } + else { + struct timeval now; + struct timespec end; + + gettimeofday(&now, NULL); + end.tv_sec = now.tv_sec + sec; + end.tv_nsec = now.tv_usec * 1000 + nsec; + if (end.tv_nsec > (1000*1000*1000)) { + sec += end.tv_nsec / (1000*1000*1000); + end.tv_nsec = end.tv_nsec % (1000*1000*1000); + } + rv = pthread_cond_timedwait(cond, mtx, &end); + } + return rv; +} + +void * +sbmsgq_wait(sbmsgq_t *q, size_t *out_len, int sec, int nsec) +{ + char *outptr; + size_t len; + + /* Lock the condition variable while we manipulate nmsg. */ + pthread_mutex_lock(&q->mtx); + if (q->nbytes == 0) { + /* Unlock the condition variable and wait for a signal. */ + if (cond_timed_wait(&q->cond, &q->mtx, sec, nsec) != 0) { + /* Timed out or something... */ + pthread_mutex_unlock(&q->mtx); + return NULL; + } + /* Condition variable is now locked again. */ + } + /* Get the message size. */ + if (q->out + sizeof(q->msglen) > q->depth) { + /* Handle annoying wraparound case. */ + size_t len1 = q->depth - q->out; + memcpy(&q->msglen, q->data + q->out, len1); + memcpy(((char *)&q->msglen) + len1, q->data, + sizeof(q->msglen) - len1); + q->out = sizeof(q->msglen) - len1; + } + else { + memcpy(&q->msglen, q->data + q->out, sizeof(q->msglen)); + q->out += sizeof(q->msglen); + } + q->nbytes -= sizeof(q->msglen); + /* Get the message body. */ + outptr = q->msg; + len = q->msglen; + if (q->out + q->msglen > q->depth) { + /* Handle wraparound. */ + size_t len1 = q->depth - q->out; + memcpy(outptr, q->data + q->out, len1); + outptr += len1; + len -= len1; + q->nbytes -= len1; + q->out = 0; + } + memcpy(outptr, q->data + q->out, len); + q->nbytes -= len; + q->out += len; + + /* Signal the condition variable. */ + pthread_cond_signal(&q->cond); + /* Unlock the condition variable, we are done. */ + pthread_mutex_unlock(&q->mtx); + if (out_len) + *out_len = q->msglen; + return q->msg; +} + +sbevent_t * +sbevent_init(void) +{ + sbevent_t *evt; + int rv; + + evt = ckd_calloc(1, sizeof(*evt)); + if ((rv = pthread_mutex_init(&evt->mtx, NULL)) != 0) { + E_ERROR("Failed to initialize mutex: %d\n", rv); + ckd_free(evt); + return NULL; + } + if ((rv = pthread_cond_init(&evt->cond, NULL)) != 0) { + E_ERROR_SYSTEM("Failed to initialize mutex: %d\n", rv); + pthread_mutex_destroy(&evt->mtx); + ckd_free(evt); + return NULL; + } + return evt; +} + +void +sbevent_free(sbevent_t *evt) +{ + pthread_mutex_destroy(&evt->mtx); + pthread_cond_destroy(&evt->cond); + ckd_free(evt); +} + +int +sbevent_signal(sbevent_t *evt) +{ + int rv; + + pthread_mutex_lock(&evt->mtx); + evt->signalled = TRUE; + rv = pthread_cond_signal(&evt->cond); + pthread_mutex_unlock(&evt->mtx); + return rv; +} + +int +sbevent_wait(sbevent_t *evt, int sec, int nsec) +{ + int rv = 0; + + /* Lock the mutex before we check its signalled state. */ + pthread_mutex_lock(&evt->mtx); + /* If it's not signalled, then wait until it is. */ + if (!evt->signalled) + rv = cond_timed_wait(&evt->cond, &evt->mtx, sec, nsec); + /* Set its state to unsignalled if we were successful. */ + if (rv == 0) + evt->signalled = FALSE; + /* And unlock its mutex. */ + pthread_mutex_unlock(&evt->mtx); + + return rv; +} + +sbmtx_t * +sbmtx_init(void) +{ + sbmtx_t *mtx; + + mtx = ckd_calloc(1, sizeof(*mtx)); + if (pthread_mutex_init(&mtx->mtx, NULL) != 0) { + ckd_free(mtx); + return NULL; + } + return mtx; +} + +int +sbmtx_trylock(sbmtx_t *mtx) +{ + return pthread_mutex_trylock(&mtx->mtx); +} + +int +sbmtx_lock(sbmtx_t *mtx) +{ + return pthread_mutex_lock(&mtx->mtx); +} + +int +sbmtx_unlock(sbmtx_t *mtx) +{ + return pthread_mutex_unlock(&mtx->mtx); +} + +void +sbmtx_free(sbmtx_t *mtx) +{ + pthread_mutex_destroy(&mtx->mtx); + ckd_free(mtx); +} +#endif /* not WIN32 */ + +cmd_ln_t * +sbthread_config(sbthread_t *th) +{ + return th->config; +} + +void * +sbthread_arg(sbthread_t *th) +{ + return th->arg; +} + +sbmsgq_t * +sbthread_msgq(sbthread_t *th) +{ + return th->msgq; +} + +int +sbthread_send(sbthread_t *th, size_t len, void const *data) +{ + return sbmsgq_send(th->msgq, len, data); +} + +void +sbthread_free(sbthread_t *th) +{ + sbthread_wait(th); + sbmsgq_free(th->msgq); + ckd_free(th); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c new file mode 100644 index 0000000..260628d --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c @@ -0,0 +1,1029 @@ +/* src/slamch.f -- translated by f2c (version 20050501). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#include "sphinxbase/f2c.h" + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +/* Table of constant values */ + +static integer c__1 = 1; +static real c_b32 = 0.f; + +doublereal +slamch_(char *cmach, ftnlen cmach_len) +{ + /* Initialized data */ + (void)cmach_len; + static logical first = TRUE_; + + /* System generated locals */ + integer i__1; + real ret_val; + + /* Builtin functions */ + double pow_ri(real *, integer *); + + /* Local variables */ + static real t; + static integer it; + static real rnd, eps, base; + static integer beta; + static real emin, prec, emax; + static integer imin, imax; + static logical lrnd; + static real rmin, rmax, rmach; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + static real small, sfmin; + extern /* Subroutine */ int slamc2_(integer *, integer *, logical *, real + *, integer *, real *, integer *, + real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMCH determines single precision machine parameters. */ + +/* Arguments */ +/* ========= */ + +/* CMACH (input) CHARACTER*1 */ +/* Specifies the value to be returned by SLAMCH: */ +/* = 'E' or 'e', SLAMCH := eps */ +/* = 'S' or 's , SLAMCH := sfmin */ +/* = 'B' or 'b', SLAMCH := base */ +/* = 'P' or 'p', SLAMCH := eps*base */ +/* = 'N' or 'n', SLAMCH := t */ +/* = 'R' or 'r', SLAMCH := rnd */ +/* = 'M' or 'm', SLAMCH := emin */ +/* = 'U' or 'u', SLAMCH := rmin */ +/* = 'L' or 'l', SLAMCH := emax */ +/* = 'O' or 'o', SLAMCH := rmax */ + +/* where */ + +/* eps = relative machine precision */ +/* sfmin = safe minimum, such that 1/sfmin does not overflow */ +/* base = base of the machine */ +/* prec = eps*base */ +/* t = number of (base) digits in the mantissa */ +/* rnd = 1.0 when rounding occurs in addition, 0.0 otherwise */ +/* emin = minimum exponent before (gradual) underflow */ +/* rmin = underflow threshold - base**(emin-1) */ +/* emax = largest exponent before overflow */ +/* rmax = overflow threshold - (base**emax)*(1-eps) */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + slamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax); + base = (real) beta; + t = (real) it; + if (lrnd) { + rnd = 1.f; + i__1 = 1 - it; + eps = pow_ri(&base, &i__1) / 2; + } + else { + rnd = 0.f; + i__1 = 1 - it; + eps = pow_ri(&base, &i__1); + } + prec = eps * base; + emin = (real) imin; + emax = (real) imax; + sfmin = rmin; + small = 1.f / rmax; + if (small >= sfmin) { + +/* Use SMALL plus a bit, to avoid the possibility of rounding */ +/* causing overflow when computing 1/sfmin. */ + + sfmin = small * (eps + 1.f); + } + } + + if (lsame_(cmach, "E", (ftnlen) 1, (ftnlen) 1)) { + rmach = eps; + } + else if (lsame_(cmach, "S", (ftnlen) 1, (ftnlen) 1)) { + rmach = sfmin; + } + else if (lsame_(cmach, "B", (ftnlen) 1, (ftnlen) 1)) { + rmach = base; + } + else if (lsame_(cmach, "P", (ftnlen) 1, (ftnlen) 1)) { + rmach = prec; + } + else if (lsame_(cmach, "N", (ftnlen) 1, (ftnlen) 1)) { + rmach = t; + } + else if (lsame_(cmach, "R", (ftnlen) 1, (ftnlen) 1)) { + rmach = rnd; + } + else if (lsame_(cmach, "M", (ftnlen) 1, (ftnlen) 1)) { + rmach = emin; + } + else if (lsame_(cmach, "U", (ftnlen) 1, (ftnlen) 1)) { + rmach = rmin; + } + else if (lsame_(cmach, "L", (ftnlen) 1, (ftnlen) 1)) { + rmach = emax; + } + else if (lsame_(cmach, "O", (ftnlen) 1, (ftnlen) 1)) { + rmach = rmax; + } + + ret_val = rmach; + return ret_val; + +/* End of SLAMCH */ + +} /* slamch_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc1_(integer * beta, integer * t, logical * rnd, logical * ieee1) +{ + /* Initialized data */ + + static logical first = TRUE_; + + /* System generated locals */ + real r__1, r__2; + + /* Local variables */ + static real a, b, c__, f, t1, t2; + static integer lt; + static real one, qtr; + static logical lrnd; + static integer lbeta; + static real savec; + static logical lieee1; + extern doublereal slamc3_(real *, real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC1 determines the machine parameters given by BETA, T, RND, and */ +/* IEEE1. */ + +/* Arguments */ +/* ========= */ + +/* BETA (output) INTEGER */ +/* The base of the machine. */ + +/* T (output) INTEGER */ +/* The number of ( BETA ) digits in the mantissa. */ + +/* RND (output) LOGICAL */ +/* Specifies whether proper rounding ( RND = .TRUE. ) or */ +/* chopping ( RND = .FALSE. ) occurs in addition. This may not */ +/* be a reliable guide to the way in which the machine performs */ +/* its arithmetic. */ + +/* IEEE1 (output) LOGICAL */ +/* Specifies whether rounding appears to be done in the IEEE */ +/* 'round to nearest' style. */ + +/* Further Details */ +/* =============== */ + +/* The routine is based on the routine ENVRON by Malcolm and */ +/* incorporates suggestions by Gentleman and Marovich. See */ + +/* Malcolm M. A. (1972) Algorithms to reveal properties of */ +/* floating-point arithmetic. Comms. of the ACM, 15, 949-951. */ + +/* Gentleman W. M. and Marovich S. B. (1974) More on algorithms */ +/* that reveal properties of floating point arithmetic units. */ +/* Comms. of the ACM, 17, 276-277. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + one = 1.f; + +/* LBETA, LIEEE1, LT and LRND are the local values of BETA, */ +/* IEEE1, T and RND. */ + +/* Throughout this routine we use the function SLAMC3 to ensure */ +/* that relevant values are stored and not held in registers, or */ +/* are not affected by optimizers. */ + +/* Compute a = 2.0**m with the smallest positive integer m such */ +/* that */ + +/* fl( a + 1.0 ) = a. */ + + a = 1.f; + c__ = 1.f; + +/* + WHILE( C.EQ.ONE )LOOP */ + L10: + if (c__ == one) { + a *= 2; + c__ = slamc3_(&a, &one); + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + goto L10; + } +/* + END WHILE */ + +/* Now compute b = 2.0**m with the smallest positive integer m */ +/* such that */ + +/* fl( a + b ) .gt. a. */ + + b = 1.f; + c__ = slamc3_(&a, &b); + +/* + WHILE( C.EQ.A )LOOP */ + L20: + if (c__ == a) { + b *= 2; + c__ = slamc3_(&a, &b); + goto L20; + } +/* + END WHILE */ + +/* Now compute the base. a and c are neighbouring floating point */ +/* numbers in the interval ( beta**t, beta**( t + 1 ) ) and so */ +/* their difference is beta. Adding 0.25 to c is to ensure that it */ +/* is truncated to beta and not ( beta - 1 ). */ + + qtr = one / 4; + savec = c__; + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + lbeta = c__ + qtr; + +/* Now determine whether rounding or chopping occurs, by adding a */ +/* bit less than beta/2 and a bit more than beta/2 to a. */ + + b = (real) lbeta; + r__1 = b / 2; + r__2 = -b / 100; + f = slamc3_(&r__1, &r__2); + c__ = slamc3_(&f, &a); + if (c__ == a) { + lrnd = TRUE_; + } + else { + lrnd = FALSE_; + } + r__1 = b / 2; + r__2 = b / 100; + f = slamc3_(&r__1, &r__2); + c__ = slamc3_(&f, &a); + if (lrnd && c__ == a) { + lrnd = FALSE_; + } + +/* Try and decide whether rounding is done in the IEEE 'round to */ +/* nearest' style. B/2 is half a unit in the last place of the two */ +/* numbers A and SAVEC. Furthermore, A is even, i.e. has last bit */ +/* zero, and SAVEC is odd. Thus adding B/2 to A should not change */ +/* A, but adding B/2 to SAVEC should change SAVEC. */ + + r__1 = b / 2; + t1 = slamc3_(&r__1, &a); + r__1 = b / 2; + t2 = slamc3_(&r__1, &savec); + lieee1 = t1 == a && t2 > savec && lrnd; + +/* Now find the mantissa, t. It should be the integer part of */ +/* log to the base beta of a, however it is safer to determine t */ +/* by powering. So we find t as the smallest positive integer for */ +/* which */ + +/* fl( beta**t + 1.0 ) = 1.0. */ + + lt = 0; + a = 1.f; + c__ = 1.f; + +/* + WHILE( C.EQ.ONE )LOOP */ + L30: + if (c__ == one) { + ++lt; + a *= lbeta; + c__ = slamc3_(&a, &one); + r__1 = -a; + c__ = slamc3_(&c__, &r__1); + goto L30; + } +/* + END WHILE */ + + } + + *beta = lbeta; + *t = lt; + *rnd = lrnd; + *ieee1 = lieee1; + return 0; + +/* End of SLAMC1 */ + +} /* slamc1_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc2_(integer * beta, integer * t, logical * rnd, real * + eps, integer * emin, real * rmin, integer * emax, real * rmax) +{ + /* Initialized data */ + + static logical first = TRUE_; + static logical iwarn = FALSE_; + + /* Format strings */ + static char fmt_9999[] = + "(//\002 WARNING. The value EMIN may be incorre" + "ct:-\002,\002 EMIN = \002,i8,/\002 If, after inspection, the va" + "lue EMIN looks\002,\002 acceptable please comment out \002,/\002" + " the IF block as marked within the code of routine\002,\002 SLAM" + "C2,\002,/\002 otherwise supply EMIN explicitly.\002,/)"; + + /* System generated locals */ + integer i__1; + real r__1, r__2, r__3, r__4, r__5; + + /* Builtin functions */ + double pow_ri(real *, integer *); + integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), + e_wsfe(void); + + /* Local variables */ + static real a, b, c__; + static integer i__, lt; + static real one, two; + static logical ieee; + static real half; + static logical lrnd; + static real leps, zero; + static integer lbeta; + static real rbase; + static integer lemin, lemax, gnmin; + static real small; + static integer gpmin; + static real third, lrmin, lrmax, sixth; + static logical lieee1; + extern /* Subroutine */ int slamc1_(integer *, integer *, logical *, + logical *); + extern doublereal slamc3_(real *, real *); + extern /* Subroutine */ int slamc4_(integer *, real *, integer *), + slamc5_(integer *, integer *, integer *, logical *, integer *, + real *); + static integer ngnmin, ngpmin; + + /* Fortran I/O blocks */ + static cilist io___58 = { 0, 6, 0, fmt_9999, 0 }; + + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC2 determines the machine parameters specified in its argument */ +/* list. */ + +/* Arguments */ +/* ========= */ + +/* BETA (output) INTEGER */ +/* The base of the machine. */ + +/* T (output) INTEGER */ +/* The number of ( BETA ) digits in the mantissa. */ + +/* RND (output) LOGICAL */ +/* Specifies whether proper rounding ( RND = .TRUE. ) or */ +/* chopping ( RND = .FALSE. ) occurs in addition. This may not */ +/* be a reliable guide to the way in which the machine performs */ +/* its arithmetic. */ + +/* EPS (output) REAL */ +/* The smallest positive number such that */ + +/* fl( 1.0 - EPS ) .LT. 1.0, */ + +/* where fl denotes the computed value. */ + +/* EMIN (output) INTEGER */ +/* The minimum exponent before (gradual) underflow occurs. */ + +/* RMIN (output) REAL */ +/* The smallest normalized number for the machine, given by */ +/* BASE**( EMIN - 1 ), where BASE is the floating point value */ +/* of BETA. */ + +/* EMAX (output) INTEGER */ +/* The maximum exponent before overflow occurs. */ + +/* RMAX (output) REAL */ +/* The largest positive number for the machine, given by */ +/* BASE**EMAX * ( 1 - EPS ), where BASE is the floating point */ +/* value of BETA. */ + +/* Further Details */ +/* =============== */ + +/* The computation of EPS is based on a routine PARANOIA by */ +/* W. Kahan of the University of California at Berkeley. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Save statement .. */ +/* .. */ +/* .. Data statements .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (first) { + first = FALSE_; + zero = 0.f; + one = 1.f; + two = 2.f; + +/* LBETA, LT, LRND, LEPS, LEMIN and LRMIN are the local values of */ +/* BETA, T, RND, EPS, EMIN and RMIN. */ + +/* Throughout this routine we use the function SLAMC3 to ensure */ +/* that relevant values are stored and not held in registers, or */ +/* are not affected by optimizers. */ + +/* SLAMC1 returns the parameters LBETA, LT, LRND and LIEEE1. */ + + slamc1_(&lbeta, <, &lrnd, &lieee1); + +/* Start to find EPS. */ + + b = (real) lbeta; + i__1 = -lt; + a = pow_ri(&b, &i__1); + leps = a; + +/* Try some tricks to see whether or not this is the correct EPS. */ + + b = two / 3; + half = one / 2; + r__1 = -half; + sixth = slamc3_(&b, &r__1); + third = slamc3_(&sixth, &sixth); + r__1 = -half; + b = slamc3_(&third, &r__1); + b = slamc3_(&b, &sixth); + b = dabs(b); + if (b < leps) { + b = leps; + } + + leps = 1.f; + +/* + WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */ + L10: + if (leps > b && b > zero) { + leps = b; + r__1 = half * leps; +/* Computing 5th power */ + r__3 = two, r__4 = r__3, r__3 *= r__3; +/* Computing 2nd power */ + r__5 = leps; + r__2 = r__4 * (r__3 * r__3) * (r__5 * r__5); + c__ = slamc3_(&r__1, &r__2); + r__1 = -c__; + c__ = slamc3_(&half, &r__1); + b = slamc3_(&half, &c__); + r__1 = -b; + c__ = slamc3_(&half, &r__1); + b = slamc3_(&half, &c__); + goto L10; + } +/* + END WHILE */ + + if (a < leps) { + leps = a; + } + +/* Computation of EPS complete. */ + +/* Now find EMIN. Let A = + or - 1, and + or - (1 + BASE**(-3)). */ +/* Keep dividing A by BETA until (gradual) underflow occurs. This */ +/* is detected when we cannot recover the previous A. */ + + rbase = one / lbeta; + small = one; + for (i__ = 1; i__ <= 3; ++i__) { + r__1 = small * rbase; + small = slamc3_(&r__1, &zero); +/* L20: */ + } + a = slamc3_(&one, &small); + slamc4_(&ngpmin, &one, &lbeta); + r__1 = -one; + slamc4_(&ngnmin, &r__1, &lbeta); + slamc4_(&gpmin, &a, &lbeta); + r__1 = -a; + slamc4_(&gnmin, &r__1, &lbeta); + ieee = FALSE_; + + if (ngpmin == ngnmin && gpmin == gnmin) { + if (ngpmin == gpmin) { + lemin = ngpmin; +/* ( Non twos-complement machines, no gradual underflow; */ +/* e.g., VAX ) */ + } + else if (gpmin - ngpmin == 3) { + lemin = ngpmin - 1 + lt; + ieee = TRUE_; +/* ( Non twos-complement machines, with gradual underflow; */ +/* e.g., IEEE standard followers ) */ + } + else { + lemin = min(ngpmin, gpmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else if (ngpmin == gpmin && ngnmin == gnmin) { + if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) { + lemin = max(ngpmin, ngnmin); +/* ( Twos-complement machines, no gradual underflow; */ +/* e.g., CYBER 205 ) */ + } + else { + lemin = min(ngpmin, ngnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 + && gpmin == gnmin) { + if (gpmin - min(ngpmin, ngnmin) == 3) { + lemin = max(ngpmin, ngnmin) - 1 + lt; +/* ( Twos-complement machines with gradual underflow; */ +/* no known machine ) */ + } + else { + lemin = min(ngpmin, ngnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } + + } + else { +/* Computing MIN */ + i__1 = min(ngpmin, ngnmin), i__1 = min(i__1, gpmin); + lemin = min(i__1, gnmin); +/* ( A guess; no known machine ) */ + iwarn = TRUE_; + } +/* ** */ +/* Comment out this if block if EMIN is ok */ + if (iwarn) { + first = TRUE_; + s_wsfe(&io___58); + do_fio(&c__1, (char *) &lemin, (ftnlen) sizeof(integer)); + e_wsfe(); + } +/* ** */ + +/* Assume IEEE arithmetic if we found denormalised numbers above, */ +/* or if arithmetic seems to round in the IEEE style, determined */ +/* in routine SLAMC1. A true IEEE machine should have both things */ +/* true; however, faulty machines may have one or the other. */ + + ieee = ieee || lieee1; + +/* Compute RMIN by successive division by BETA. We could compute */ +/* RMIN as BASE**( EMIN - 1 ), but some machines underflow during */ +/* this computation. */ + + lrmin = 1.f; + i__1 = 1 - lemin; + for (i__ = 1; i__ <= i__1; ++i__) { + r__1 = lrmin * rbase; + lrmin = slamc3_(&r__1, &zero); +/* L30: */ + } + +/* Finally, call SLAMC5 to compute EMAX and RMAX. */ + + slamc5_(&lbeta, <, &lemin, &ieee, &lemax, &lrmax); + } + + *beta = lbeta; + *t = lt; + *rnd = lrnd; + *eps = leps; + *emin = lemin; + *rmin = lrmin; + *emax = lemax; + *rmax = lrmax; + + return 0; + + +/* End of SLAMC2 */ + +} /* slamc2_ */ + + +/* *********************************************************************** */ + +doublereal +slamc3_(real * a, real * b) +{ + /* System generated locals */ + real ret_val; + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC3 is intended to force A and B to be stored prior to doing */ +/* the addition of A and B , for use in situations where optimizers */ +/* might hold one of these in a register. */ + +/* Arguments */ +/* ========= */ + +/* A, B (input) REAL */ +/* The values A and B. */ + +/* ===================================================================== */ + +/* .. Executable Statements .. */ + + ret_val = *a + *b; + + return ret_val; + +/* End of SLAMC3 */ + +} /* slamc3_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc4_(integer * emin, real * start, integer * base) +{ + /* System generated locals */ + integer i__1; + real r__1; + + /* Local variables */ + static real a; + static integer i__; + static real b1, b2, c1, c2, d1, d2, one, zero, rbase; + extern doublereal slamc3_(real *, real *); + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC4 is a service routine for SLAMC2. */ + +/* Arguments */ +/* ========= */ + +/* EMIN (output) EMIN */ +/* The minimum exponent before (gradual) underflow, computed by */ +/* setting A = START and dividing by BASE until the previous A */ +/* can not be recovered. */ + +/* START (input) REAL */ +/* The starting point for determining EMIN. */ + +/* BASE (input) INTEGER */ +/* The base of the machine. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + a = *start; + one = 1.f; + rbase = one / *base; + zero = 0.f; + *emin = 1; + r__1 = a * rbase; + b1 = slamc3_(&r__1, &zero); + c1 = a; + c2 = a; + d1 = a; + d2 = a; +/* + WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND. */ +/* $ ( D1.EQ.A ).AND.( D2.EQ.A ) )LOOP */ + L10: + if (c1 == a && c2 == a && d1 == a && d2 == a) { + --(*emin); + a = b1; + r__1 = a / *base; + b1 = slamc3_(&r__1, &zero); + r__1 = b1 * *base; + c1 = slamc3_(&r__1, &zero); + d1 = zero; + i__1 = *base; + for (i__ = 1; i__ <= i__1; ++i__) { + d1 += b1; +/* L20: */ + } + r__1 = a * rbase; + b2 = slamc3_(&r__1, &zero); + r__1 = b2 / rbase; + c2 = slamc3_(&r__1, &zero); + d2 = zero; + i__1 = *base; + for (i__ = 1; i__ <= i__1; ++i__) { + d2 += b2; +/* L30: */ + } + goto L10; + } +/* + END WHILE */ + + return 0; + +/* End of SLAMC4 */ + +} /* slamc4_ */ + + +/* *********************************************************************** */ + +/* Subroutine */ int +slamc5_(integer * beta, integer * p, integer * emin, + logical * ieee, integer * emax, real * rmax) +{ + /* System generated locals */ + integer i__1; + real r__1; + + /* Local variables */ + static integer i__; + static real y, z__; + static integer try__, lexp; + static real oldy; + static integer uexp, nbits; + extern doublereal slamc3_(real *, real *); + static real recbas; + static integer exbits, expsum; + + +/* -- LAPACK auxiliary routine (version 3.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ +/* Courant Institute, Argonne National Lab, and Rice University */ +/* October 31, 1992 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* Purpose */ +/* ======= */ + +/* SLAMC5 attempts to compute RMAX, the largest machine floating-point */ +/* number, without overflow. It assumes that EMAX + abs(EMIN) sum */ +/* approximately to a power of 2. It will fail on machines where this */ +/* assumption does not hold, for example, the Cyber 205 (EMIN = -28625, */ +/* EMAX = 28718). It will also fail if the value supplied for EMIN is */ +/* too large (i.e. too close to zero), probably with overflow. */ + +/* Arguments */ +/* ========= */ + +/* BETA (input) INTEGER */ +/* The base of floating-point arithmetic. */ + +/* P (input) INTEGER */ +/* The number of base BETA digits in the mantissa of a */ +/* floating-point value. */ + +/* EMIN (input) INTEGER */ +/* The minimum exponent before (gradual) underflow. */ + +/* IEEE (input) LOGICAL */ +/* A logical flag specifying whether or not the arithmetic */ +/* system is thought to comply with the IEEE standard. */ + +/* EMAX (output) INTEGER */ +/* The largest exponent before overflow */ + +/* RMAX (output) REAL */ +/* The largest machine floating-point number. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* First compute LEXP and UEXP, two powers of 2 that bound */ +/* abs(EMIN). We then assume that EMAX + abs(EMIN) will sum */ +/* approximately to the bound that is closest to abs(EMIN). */ +/* (EMAX is the exponent of the required number RMAX). */ + + lexp = 1; + exbits = 1; + L10: + try__ = lexp << 1; + if (try__ <= -(*emin)) { + lexp = try__; + ++exbits; + goto L10; + } + if (lexp == -(*emin)) { + uexp = lexp; + } + else { + uexp = try__; + ++exbits; + } + +/* Now -LEXP is less than or equal to EMIN, and -UEXP is greater */ +/* than or equal to EMIN. EXBITS is the number of bits needed to */ +/* store the exponent. */ + + if (uexp + *emin > -lexp - *emin) { + expsum = lexp << 1; + } + else { + expsum = uexp << 1; + } + +/* EXPSUM is the exponent range, approximately equal to */ +/* EMAX - EMIN + 1 . */ + + *emax = expsum + *emin - 1; + nbits = exbits + 1 + *p; + +/* NBITS is the total number of bits needed to store a */ +/* floating-point number. */ + + if (nbits % 2 == 1 && *beta == 2) { + +/* Either there are an odd number of bits used to store a */ +/* floating-point number, which is unlikely, or some bits are */ +/* not used in the representation of numbers, which is possible, */ +/* (e.g. Cray machines) or the mantissa has an implicit bit, */ +/* (e.g. IEEE machines, Dec Vax machines), which is perhaps the */ +/* most likely. We have to assume the last alternative. */ +/* If this is true, then we need to reduce EMAX by one because */ +/* there must be some way of representing zero in an implicit-bit */ +/* system. On machines like Cray, we are reducing EMAX by one */ +/* unnecessarily. */ + + --(*emax); + } + + if (*ieee) { + +/* Assume we are on an IEEE machine which reserves one exponent */ +/* for infinity and NaN. */ + + --(*emax); + } + +/* Now create RMAX, the largest machine number, which should */ +/* be equal to (1.0 - BETA**(-P)) * BETA**EMAX . */ + +/* First compute 1.0 - BETA**(-P), being careful that the */ +/* result is less than 1.0 . */ + + recbas = 1.f / *beta; + z__ = *beta - 1.f; + y = 0.f; + i__1 = *p; + for (i__ = 1; i__ <= i__1; ++i__) { + z__ *= recbas; + if (y < 1.f) { + oldy = y; + } + y = slamc3_(&y, &z__); +/* L20: */ + } + if (y >= 1.f) { + y = oldy; + } + +/* Now multiply by BETA**EMAX to get RMAX. */ + + i__1 = *emax; + for (i__ = 1; i__ <= i__1; ++i__) { + r__1 = y * *beta; + y = slamc3_(&r__1, &c_b32); +/* L30: */ + } + + *rmax = y; + return 0; + +/* End of SLAMC5 */ + +} /* slamc5_ */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c new file mode 100644 index 0000000..a81f27f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c @@ -0,0 +1,1463 @@ +/* +NOTE: This is generated code. Look in README.python for information on + remaking this file. +*/ +#include "sphinxbase/f2c.h" + +#ifdef HAVE_CONFIG +#include "config.h" +#else +extern doublereal slamch_(char *); +#define EPSILON slamch_("Epsilon") +#define SAFEMINIMUM slamch_("Safe minimum") +#define PRECISION slamch_("Precision") +#define BASE slamch_("Base") +#endif + + +extern doublereal slapy2_(real *, real *); + + + +/* Table of constant values */ + +static integer c__0 = 0; +static real c_b163 = 0.f; +static real c_b164 = 1.f; +static integer c__1 = 1; +static real c_b181 = -1.f; +static integer c_n1 = -1; + +integer ieeeck_(integer *ispec, real *zero, real *one) +{ + /* System generated locals */ + integer ret_val; + + /* Local variables */ + static real nan1, nan2, nan3, nan4, nan5, nan6, neginf, posinf, negzro, + newzro; + + +/* + -- LAPACK auxiliary routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + June 30, 1998 + + + Purpose + ======= + + IEEECK is called from the ILAENV to verify that Infinity and + possibly NaN arithmetic is safe (i.e. will not trap). + + Arguments + ========= + + ISPEC (input) INTEGER + Specifies whether to test just for inifinity arithmetic + or whether to test for infinity and NaN arithmetic. + = 0: Verify infinity arithmetic only. + = 1: Verify infinity and NaN arithmetic. + + ZERO (input) REAL + Must contain the value 0.0 + This is passed to prevent the compiler from optimizing + away this code. + + ONE (input) REAL + Must contain the value 1.0 + This is passed to prevent the compiler from optimizing + away this code. + + RETURN VALUE: INTEGER + = 0: Arithmetic failed to produce the correct answers + = 1: Arithmetic produced the correct answers +*/ + + ret_val = 1; + + posinf = *one / *zero; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + neginf = -(*one) / *zero; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + negzro = *one / (neginf + *one); + if (negzro != *zero) { + ret_val = 0; + return ret_val; + } + + neginf = *one / negzro; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + newzro = negzro + *zero; + if (newzro != *zero) { + ret_val = 0; + return ret_val; + } + + posinf = *one / newzro; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + neginf *= posinf; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + posinf *= posinf; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + +/* Return if we were only asked to check infinity arithmetic */ + + if (*ispec == 0) { + return ret_val; + } + + nan1 = posinf + neginf; + + nan2 = posinf / neginf; + + nan3 = posinf / posinf; + + nan4 = posinf * *zero; + + nan5 = neginf * negzro; + + nan6 = nan5 * 0.f; + + if (nan1 == nan1) { + ret_val = 0; + return ret_val; + } + + if (nan2 == nan2) { + ret_val = 0; + return ret_val; + } + + if (nan3 == nan3) { + ret_val = 0; + return ret_val; + } + + if (nan4 == nan4) { + ret_val = 0; + return ret_val; + } + + if (nan5 == nan5) { + ret_val = 0; + return ret_val; + } + + if (nan6 == nan6) { + ret_val = 0; + return ret_val; + } + + return ret_val; +} /* ieeeck_ */ + +integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, + integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen + opts_len) +{ + /* System generated locals */ + integer ret_val; + + /* Builtin functions */ + /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); + integer s_cmp(char *, char *, ftnlen, ftnlen); + + /* Local variables */ + static integer i__; + static char c1[1], c2[2], c3[3], c4[2]; + static integer ic, nb, iz, nx; + static logical cname, sname; + static integer nbmin; + extern integer ieeeck_(integer *, real *, real *); + static char subnam[6]; + + (void)opts; + (void)n3; + (void)opts_len; +/* + -- LAPACK auxiliary routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + June 30, 1999 + + + Purpose + ======= + + ILAENV is called from the LAPACK routines to choose problem-dependent + parameters for the local environment. See ISPEC for a description of + the parameters. + + This version provides a set of parameters which should give good, + but not optimal, performance on many of the currently available + computers. Users are encouraged to modify this subroutine to set + the tuning parameters for their particular machine using the option + and problem size information in the arguments. + + This routine will not function correctly if it is converted to all + lower case. Converting it to all upper case is allowed. + + Arguments + ========= + + ISPEC (input) INTEGER + Specifies the parameter to be returned as the value of + ILAENV. + = 1: the optimal blocksize; if this value is 1, an unblocked + algorithm will give the best performance. + = 2: the minimum block size for which the block routine + should be used; if the usable block size is less than + this value, an unblocked routine should be used. + = 3: the crossover point (in a block routine, for N less + than this value, an unblocked routine should be used) + = 4: the number of shifts, used in the nonsymmetric + eigenvalue routines + = 5: the minimum column dimension for blocking to be used; + rectangular blocks must have dimension at least k by m, + where k is given by ILAENV(2,...) and m by ILAENV(5,...) + = 6: the crossover point for the SVD (when reducing an m by n + matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds + this value, a QR factorization is used first to reduce + the matrix to a triangular form.) + = 7: the number of processors + = 8: the crossover point for the multishift QR and QZ methods + for nonsymmetric eigenvalue problems. + = 9: maximum size of the subproblems at the bottom of the + computation tree in the divide-and-conquer algorithm + (used by xGELSD and xGESDD) + =10: ieee NaN arithmetic can be trusted not to trap + =11: infinity arithmetic can be trusted not to trap + + NAME (input) CHARACTER*(*) + The name of the calling subroutine, in either upper case or + lower case. + + OPTS (input) CHARACTER*(*) + The character options to the subroutine NAME, concatenated + into a single character string. For example, UPLO = 'U', + TRANS = 'T', and DIAG = 'N' for a triangular routine would + be specified as OPTS = 'UTN'. + + N1 (input) INTEGER + N2 (input) INTEGER + N3 (input) INTEGER + N4 (input) INTEGER + Problem dimensions for the subroutine NAME; these may not all + be required. + + (ILAENV) (output) INTEGER + >= 0: the value of the parameter specified by ISPEC + < 0: if ILAENV = -k, the k-th argument had an illegal value. + + Further Details + =============== + + The following conventions have been used when calling ILAENV from the + LAPACK routines: + 1) OPTS is a concatenation of all of the character options to + subroutine NAME, in the same order that they appear in the + argument list for NAME, even if they are not used in determining + the value of the parameter specified by ISPEC. + 2) The problem dimensions N1, N2, N3, N4 are specified in the order + that they appear in the argument list for NAME. N1 is used + first, N2 second, and so on, and unused problem dimensions are + passed a value of -1. + 3) The parameter value returned by ILAENV is checked for validity in + the calling subroutine. For example, ILAENV is used to retrieve + the optimal blocksize for STRTRI as follows: + + NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) + IF( NB.LE.1 ) NB = MAX( 1, N ) + + ===================================================================== +*/ + + + switch (*ispec) { + case 1: goto L100; + case 2: goto L100; + case 3: goto L100; + case 4: goto L400; + case 5: goto L500; + case 6: goto L600; + case 7: goto L700; + case 8: goto L800; + case 9: goto L900; + case 10: goto L1000; + case 11: goto L1100; + } + +/* Invalid value for ISPEC */ + + ret_val = -1; + return ret_val; + +L100: + +/* Convert NAME to upper case if the first character is lower case. */ + + ret_val = 1; + s_copy(subnam, name__, (ftnlen)6, name_len); + ic = *(unsigned char *)subnam; + iz = 'Z'; + if (iz == 90 || iz == 122) { + +/* ASCII character set */ + + if (ic >= 97 && ic <= 122) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 97 && ic <= 122) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } +/* L10: */ + } + } + + } else if (iz == 233 || iz == 169) { + +/* EBCDIC character set */ + + if ((ic >= 129 && ic <= 137) || (ic >= 145 && ic <= 153) || (ic >= 162 && + ic <= 169)) { + *(unsigned char *)subnam = (char) (ic + 64); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if ((ic >= 129 && ic <= 137) || (ic >= 145 && ic <= 153) || (ic >= + 162 && ic <= 169)) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + } +/* L20: */ + } + } + + } else if (iz == 218 || iz == 250) { + +/* Prime machines: ASCII+128 */ + + if (ic >= 225 && ic <= 250) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 225 && ic <= 250) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } +/* L30: */ + } + } + } + + *(unsigned char *)c1 = *(unsigned char *)subnam; + sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; + cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; + if (! (cname || sname)) { + return ret_val; + } + s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); + s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); + s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); + + switch (*ispec) { + case 1: goto L110; + case 2: goto L200; + case 3: goto L300; + } + +L110: + +/* + ISPEC = 1: block size + + In these examples, separate code is provided for setting NB for + real and complex. We assume that NB will take the same value in + single or double precision. +*/ + + nb = 1; + + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, + "RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen) + 3, (ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) + == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "PO", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (sname && s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } else if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } + } else if (s_cmp(c2, "GB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } + } else if (s_cmp(c2, "PB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } + } else if (s_cmp(c2, "TR", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, "LA", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "UUM", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (sname && s_cmp(c2, "ST", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "EBZ", (ftnlen)3, (ftnlen)3) == 0) { + nb = 1; + } + } + ret_val = nb; + return ret_val; + +L200: + +/* ISPEC = 2: minimum block size */ + + nbmin = 2; + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 8; + } else { + nbmin = 8; + } + } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } + } + ret_val = nbmin; + return ret_val; + +L300: + +/* ISPEC = 3: crossover point */ + + nx = 0; + if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } + } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { + if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } + } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } + } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } + } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } + } + ret_val = nx; + return ret_val; + +L400: + +/* ISPEC = 4: number of shifts (used by xHSEQR) */ + + ret_val = 6; + return ret_val; + +L500: + +/* ISPEC = 5: minimum column dimension (not used) */ + + ret_val = 2; + return ret_val; + +L600: + +/* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ + + ret_val = (integer) ((real) min(*n1,*n2) * 1.6f); + return ret_val; + +L700: + +/* ISPEC = 7: number of processors (not used) */ + + ret_val = 1; + return ret_val; + +L800: + +/* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ + + ret_val = 50; + return ret_val; + +L900: + +/* + ISPEC = 9: maximum size of the subproblems at the bottom of the + computation tree in the divide-and-conquer algorithm + (used by xGELSD and xGESDD) +*/ + + ret_val = 25; + return ret_val; + +L1000: + +/* + ISPEC = 10: ieee NaN arithmetic can be trusted not to trap + + ILAENV = 0 +*/ + ret_val = 1; + if (ret_val == 1) { + ret_val = ieeeck_(&c__0, &c_b163, &c_b164); + } + return ret_val; + +L1100: + +/* + ISPEC = 11: infinity arithmetic can be trusted not to trap + + ILAENV = 0 +*/ + ret_val = 1; + if (ret_val == 1) { + ret_val = ieeeck_(&c__1, &c_b163, &c_b164); + } + return ret_val; + +/* End of ILAENV */ + +} /* ilaenv_ */ + +/* Subroutine */ int sposv_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *); + extern /* Subroutine */ int xerbla_(char *, integer *), spotrf_( + char *, integer *, real *, integer *, integer *), spotrs_( + char *, integer *, integer *, real *, integer *, real *, integer * + , integer *); + + +/* + -- LAPACK driver routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOSV computes the solution to a real system of linear equations + A * X = B, + where A is an N-by-N symmetric positive definite matrix and X and B + are N-by-NRHS matrices. + + The Cholesky decomposition is used to factor A as + A = U**T* U, if UPLO = 'U', or + A = L * L**T, if UPLO = 'L', + where U is an upper triangular matrix and L is a lower triangular + matrix. The factored form of A is then used to solve the system of + equations A * X = B. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The number of linear equations, i.e., the order of the + matrix A. N >= 0. + + NRHS (input) INTEGER + The number of right hand sides, i.e., the number of columns + of the matrix B. NRHS >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + N-by-N upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading N-by-N lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U**T*U or A = L*L**T. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + B (input/output) REAL array, dimension (LDB,NRHS) + On entry, the N-by-NRHS right hand side matrix B. + On exit, if INFO = 0, the N-by-NRHS solution matrix X. + + LDB (input) INTEGER + The leading dimension of the array B. LDB >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + > 0: if INFO = i, the leading minor of order i of A is not + positive definite, so the factorization could not be + completed, and the solution has not been computed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + if (! lsame_(uplo, "U") && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOSV ", &i__1); + return 0; + } + +/* Compute the Cholesky factorization A = U'*U or A = L*L'. */ + + spotrf_(uplo, n, &a[a_offset], lda, info); + if (*info == 0) { + +/* Solve the system A*X = B, overwriting B with X. */ + + spotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info); + + } + return 0; + +/* End of SPOSV */ + +} /* sposv_ */ + +/* Subroutine */ int spotf2_(char *uplo, integer *n, real *a, integer *lda, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + real r__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + static integer j; + static real ajj; + extern doublereal sdot_(integer *, real *, integer *, real *, integer *); + extern logical lsame_(char *, char *); + extern /* Subroutine */ int sscal_(integer *, real *, real *, integer *), + sgemv_(char *, integer *, integer *, real *, real *, integer *, + real *, integer *, real *, real *, integer *); + static logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + February 29, 1992 + + + Purpose + ======= + + SPOTF2 computes the Cholesky factorization of a real symmetric + positive definite matrix A. + + The factorization has the form + A = U' * U , if UPLO = 'U', or + A = L * L', if UPLO = 'L', + where U is an upper triangular matrix and L is lower triangular. + + This is the unblocked version of the algorithm, calling Level 2 BLAS. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + Specifies whether the upper or lower triangular part of the + symmetric matrix A is stored. + = 'U': Upper triangular + = 'L': Lower triangular + + N (input) INTEGER + The order of the matrix A. N >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + n by n upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading n by n lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U'*U or A = L*L'. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -k, the k-th argument had an illegal value + > 0: if INFO = k, the leading minor of order k is not + positive definite, and the factorization could not be + completed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTF2", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (upper) { + +/* Compute the Cholesky factorization A = U'*U. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute U(J,J) and test for non-positive-definiteness. */ + + i__2 = j - 1; + ajj = a[j + j * a_dim1] - sdot_(&i__2, &a[j * a_dim1 + 1], &c__1, + &a[j * a_dim1 + 1], &c__1); + if (ajj <= 0.f) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; + +/* Compute elements J+1:N of row J. */ + + if (j < *n) { + i__2 = j - 1; + i__3 = *n - j; + sgemv_("Transpose", &i__2, &i__3, &c_b181, &a[(j + 1) * + a_dim1 + 1], lda, &a[j * a_dim1 + 1], &c__1, &c_b164, + &a[j + (j + 1) * a_dim1], lda); + i__2 = *n - j; + r__1 = 1.f / ajj; + sscal_(&i__2, &r__1, &a[j + (j + 1) * a_dim1], lda); + } +/* L10: */ + } + } else { + +/* Compute the Cholesky factorization A = L*L'. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute L(J,J) and test for non-positive-definiteness. */ + + i__2 = j - 1; + ajj = a[j + j * a_dim1] - sdot_(&i__2, &a[j + a_dim1], lda, &a[j + + a_dim1], lda); + if (ajj <= 0.f) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; + +/* Compute elements J+1:N of column J. */ + + if (j < *n) { + i__2 = *n - j; + i__3 = j - 1; + sgemv_("No transpose", &i__2, &i__3, &c_b181, &a[j + 1 + + a_dim1], lda, &a[j + a_dim1], lda, &c_b164, &a[j + 1 + + j * a_dim1], &c__1); + i__2 = *n - j; + r__1 = 1.f / ajj; + sscal_(&i__2, &r__1, &a[j + 1 + j * a_dim1], &c__1); + } +/* L20: */ + } + } + goto L40; + +L30: + *info = j; + +L40: + return 0; + +/* End of SPOTF2 */ + +} /* spotf2_ */ + +/* Subroutine */ int spotrf_(char *uplo, integer *n, real *a, integer *lda, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + static integer j, jb, nb; + extern logical lsame_(char *, char *); + extern /* Subroutine */ int sgemm_(char *, char *, integer *, integer *, + integer *, real *, real *, integer *, real *, integer *, real *, + real *, integer *); + static logical upper; + extern /* Subroutine */ int strsm_(char *, char *, char *, char *, + integer *, integer *, real *, real *, integer *, real *, integer * + ), ssyrk_(char *, char *, integer + *, integer *, real *, real *, integer *, real *, real *, integer * + ), spotf2_(char *, integer *, real *, integer *, + integer *), xerbla_(char *, integer *); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOTRF computes the Cholesky factorization of a real symmetric + positive definite matrix A. + + The factorization has the form + A = U**T * U, if UPLO = 'U', or + A = L * L**T, if UPLO = 'L', + where U is an upper triangular matrix and L is lower triangular. + + This is the block version of the algorithm, calling Level 3 BLAS. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The order of the matrix A. N >= 0. + + A (input/output) REAL array, dimension (LDA,N) + On entry, the symmetric matrix A. If UPLO = 'U', the leading + N-by-N upper triangular part of A contains the upper + triangular part of the matrix A, and the strictly lower + triangular part of A is not referenced. If UPLO = 'L', the + leading N-by-N lower triangular part of A contains the lower + triangular part of the matrix A, and the strictly upper + triangular part of A is not referenced. + + On exit, if INFO = 0, the factor U or L from the Cholesky + factorization A = U**T*U or A = L*L**T. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + > 0: if INFO = i, the leading minor of order i is not + positive definite, and the factorization could not be + completed. + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTRF", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Determine the block size for this environment. */ + + nb = ilaenv_(&c__1, "SPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( + ftnlen)1); + if (nb <= 1 || nb >= *n) { + +/* Use unblocked code. */ + + spotf2_(uplo, n, &a[a_offset], lda, info); + } else { + +/* Use blocked code. */ + + if (upper) { + +/* Compute the Cholesky factorization A = U'*U. */ + + i__1 = *n; + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + +/* + Update and factorize the current diagonal block and test + for non-positive-definiteness. + + Computing MIN +*/ + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + ssyrk_("Upper", "Transpose", &jb, &i__3, &c_b181, &a[j * + a_dim1 + 1], lda, &c_b164, &a[j + j * a_dim1], lda); + spotf2_("Upper", &jb, &a[j + j * a_dim1], lda, info); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + +/* Compute the current block row. */ + + i__3 = *n - j - jb + 1; + i__4 = j - 1; + sgemm_("Transpose", "No transpose", &jb, &i__3, &i__4, & + c_b181, &a[j * a_dim1 + 1], lda, &a[(j + jb) * + a_dim1 + 1], lda, &c_b164, &a[j + (j + jb) * + a_dim1], lda); + i__3 = *n - j - jb + 1; + strsm_("Left", "Upper", "Transpose", "Non-unit", &jb, & + i__3, &c_b164, &a[j + j * a_dim1], lda, &a[j + (j + + jb) * a_dim1], lda); + } +/* L10: */ + } + + } else { + +/* Compute the Cholesky factorization A = L*L'. */ + + i__2 = *n; + i__1 = nb; + for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + +/* + Update and factorize the current diagonal block and test + for non-positive-definiteness. + + Computing MIN +*/ + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + ssyrk_("Lower", "No transpose", &jb, &i__3, &c_b181, &a[j + + a_dim1], lda, &c_b164, &a[j + j * a_dim1], lda); + spotf2_("Lower", &jb, &a[j + j * a_dim1], lda, info); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + +/* Compute the current block column. */ + + i__3 = *n - j - jb + 1; + i__4 = j - 1; + sgemm_("No transpose", "Transpose", &i__3, &jb, &i__4, & + c_b181, &a[j + jb + a_dim1], lda, &a[j + a_dim1], + lda, &c_b164, &a[j + jb + j * a_dim1], lda); + i__3 = *n - j - jb + 1; + strsm_("Right", "Lower", "Transpose", "Non-unit", &i__3, & + jb, &c_b164, &a[j + j * a_dim1], lda, &a[j + jb + + j * a_dim1], lda); + } +/* L20: */ + } + } + } + goto L40; + +L30: + *info = *info + j - 1; + +L40: + return 0; + +/* End of SPOTRF */ + +} /* spotrf_ */ + +/* Subroutine */ int spotrs_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *); + static logical upper; + extern /* Subroutine */ int strsm_(char *, char *, char *, char *, + integer *, integer *, real *, real *, integer *, real *, integer * + ), xerbla_(char *, integer *); + + +/* + -- LAPACK routine (version 3.0) -- + Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., + Courant Institute, Argonne National Lab, and Rice University + March 31, 1993 + + + Purpose + ======= + + SPOTRS solves a system of linear equations A*X = B with a symmetric + positive definite matrix A using the Cholesky factorization + A = U**T*U or A = L*L**T computed by SPOTRF. + + Arguments + ========= + + UPLO (input) CHARACTER*1 + = 'U': Upper triangle of A is stored; + = 'L': Lower triangle of A is stored. + + N (input) INTEGER + The order of the matrix A. N >= 0. + + NRHS (input) INTEGER + The number of right hand sides, i.e., the number of columns + of the matrix B. NRHS >= 0. + + A (input) REAL array, dimension (LDA,N) + The triangular factor U or L from the Cholesky factorization + A = U**T*U or A = L*L**T, as computed by SPOTRF. + + LDA (input) INTEGER + The leading dimension of the array A. LDA >= max(1,N). + + B (input/output) REAL array, dimension (LDB,NRHS) + On entry, the right hand side matrix B. + On exit, the solution matrix X. + + LDB (input) INTEGER + The leading dimension of the array B. LDB >= max(1,N). + + INFO (output) INTEGER + = 0: successful exit + < 0: if INFO = -i, the i-th argument had an illegal value + + ===================================================================== + + + Test the input parameters. +*/ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, "U"); + if (! upper && ! lsame_(uplo, "L")) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_("SPOTRS", &i__1); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0 || *nrhs == 0) { + return 0; + } + + if (upper) { + +/* + Solve A*X = B where A = U'*U. + + Solve U'*X = B, overwriting B with X. +*/ + + strsm_("Left", "Upper", "Transpose", "Non-unit", n, nrhs, &c_b164, &a[ + a_offset], lda, &b[b_offset], ldb); + +/* Solve U*X = B, overwriting B with X. */ + + strsm_("Left", "Upper", "No transpose", "Non-unit", n, nrhs, &c_b164, + &a[a_offset], lda, &b[b_offset], ldb); + } else { + +/* + Solve A*X = B where A = L*L'. + + Solve L*X = B, overwriting B with X. +*/ + + strsm_("Left", "Lower", "No transpose", "Non-unit", n, nrhs, &c_b164, + &a[a_offset], lda, &b[b_offset], ldb); + +/* Solve L'*X = B, overwriting B with X. */ + + strsm_("Left", "Lower", "Transpose", "Non-unit", n, nrhs, &c_b164, &a[ + a_offset], lda, &b[b_offset], ldb); + } + + return 0; + +/* End of SPOTRS */ + +} /* spotrs_ */ + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c new file mode 100644 index 0000000..4d2d72f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c @@ -0,0 +1,194 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2006 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ +/* + * strfuncs.c -- String functions + */ + + +#include +#include +#include +#include +#include + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/strfuncs.h" + +/* Defined in dtoa.c */ +double sb_strtod(const char *s00, char **se); + +double +atof_c(char const *str) +{ + return sb_strtod(str, NULL); +} + +/* Locale-independent isspace to avoid different incompatibilities */ +static int +isspace_c(char ch) +{ + if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') + return 1; + return 0; +} + +char * +string_join(const char *base, ...) +{ + va_list args; + size_t len; + const char *c; + char *out; + + va_start(args, base); + len = strlen(base); + while ((c = va_arg(args, const char *)) != NULL) { + len += strlen(c); + } + len++; + va_end(args); + + out = ckd_calloc(len, 1); + va_start(args, base); + strcpy(out, base); + while ((c = va_arg(args, const char *)) != NULL) { + strcat(out, c); + } + va_end(args); + + return out; +} + +char * +string_trim(char *string, enum string_edge_e which) +{ + size_t len; + + len = strlen(string); + if (which == STRING_START || which == STRING_BOTH) { + size_t sub = strspn(string, " \t\n\r\f"); + if (sub > 0) { + memmove(string, string + sub, len + 1 - sub); + len -= sub; + } + } + if (which == STRING_END || which == STRING_BOTH) { + long sub = len; + while (--sub >= 0) + if (strchr(" \t\n\r\f", string[sub]) == NULL) + break; + if (sub == -1) + string[0] = '\0'; + else + string[sub+1] = '\0'; + } + return string; +} + +int32 +str2words(char *line, char **ptr, int32 max_ptr) +{ + int32 i, n; + + n = 0; /* #words found so far */ + i = 0; /* For scanning through the input string */ + while (1) { + /* Skip whitespace before next word */ + while (line[i] && isspace_c(line[i])) + ++i; + if (!line[i]) + break; + + if (ptr != NULL && n >= max_ptr) { + /* + * Pointer array size insufficient. Restore NULL chars inserted so far + * to space chars. Not a perfect restoration, but better than nothing. + */ + for (; i >= 0; --i) + if (line[i] == '\0') + line[i] = ' '; + + return -1; + } + + /* Scan to end of word */ + if (ptr != NULL) + ptr[n] = line + i; + ++n; + while (line[i] && !isspace_c(line[i])) + ++i; + if (!line[i]) + break; + if (ptr != NULL) + line[i] = '\0'; + ++i; + } + + return n; +} + + +int32 +nextword(char *line, const char *delim, char **word, char *delimfound) +{ + const char *d; + char *w; + + /* Skip past any preceding delimiters */ + for (w = line; *w; w++) { + for (d = delim; *d && (*d != *w); d++); + if (!*d) + break; + } + if (!*w) + return -1; + + *word = w; /* Beginning of word */ + + /* Skip until first delimiter char */ + for (w++; *w; w++) { + for (d = delim; *d && (*d != *w); d++); + if (*d) + break; + } + + /* Replace delimiter with NULL char, but return the original first */ + *delimfound = *w; + *w = '\0'; + + return (w - *word); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines new file mode 100644 index 0000000..d78c8db --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines @@ -0,0 +1,4 @@ +ssymm +sposv +spotrf +IGNORE: slamch diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c new file mode 100644 index 0000000..edb8699 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c @@ -0,0 +1,150 @@ +/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * vector.c + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1997 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + * + * HISTORY + * + * 22-Nov-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University + * Imported from s3.2, for supporting s3 format continuous + * acoustic models. + * + * 10-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Added vector_accum(), vector_vqlabel(), and vector_vqgen(). + * + * 09-Mar-1999 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Added vector_is_zero(), vector_cmp(), and vector_dist_eucl(). + * Changed the name vector_dist_eval to vector_dist_maha. + * + * 07-Oct-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Added distance computation related functions. + * + * 12-Nov-95 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. + * Copied from Eric Thayer. + */ + +/* System headers. */ +#include +#include +#include +#include +#include + +/* SphinxBase headers. */ +#include +#include +#include + +/* Local headers. */ +#include "vector.h" + +#if defined(_WIN32) +#define srandom srand +#define random rand +#endif + + +float64 +vector_sum_norm(float32 * vec, int32 len) +{ + float64 sum, f; + int32 i; + + sum = 0.0; + for (i = 0; i < len; i++) + sum += vec[i]; + + if (sum != 0.0) { + f = 1.0 / sum; + for (i = 0; i < len; i++) + vec[i] *= f; + } + + return sum; +} + + +void +vector_floor(float32 * vec, int32 len, float64 flr) +{ + int32 i; + + for (i = 0; i < len; i++) + if (vec[i] < flr) + vec[i] = (float32) flr; +} + + +void +vector_nz_floor(float32 * vec, int32 len, float64 flr) +{ + int32 i; + + for (i = 0; i < len; i++) + if ((vec[i] != 0.0) && (vec[i] < flr)) + vec[i] = (float32) flr; +} + + +void +vector_print(FILE * fp, vector_t v, int32 dim) +{ + int32 i; + + for (i = 0; i < dim; i++) + fprintf(fp, " %11.4e", v[i]); + fprintf(fp, "\n"); + fflush(fp); +} + + +int32 +vector_is_zero(float32 * vec, int32 len) +{ + int32 i; + + for (i = 0; (i < len) && (vec[i] == 0.0); i++); + return (i == len); /* TRUE iff all mean values are 0.0 */ +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h new file mode 100644 index 0000000..ee8fd52 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h @@ -0,0 +1,100 @@ +/* ==================================================================== + * Copyright (c) 1999-2004 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ + +/* + * vector.h -- vector routines. + * + * ********************************************** + * CMU ARPA Speech Project + * + * Copyright (c) 1997 Carnegie Mellon University. + * ALL RIGHTS RESERVED. + * ********************************************** + */ + + +#ifndef __VECTOR_H__ +#define __VECTOR_H__ + +/* System headers. */ +#include + +/* SphinxBase headers. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif +#if 0 +} +#endif + +typedef float32 *vector_t; + +/* + * The reason for some of the "trivial" routines below is that they could be OPTIMIZED for SPEED + * at some point. + */ + + +/* Floor all elements of v[0..dim-1] to min value of f */ +void vector_floor(vector_t v, int32 dim, float64 f); + + +/* Floor all non-0 elements of v[0..dim-1] to min value of f */ +void vector_nz_floor(vector_t v, int32 dim, float64 f); + + +/* + * Normalize the elements of the given vector so that they sum to 1.0. If the sum is 0.0 + * to begin with, the vector is left untouched. Return value: The normalization factor. + */ +float64 vector_sum_norm(vector_t v, int32 dim); + + +/* Print vector in one line, in %11.4e format, terminated by newline */ +void vector_print(FILE *fp, vector_t v, int32 dim); + + +/* Return TRUE iff given vector is all 0.0 */ +int32 vector_is_zero (float32 *vec, /* In: Vector to be checked */ + int32 len); /* In: Length of above vector */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* VECTOR_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h new file mode 100644 index 0000000..df6ea22 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h @@ -0,0 +1,23 @@ +#ifndef CAR_VOICE_ASSISTANT_COMMON_UTILS_H +#define CAR_VOICE_ASSISTANT_COMMON_UTILS_H + +#include +#include +#include +#include +#include +#include + +#define CAR_VOICE_ASSISTANT_SERVICE_SA_ID 5102 + +namespace OHOS::CarVoiceAssistant::CommonUtils { +enum VoiceAssistantErrorCode { + VOICE_ASSISTANT_OK = 0, + VOICE_ASSISTANT_ERR = 8001, + VOICE_ASSISTANT_START_RECORD_FAILED, //录音开启失败 + VOICE_ASSISTANT_START_WEBSOCKET_CONNECT_FAILED, // websocket连接失败 +}; + +} // namespace OHOS::CarVoiceAssistant::CommonUtils + +#endif /* CAR_VOICE_ASSISTANT_COMMON_UTILS_H */ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h new file mode 100644 index 0000000..6d5cdad --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h @@ -0,0 +1,26 @@ +#ifndef CAR_VOICE_ASSISTANT_LOG +#define CAR_VOICE_ASSISTANT_LOG + +#include +#include + +#include "hilog/log.h" + +#define MAKE_FILE_NAME (strrchr(__FILE__, '/') + 1) + +#define VOICE_ASSISTANT_LOG_TAG "CarVoiceAssistant" + +#define VOICE_ASSISTANT_LOG_DOMAIN 0xD001C00 + +static constexpr OHOS::HiviewDFX::HiLogLabel NETSTACK_LOG_LABEL = {LOG_CORE, VOICE_ASSISTANT_LOG_DOMAIN, VOICE_ASSISTANT_LOG_TAG}; + +#define VOICE_ASSISTANT_HILOG_PRINT(Level, fmt, ...) \ + (void)OHOS::HiviewDFX::HiLog::Level(NETSTACK_LOG_LABEL, "CarVoiceAssistant [%{public}s %{public}d] " fmt, MAKE_FILE_NAME, \ + __LINE__, ##__VA_ARGS__) + + +#define VOICE_ASSISTANT_LOGE(fmt, ...) VOICE_ASSISTANT_HILOG_PRINT(Error, fmt, ##__VA_ARGS__) + +#define VOICE_ASSISTANT_LOGI(fmt, ...) VOICE_ASSISTANT_HILOG_PRINT(Info, fmt, ##__VA_ARGS__) + +#endif /* CAR_VOICE_ASSISTANT_COMMON_UTILS_H */ \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn new file mode 100644 index 0000000..57e73ac --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn @@ -0,0 +1,41 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import("//build/ohos.gni") + +config("ps_vad_config") { + visibility = [ ":*" ] + include_dirs = [ + "include", + "./" + ] + + cflags = ["-Wno-unused-variable", "-Wno-unused-function", "-Wno-implicit-function-declaration", "-Wno-unused-private-field"] + cflags_cc = [] +} + +ohos_shared_library("ps_vad") { + sources = [ + "src/signal_processing_library.c", + "src/vad.cc", + "src/vad_core.c", + "src/vad_filterbank.c", + "src/vad_gmm.c", + "src/vad_sp.c", + "src/webrtc_vad.c" + ] + + configs = [ ":ps_vad_config" ] + + subsystem_name = "miscservices" + part_name = "voiceassistant" +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h new file mode 100644 index 0000000..12bb3e0 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This header file includes all of the fix point signal processing library + * (SPL) function descriptions and declarations. For specific function calls, + * see bottom of file. + */ + +#ifndef COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_ +#define COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_ + +#include +#include + +#include + +#include +// If you for some reson need to know if DCHECKs are on, test the value of +// RTC_DCHECK_IS_ON. (Test its value, not if it's defined; it'll always be +// defined, to either a true or a false value.) +#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) +#define RTC_DCHECK_IS_ON 1 +#else +#define RTC_DCHECK_IS_ON 0 +#endif + + +#define RTC_DCHECK(condition) \ + do { \ + if (RTC_DCHECK_IS_ON) { \ + assert(condition); \ + } \ + } while (0) + +#define RTC_DCHECK_EQ(a, b) RTC_DCHECK((a) == (b)) +#define RTC_DCHECK_NE(a, b) RTC_DCHECK((a) != (b)) +#define RTC_DCHECK_LE(a, b) RTC_DCHECK((a) <= (b)) +#define RTC_DCHECK_LT(a, b) RTC_DCHECK((a) < (b)) +#define RTC_DCHECK_GE(a, b) RTC_DCHECK((a) >= (b)) +#define RTC_DCHECK_GT(a, b) RTC_DCHECK((a) > (b)) + +// Processor architecture detection. For more info on what's defined, see: +// http://msdn.microsoft.com/en-us/library/b0084kay.aspx +// http://www.agner.org/optimize/calling_conventions.pdf +// or with gcc, run: "echo | gcc -E -dM -" +#if defined(_M_X64) || defined(__x86_64__) +#define WEBRTC_ARCH_X86_FAMILY +#define WEBRTC_ARCH_X86_64 +#define WEBRTC_ARCH_64_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(_M_ARM64) || defined(__aarch64__) +#define WEBRTC_ARCH_ARM_FAMILY +#define WEBRTC_ARCH_64_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(_M_IX86) || defined(__i386__) +#define WEBRTC_ARCH_X86_FAMILY +#define WEBRTC_ARCH_X86 +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__ARMEL__) +#define WEBRTC_ARCH_ARM_FAMILY +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__MIPSEL__) +#define WEBRTC_ARCH_MIPS_FAMILY +#if defined(__LP64__) +#define WEBRTC_ARCH_64_BITS +#else +#define WEBRTC_ARCH_32_BITS +#endif +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__pnacl__) +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__EMSCRIPTEN__) +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#else +#error Please add support for your architecture in rtc_base/system/arch.h +#endif + +// Macros specific for the fixed point implementation +#define WEBRTC_SPL_WORD16_MAX 32767 +#define WEBRTC_SPL_WORD16_MIN -32768 +#define WEBRTC_SPL_WORD32_MAX (int32_t)0x7fffffff +#define WEBRTC_SPL_WORD32_MIN (int32_t)0x80000000 +#define WEBRTC_SPL_MIN(A, B) (A < B ? A : B) // Get min value +// TODO(kma/bjorn): For the next two macros, investigate how to correct the code +// for inputs of a = WEBRTC_SPL_WORD16_MIN or WEBRTC_SPL_WORD32_MIN. + +#define WEBRTC_SPL_MUL(a, b) ((int32_t)((int32_t)(a) * (int32_t)(b))) +#define WEBRTC_SPL_MUL_16_U16(a, b) ((int32_t)(int16_t)(a) * (uint16_t)(b)) + +// clang-format off +// clang-format would choose some identation +// leading to presubmit error (cpplint.py) +#ifndef WEBRTC_ARCH_ARM_V7 +// For ARMv7 platforms, these are inline functions in spl_inl_armv7.h +#ifndef MIPS32_LE +// For MIPS platforms, these are inline functions in spl_inl_mips.h +#define WEBRTC_SPL_MUL_16_16(a, b) ((int32_t)(((int16_t)(a)) * ((int16_t)(b)))) +#endif +#endif + +// clang-format on + +// C + the 32 most significant bits of A * B +#define WEBRTC_SPL_SCALEDIFF32(A, B, C) \ + (C + (B >> 16) * A + (((uint32_t)(B & 0x0000FFFF) * A) >> 16)) + +// Shifting with negative numbers allowed +// Positive means left shift + +// Shifting with negative numbers not allowed +// We cannot do casting here due to signed/unsigned problem + +#ifdef __cplusplus +extern "C" { +#endif + +// inline functions: +#include "spl_inl.h" + + +int16_t WebRtcSpl_GetScalingSquare(int16_t *in_vector, + size_t in_vector_length, + size_t times); + + +// Minimum and maximum operation functions and their pointers. +// Implementation in min_max_operations.c. + +// Returns the largest absolute value in a signed 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Maximum absolute value in vector. +typedef int16_t (*MaxAbsValueW16)(const int16_t *vector, size_t length); + +extern const MaxAbsValueW16 WebRtcSpl_MaxAbsValueW16; + +int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t *vector, size_t length); + +#if defined(WEBRTC_HAS_NEON) +int16_t WebRtcSpl_MaxAbsValueW16Neon(const int16_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int16_t WebRtcSpl_MaxAbsValueW16_mips(const int16_t* vector, size_t length); +#endif + +// Returns the largest absolute value in a signed 32-bit vector. +// +// Input: +// - vector : 32-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Maximum absolute value in vector. +typedef int32_t (*MaxAbsValueW32)(const int32_t *vector, size_t length); + +extern const MaxAbsValueW32 WebRtcSpl_MaxAbsValueW32; + +int32_t WebRtcSpl_MaxAbsValueW32C(const int32_t *vector, size_t length); + +#if defined(WEBRTC_HAS_NEON) +int32_t WebRtcSpl_MaxAbsValueW32Neon(const int32_t* vector, size_t length); +#endif +#if defined(MIPS_DSP_R1_LE) +int32_t WebRtcSpl_MaxAbsValueW32_mips(const int32_t* vector, size_t length); +#endif + +// Returns the maximum value of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Maximum sample value in |vector|. +typedef int16_t (*MaxValueW16)(const int16_t *vector, size_t length); + +extern const MaxValueW16 WebRtcSpl_MaxValueW16; + +int16_t WebRtcSpl_MaxValueW16C(const int16_t *vector, size_t length); + +#if defined(WEBRTC_HAS_NEON) +int16_t WebRtcSpl_MaxValueW16Neon(const int16_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int16_t WebRtcSpl_MaxValueW16_mips(const int16_t* vector, size_t length); +#endif + +// Returns the maximum value of a 32-bit vector. +// +// Input: +// - vector : 32-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Maximum sample value in |vector|. +typedef int32_t (*MaxValueW32)(const int32_t *vector, size_t length); + +extern const MaxValueW32 WebRtcSpl_MaxValueW32; + +int32_t WebRtcSpl_MaxValueW32C(const int32_t *vector, size_t length); + +#if defined(WEBRTC_HAS_NEON) +int32_t WebRtcSpl_MaxValueW32Neon(const int32_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int32_t WebRtcSpl_MaxValueW32_mips(const int32_t* vector, size_t length); +#endif + +// Returns the minimum value of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Minimum sample value in |vector|. +typedef int16_t (*MinValueW16)(const int16_t *vector, size_t length); + +extern const MinValueW16 WebRtcSpl_MinValueW16; + +int16_t WebRtcSpl_MinValueW16C(const int16_t *vector, size_t length); + +#if defined(WEBRTC_HAS_NEON) +int16_t WebRtcSpl_MinValueW16Neon(const int16_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int16_t WebRtcSpl_MinValueW16_mips(const int16_t* vector, size_t length); +#endif + +// Returns the minimum value of a 32-bit vector. +// +// Input: +// - vector : 32-bit input vector. +// - length : Number of samples in vector. +// +// Return value : Minimum sample value in |vector|. +typedef int32_t (*MinValueW32)(const int32_t *vector, size_t length); + +extern const MinValueW32 WebRtcSpl_MinValueW32; + +int32_t WebRtcSpl_MinValueW32C(const int32_t *vector, size_t length); + +#if defined(WEBRTC_HAS_NEON) +int32_t WebRtcSpl_MinValueW32Neon(const int32_t* vector, size_t length); +#endif +#if defined(MIPS32_LE) +int32_t WebRtcSpl_MinValueW32_mips(const int32_t* vector, size_t length); +#endif + +// Divisions. Implementations collected in division_operations.c and +// descriptions at bottom of this file. +int32_t WebRtcSpl_DivW32W16(int32_t num, int16_t den); +// End: Divisions. + +int32_t WebRtcSpl_Energy(int16_t *vector, + size_t vector_length, + int *scale_factor); + + +void WebRtcSpl_Resample48khzTo32khz(const int32_t *In, int32_t *Out, size_t K); + +typedef struct { + int32_t S_48_24[8]; + int32_t S_24_24[16]; + int32_t S_24_16[8]; + int32_t S_16_8[8]; +} WebRtcSpl_State48khzTo8khz; + +void WebRtcSpl_Resample48khzTo8khz(const int16_t *in, + int16_t *out, + WebRtcSpl_State48khzTo8khz *state, + int32_t *tmpmem); + +void WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz *state); + +#ifdef __cplusplus +} +#endif // __cplusplus +#endif // COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_ \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h new file mode 100644 index 0000000..f54ea81 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// This header file includes the inline functions in +// the fix point signal processing library. + +#ifndef COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_ +#define COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_ + +#include "signal_processing_library.h" + +extern const int8_t kWebRtcSpl_CountLeadingZeros32_Table[64]; + +// Don't call this directly except in tests! +static __inline int WebRtcSpl_CountLeadingZeros32_NotBuiltin(uint32_t n) { + // Normalize n by rounding up to the nearest number that is a sequence of 0 + // bits followed by a sequence of 1 bits. This number has the same number of + // leading zeros as the original n. There are exactly 33 such values. + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + + // Multiply the modified n with a constant selected (by exhaustive search) + // such that each of the 33 possible values of n give a product whose 6 most + // significant bits are unique. Then look up the answer in the table. + return kWebRtcSpl_CountLeadingZeros32_Table[(n * 0x8c0b2891) >> 26]; +} + +// Returns the number of leading zero bits in the argument. +static __inline int WebRtcSpl_CountLeadingZeros32(uint32_t n) { +#ifdef __GNUC__ + assert(sizeof(unsigned int) == sizeof(uint32_t)); + return n == 0 ? 32 : __builtin_clz(n); +#else + return WebRtcSpl_CountLeadingZeros32_NotBuiltin(n); +#endif +} + + +#ifdef WEBRTC_ARCH_ARM_V7 +#include "spl_inl_armv7.h" +#else + +#if defined(MIPS32_LE) +#include "spl_inl_mips.h" +#endif + +#if !defined(MIPS32_LE) + +static __inline int16_t WebRtcSpl_GetSizeInBits(uint32_t n) { + return 32 - WebRtcSpl_CountLeadingZeros32(n); +} + +// Return the number of steps a can be left-shifted without overflow, +// or 0 if a == 0. +static __inline int16_t WebRtcSpl_NormW32(int32_t a) { + return a == 0 ? 0 : WebRtcSpl_CountLeadingZeros32(a < 0 ? ~a : a) - 1; +} + +// Return the number of steps a can be left-shifted without overflow, +// or 0 if a == 0. +static __inline int16_t WebRtcSpl_NormU32(uint32_t a) { + return a == 0 ? 0 : WebRtcSpl_CountLeadingZeros32(a); +} + +#endif // #if !defined(MIPS32_LE) + +#endif // WEBRTC_ARCH_ARM_V7 + +#endif // COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h new file mode 100644 index 0000000..6e9843b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* This header file includes the inline functions for ARM processors in + * the fix point signal processing library. + */ + +#ifndef COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_ARMV7_H_ +#define COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_ARMV7_H_ + +/* TODO(kma): Replace some assembly code with GCC intrinsics + * (e.g. __builtin_clz). + */ + +/* This function produces result that is not bit exact with that by the generic + * C version in some cases, although the former is at least as accurate as the + * later. + */ +static __inline int32_t WEBRTC_SPL_MUL_16_32_RSFT16(int16_t a, int32_t b) { + int32_t tmp = 0; + __asm __volatile("smulwb %0, %1, %2" : "=r"(tmp) : "r"(b), "r"(a)); + return tmp; +} + +static __inline int32_t WEBRTC_SPL_MUL_16_16(int16_t a, int16_t b) { + int32_t tmp = 0; + __asm __volatile("smulbb %0, %1, %2" : "=r"(tmp) : "r"(a), "r"(b)); + return tmp; +} + +// TODO(kma): add unit test. +static __inline int32_t WebRtc_MulAccumW16(int16_t a, int16_t b, int32_t c) { + int32_t tmp = 0; + __asm __volatile("smlabb %0, %1, %2, %3" + : "=r"(tmp) + : "r"(a), "r"(b), "r"(c)); + return tmp; +} + +static __inline int16_t WebRtcSpl_AddSatW16(int16_t a, int16_t b) { + int32_t s_sum = 0; + + __asm __volatile("qadd16 %0, %1, %2" : "=r"(s_sum) : "r"(a), "r"(b)); + + return (int16_t) s_sum; +} + +static __inline int32_t WebRtcSpl_AddSatW32(int32_t l_var1, int32_t l_var2) { + int32_t l_sum = 0; + + __asm __volatile("qadd %0, %1, %2" : "=r"(l_sum) : "r"(l_var1), "r"(l_var2)); + + return l_sum; +} + +static __inline int32_t WebRtcSpl_SubSatW32(int32_t l_var1, int32_t l_var2) { + int32_t l_sub = 0; + + __asm __volatile("qsub %0, %1, %2" : "=r"(l_sub) : "r"(l_var1), "r"(l_var2)); + + return l_sub; +} + +static __inline int16_t WebRtcSpl_SubSatW16(int16_t var1, int16_t var2) { + int32_t s_sub = 0; + + __asm __volatile("qsub16 %0, %1, %2" : "=r"(s_sub) : "r"(var1), "r"(var2)); + + return (int16_t) s_sub; +} + +static __inline int16_t WebRtcSpl_GetSizeInBits(uint32_t n) { + int32_t tmp = 0; + + __asm __volatile("clz %0, %1" : "=r"(tmp) : "r"(n)); + + return (int16_t)(32 - tmp); +} + +static __inline int16_t WebRtcSpl_NormW32(int32_t a) { + int32_t tmp = 0; + + if (a == 0) { + return 0; + } else if (a < 0) { + a ^= 0xFFFFFFFF; + } + + __asm __volatile("clz %0, %1" : "=r"(tmp) : "r"(a)); + + return (int16_t)(tmp - 1); +} + +static __inline int16_t WebRtcSpl_NormU32(uint32_t a) { + int tmp = 0; + + if (a == 0) + return 0; + + __asm __volatile("clz %0, %1" : "=r"(tmp) : "r"(a)); + + return (int16_t) tmp; +} + +static __inline int16_t WebRtcSpl_NormW16(int16_t a) { + int32_t tmp = 0; + int32_t a_32 = a; + + if (a_32 == 0) { + return 0; + } else if (a_32 < 0) { + a_32 ^= 0xFFFFFFFF; + } + + __asm __volatile("clz %0, %1" : "=r"(tmp) : "r"(a_32)); + + return (int16_t)(tmp - 17); +} + +// TODO(kma): add unit test. +static __inline int16_t WebRtcSpl_SatW32ToW16(int32_t value32) { + int32_t out = 0; + + __asm __volatile("ssat %0, #16, %1" : "=r"(out) : "r"(value32)); + + return (int16_t) out; +} + +#endif // COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_ARMV7_H_ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h new file mode 100644 index 0000000..f787a1b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// This header file includes the inline functions in +// the fix point signal processing library. + +#ifndef COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_MIPS_H_ +#define COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_MIPS_H_ + +static __inline int32_t WEBRTC_SPL_MUL_16_16(int32_t a, int32_t b) { + int32_t value32 = 0; + int32_t a1 = 0, b1 = 0; + + __asm __volatile( +#if defined(MIPS32_R2_LE) + "seh %[a1], %[a] \n\t" + "seh %[b1], %[b] \n\t" +#else + "sll %[a1], %[a], 16 \n\t" + "sll %[b1], %[b], 16 \n\t" + "sra %[a1], %[a1], 16 \n\t" + "sra %[b1], %[b1], 16 \n\t" + #endif + "mul %[value32], %[a1], %[b1] \n\t" + : [value32] "=r"(value32), [a1] "=&r"(a1), [b1] "=&r"(b1) + : [a] "r"(a), [b] "r"(b) + : "hi", "lo"); + return value32; +} + +static __inline int32_t WEBRTC_SPL_MUL_16_32_RSFT16(int16_t a, int32_t b) { + int32_t value32 = 0, b1 = 0, b2 = 0; + int32_t a1 = 0; + + __asm __volatile( +#if defined(MIPS32_R2_LE) + "seh %[a1], %[a] \n\t" +#else + "sll %[a1], %[a], 16 \n\t" + "sra %[a1], %[a1], 16 \n\t" + #endif + "andi %[b2], %[b], 0xFFFF \n\t" + "sra %[b1], %[b], 16 \n\t" + "sra %[b2], %[b2], 1 \n\t" + "mul %[value32], %[a1], %[b1] \n\t" + "mul %[b2], %[a1], %[b2] \n\t" + "addiu %[b2], %[b2], 0x4000 \n\t" + "sra %[b2], %[b2], 15 \n\t" + "addu %[value32], %[value32], %[b2] \n\t" + : [value32] "=&r"(value32), [b1] "=&r"(b1), [b2] "=&r"(b2), [a1] "=&r"(a1) + : [a] "r"(a), [b] "r"(b) + : "hi", "lo"); + return value32; +} + +#if defined(MIPS_DSP_R1_LE) +static __inline int16_t WebRtcSpl_SatW32ToW16(int32_t value32) { + __asm __volatile( + "shll_s.w %[value32], %[value32], 16 \n\t" + "sra %[value32], %[value32], 16 \n\t" + : [value32] "+r"(value32) + :); + int16_t out16 = (int16_t)value32; + return out16; +} + +static __inline int16_t WebRtcSpl_AddSatW16(int16_t a, int16_t b) { + int32_t value32 = 0; + + __asm __volatile("addq_s.ph %[value32], %[a], %[b] \n\t" + : [value32] "=r"(value32) + : [a] "r"(a), [b] "r"(b)); + return (int16_t)value32; +} + +static __inline int32_t WebRtcSpl_AddSatW32(int32_t l_var1, int32_t l_var2) { + int32_t l_sum; + + __asm __volatile( + "addq_s.w %[l_sum], %[l_var1], %[l_var2] \n\t" + : [l_sum] "=r"(l_sum) + : [l_var1] "r"(l_var1), [l_var2] "r"(l_var2)); + + return l_sum; +} + +static __inline int16_t WebRtcSpl_SubSatW16(int16_t var1, int16_t var2) { + int32_t value32; + + __asm __volatile("subq_s.ph %[value32], %[var1], %[var2] \n\t" + : [value32] "=r"(value32) + : [var1] "r"(var1), [var2] "r"(var2)); + + return (int16_t)value32; +} + +static __inline int32_t WebRtcSpl_SubSatW32(int32_t l_var1, int32_t l_var2) { + int32_t l_diff; + + __asm __volatile( + "subq_s.w %[l_diff], %[l_var1], %[l_var2] \n\t" + : [l_diff] "=r"(l_diff) + : [l_var1] "r"(l_var1), [l_var2] "r"(l_var2)); + + return l_diff; +} +#endif + +static __inline int16_t WebRtcSpl_GetSizeInBits(uint32_t n) { + int bits = 0; + int i32 = 32; + + __asm __volatile( + "clz %[bits], %[n] \n\t" + "subu %[bits], %[i32], %[bits] \n\t" + : [bits] "=&r"(bits) + : [n] "r"(n), [i32] "r"(i32)); + + return (int16_t) bits; +} + +static __inline int16_t WebRtcSpl_NormW32(int32_t a) { + int zeros = 0; + + __asm __volatile( + ".set push \n\t" + ".set noreorder \n\t" + "bnez %[a], 1f \n\t" + " sra %[zeros], %[a], 31 \n\t" + "b 2f \n\t" + " move %[zeros], $zero \n\t" + "1: \n\t" + "xor %[zeros], %[a], %[zeros] \n\t" + "clz %[zeros], %[zeros] \n\t" + "addiu %[zeros], %[zeros], -1 \n\t" + "2: \n\t" + ".set pop \n\t" + : [zeros] "=&r"(zeros) + : [a] "r"(a)); + + return (int16_t) zeros; +} + +static __inline int16_t WebRtcSpl_NormU32(uint32_t a) { + int zeros = 0; + + __asm __volatile("clz %[zeros], %[a] \n\t" + : [zeros] "=r"(zeros) + : [a] "r"(a)); + + return (int16_t)(zeros & 0x1f); +} + +static __inline int16_t WebRtcSpl_NormW16(int16_t a) { + int zeros = 0; + int a0 = a << 16; + + __asm __volatile( + ".set push \n\t" + ".set noreorder \n\t" + "bnez %[a0], 1f \n\t" + " sra %[zeros], %[a0], 31 \n\t" + "b 2f \n\t" + " move %[zeros], $zero \n\t" + "1: \n\t" + "xor %[zeros], %[a0], %[zeros] \n\t" + "clz %[zeros], %[zeros] \n\t" + "addiu %[zeros], %[zeros], -1 \n\t" + "2: \n\t" + ".set pop \n\t" + : [zeros] "=&r"(zeros) + : [a0] "r"(a0)); + + return (int16_t) zeros; +} + +static __inline int32_t WebRtc_MulAccumW16(int16_t a, int16_t b, int32_t c) { + int32_t res = 0, c1 = 0; + __asm __volatile( +#if defined(MIPS32_R2_LE) + "seh %[a], %[a] \n\t" + "seh %[b], %[b] \n\t" +#else + "sll %[a], %[a], 16 \n\t" + "sll %[b], %[b], 16 \n\t" + "sra %[a], %[a], 16 \n\t" + "sra %[b], %[b], 16 \n\t" + #endif + "mul %[res], %[a], %[b] \n\t" + "addu %[c1], %[c], %[res] \n\t" + : [c1] "=r"(c1), [res] "=&r"(res) + : [a] "r"(a), [b] "r"(b), [c] "r"(c) + : "hi", "lo"); + return (c1); +} + +#endif // COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_MIPS_H_ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h new file mode 100644 index 0000000..b918a06 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef COMMON_AUDIO_VAD_INCLUDE_VAD_H_ +#define COMMON_AUDIO_VAD_INCLUDE_VAD_H_ + +#include + +#include "webrtc_vad.h" +#include "signal_processing_library.h" + + +class Vad { +public: + enum Aggressiveness { + kVadNormal = 0, + kVadLowBitrate = 1, + kVadAggressive = 2, + kVadVeryAggressive = 3 + }; + + enum Activity { + kPassive = 0, kActive = 1, kError = -1 + }; + + virtual ~Vad() = default; + + // Calculates a VAD decision for the given audio frame. Valid sample rates + // are 8000, 16000, and 32000 Hz; the number of samples must be such that the + // frame is 10, 20, or 30 ms long. + virtual Activity VoiceActivity(const int16_t *audio, + size_t num_samples, + int sample_rate_hz) = 0; + + // Resets VAD state. + virtual void Reset() = 0; +}; + +// Returns a Vad instance that's implemented on top of WebRtcVad. +std::unique_ptr CreateVad(Vad::Aggressiveness aggressiveness); + + +#endif // COMMON_AUDIO_VAD_INCLUDE_VAD_H_ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h new file mode 100644 index 0000000..da537cb --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This header file includes the descriptions of the core VAD calls. + */ + +#ifndef COMMON_AUDIO_VAD_VAD_CORE_H_ +#define COMMON_AUDIO_VAD_VAD_CORE_H_ + +#include "signal_processing_library.h" + +enum { + kNumChannels = 6 +}; // Number of frequency bands (named channels). +enum { + kNumGaussians = 2 +}; // Number of Gaussians per channel in the GMM. +enum { + kTableSize = kNumChannels * kNumGaussians +}; +enum { + kMinEnergy = 10 +}; // Minimum energy required to trigger audio signal. + +typedef struct VadInstT_ { + int vad; + int32_t downsampling_filter_states[4]; + WebRtcSpl_State48khzTo8khz state_48_to_8; + int16_t noise_means[kTableSize]; + int16_t speech_means[kTableSize]; + int16_t noise_stds[kTableSize]; + int16_t speech_stds[kTableSize]; + // TODO(bjornv): Change to |frame_count|. + int32_t frame_counter; + int16_t over_hang; // Over Hang + int16_t num_of_speech; + // TODO(bjornv): Change to |age_vector|. + int16_t index_vector[16 * kNumChannels]; + int16_t low_value_vector[16 * kNumChannels]; + // TODO(bjornv): Change to |median|. + int16_t mean_value[kNumChannels]; + int16_t upper_state[5]; + int16_t lower_state[5]; + int16_t hp_filter_state[4]; + int16_t over_hang_max_1[3]; + int16_t over_hang_max_2[3]; + int16_t individual[3]; + int16_t total[3]; + + int init_flag; +} VadInstT; + +// Initializes the core VAD component. The default aggressiveness mode is +// controlled by |kDefaultMode| in vad_core.c. +// +// - self [i/o] : Instance that should be initialized +// +// returns : 0 (OK), -1 (null pointer in or if the default mode can't be +// set) +int WebRtcVad_InitCore(VadInstT *self); + +/**************************************************************************** + * WebRtcVad_set_mode_core(...) + * + * This function changes the VAD settings + * + * Input: + * - inst : VAD instance + * - mode : Aggressiveness degree + * 0 (High quality) - 3 (Highly aggressive) + * + * Output: + * - inst : Changed instance + * + * Return value : 0 - Ok + * -1 - Error + */ + +int WebRtcVad_set_mode_core(VadInstT *self, int mode); + +/**************************************************************************** + * WebRtcVad_CalcVad48khz(...) + * WebRtcVad_CalcVad32khz(...) + * WebRtcVad_CalcVad16khz(...) + * WebRtcVad_CalcVad8khz(...) + * + * Calculate probability for active speech and make VAD decision. + * + * Input: + * - inst : Instance that should be initialized + * - speech_frame : Input speech frame + * - frame_length : Number of input samples + * + * Output: + * - inst : Updated filter states etc. + * + * Return value : VAD decision + * 0 - No active speech + * 1-6 - Active speech + */ +int WebRtcVad_CalcVad48khz(VadInstT *inst, + const int16_t *speech_frame, + size_t frame_length); + +int WebRtcVad_CalcVad32khz(VadInstT *inst, + const int16_t *speech_frame, + size_t frame_length); + +int WebRtcVad_CalcVad16khz(VadInstT *inst, + const int16_t *speech_frame, + size_t frame_length); + +int WebRtcVad_CalcVad8khz(VadInstT *inst, + const int16_t *speech_frame, + size_t frame_length); + +#endif // COMMON_AUDIO_VAD_VAD_CORE_H_ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h new file mode 100644 index 0000000..6d73236 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This file includes feature calculating functionality used in vad_core.c. + */ + +#ifndef COMMON_AUDIO_VAD_VAD_FILTERBANK_H_ +#define COMMON_AUDIO_VAD_VAD_FILTERBANK_H_ + +#include "vad_core.h" + +// Takes |data_length| samples of |data_in| and calculates the logarithm of the +// energy of each of the |kNumChannels| = 6 frequency bands used by the VAD: +// 80 Hz - 250 Hz +// 250 Hz - 500 Hz +// 500 Hz - 1000 Hz +// 1000 Hz - 2000 Hz +// 2000 Hz - 3000 Hz +// 3000 Hz - 4000 Hz +// +// The values are given in Q4 and written to |features|. Further, an approximate +// overall energy is returned. The return value is used in +// WebRtcVad_GmmProbability() as a signal indicator, hence it is arbitrary above +// the threshold |kMinEnergy|. +// +// - self [i/o] : State information of the VAD. +// - data_in [i] : Input audio data, for feature extraction. +// - data_length [i] : Audio data size, in number of samples. +// - features [o] : 10 * log10(energy in each frequency band), Q4. +// - returns : Total energy of the signal (NOTE! This value is not +// exact. It is only used in a comparison.) +int16_t WebRtcVad_CalculateFeatures(VadInstT *self, + const int16_t *data_in, + size_t data_length, + int16_t *features); + +#endif // COMMON_AUDIO_VAD_VAD_FILTERBANK_H_ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h new file mode 100644 index 0000000..d61a09d --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// Gaussian probability calculations internally used in vad_core.c. + +#ifndef COMMON_AUDIO_VAD_VAD_GMM_H_ +#define COMMON_AUDIO_VAD_VAD_GMM_H_ + +#include + +// Calculates the probability for |input|, given that |input| comes from a +// normal distribution with mean and standard deviation (|mean|, |std|). +// +// Inputs: +// - input : input sample in Q4. +// - mean : mean input in the statistical model, Q7. +// - std : standard deviation, Q7. +// +// Output: +// +// - delta : input used when updating the model, Q11. +// |delta| = (|input| - |mean|) / |std|^2. +// +// Return: +// (probability for |input|) = +// 1 / |std| * exp(-(|input| - |mean|)^2 / (2 * |std|^2)); +int32_t WebRtcVad_GaussianProbability(int16_t input, + int16_t mean, + int16_t std, + int16_t *delta); + +#endif // COMMON_AUDIO_VAD_VAD_GMM_H_ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h new file mode 100644 index 0000000..fdb1dc7 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// This file includes specific signal processing tools used in vad_core.c. + +#ifndef COMMON_AUDIO_VAD_VAD_SP_H_ +#define COMMON_AUDIO_VAD_VAD_SP_H_ + +#include "vad_core.h" + +// Downsamples the signal by a factor 2, eg. 32->16 or 16->8. +// +// Inputs: +// - signal_in : Input signal. +// - in_length : Length of input signal in samples. +// +// Input & Output: +// - filter_state : Current filter states of the two all-pass filters. The +// |filter_state| is updated after all samples have been +// processed. +// +// Output: +// - signal_out : Downsampled signal (of length |in_length| / 2). +void WebRtcVad_Downsampling(const int16_t *signal_in, + int16_t *signal_out, + int32_t *filter_state, + size_t in_length); + +// Updates and returns the smoothed feature minimum. As minimum we use the +// median of the five smallest feature values in a 100 frames long window. +// As long as |handle->frame_counter| is zero, that is, we haven't received any +// "valid" data, FindMinimum() outputs the default value of 1600. +// +// Inputs: +// - feature_value : New feature value to update with. +// - channel : Channel number. +// +// Input & Output: +// - handle : State information of the VAD. +// +// Returns: +// : Smoothed minimum value for a moving window. +int16_t WebRtcVad_FindMinimum(VadInstT *handle, + int16_t feature_value, + int channel); + +#endif // COMMON_AUDIO_VAD_VAD_SP_H_ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h new file mode 100644 index 0000000..a71631b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This header file includes the VAD API calls. Specific function calls are + * given below. + */ + +#ifndef COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_ // NOLINT +#define COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_ + +#include +#include + +typedef struct WebRtcVadInst VadInst; + +#ifdef __cplusplus +extern "C" { +#endif + +// Creates an instance to the VAD structure. +VadInst *WebRtcVad_Create(void); + +// Frees the dynamic memory of a specified VAD instance. +// +// - handle [i] : Pointer to VAD instance that should be freed. +void WebRtcVad_Free(VadInst *handle); + +// Initializes a VAD instance. +// +// - handle [i/o] : Instance that should be initialized. +// +// returns : 0 - (OK), +// -1 - (null pointer or Default mode could not be set). +int WebRtcVad_Init(VadInst *handle); + +// Sets the VAD operating mode. A more aggressive (higher mode) VAD is more +// restrictive in reporting speech. Put in other words the probability of being +// speech when the VAD returns 1 is increased with increasing mode. As a +// consequence also the missed detection rate goes up. +// +// - handle [i/o] : VAD instance. +// - mode [i] : Aggressiveness mode (0, 1, 2, or 3). +// +// returns : 0 - (OK), +// -1 - (null pointer, mode could not be set or the VAD instance +// has not been initialized). +int WebRtcVad_set_mode(VadInst *handle, int mode); + +// Calculates a VAD decision for the |audio_frame|. For valid sampling rates +// frame lengths, see the description of WebRtcVad_ValidRatesAndFrameLengths(). +// +// - handle [i/o] : VAD Instance. Needs to be initialized by +// WebRtcVad_Init() before call. +// - fs [i] : Sampling frequency (Hz): 8000, 16000, or 32000 +// - audio_frame [i] : Audio frame buffer. +// - frame_length [i] : Length of audio frame buffer in number of samples. +// +// returns : 1 - (Active Voice), +// 0 - (Non-active Voice), +// -1 - (Error) +int WebRtcVad_Process(VadInst *handle, + int fs, + const int16_t *audio_frame, + size_t frame_length); + +// Checks for valid combinations of |rate| and |frame_length|. We support 10, +// 20 and 30 ms frames and the rates 8000, 16000 and 32000 Hz. +// +// - rate [i] : Sampling frequency (Hz). +// - frame_length [i] : Speech frame buffer length in number of samples. +// +// returns : 0 - (valid combination), -1 - (invalid combination) +int WebRtcVad_ValidRateAndFrameLength(int rate, size_t frame_length); + +#ifdef __cplusplus +} +#endif + +#endif // COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_ // NOLINT diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c new file mode 100644 index 0000000..a675384 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c @@ -0,0 +1,668 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#include "include/signal_processing_library.h" + +// TODO(bugs.webrtc.org/9553): These function pointers are useless. Refactor +// things so that we simply have a bunch of regular functions with different +// implementations for different platforms. + +#if defined(WEBRTC_HAS_NEON) + +const MaxAbsValueW16 WebRtcSpl_MaxAbsValueW16 = WebRtcSpl_MaxAbsValueW16Neon; +const MaxAbsValueW32 WebRtcSpl_MaxAbsValueW32 = WebRtcSpl_MaxAbsValueW32Neon; +const MaxValueW16 WebRtcSpl_MaxValueW16 = WebRtcSpl_MaxValueW16Neon; +const MaxValueW32 WebRtcSpl_MaxValueW32 = WebRtcSpl_MaxValueW32Neon; +const MinValueW16 WebRtcSpl_MinValueW16 = WebRtcSpl_MinValueW16Neon; +const MinValueW32 WebRtcSpl_MinValueW32 = WebRtcSpl_MinValueW32Neon; + + +#elif defined(MIPS32_LE) + +const MaxAbsValueW16 WebRtcSpl_MaxAbsValueW16 = WebRtcSpl_MaxAbsValueW16_mips; +const MaxAbsValueW32 WebRtcSpl_MaxAbsValueW32 = +#ifdef MIPS_DSP_R1_LE + WebRtcSpl_MaxAbsValueW32_mips; +#else + WebRtcSpl_MaxAbsValueW32C; +#endif +const MaxValueW16 WebRtcSpl_MaxValueW16 = WebRtcSpl_MaxValueW16_mips; +const MaxValueW32 WebRtcSpl_MaxValueW32 = WebRtcSpl_MaxValueW32_mips; +const MinValueW16 WebRtcSpl_MinValueW16 = WebRtcSpl_MinValueW16_mips; +const MinValueW32 WebRtcSpl_MinValueW32 = WebRtcSpl_MinValueW32_mips; + + +#else + +const MaxAbsValueW16 WebRtcSpl_MaxAbsValueW16 = WebRtcSpl_MaxAbsValueW16C; +const MaxAbsValueW32 WebRtcSpl_MaxAbsValueW32 = WebRtcSpl_MaxAbsValueW32C; +const MaxValueW16 WebRtcSpl_MaxValueW16 = WebRtcSpl_MaxValueW16C; +const MaxValueW32 WebRtcSpl_MaxValueW32 = WebRtcSpl_MaxValueW32C; +const MinValueW16 WebRtcSpl_MinValueW16 = WebRtcSpl_MinValueW16C; +const MinValueW32 WebRtcSpl_MinValueW32 = WebRtcSpl_MinValueW32C; + +#endif + +// Table used by WebRtcSpl_CountLeadingZeros32_NotBuiltin. For each uint32_t n +// that's a sequence of 0 bits followed by a sequence of 1 bits, the entry at +// index (n * 0x8c0b2891) >> 26 in this table gives the number of zero bits in +// n. +const int8_t kWebRtcSpl_CountLeadingZeros32_Table[64] = { + 32, 8, 17, -1, -1, 14, -1, -1, -1, 20, -1, -1, -1, 28, -1, 18, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 26, 25, 24, + 4, 11, 23, 31, 3, 7, 10, 16, 22, 30, -1, -1, 2, 6, 13, 9, + -1, 15, -1, 21, -1, 29, 19, -1, -1, -1, -1, -1, 1, 27, 5, 12, +}; + +int32_t WebRtcSpl_DivW32W16(int32_t num, int16_t den) { + // Guard against division with 0 + if (den != 0) { + return (int32_t) (num / den); + } else { + return (int32_t) 0x7FFFFFFF; + } +} + + + +// TODO(bjorn/kma): Consolidate function pairs (e.g. combine +// WebRtcSpl_MaxAbsValueW16C and WebRtcSpl_MaxAbsIndexW16 into a single one.) +// TODO(kma): Move the next six functions into min_max_operations_c.c. + +// Maximum absolute value of word16 vector. C version for generic platforms. +int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t *vector, size_t length) { + size_t i = 0; + int absolute = 0, maximum = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + absolute = abs((int) vector[i]); + + if (absolute > maximum) { + maximum = absolute; + } + } + + // Guard the case for abs(-32768). + if (maximum > WEBRTC_SPL_WORD16_MAX) { + maximum = WEBRTC_SPL_WORD16_MAX; + } + + return (int16_t) maximum; +} + +// Maximum absolute value of word32 vector. C version for generic platforms. +int32_t WebRtcSpl_MaxAbsValueW32C(const int32_t *vector, size_t length) { + // Use uint32_t for the local variables, to accommodate the return value + // of abs(0x80000000), which is 0x80000000. + + uint32_t absolute = 0, maximum = 0; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + absolute = abs((int) vector[i]); + if (absolute > maximum) { + maximum = absolute; + } + } + + maximum = WEBRTC_SPL_MIN(maximum, WEBRTC_SPL_WORD32_MAX); + + return (int32_t) maximum; +} + +// Maximum value of word16 vector. C version for generic platforms. +int16_t WebRtcSpl_MaxValueW16C(const int16_t *vector, size_t length) { + int16_t maximum = WEBRTC_SPL_WORD16_MIN; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] > maximum) + maximum = vector[i]; + } + return maximum; +} + +// Maximum value of word32 vector. C version for generic platforms. +int32_t WebRtcSpl_MaxValueW32C(const int32_t *vector, size_t length) { + int32_t maximum = WEBRTC_SPL_WORD32_MIN; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] > maximum) + maximum = vector[i]; + } + return maximum; +} + +// Minimum value of word16 vector. C version for generic platforms. +int16_t WebRtcSpl_MinValueW16C(const int16_t *vector, size_t length) { + int16_t minimum = WEBRTC_SPL_WORD16_MAX; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] < minimum) + minimum = vector[i]; + } + return minimum; +} + +// Minimum value of word32 vector. C version for generic platforms. +int32_t WebRtcSpl_MinValueW32C(const int32_t *vector, size_t length) { + int32_t minimum = WEBRTC_SPL_WORD32_MAX; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] < minimum) + minimum = vector[i]; + } + return minimum; +} + +// allpass filter coefficients. +static const int16_t kResampleAllpass[2][3] = { + {821, 6110, 12382}, + {3050, 9368, 15063} +}; + +// +// decimator +// input: int32_t (shifted 15 positions to the left, + offset 16384) OVERWRITTEN! +// output: int16_t (saturated) (of length len/2) +// state: filter state array; length = 8 + +void // bugs.webrtc.org/5486 +WebRtcSpl_DownBy2IntToShort(int32_t *in, int32_t len, int16_t *out, + int32_t *state) { + int32_t tmp0, tmp1, diff; + int32_t i; + + len >>= 1; + +// lower allpass filter (operates on even input samples) + for (i = 0; i < len; i++) { + tmp0 = in[i << 1]; + diff = tmp0 - state[1]; +// UBSan: -1771017321 - 999586185 cannot be represented in type 'int' + +// scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; +// scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; +// scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + +// divide by two and store temporarily + in[i << 1] = (state[3] >> 1); + } + + in++; + +// upper allpass filter (operates on odd input samples) + for (i = 0; i < len; i++) { + tmp0 = in[i << 1]; + diff = tmp0 - state[5]; +// scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; +// scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; +// scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + +// divide by two and store temporarily + in[i << 1] = (state[7] >> 1); + } + + in--; + +// combine allpass outputs + for (i = 0; i < len; i += 2) { +// divide by two, add both allpass outputs and round + tmp0 = (in[i << 1] + in[(i << 1) + 1]) >> 15; + tmp1 = (in[(i << 1) + 2] + in[(i << 1) + 3]) >> 15; + if (tmp0 > (int32_t) 0x00007FFF) + tmp0 = 0x00007FFF; + if (tmp0 < (int32_t) 0xFFFF8000) + tmp0 = 0xFFFF8000; + out[i] = (int16_t) tmp0; + if (tmp1 > (int32_t) 0x00007FFF) + tmp1 = 0x00007FFF; + if (tmp1 < (int32_t) 0xFFFF8000) + tmp1 = 0xFFFF8000; + out[i + 1] = (int16_t) tmp1; + } +} + +// +// decimator +// input: int16_t +// output: int32_t (shifted 15 positions to the left, + offset 16384) (of length len/2) +// state: filter state array; length = 8 + +void // bugs.webrtc.org/5486 +WebRtcSpl_DownBy2ShortToInt(const int16_t *in, + int32_t len, + int32_t *out, + int32_t *state) { + int32_t tmp0, tmp1, diff; + int32_t i; + + len >>= 1; + + // lower allpass filter (operates on even input samples) + for (i = 0; i < len; i++) { + tmp0 = ((int32_t) in[i << 1] << 15) + (1 << 14); + diff = tmp0 - state[1]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // UBSan: -1379909682 - 834099714 cannot be represented in type 'int' + + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // divide by two and store temporarily + out[i] = (state[3] >> 1); + } + + in++; + + // upper allpass filter (operates on odd input samples) + for (i = 0; i < len; i++) { + tmp0 = ((int32_t) in[i << 1] << 15) + (1 << 14); + diff = tmp0 - state[5]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // divide by two and store temporarily + out[i] += (state[7] >> 1); + } + + in--; +} + +// lowpass filter +// input: int32_t (shifted 15 positions to the left, + offset 16384) +// output: int32_t (normalized, not saturated) +// state: filter state array; length = 8 +void // bugs.webrtc.org/5486 +WebRtcSpl_LPBy2IntToInt(const int32_t *in, int32_t len, int32_t *out, + int32_t *state) { + int32_t tmp0, tmp1, diff; + int32_t i; + + len >>= 1; + + // lower allpass filter: odd input -> even output samples + in++; + // initial state of polyphase delay element + tmp0 = state[12]; + for (i = 0; i < len; i++) { + diff = tmp0 - state[1]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[0] + diff * kResampleAllpass[1][0]; + state[0] = tmp0; + diff = tmp1 - state[2]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[1] + diff * kResampleAllpass[1][1]; + state[1] = tmp1; + diff = tmp0 - state[3]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[3] = state[2] + diff * kResampleAllpass[1][2]; + state[2] = tmp0; + + // scale down, round and store + out[i << 1] = state[3] >> 1; + tmp0 = in[i << 1]; + } + in--; + + // upper allpass filter: even input -> even output samples + for (i = 0; i < len; i++) { + tmp0 = in[i << 1]; + diff = tmp0 - state[5]; + // UBSan: -794814117 - 1566149201 cannot be represented in type 'int' + + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[4] + diff * kResampleAllpass[0][0]; + state[4] = tmp0; + diff = tmp1 - state[6]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[5] + diff * kResampleAllpass[0][1]; + state[5] = tmp1; + diff = tmp0 - state[7]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[7] = state[6] + diff * kResampleAllpass[0][2]; + state[6] = tmp0; + + // average the two allpass outputs, scale down and store + out[i << 1] = (out[i << 1] + (state[7] >> 1)) >> 15; + } + + // switch to odd output samples + out++; + + // lower allpass filter: even input -> odd output samples + for (i = 0; i < len; i++) { + tmp0 = in[i << 1]; + diff = tmp0 - state[9]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[8] + diff * kResampleAllpass[1][0]; + state[8] = tmp0; + diff = tmp1 - state[10]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[9] + diff * kResampleAllpass[1][1]; + state[9] = tmp1; + diff = tmp0 - state[11]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[11] = state[10] + diff * kResampleAllpass[1][2]; + state[10] = tmp0; + + // scale down, round and store + out[i << 1] = state[11] >> 1; + } + + // upper allpass filter: odd input -> odd output samples + in++; + for (i = 0; i < len; i++) { + tmp0 = in[i << 1]; + diff = tmp0 - state[13]; + // scale down and round + diff = (diff + (1 << 13)) >> 14; + tmp1 = state[12] + diff * kResampleAllpass[0][0]; + state[12] = tmp0; + diff = tmp1 - state[14]; + // scale down and round + diff = diff >> 14; + if (diff < 0) + diff += 1; + tmp0 = state[13] + diff * kResampleAllpass[0][1]; + state[13] = tmp1; + diff = tmp0 - state[15]; + // scale down and truncate + diff = diff >> 14; + if (diff < 0) + diff += 1; + state[15] = state[14] + diff * kResampleAllpass[0][2]; + state[14] = tmp0; + + // average the two allpass outputs, scale down and store + out[i << 1] = (out[i << 1] + (state[15] >> 1)) >> 15; + } +} + +// interpolation coefficients +static const int16_t kCoefficients48To32[2][8] = { + {778, -2050, 1087, 23285, 12903, -3783, 441, 222}, + {222, 441, -3783, 12903, 23285, 1087, -2050, 778} +}; + + +// Resampling ratio: 2/3 +// input: int32_t (normalized, not saturated) :: size 3 * K +// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 2 * K +// K: number of blocks + +void WebRtcSpl_Resample48khzTo32khz(const int32_t *In, int32_t *Out, size_t K) { + ///////////////////////////////////////////////////////////// + // Filter operation: + // + // Perform resampling (3 input samples -> 2 output samples); + // process in sub blocks of size 3 samples. + int32_t tmp; + size_t m; + + for (m = 0; m < K; m++) { + tmp = 1 << 14; + tmp += kCoefficients48To32[0][0] * In[0]; + tmp += kCoefficients48To32[0][1] * In[1]; + tmp += kCoefficients48To32[0][2] * In[2]; + tmp += kCoefficients48To32[0][3] * In[3]; + tmp += kCoefficients48To32[0][4] * In[4]; + tmp += kCoefficients48To32[0][5] * In[5]; + tmp += kCoefficients48To32[0][6] * In[6]; + tmp += kCoefficients48To32[0][7] * In[7]; + Out[0] = tmp; + + tmp = 1 << 14; + tmp += kCoefficients48To32[1][0] * In[1]; + tmp += kCoefficients48To32[1][1] * In[2]; + tmp += kCoefficients48To32[1][2] * In[3]; + tmp += kCoefficients48To32[1][3] * In[4]; + tmp += kCoefficients48To32[1][4] * In[5]; + tmp += kCoefficients48To32[1][5] * In[6]; + tmp += kCoefficients48To32[1][6] * In[7]; + tmp += kCoefficients48To32[1][7] * In[8]; + Out[1] = tmp; + + // update pointers + In += 3; + Out += 2; + } +} + + +#ifdef WEBRTC_ARCH_ARM_V7 + +// allpass filter coefficients. +static const uint32_t kResampleAllpass1[3] = {3284, 24441, 49528 << 15}; +static const uint32_t kResampleAllpass2[3] = + {12199, 37471 << 15, 60255 << 15}; + +// Multiply two 32-bit values and accumulate to another input value. +// Return: state + ((diff * tbl_value) >> 16) + +static __inline int32_t MUL_ACCUM_1(int32_t tbl_value, + int32_t diff, + int32_t state) { + int32_t result; + __asm __volatile ("smlawb %0, %1, %2, %3": "=r"(result): "r"(diff), + "r"(tbl_value), "r"(state)); + return result; +} + +// Multiply two 32-bit values and accumulate to another input value. +// Return: Return: state + (((diff << 1) * tbl_value) >> 32) +// +// The reason to introduce this function is that, in case we can't use smlawb +// instruction (in MUL_ACCUM_1) due to input value range, we can still use +// smmla to save some cycles. + +static __inline int32_t MUL_ACCUM_2(int32_t tbl_value, + int32_t diff, + int32_t state) { + int32_t result; + __asm __volatile ("smmla %0, %1, %2, %3": "=r"(result): "r"(diff << 1), + "r"(tbl_value), "r"(state)); + return result; +} + +#else + +// Multiply a 32-bit value with a 16-bit value and accumulate to another input: +#define MUL_ACCUM_1(a, b, c) WEBRTC_SPL_SCALEDIFF32(a, b, c) +#define MUL_ACCUM_2(a, b, c) WEBRTC_SPL_SCALEDIFF32(a, b, c) + +#endif // WEBRTC_ARCH_ARM_V7 + + +//////////////////////////// +///// 48 kHz -> 8 kHz ///// +//////////////////////////// + +// 48 -> 8 resampler +void WebRtcSpl_Resample48khzTo8khz(const int16_t *in, int16_t *out, + WebRtcSpl_State48khzTo8khz *state, int32_t *tmpmem) { + ///// 48 --> 24 ///// + // int16_t in[480] + // int32_t out[240] + ///// + WebRtcSpl_DownBy2ShortToInt(in, 480, tmpmem + 256, state->S_48_24); + + ///// 24 --> 24(LP) ///// + // int32_t in[240] + // int32_t out[240] + ///// + WebRtcSpl_LPBy2IntToInt(tmpmem + 256, 240, tmpmem + 16, state->S_24_24); + + ///// 24 --> 16 ///// + // int32_t in[240] + // int32_t out[160] + ///// + // copy state to and from input array + memcpy(tmpmem + 8, state->S_24_16, 8 * sizeof(int32_t)); + memcpy(state->S_24_16, tmpmem + 248, 8 * sizeof(int32_t)); + WebRtcSpl_Resample48khzTo32khz(tmpmem + 8, tmpmem, 80); + + ///// 16 --> 8 ///// + // int32_t in[160] + // int16_t out[80] + ///// + WebRtcSpl_DownBy2IntToShort(tmpmem, 160, out, state->S_16_8); +} + +// initialize state of 48 -> 8 resampler +void WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz *state) { + memset(state->S_48_24, 0, 8 * sizeof(int32_t)); + memset(state->S_24_24, 0, 16 * sizeof(int32_t)); + memset(state->S_24_16, 0, 8 * sizeof(int32_t)); + memset(state->S_16_8, 0, 8 * sizeof(int32_t)); +} + +//////////////////////////// +///// 8 kHz -> 48 kHz ///// +//////////////////////////// + +int16_t WebRtcSpl_GetScalingSquare(int16_t *in_vector, + size_t in_vector_length, + size_t times) { + int16_t nbits = WebRtcSpl_GetSizeInBits((uint32_t) times); + size_t i; + int16_t smax = -1; + int16_t sabs; + int16_t *sptr = in_vector; + int16_t t; + size_t looptimes = in_vector_length; + + for (i = looptimes; i > 0; i--) { + sabs = (*sptr > 0 ? *sptr++ : -*sptr++); + smax = (sabs > smax ? sabs : smax); + } + t = WebRtcSpl_NormW32(WEBRTC_SPL_MUL(smax, smax)); + + if (smax == 0) { + return 0; // Since norm(0) returns 0 + } else { + return (t > nbits) ? 0 : nbits - t; + } +} + +int32_t WebRtcSpl_Energy(int16_t *vector, + size_t vector_length, + int *scale_factor) { + int32_t en = 0; + size_t i; + int scaling = + WebRtcSpl_GetScalingSquare(vector, vector_length, vector_length); + size_t looptimes = vector_length; + int16_t *vectorptr = vector; + + for (i = 0; i < looptimes; i++) { + en += (*vectorptr * *vectorptr) >> scaling; + vectorptr++; + } + *scale_factor = scaling; + + return en; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc new file mode 100644 index 0000000..a2ef810 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "include/vad.h" + + +class VadImpl final : public Vad { +public: + explicit VadImpl(Aggressiveness aggressiveness) + : handle_(nullptr), aggressiveness_(aggressiveness) { + Reset(); + } + + ~VadImpl() override { WebRtcVad_Free(handle_); } + + Activity VoiceActivity(const int16_t *audio, + size_t num_samples, + int sample_rate_hz) override { + int ret = WebRtcVad_Process(handle_, sample_rate_hz, audio, num_samples); + switch (ret) { + case 0: + return kPassive; + case 1: + return kActive; + default: +// RTC_NOTREACHED() << "WebRtcVad_Process returned an error."; + return kError; + } + } + + void Reset() override { + if (handle_) + WebRtcVad_Free(handle_); + handle_ = WebRtcVad_Create(); + RTC_DCHECK(handle_); + RTC_DCHECK_EQ(WebRtcVad_Init(handle_), 0); + RTC_DCHECK_EQ(WebRtcVad_set_mode(handle_, aggressiveness_), 0); + } + +private: + VadInst *handle_; + Aggressiveness aggressiveness_; +}; + + +std::unique_ptr CreateVad(Vad::Aggressiveness aggressiveness) { + return std::unique_ptr(new VadImpl(aggressiveness)); +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c new file mode 100644 index 0000000..5d3d0ab --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c @@ -0,0 +1,680 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "include/vad_core.h" + +#include "include/vad_filterbank.h" +#include "include/vad_gmm.h" +#include "include/vad_sp.h" + +// Spectrum Weighting +static const int16_t kSpectrumWeight[kNumChannels] = {6, 8, 10, 12, 14, 16}; +static const int16_t kNoiseUpdateConst = 655; // Q15 +static const int16_t kSpeechUpdateConst = 6554; // Q15 +static const int16_t kBackEta = 154; // Q8 +// Minimum difference between the two models, Q5 +static const int16_t kMinimumDifference[kNumChannels] = { + 544, 544, 576, 576, 576, 576}; +// Upper limit of mean value for speech model, Q7 +static const int16_t kMaximumSpeech[kNumChannels] = { + 11392, 11392, 11520, 11520, 11520, 11520}; +// Minimum value for mean value +static const int16_t kMinimumMean[kNumGaussians] = {640, 768}; +// Upper limit of mean value for noise model, Q7 +static const int16_t kMaximumNoise[kNumChannels] = { + 9216, 9088, 8960, 8832, 8704, 8576}; +// Start values for the Gaussian models, Q7 +// Weights for the two Gaussians for the six channels (noise) +static const int16_t kNoiseDataWeights[kTableSize] = { + 34, 62, 72, 66, 53, 25, 94, 66, 56, 62, 75, 103}; +// Weights for the two Gaussians for the six channels (speech) +static const int16_t kSpeechDataWeights[kTableSize] = { + 48, 82, 45, 87, 50, 47, 80, 46, 83, 41, 78, 81}; +// Means for the two Gaussians for the six channels (noise) +static const int16_t kNoiseDataMeans[kTableSize] = { + 6738, 4892, 7065, 6715, 6771, 3369, 7646, 3863, 7820, 7266, 5020, 4362}; +// Means for the two Gaussians for the six channels (speech) +static const int16_t kSpeechDataMeans[kTableSize] = { + 8306, 10085, 10078, 11823, 11843, 6309, 9473, 9571, 10879, 7581, 8180, 7483 +}; +// Stds for the two Gaussians for the six channels (noise) +static const int16_t kNoiseDataStds[kTableSize] = { + 378, 1064, 493, 582, 688, 593, 474, 697, 475, 688, 421, 455}; +// Stds for the two Gaussians for the six channels (speech) +static const int16_t kSpeechDataStds[kTableSize] = { + 555, 505, 567, 524, 585, 1231, 509, 828, 492, 1540, 1079, 850}; + +// Constants used in GmmProbability(). +// +// Maximum number of counted speech (VAD = 1) frames in a row. +static const int16_t kMaxSpeechFrames = 6; +// Minimum standard deviation for both speech and noise. +static const int16_t kMinStd = 384; + +// Constants in WebRtcVad_InitCore(). +// Default aggressiveness mode. +static const short kDefaultMode = 0; +static const int kInitCheck = 42; + +// Constants used in WebRtcVad_set_mode_core(). +// +// Thresholds for different frame lengths (10 ms, 20 ms and 30 ms). +// +// Mode 0, Quality. +static const int16_t kOverHangMax1Q[3] = {8, 4, 3}; +static const int16_t kOverHangMax2Q[3] = {14, 7, 5}; +static const int16_t kLocalThresholdQ[3] = {24, 21, 24}; +static const int16_t kGlobalThresholdQ[3] = {57, 48, 57}; +// Mode 1, Low bitrate. +static const int16_t kOverHangMax1LBR[3] = {8, 4, 3}; +static const int16_t kOverHangMax2LBR[3] = {14, 7, 5}; +static const int16_t kLocalThresholdLBR[3] = {37, 32, 37}; +static const int16_t kGlobalThresholdLBR[3] = {100, 80, 100}; +// Mode 2, Aggressive. +static const int16_t kOverHangMax1AGG[3] = {6, 3, 2}; +static const int16_t kOverHangMax2AGG[3] = {9, 5, 3}; +static const int16_t kLocalThresholdAGG[3] = {82, 78, 82}; +static const int16_t kGlobalThresholdAGG[3] = {285, 260, 285}; +// Mode 3, Very aggressive. +static const int16_t kOverHangMax1VAG[3] = {6, 3, 2}; +static const int16_t kOverHangMax2VAG[3] = {9, 5, 3}; +static const int16_t kLocalThresholdVAG[3] = {94, 94, 94}; +static const int16_t kGlobalThresholdVAG[3] = {1100, 1050, 1100}; + +// Calculates the weighted average w.r.t. number of Gaussians. The |data| are +// updated with an |offset| before averaging. +// +// - data [i/o] : Data to average. +// - offset [i] : An offset added to |data|. +// - weights [i] : Weights used for averaging. +// +// returns : The weighted average. +static int32_t WeightedAverage(int16_t *data, int16_t offset, + const int16_t *weights) { + int k; + int32_t weighted_average = 0; + + for (k = 0; k < kNumGaussians; k++) { + data[k * kNumChannels] += offset; + weighted_average += data[k * kNumChannels] * weights[k * kNumChannels]; + } + return weighted_average; +} + +// An s16 x s32 -> s32 multiplication that's allowed to overflow. (It's still +// undefined behavior, so not a good idea; this just makes UBSan ignore the +// violation, so that our old code can continue to do what it's always been +// doing.) +static inline int32_t +OverflowingMulS16ByS32ToS32(int16_t a, int32_t b) { + return a * b; +} + +// Calculates the probabilities for both speech and background noise using +// Gaussian Mixture Models (GMM). A hypothesis-test is performed to decide which +// type of signal is most probable. +// +// - self [i/o] : Pointer to VAD instance +// - features [i] : Feature vector of length |kNumChannels| +// = log10(energy in frequency band) +// - total_power [i] : Total power in audio frame. +// - frame_length [i] : Number of input samples +// +// - returns : the VAD decision (0 - noise, 1 - speech). +static int16_t GmmProbability(VadInstT *self, int16_t *features, + int16_t total_power, size_t frame_length) { + int channel, k; + int16_t feature_minimum; + int16_t h0, h1; + int16_t log_likelihood_ratio; + int16_t vadflag = 0; + int16_t shifts_h0, shifts_h1; + int16_t tmp_s16, tmp1_s16, tmp2_s16; + int16_t diff; + int gaussian; + int16_t nmk, nmk2, nmk3, smk, smk2, nsk, ssk; + int16_t delt, ndelt; + int16_t maxspe, maxmu; + int16_t deltaN[kTableSize], deltaS[kTableSize]; + int16_t ngprvec[kTableSize] = {0}; // Conditional probability = 0. + int16_t sgprvec[kTableSize] = {0}; // Conditional probability = 0. + int32_t h0_test, h1_test; + int32_t tmp1_s32, tmp2_s32; + int32_t sum_log_likelihood_ratios = 0; + int32_t noise_global_mean, speech_global_mean; + int32_t noise_probability[kNumGaussians], speech_probability[kNumGaussians]; + int16_t overhead1, overhead2, individualTest, totalTest; + + // Set various thresholds based on frame lengths (80, 160 or 240 samples). + if (frame_length == 80) { + overhead1 = self->over_hang_max_1[0]; + overhead2 = self->over_hang_max_2[0]; + individualTest = self->individual[0]; + totalTest = self->total[0]; + } else if (frame_length == 160) { + overhead1 = self->over_hang_max_1[1]; + overhead2 = self->over_hang_max_2[1]; + individualTest = self->individual[1]; + totalTest = self->total[1]; + } else { + overhead1 = self->over_hang_max_1[2]; + overhead2 = self->over_hang_max_2[2]; + individualTest = self->individual[2]; + totalTest = self->total[2]; + } + + if (total_power > kMinEnergy) { + // The signal power of current frame is large enough for processing. The + // processing consists of two parts: + // 1) Calculating the likelihood of speech and thereby a VAD decision. + // 2) Updating the underlying model, w.r.t., the decision made. + + // The detection scheme is an LRT with hypothesis + // H0: Noise + // H1: Speech + // + // We combine a global LRT with local tests, for each frequency sub-band, + // here defined as |channel|. + for (channel = 0; channel < kNumChannels; channel++) { + // For each channel we model the probability with a GMM consisting of + // |kNumGaussians|, with different means and standard deviations depending + // on H0 or H1. + h0_test = 0; + h1_test = 0; + for (k = 0; k < kNumGaussians; k++) { + gaussian = channel + k * kNumChannels; + // Probability under H0, that is, probability of frame being noise. + // Value given in Q27 = Q7 * Q20. + tmp1_s32 = WebRtcVad_GaussianProbability(features[channel], + self->noise_means[gaussian], + self->noise_stds[gaussian], + &deltaN[gaussian]); + noise_probability[k] = kNoiseDataWeights[gaussian] * tmp1_s32; + h0_test += noise_probability[k]; // Q27 + + // Probability under H1, that is, probability of frame being speech. + // Value given in Q27 = Q7 * Q20. + tmp1_s32 = WebRtcVad_GaussianProbability(features[channel], + self->speech_means[gaussian], + self->speech_stds[gaussian], + &deltaS[gaussian]); + speech_probability[k] = kSpeechDataWeights[gaussian] * tmp1_s32; + h1_test += speech_probability[k]; // Q27 + } + + // Calculate the log likelihood ratio: log2(Pr{X|H1} / Pr{X|H1}). + // Approximation: + // log2(Pr{X|H1} / Pr{X|H1}) = log2(Pr{X|H1}*2^Q) - log2(Pr{X|H1}*2^Q) + // = log2(h1_test) - log2(h0_test) + // = log2(2^(31-shifts_h1)*(1+b1)) + // - log2(2^(31-shifts_h0)*(1+b0)) + // = shifts_h0 - shifts_h1 + // + log2(1+b1) - log2(1+b0) + // ~= shifts_h0 - shifts_h1 + // + // Note that b0 and b1 are values less than 1, hence, 0 <= log2(1+b0) < 1. + // Further, b0 and b1 are independent and on the average the two terms + // cancel. + shifts_h0 = WebRtcSpl_NormW32(h0_test); + shifts_h1 = WebRtcSpl_NormW32(h1_test); + if (h0_test == 0) { + shifts_h0 = 31; + } + if (h1_test == 0) { + shifts_h1 = 31; + } + log_likelihood_ratio = shifts_h0 - shifts_h1; + + // Update |sum_log_likelihood_ratios| with spectrum weighting. This is + // used for the global VAD decision. + sum_log_likelihood_ratios += + (int32_t) (log_likelihood_ratio * kSpectrumWeight[channel]); + + // Local VAD decision. + if ((log_likelihood_ratio * 4) > individualTest) { + vadflag = 1; + } + + // TODO(bjornv): The conditional probabilities below are applied on the + // hard coded number of Gaussians set to two. Find a way to generalize. + // Calculate local noise probabilities used later when updating the GMM. + h0 = (int16_t) (h0_test >> 12); // Q15 + if (h0 > 0) { + // High probability of noise. Assign conditional probabilities for each + // Gaussian in the GMM. + tmp1_s32 = (noise_probability[0] & 0xFFFFF000) << 2; // Q29 + ngprvec[channel] = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, h0); // Q14 + ngprvec[channel + kNumChannels] = 16384 - ngprvec[channel]; + } else { + // Low noise probability. Assign conditional probability 1 to the first + // Gaussian and 0 to the rest (which is already set at initialization). + ngprvec[channel] = 16384; + } + + // Calculate local speech probabilities used later when updating the GMM. + h1 = (int16_t) (h1_test >> 12); // Q15 + if (h1 > 0) { + // High probability of speech. Assign conditional probabilities for each + // Gaussian in the GMM. Otherwise use the initialized values, i.e., 0. + tmp1_s32 = (speech_probability[0] & 0xFFFFF000) << 2; // Q29 + sgprvec[channel] = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, h1); // Q14 + sgprvec[channel + kNumChannels] = 16384 - sgprvec[channel]; + } + } + + // Make a global VAD decision. + vadflag |= (sum_log_likelihood_ratios >= totalTest); + + // Update the model parameters. + maxspe = 12800; + for (channel = 0; channel < kNumChannels; channel++) { + + // Get minimum value in past which is used for long term correction in Q4. + feature_minimum = WebRtcVad_FindMinimum(self, features[channel], channel); + + // Compute the "global" mean, that is the sum of the two means weighted. + noise_global_mean = WeightedAverage(&self->noise_means[channel], 0, + &kNoiseDataWeights[channel]); + tmp1_s16 = (int16_t) (noise_global_mean >> 6); // Q8 + + for (k = 0; k < kNumGaussians; k++) { + gaussian = channel + k * kNumChannels; + + nmk = self->noise_means[gaussian]; + smk = self->speech_means[gaussian]; + nsk = self->noise_stds[gaussian]; + ssk = self->speech_stds[gaussian]; + + // Update noise mean vector if the frame consists of noise only. + nmk2 = nmk; + if (!vadflag) { + // deltaN = (x-mu)/sigma^2 + // ngprvec[k] = |noise_probability[k]| / + // (|noise_probability[0]| + |noise_probability[1]|) + + // (Q14 * Q11 >> 11) = Q14. + delt = (int16_t) ((ngprvec[gaussian] * deltaN[gaussian]) >> 11); + // Q7 + (Q14 * Q15 >> 22) = Q7. + nmk2 = nmk + (int16_t) ((delt * kNoiseUpdateConst) >> 22); + } + + // Long term correction of the noise mean. + // Q8 - Q8 = Q8. + ndelt = (feature_minimum << 4) - tmp1_s16; + // Q7 + (Q8 * Q8) >> 9 = Q7. + nmk3 = nmk2 + (int16_t) ((ndelt * kBackEta) >> 9); + + // Control that the noise mean does not drift to much. + tmp_s16 = (int16_t) ((k + 5) << 7); + if (nmk3 < tmp_s16) { + nmk3 = tmp_s16; + } + tmp_s16 = (int16_t) ((72 + k - channel) << 7); + if (nmk3 > tmp_s16) { + nmk3 = tmp_s16; + } + self->noise_means[gaussian] = nmk3; + + if (vadflag) { + // Update speech mean vector: + // |deltaS| = (x-mu)/sigma^2 + // sgprvec[k] = |speech_probability[k]| / + // (|speech_probability[0]| + |speech_probability[1]|) + + // (Q14 * Q11) >> 11 = Q14. + delt = (int16_t) ((sgprvec[gaussian] * deltaS[gaussian]) >> 11); + // Q14 * Q15 >> 21 = Q8. + tmp_s16 = (int16_t) ((delt * kSpeechUpdateConst) >> 21); + // Q7 + (Q8 >> 1) = Q7. With rounding. + smk2 = smk + ((tmp_s16 + 1) >> 1); + + // Control that the speech mean does not drift to much. + maxmu = maxspe + 640; + if (smk2 < kMinimumMean[k]) { + smk2 = kMinimumMean[k]; + } + if (smk2 > maxmu) { + smk2 = maxmu; + } + self->speech_means[gaussian] = smk2; // Q7. + + // (Q7 >> 3) = Q4. With rounding. + tmp_s16 = ((smk + 4) >> 3); + + tmp_s16 = features[channel] - tmp_s16; // Q4 + // (Q11 * Q4 >> 3) = Q12. + tmp1_s32 = (deltaS[gaussian] * tmp_s16) >> 3; + tmp2_s32 = tmp1_s32 - 4096; + tmp_s16 = sgprvec[gaussian] >> 2; + // (Q14 >> 2) * Q12 = Q24. + tmp1_s32 = tmp_s16 * tmp2_s32; + + tmp2_s32 = tmp1_s32 >> 4; // Q20 + + // 0.1 * Q20 / Q7 = Q13. + if (tmp2_s32 > 0) { + tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(tmp2_s32, ssk * 10); + } else { + tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(-tmp2_s32, ssk * 10); + tmp_s16 = -tmp_s16; + } + // Divide by 4 giving an update factor of 0.025 (= 0.1 / 4). + // Note that division by 4 equals shift by 2, hence, + // (Q13 >> 8) = (Q13 >> 6) / 4 = Q7. + tmp_s16 += 128; // Rounding. + ssk += (tmp_s16 >> 8); + if (ssk < kMinStd) { + ssk = kMinStd; + } + self->speech_stds[gaussian] = ssk; + } else { + // Update GMM variance vectors. + // deltaN * (features[channel] - nmk) - 1 + // Q4 - (Q7 >> 3) = Q4. + tmp_s16 = features[channel] - (nmk >> 3); + // (Q11 * Q4 >> 3) = Q12. + tmp1_s32 = (deltaN[gaussian] * tmp_s16) >> 3; + tmp1_s32 -= 4096; + + // (Q14 >> 2) * Q12 = Q24. + tmp_s16 = (ngprvec[gaussian] + 2) >> 2; + tmp2_s32 = OverflowingMulS16ByS32ToS32(tmp_s16, tmp1_s32); + // Q20 * approx 0.001 (2^-10=0.0009766), hence, + // (Q24 >> 14) = (Q24 >> 4) / 2^10 = Q20. + tmp1_s32 = tmp2_s32 >> 14; + + // Q20 / Q7 = Q13. + if (tmp1_s32 > 0) { + tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, nsk); + } else { + tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(-tmp1_s32, nsk); + tmp_s16 = -tmp_s16; + } + tmp_s16 += 32; // Rounding + nsk += tmp_s16 >> 6; // Q13 >> 6 = Q7. + if (nsk < kMinStd) { + nsk = kMinStd; + } + self->noise_stds[gaussian] = nsk; + } + } + + // Separate models if they are too close. + // |noise_global_mean| in Q14 (= Q7 * Q7). + noise_global_mean = WeightedAverage(&self->noise_means[channel], 0, + &kNoiseDataWeights[channel]); + + // |speech_global_mean| in Q14 (= Q7 * Q7). + speech_global_mean = WeightedAverage(&self->speech_means[channel], 0, + &kSpeechDataWeights[channel]); + + // |diff| = "global" speech mean - "global" noise mean. + // (Q14 >> 9) - (Q14 >> 9) = Q5. + diff = (int16_t) (speech_global_mean >> 9) - + (int16_t) (noise_global_mean >> 9); + if (diff < kMinimumDifference[channel]) { + tmp_s16 = kMinimumDifference[channel] - diff; + + // |tmp1_s16| = ~0.8 * (kMinimumDifference - diff) in Q7. + // |tmp2_s16| = ~0.2 * (kMinimumDifference - diff) in Q7. + tmp1_s16 = (int16_t) ((13 * tmp_s16) >> 2); + tmp2_s16 = (int16_t) ((3 * tmp_s16) >> 2); + + // Move Gaussian means for speech model by |tmp1_s16| and update + // |speech_global_mean|. Note that |self->speech_means[channel]| is + // changed after the call. + speech_global_mean = WeightedAverage(&self->speech_means[channel], + tmp1_s16, + &kSpeechDataWeights[channel]); + + // Move Gaussian means for noise model by -|tmp2_s16| and update + // |noise_global_mean|. Note that |self->noise_means[channel]| is + // changed after the call. + noise_global_mean = WeightedAverage(&self->noise_means[channel], + -tmp2_s16, + &kNoiseDataWeights[channel]); + } + + // Control that the speech & noise means do not drift to much. + maxspe = kMaximumSpeech[channel]; + tmp2_s16 = (int16_t) (speech_global_mean >> 7); + if (tmp2_s16 > maxspe) { + // Upper limit of speech model. + tmp2_s16 -= maxspe; + + for (k = 0; k < kNumGaussians; k++) { + self->speech_means[channel + k * kNumChannels] -= tmp2_s16; + } + } + + tmp2_s16 = (int16_t) (noise_global_mean >> 7); + if (tmp2_s16 > kMaximumNoise[channel]) { + tmp2_s16 -= kMaximumNoise[channel]; + + for (k = 0; k < kNumGaussians; k++) { + self->noise_means[channel + k * kNumChannels] -= tmp2_s16; + } + } + } + self->frame_counter++; + } + + // Smooth with respect to transition hysteresis. + if (!vadflag) { + if (self->over_hang > 0) { + vadflag = 2 + self->over_hang; + self->over_hang--; + } + self->num_of_speech = 0; + } else { + self->num_of_speech++; + if (self->num_of_speech > kMaxSpeechFrames) { + self->num_of_speech = kMaxSpeechFrames; + self->over_hang = overhead2; + } else { + self->over_hang = overhead1; + } + } + return vadflag; +} + +// Initialize the VAD. Set aggressiveness mode to default value. +int WebRtcVad_InitCore(VadInstT *self) { + int i; + + if (self == NULL) { + return -1; + } + + // Initialization of general struct variables. + self->vad = 1; // Speech active (=1). + self->frame_counter = 0; + self->over_hang = 0; + self->num_of_speech = 0; + + // Initialization of downsampling filter state. + memset(self->downsampling_filter_states, 0, + sizeof(self->downsampling_filter_states)); + + // Initialization of 48 to 8 kHz downsampling. + WebRtcSpl_ResetResample48khzTo8khz(&self->state_48_to_8); + + // Read initial PDF parameters. + for (i = 0; i < kTableSize; i++) { + self->noise_means[i] = kNoiseDataMeans[i]; + self->speech_means[i] = kSpeechDataMeans[i]; + self->noise_stds[i] = kNoiseDataStds[i]; + self->speech_stds[i] = kSpeechDataStds[i]; + } + + // Initialize Index and Minimum value vectors. + for (i = 0; i < 16 * kNumChannels; i++) { + self->low_value_vector[i] = 10000; + self->index_vector[i] = 0; + } + + // Initialize splitting filter states. + memset(self->upper_state, 0, sizeof(self->upper_state)); + memset(self->lower_state, 0, sizeof(self->lower_state)); + + // Initialize high pass filter states. + memset(self->hp_filter_state, 0, sizeof(self->hp_filter_state)); + + // Initialize mean value memory, for WebRtcVad_FindMinimum(). + for (i = 0; i < kNumChannels; i++) { + self->mean_value[i] = 1600; + } + + // Set aggressiveness mode to default (=|kDefaultMode|). + if (WebRtcVad_set_mode_core(self, kDefaultMode) != 0) { + return -1; + } + + self->init_flag = kInitCheck; + + return 0; +} + +// Set aggressiveness mode +int WebRtcVad_set_mode_core(VadInstT *self, int mode) { + int return_value = 0; + + switch (mode) { + case 0: + // Quality mode. + memcpy(self->over_hang_max_1, kOverHangMax1Q, + sizeof(self->over_hang_max_1)); + memcpy(self->over_hang_max_2, kOverHangMax2Q, + sizeof(self->over_hang_max_2)); + memcpy(self->individual, kLocalThresholdQ, + sizeof(self->individual)); + memcpy(self->total, kGlobalThresholdQ, + sizeof(self->total)); + break; + case 1: + // Low bitrate mode. + memcpy(self->over_hang_max_1, kOverHangMax1LBR, + sizeof(self->over_hang_max_1)); + memcpy(self->over_hang_max_2, kOverHangMax2LBR, + sizeof(self->over_hang_max_2)); + memcpy(self->individual, kLocalThresholdLBR, + sizeof(self->individual)); + memcpy(self->total, kGlobalThresholdLBR, + sizeof(self->total)); + break; + case 2: + // Aggressive mode. + memcpy(self->over_hang_max_1, kOverHangMax1AGG, + sizeof(self->over_hang_max_1)); + memcpy(self->over_hang_max_2, kOverHangMax2AGG, + sizeof(self->over_hang_max_2)); + memcpy(self->individual, kLocalThresholdAGG, + sizeof(self->individual)); + memcpy(self->total, kGlobalThresholdAGG, + sizeof(self->total)); + break; + case 3: + // Very aggressive mode. + memcpy(self->over_hang_max_1, kOverHangMax1VAG, + sizeof(self->over_hang_max_1)); + memcpy(self->over_hang_max_2, kOverHangMax2VAG, + sizeof(self->over_hang_max_2)); + memcpy(self->individual, kLocalThresholdVAG, + sizeof(self->individual)); + memcpy(self->total, kGlobalThresholdVAG, + sizeof(self->total)); + break; + default: + return_value = -1; + break; + } + + return return_value; +} + +// Calculate VAD decision by first extracting feature values and then calculate +// probability for both speech and background noise. + +int WebRtcVad_CalcVad48khz(VadInstT *inst, const int16_t *speech_frame, + size_t frame_length) { + int vad; + size_t i; + int16_t speech_nb[240]; // 30 ms in 8 kHz. + // |tmp_mem| is a temporary memory used by resample function, length is + // frame length in 10 ms (480 samples) + 256 extra. + int32_t tmp_mem[480 + 256] = {0}; + const size_t kFrameLen10ms48khz = 480; + const size_t kFrameLen10ms8khz = 80; + size_t num_10ms_frames = frame_length / kFrameLen10ms48khz; + + for (i = 0; i < num_10ms_frames; i++) { + WebRtcSpl_Resample48khzTo8khz(speech_frame, + &speech_nb[i * kFrameLen10ms8khz], + &inst->state_48_to_8, + tmp_mem); + } + + // Do VAD on an 8 kHz signal + vad = WebRtcVad_CalcVad8khz(inst, speech_nb, frame_length / 6); + + return vad; +} + +int WebRtcVad_CalcVad32khz(VadInstT *inst, const int16_t *speech_frame, + size_t frame_length) { + size_t len; + int vad; + int16_t speechWB[480]; // Downsampled speech frame: 960 samples (30ms in SWB) + int16_t speechNB[240]; // Downsampled speech frame: 480 samples (30ms in WB) + + + // Downsample signal 32->16->8 before doing VAD + WebRtcVad_Downsampling(speech_frame, speechWB, &(inst->downsampling_filter_states[2]), + frame_length); + len = frame_length / 2; + + WebRtcVad_Downsampling(speechWB, speechNB, inst->downsampling_filter_states, len); + len /= 2; + + // Do VAD on an 8 kHz signal + vad = WebRtcVad_CalcVad8khz(inst, speechNB, len); + + return vad; +} + +int WebRtcVad_CalcVad16khz(VadInstT *inst, const int16_t *speech_frame, + size_t frame_length) { + size_t len; + int vad; + int16_t speechNB[240]; // Downsampled speech frame: 480 samples (30ms in WB) + + // Wideband: Downsample signal before doing VAD + WebRtcVad_Downsampling(speech_frame, speechNB, inst->downsampling_filter_states, + frame_length); + + len = frame_length / 2; + vad = WebRtcVad_CalcVad8khz(inst, speechNB, len); + + return vad; +} + +int WebRtcVad_CalcVad8khz(VadInstT *inst, const int16_t *speech_frame, + size_t frame_length) { + int16_t feature_vector[kNumChannels], total_power; + + // Get power in the bands + total_power = WebRtcVad_CalculateFeatures(inst, speech_frame, frame_length, + feature_vector); + + // Make a VAD + inst->vad = GmmProbability(inst, feature_vector, total_power, frame_length); + + return inst->vad; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c new file mode 100644 index 0000000..5a49cb4 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c @@ -0,0 +1,326 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "include/vad_filterbank.h" + +// Constants used in LogOfEnergy(). +static const int16_t kLogConst = 24660; // 160*log10(2) in Q9. +static const int16_t kLogEnergyIntPart = 14336; // 14 in Q10 + +// Coefficients used by HighPassFilter, Q14. +static const int16_t kHpZeroCoefs[3] = {6631, -13262, 6631}; +static const int16_t kHpPoleCoefs[3] = {16384, -7756, 5620}; + +// Allpass filter coefficients, upper and lower, in Q15. +// Upper: 0.64, Lower: 0.17 +static const int16_t kAllPassCoefsQ15[2] = {20972, 5571}; + +// Adjustment for division with two in SplitFilter. +static const int16_t kOffsetVector[6] = {368, 368, 272, 176, 176, 176}; + +// High pass filtering, with a cut-off frequency at 80 Hz, if the |data_in| is +// sampled at 500 Hz. +// +// - data_in [i] : Input audio data sampled at 500 Hz. +// - data_length [i] : Length of input and output data. +// - filter_state [i/o] : State of the filter. +// - data_out [o] : Output audio data in the frequency interval +// 80 - 250 Hz. +static void HighPassFilter(const int16_t *data_in, size_t data_length, + int16_t *filter_state, int16_t *data_out) { + size_t i; + const int16_t *in_ptr = data_in; + int16_t *out_ptr = data_out; + int32_t tmp32 = 0; + + + // The sum of the absolute values of the impulse response: + // The zero/pole-filter has a max amplification of a single sample of: 1.4546 + // Impulse response: 0.4047 -0.6179 -0.0266 0.1993 0.1035 -0.0194 + // The all-zero section has a max amplification of a single sample of: 1.6189 + // Impulse response: 0.4047 -0.8094 0.4047 0 0 0 + // The all-pole section has a max amplification of a single sample of: 1.9931 + // Impulse response: 1.0000 0.4734 -0.1189 -0.2187 -0.0627 0.04532 + + for (i = 0; i < data_length; i++) { + // All-zero section (filter coefficients in Q14). + tmp32 = kHpZeroCoefs[0] * *in_ptr; + tmp32 += kHpZeroCoefs[1] * filter_state[0]; + tmp32 += kHpZeroCoefs[2] * filter_state[1]; + filter_state[1] = filter_state[0]; + filter_state[0] = *in_ptr++; + + // All-pole section (filter coefficients in Q14). + tmp32 -= kHpPoleCoefs[1] * filter_state[2]; + tmp32 -= kHpPoleCoefs[2] * filter_state[3]; + filter_state[3] = filter_state[2]; + filter_state[2] = (int16_t) (tmp32 >> 14); + *out_ptr++ = filter_state[2]; + } +} + +// All pass filtering of |data_in|, used before splitting the signal into two +// frequency bands (low pass vs high pass). +// Note that |data_in| and |data_out| can NOT correspond to the same address. +// +// - data_in [i] : Input audio signal given in Q0. +// - data_length [i] : Length of input and output data. +// - filter_coefficient [i] : Given in Q15. +// - filter_state [i/o] : State of the filter given in Q(-1). +// - data_out [o] : Output audio signal given in Q(-1). +static void AllPassFilter(const int16_t *data_in, size_t data_length, + int16_t filter_coefficient, int16_t *filter_state, + int16_t *data_out) { + // The filter can only cause overflow (in the w16 output variable) + // if more than 4 consecutive input numbers are of maximum value and + // has the the same sign as the impulse responses first taps. + // First 6 taps of the impulse response: + // 0.6399 0.5905 -0.3779 0.2418 -0.1547 0.0990 + + size_t i; + int16_t tmp16 = 0; + int32_t tmp32 = 0; + int32_t state32 = ((int32_t) (*filter_state) * (1 << 16)); // Q15 + + for (i = 0; i < data_length; i++) { + tmp32 = state32 + filter_coefficient * *data_in; + tmp16 = (int16_t) (tmp32 >> 16); // Q(-1) + *data_out++ = tmp16; + state32 = (*data_in * (1 << 14)) - filter_coefficient * tmp16; // Q14 + state32 *= 2; // Q15. + data_in += 2; + } + + *filter_state = (int16_t) (state32 >> 16); // Q(-1) +} + +// Splits |data_in| into |hp_data_out| and |lp_data_out| corresponding to +// an upper (high pass) part and a lower (low pass) part respectively. +// +// - data_in [i] : Input audio data to be split into two frequency bands. +// - data_length [i] : Length of |data_in|. +// - upper_state [i/o] : State of the upper filter, given in Q(-1). +// - lower_state [i/o] : State of the lower filter, given in Q(-1). +// - hp_data_out [o] : Output audio data of the upper half of the spectrum. +// The length is |data_length| / 2. +// - lp_data_out [o] : Output audio data of the lower half of the spectrum. +// The length is |data_length| / 2. +static void SplitFilter(const int16_t *data_in, size_t data_length, + int16_t *upper_state, int16_t *lower_state, + int16_t *hp_data_out, int16_t *lp_data_out) { + size_t i; + size_t half_length = data_length >> 1; // Downsampling by 2. + int16_t tmp_out; + + // All-pass filtering upper branch. + AllPassFilter(&data_in[0], half_length, kAllPassCoefsQ15[0], upper_state, + hp_data_out); + + // All-pass filtering lower branch. + AllPassFilter(&data_in[1], half_length, kAllPassCoefsQ15[1], lower_state, + lp_data_out); + + // Make LP and HP signals. + for (i = 0; i < half_length; i++) { + tmp_out = *hp_data_out; + *hp_data_out++ -= *lp_data_out; + *lp_data_out++ += tmp_out; + } +} + +// Calculates the energy of |data_in| in dB, and also updates an overall +// |total_energy| if necessary. +// +// - data_in [i] : Input audio data for energy calculation. +// - data_length [i] : Length of input data. +// - offset [i] : Offset value added to |log_energy|. +// - total_energy [i/o] : An external energy updated with the energy of +// |data_in|. +// NOTE: |total_energy| is only updated if +// |total_energy| <= |kMinEnergy|. +// - log_energy [o] : 10 * log10("energy of |data_in|") given in Q4. +static void LogOfEnergy(const int16_t *data_in, size_t data_length, + int16_t offset, int16_t *total_energy, + int16_t *log_energy) { + // |tot_rshifts| accumulates the number of right shifts performed on |energy|. + int tot_rshifts = 0; + // The |energy| will be normalized to 15 bits. We use unsigned integer because + // we eventually will mask out the fractional part. + uint32_t energy = 0; + + RTC_DCHECK(data_in); + RTC_DCHECK_GT(data_length, 0); + + energy = (uint32_t) WebRtcSpl_Energy((int16_t *) data_in, data_length, + &tot_rshifts); + + if (energy != 0) { + // By construction, normalizing to 15 bits is equivalent with 17 leading + // zeros of an unsigned 32 bit value. + int normalizing_rshifts = 17 - WebRtcSpl_NormU32(energy); + // In a 15 bit representation the leading bit is 2^14. log2(2^14) in Q10 is + // (14 << 10), which is what we initialize |log2_energy| with. For a more + // detailed derivations, see below. + int16_t log2_energy = kLogEnergyIntPart; + + tot_rshifts += normalizing_rshifts; + // Normalize |energy| to 15 bits. + // |tot_rshifts| is now the total number of right shifts performed on + // |energy| after normalization. This means that |energy| is in + // Q(-tot_rshifts). + if (normalizing_rshifts < 0) { + energy <<= -normalizing_rshifts; + } else { + energy >>= normalizing_rshifts; + } + + // Calculate the energy of |data_in| in dB, in Q4. + // + // 10 * log10("true energy") in Q4 = 2^4 * 10 * log10("true energy") = + // 160 * log10(|energy| * 2^|tot_rshifts|) = + // 160 * log10(2) * log2(|energy| * 2^|tot_rshifts|) = + // 160 * log10(2) * (log2(|energy|) + log2(2^|tot_rshifts|)) = + // (160 * log10(2)) * (log2(|energy|) + |tot_rshifts|) = + // |kLogConst| * (|log2_energy| + |tot_rshifts|) + // + // We know by construction that |energy| is normalized to 15 bits. Hence, + // |energy| = 2^14 + frac_Q15, where frac_Q15 is a fractional part in Q15. + // Further, we'd like |log2_energy| in Q10 + // log2(|energy|) in Q10 = 2^10 * log2(2^14 + frac_Q15) = + // 2^10 * log2(2^14 * (1 + frac_Q15 * 2^-14)) = + // 2^10 * (14 + log2(1 + frac_Q15 * 2^-14)) ~= + // (14 << 10) + 2^10 * (frac_Q15 * 2^-14) = + // (14 << 10) + (frac_Q15 * 2^-4) = (14 << 10) + (frac_Q15 >> 4) + // + // Note that frac_Q15 = (|energy| & 0x00003FFF) + + // Calculate and add the fractional part to |log2_energy|. + log2_energy += (int16_t) ((energy & 0x00003FFF) >> 4); + + // |kLogConst| is in Q9, |log2_energy| in Q10 and |tot_rshifts| in Q0. + // Note that we in our derivation above have accounted for an output in Q4. + *log_energy = (int16_t) (((kLogConst * log2_energy) >> 19) + + ((tot_rshifts * kLogConst) >> 9)); + + if (*log_energy < 0) { + *log_energy = 0; + } + } else { + *log_energy = offset; + return; + } + + *log_energy += offset; + + // Update the approximate |total_energy| with the energy of |data_in|, if + // |total_energy| has not exceeded |kMinEnergy|. |total_energy| is used as an + // energy indicator in WebRtcVad_GmmProbability() in vad_core.c. + if (*total_energy <= kMinEnergy) { + if (tot_rshifts >= 0) { + // We know by construction that the |energy| > |kMinEnergy| in Q0, so add + // an arbitrary value such that |total_energy| exceeds |kMinEnergy|. + *total_energy += kMinEnergy + 1; + } else { + // By construction |energy| is represented by 15 bits, hence any number of + // right shifted |energy| will fit in an int16_t. In addition, adding the + // value to |total_energy| is wrap around safe as long as + // |kMinEnergy| < 8192. + *total_energy += (int16_t) (energy >> -tot_rshifts); // Q0. + } + } +} + +int16_t WebRtcVad_CalculateFeatures(VadInstT *self, const int16_t *data_in, + size_t data_length, int16_t *features) { + int16_t total_energy = 0; + // We expect |data_length| to be 80, 160 or 240 samples, which corresponds to + // 10, 20 or 30 ms in 8 kHz. Therefore, the intermediate downsampled data will + // have at most 120 samples after the first split and at most 60 samples after + // the second split. + int16_t hp_120[120], lp_120[120]; + int16_t hp_60[60], lp_60[60]; + const size_t half_data_length = data_length >> 1; + size_t length = half_data_length; // |data_length| / 2, corresponds to + // bandwidth = 2000 Hz after downsampling. + + // Initialize variables for the first SplitFilter(). + int frequency_band = 0; + const int16_t *in_ptr = data_in; // [0 - 4000] Hz. + int16_t *hp_out_ptr = hp_120; // [2000 - 4000] Hz. + int16_t *lp_out_ptr = lp_120; // [0 - 2000] Hz. + + RTC_DCHECK_LE(data_length, 240); + RTC_DCHECK_LT(4, kNumChannels - 1); // Checking maximum |frequency_band|. + + // Split at 2000 Hz and downsample. + SplitFilter(in_ptr, data_length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // For the upper band (2000 Hz - 4000 Hz) split at 3000 Hz and downsample. + frequency_band = 1; + in_ptr = hp_120; // [2000 - 4000] Hz. + hp_out_ptr = hp_60; // [3000 - 4000] Hz. + lp_out_ptr = lp_60; // [2000 - 3000] Hz. + SplitFilter(in_ptr, length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // Energy in 3000 Hz - 4000 Hz. + length >>= 1; // |data_length| / 4 <=> bandwidth = 1000 Hz. + + LogOfEnergy(hp_60, length, kOffsetVector[5], &total_energy, &features[5]); + + // Energy in 2000 Hz - 3000 Hz. + LogOfEnergy(lp_60, length, kOffsetVector[4], &total_energy, &features[4]); + + // For the lower band (0 Hz - 2000 Hz) split at 1000 Hz and downsample. + frequency_band = 2; + in_ptr = lp_120; // [0 - 2000] Hz. + hp_out_ptr = hp_60; // [1000 - 2000] Hz. + lp_out_ptr = lp_60; // [0 - 1000] Hz. + length = half_data_length; // |data_length| / 2 <=> bandwidth = 2000 Hz. + SplitFilter(in_ptr, length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // Energy in 1000 Hz - 2000 Hz. + length >>= 1; // |data_length| / 4 <=> bandwidth = 1000 Hz. + LogOfEnergy(hp_60, length, kOffsetVector[3], &total_energy, &features[3]); + + // For the lower band (0 Hz - 1000 Hz) split at 500 Hz and downsample. + frequency_band = 3; + in_ptr = lp_60; // [0 - 1000] Hz. + hp_out_ptr = hp_120; // [500 - 1000] Hz. + lp_out_ptr = lp_120; // [0 - 500] Hz. + SplitFilter(in_ptr, length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // Energy in 500 Hz - 1000 Hz. + length >>= 1; // |data_length| / 8 <=> bandwidth = 500 Hz. + LogOfEnergy(hp_120, length, kOffsetVector[2], &total_energy, &features[2]); + + // For the lower band (0 Hz - 500 Hz) split at 250 Hz and downsample. + frequency_band = 4; + in_ptr = lp_120; // [0 - 500] Hz. + hp_out_ptr = hp_60; // [250 - 500] Hz. + lp_out_ptr = lp_60; // [0 - 250] Hz. + SplitFilter(in_ptr, length, &self->upper_state[frequency_band], + &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr); + + // Energy in 250 Hz - 500 Hz. + length >>= 1; // |data_length| / 16 <=> bandwidth = 250 Hz. + LogOfEnergy(hp_60, length, kOffsetVector[1], &total_energy, &features[1]); + + // Remove 0 Hz - 80 Hz, by high pass filtering the lower band. + HighPassFilter(lp_60, length, self->hp_filter_state, hp_120); + + // Energy in 80 Hz - 250 Hz. + LogOfEnergy(hp_120, length, kOffsetVector[0], &total_energy, &features[0]); + + return total_energy; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c new file mode 100644 index 0000000..b1ab67a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "include/vad_gmm.h" + +#include "include/signal_processing_library.h" + +static const int32_t kCompVar = 22005; +static const int16_t kLog2Exp = 5909; // log2(exp(1)) in Q12. + +// For a normal distribution, the probability of |input| is calculated and +// returned (in Q20). The formula for normal distributed probability is +// +// 1 / s * exp(-(x - m)^2 / (2 * s^2)) +// +// where the parameters are given in the following Q domains: +// m = |mean| (Q7) +// s = |std| (Q7) +// x = |input| (Q4) +// in addition to the probability we output |delta| (in Q11) used when updating +// the noise/speech model. +int32_t WebRtcVad_GaussianProbability(int16_t input, + int16_t mean, + int16_t std, + int16_t *delta) { + int16_t tmp16, inv_std, inv_std2, exp_value = 0; + int32_t tmp32; + + // Calculate |inv_std| = 1 / s, in Q10. + // 131072 = 1 in Q17, and (|std| >> 1) is for rounding instead of truncation. + // Q-domain: Q17 / Q7 = Q10. + tmp32 = (int32_t) 131072 + (int32_t) (std >> 1); + inv_std = (int16_t) WebRtcSpl_DivW32W16(tmp32, std); + + // Calculate |inv_std2| = 1 / s^2, in Q14. + tmp16 = (inv_std >> 2); // Q10 -> Q8. + // Q-domain: (Q8 * Q8) >> 2 = Q14. + inv_std2 = (int16_t) ((tmp16 * tmp16) >> 2); + // TODO(bjornv): Investigate if changing to + // inv_std2 = (int16_t)((inv_std * inv_std) >> 6); + // gives better accuracy. + + tmp16 = (input << 3); // Q4 -> Q7 + tmp16 = tmp16 - mean; // Q7 - Q7 = Q7 + + // To be used later, when updating noise/speech model. + // |delta| = (x - m) / s^2, in Q11. + // Q-domain: (Q14 * Q7) >> 10 = Q11. + *delta = (int16_t) ((inv_std2 * tmp16) >> 10); + + // Calculate the exponent |tmp32| = (x - m)^2 / (2 * s^2), in Q10. Replacing + // division by two with one shift. + // Q-domain: (Q11 * Q7) >> 8 = Q10. + tmp32 = (*delta * tmp16) >> 9; + + // If the exponent is small enough to give a non-zero probability we calculate + // |exp_value| ~= exp(-(x - m)^2 / (2 * s^2)) + // ~= exp2(-log2(exp(1)) * |tmp32|). + if (tmp32 < kCompVar) { + // Calculate |tmp16| = log2(exp(1)) * |tmp32|, in Q10. + // Q-domain: (Q12 * Q10) >> 12 = Q10. + tmp16 = (int16_t) ((kLog2Exp * tmp32) >> 12); + tmp16 = -tmp16; + exp_value = (0x0400 | (tmp16 & 0x03FF)); + tmp16 ^= 0xFFFF; + tmp16 >>= 10; + tmp16 += 1; + // Get |exp_value| = exp(-|tmp32|) in Q10. + exp_value >>= tmp16; + } + + // Calculate and return (1 / s) * exp(-(x - m)^2 / (2 * s^2)), in Q20. + // Q-domain: Q10 * Q10 = Q20. + return inv_std * exp_value; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c new file mode 100644 index 0000000..73b2a5b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "include/vad_sp.h" + +// Allpass filter coefficients, upper and lower, in Q13. +// Upper: 0.64, Lower: 0.17. +static const int16_t kAllPassCoefsQ13[2] = {5243, 1392}; // Q13. +static const int16_t kSmoothingDown = 6553; // 0.2 in Q15. +static const int16_t kSmoothingUp = 32439; // 0.99 in Q15. + +// TODO(bjornv): Move this function to vad_filterbank.c. +// Downsampling filter based on splitting filter and allpass functions. +void WebRtcVad_Downsampling(const int16_t *signal_in, + int16_t *signal_out, + int32_t *filter_state, + size_t in_length) { + int16_t tmp16_1 = 0, tmp16_2 = 0; + int32_t tmp32_1 = filter_state[0]; + int32_t tmp32_2 = filter_state[1]; + size_t n = 0; + // Downsampling by 2 gives half length. + size_t half_length = (in_length >> 1); + + // Filter coefficients in Q13, filter state in Q0. + for (n = 0; n < half_length; n++) { + // All-pass filtering upper branch. + tmp16_1 = (int16_t) ((tmp32_1 >> 1) + + ((kAllPassCoefsQ13[0] * *signal_in) >> 14)); + *signal_out = tmp16_1; + tmp32_1 = (int32_t) (*signal_in++) - ((kAllPassCoefsQ13[0] * tmp16_1) >> 12); + + // All-pass filtering lower branch. + tmp16_2 = (int16_t) ((tmp32_2 >> 1) + + ((kAllPassCoefsQ13[1] * *signal_in) >> 14)); + *signal_out++ += tmp16_2; + tmp32_2 = (int32_t) (*signal_in++) - ((kAllPassCoefsQ13[1] * tmp16_2) >> 12); + } + // Store the filter states. + filter_state[0] = tmp32_1; + filter_state[1] = tmp32_2; +} + +// Inserts |feature_value| into |low_value_vector|, if it is one of the 16 +// smallest values the last 100 frames. Then calculates and returns the median +// of the five smallest values. +int16_t WebRtcVad_FindMinimum(VadInstT *self, + int16_t feature_value, + int channel) { + int i = 0, j = 0; + int position = -1; + // Offset to beginning of the 16 minimum values in memory. + const int offset = (channel << 4); + int16_t current_median = 1600; + int16_t alpha = 0; + int32_t tmp32 = 0; + // Pointer to memory for the 16 minimum values and the age of each value of + // the |channel|. + int16_t *age = &self->index_vector[offset]; + int16_t *smallest_values = &self->low_value_vector[offset]; + + RTC_DCHECK_LT(channel, kNumChannels); + + // Each value in |smallest_values| is getting 1 loop older. Update |age|, and + // remove old values. + for (i = 0; i < 16; i++) { + if (age[i] != 100) { + age[i]++; + } else { + // Too old value. Remove from memory and shift larger values downwards. + for (j = i; j < 15; j++) { + smallest_values[j] = smallest_values[j + 1]; + age[j] = age[j + 1]; + } + age[15] = 101; + smallest_values[15] = 10000; + } + } + + // Check if |feature_value| is smaller than any of the values in + // |smallest_values|. If so, find the |position| where to insert the new value + // (|feature_value|). + if (feature_value < smallest_values[7]) { + if (feature_value < smallest_values[3]) { + if (feature_value < smallest_values[1]) { + if (feature_value < smallest_values[0]) { + position = 0; + } else { + position = 1; + } + } else if (feature_value < smallest_values[2]) { + position = 2; + } else { + position = 3; + } + } else if (feature_value < smallest_values[5]) { + if (feature_value < smallest_values[4]) { + position = 4; + } else { + position = 5; + } + } else if (feature_value < smallest_values[6]) { + position = 6; + } else { + position = 7; + } + } else if (feature_value < smallest_values[15]) { + if (feature_value < smallest_values[11]) { + if (feature_value < smallest_values[9]) { + if (feature_value < smallest_values[8]) { + position = 8; + } else { + position = 9; + } + } else if (feature_value < smallest_values[10]) { + position = 10; + } else { + position = 11; + } + } else if (feature_value < smallest_values[13]) { + if (feature_value < smallest_values[12]) { + position = 12; + } else { + position = 13; + } + } else if (feature_value < smallest_values[14]) { + position = 14; + } else { + position = 15; + } + } + + // If we have detected a new small value, insert it at the correct position + // and shift larger values up. + if (position > -1) { + for (i = 15; i > position; i--) { + smallest_values[i] = smallest_values[i - 1]; + age[i] = age[i - 1]; + } + smallest_values[position] = feature_value; + age[position] = 1; + } + + // Get |current_median|. + if (self->frame_counter > 2) { + current_median = smallest_values[2]; + } else if (self->frame_counter > 0) { + current_median = smallest_values[0]; + } + + // Smooth the median value. + if (self->frame_counter > 0) { + if (current_median < self->mean_value[channel]) { + alpha = kSmoothingDown; // 0.2 in Q15. + } else { + alpha = kSmoothingUp; // 0.99 in Q15. + } + } + tmp32 = (alpha + 1) * self->mean_value[channel]; + tmp32 += (WEBRTC_SPL_WORD16_MAX - alpha) * current_median; + tmp32 += 16384; + self->mean_value[channel] = (int16_t) (tmp32 >> 15); + + return self->mean_value[channel]; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c new file mode 100644 index 0000000..225355a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "include/webrtc_vad.h" + +#include + +#include "include/vad_core.h" + +static const int kInitCheck = 42; +static const int kValidRates[] = {8000, 16000, 32000, 48000}; +static const size_t kRatesSize = sizeof(kValidRates) / sizeof(*kValidRates); +static const int kMaxFrameLengthMs = 30; + +VadInst *WebRtcVad_Create() { + VadInstT *self = (VadInstT *) malloc(sizeof(VadInstT)); + + self->init_flag = 0; + + return (VadInst *) self; +} + +void WebRtcVad_Free(VadInst *handle) { + free(handle); +} + +// TODO(bjornv): Move WebRtcVad_InitCore() code here. +int WebRtcVad_Init(VadInst *handle) { + // Initialize the core VAD component. + return WebRtcVad_InitCore((VadInstT *) handle); +} + +// TODO(bjornv): Move WebRtcVad_set_mode_core() code here. +int WebRtcVad_set_mode(VadInst *handle, int mode) { + VadInstT *self = (VadInstT *) handle; + + if (handle == NULL) { + return -1; + } + if (self->init_flag != kInitCheck) { + return -1; + } + + return WebRtcVad_set_mode_core(self, mode); +} + +int WebRtcVad_Process(VadInst *handle, int fs, const int16_t *audio_frame, + size_t frame_length) { + int vad = -1; + VadInstT *self = (VadInstT *) handle; + + if (handle == NULL) { + return -1; + } + + if (self->init_flag != kInitCheck) { + return -1; + } + if (audio_frame == NULL) { + return -1; + } + if (WebRtcVad_ValidRateAndFrameLength(fs, frame_length) != 0) { + return -1; + } + + if (fs == 48000) { + vad = WebRtcVad_CalcVad48khz(self, audio_frame, frame_length); + } else if (fs == 32000) { + vad = WebRtcVad_CalcVad32khz(self, audio_frame, frame_length); + } else if (fs == 16000) { + vad = WebRtcVad_CalcVad16khz(self, audio_frame, frame_length); + } else if (fs == 8000) { + vad = WebRtcVad_CalcVad8khz(self, audio_frame, frame_length); + } + + if (vad > 0) { + vad = 1; + } + return vad; +} + +int WebRtcVad_ValidRateAndFrameLength(int rate, size_t frame_length) { + int return_value = -1; + size_t i; + int valid_length_ms; + size_t valid_length; + + // We only allow 10, 20 or 30 ms frames. Loop through valid frame rates and + // see if we have a matching pair. + for (i = 0; i < kRatesSize; i++) { + if (kValidRates[i] == rate) { + for (valid_length_ms = 10; valid_length_ms <= kMaxFrameLengthMs; + valid_length_ms += 10) { + valid_length = (size_t) (kValidRates[i] / 1000 * valid_length_ms); + if (frame_length == valid_length) { + return_value = 0; + break; + } + } + break; + } + } + + return return_value; +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn new file mode 100644 index 0000000..4f8cecc --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn @@ -0,0 +1,20 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import("//build/ohos.gni") + +ohos_prebuilt_shared_library("voicecloud_dll") { + source = "./libvoicecloud.z.so" + install_enable = true + subsystem_name = "miscservices" + part_name = "voiceassistant" +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h new file mode 100644 index 0000000..c514f48 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h @@ -0,0 +1,50 @@ +#ifndef CAR_VOICE_ASSISTANT_I_VOICE_CLOUD_H +#define CAR_VOICE_ASSISTANT_I_VOICE_CLOUD_H + +#include "refbase.h" +#include +#include +#include +#include +#include + +namespace OHOS { +namespace CarVoiceAssistant { + enum VoiceCloudStatus { + VoiceCloudStatusNone, //未连接 + VoiceCloudStatusConnecting, //连接中 + VoiceCloudStatusConnected, // 已连接 + VoiceCloudStatusClosing //关闭中 + }; + + struct MemoryStruct { + char* memory; + size_t size; + }; + + class IVoiceCloudManagerCallback : public virtual RefBase { + public: + virtual void VoiceCloudStatusChanged(VoiceCloudStatus status) = 0; + virtual void ReveiceVoiceCloudMessage(void* data, size_t length, bool isBinary) = 0; + }; + + class IVoiceCloudManager : public virtual RefBase { + public: + IVoiceCloudManager() = default; + virtual ~IVoiceCloudManager() = default; + virtual bool Connect() = 0; //连接 + virtual bool Close() = 0; //关闭连接 + virtual VoiceCloudStatus GetStatus() = 0; //获取当前连接状态 + virtual bool IsSendingAudioStream() = 0; //当前是否在发送pcm流 + virtual void SetCallback(wptr callback) = 0; //设置回调 + virtual void SendNLUText(std::string text) = 0; // 发送文本消息 + virtual void SendStartAudioStream() = 0; // 发送pcm流开始消息 + virtual void SendEndAudioStream() = 0; //发送pcm流结束消息 + virtual void SendBinary(void* data, size_t length) = 0; //发送pcm流 + virtual void SendTrackStat(double latitude, double longitude, std::string& items) = 0; //发送经纬度和热词 + virtual MemoryStruct RequestTTS(std::string text, std::string speakerType) = 0; // 文字转语音pcm流 + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts new file mode 100644 index 0000000..8835fb1 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts @@ -0,0 +1,119 @@ +import { AsyncCallback } from './basic'; + +declare namespace carVoiceAssistant { + class CarVoiceAssistantManager { + + /** + * 是否开启唤醒功能 + * @returns true 开启,false 未开启 + */ + isEnableWakeUp(): boolean; + + /** + * 开启唤醒功能 + * @returns 结果 + */ + enableWakeUp(): ErrorCode; + + /** + * 关闭唤醒功能 + * @returns 结果 + */ + disableWakeUp(): ErrorCode; + + /** + * 是否正在识别 + * @returns true 正在识别 + */ + isRecognizing(): boolean; + + /** + * 开始识别 + * @returns ErrorCode 结果 + */ + startRecognize(): ErrorCode; + + /** + * 结束识别 + * @returns ErrorCode 结果 + */ + stopRecognize(): ErrorCode; + + /** + * 播放TTS + * @returns ErrorCode 结果 + */ + playTTS(tts: string): ErrorCode; + + /** + * 停止播放TTS + * @returns ErrorCode 结果 + */ + stopPlayTTS(): ErrorCode; + + /** + * 注册热词 + * @param hotwords 热词json + */ + registerHotwords(hotwords: string): void; + + /** + * 设置经纬度 + * @param latitude 纬度 + * @param longitude 经度 + */ + setCoord(latitude: number, longitude: number): void; + + /** + * 设置经纬度 + * @param speaker common,zhilingfa,qianranfa,tzruim,gqlanf, + * jlshim,madoufp_wenrou,gdfanf_boy,gdfanfp,mandarin, + * hchunf_ctn,wqingf_csn,aningf,yukaim_all + */ + changeSpeakerType(speaker: string): void; + + /** + * 监听事件 + * @param event 事件类型 + * + */ + on(event: EventType.VoiceAssistantEventTypeOnWakeUp, callback: AsyncCallback<{}>): void; + on(event: EventType.VoiceAssistantEventTypeRecognizeStateChanged, callback: AsyncCallback<{ isRecognizing: boolean }>): void; + on(event: EventType.VoiceAssistantEventTypeAsrResult, callback: AsyncCallback<{ result: string }>): void; + on(event: EventType.VoiceAssistantEventTypeTTSPlayStateChanged, callback: AsyncCallback<{ isPlaying: boolean }>): void; + + /** + * 取消监听 + * @param event 事件类型 + */ + off(event: EventType): void; + + } + + enum ErrorCode { + VOICE_ASSISTANT_OK = 0, //成功 + VOICE_ASSISTANT_ERR = 8001, //错误 + VOICE_ASSISTANT_START_RECORD_FAILED = 8002, //录音开启失败 + VOICE_ASSISTANT_START_WEBSOCKET_CONNECT_FAILED = 8003, //websocket连接失败 + } + + enum EventType { + VoiceAssistantEventTypeOnWakeUp = 0, //被唤醒 + VoiceAssistantEventTypeRecognizeStateChanged = 1, //识别状态改变 + VoiceAssistantEventTypeAsrResult = 2, //语音识别结果返回 + VoiceAssistantEventTypeTTSPlayStateChanged = 3, //tts播报状态 + } + + interface AsrResult { + op: 'realTimeASRResult' | 'nluResult', + intentName: string, //意图 + text: string, // op为realTimeASRResult时,语音转文字内容;op为nluResult时,语义解析内容 + isFinish: boolean, // op为realTimeASRResult时表示是否结束说话 + url: string, // op为nluResult时,表示响应的热词url + needDeclare: boolean, //是否多轮 + } + + function getManager(): CarVoiceAssistantManager; +} + +export default carVoiceAssistant; \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn new file mode 100644 index 0000000..2ea6378 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn @@ -0,0 +1,27 @@ +# Copyright (c) 2021-2022 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") +import("//build/ohos/ace/ace.gni") + +js_declaration("voiceassistant_js") { + part_name = "voiceassistant" + sources = [ "./@ohos.carvoiceassistant.d.ts" ] +} + +ohos_copy("voiceassistant_declaration") { + sources = [ "./@ohos.carvoiceassistant.d.ts" ] + outputs = [ target_out_dir + "/$target_name/" ] + module_source_dir = target_out_dir + "/$target_name" + module_install_name = "" +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h new file mode 100644 index 0000000..89b74b6 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h @@ -0,0 +1,87 @@ +#ifndef VOICE_ASSISTANT_EVENT_TARGET_H +#define VOICE_ASSISTANT_EVENT_TARGET_H + +#include "napi/native_api.h" +#include "napi/native_node_api.h" +#include "refbase.h" +#include "voice_assistant_log.h" +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + enum VoiceAssistantEventType { + VoiceAssistantEventTypeOnWakeUp, + VoiceAssistantEventTypeRecognizeStateChanged, + VoiceAssistantEventTypeAsrResult, + VoiceAssistantEventTypeTTSPlayStateChanged + }; + + struct VoiceAssistantEventListener { + napi_env env_; + VoiceAssistantEventType eventType_; + napi_ref callbackRef_; + napi_ref thisVarRef_; + bool isOnce_; + }; + + class BaseEvent { + public: + virtual ~BaseEvent() {}; + virtual napi_value ToJsObject(napi_env env) = 0; + }; + + class RecognizeStateEvent : public BaseEvent { + public: + RecognizeStateEvent(bool isRecognizing); + ~RecognizeStateEvent() = default; + napi_value ToJsObject(napi_env env); + + private: + bool isRecognizing_; + }; + + class ArsResultEvent : public BaseEvent { + public: + ArsResultEvent(std::string text); + ~ArsResultEvent() = default; + napi_value ToJsObject(napi_env env); + + private: + std::string text_; + }; + + class TTSPlayStateEvent : public BaseEvent { + public: + TTSPlayStateEvent(bool isPlaying); + ~TTSPlayStateEvent() = default; + napi_value ToJsObject(napi_env env); + + private: + bool isPlaying_; + }; + + class VoiceAssistantEventTarget : public RefBase { + public: + VoiceAssistantEventTarget(napi_env env); + virtual ~VoiceAssistantEventTarget(); + virtual void On(napi_env env, VoiceAssistantEventType type, napi_value callbackRef, napi_value thisVar); + virtual void Once(napi_env env, VoiceAssistantEventType type, napi_value callbackRef, napi_value thisVar); + virtual void Off(napi_env env, VoiceAssistantEventType type, napi_value thisVar); + + void EmitOnWakeUp(); + void EmitRecognizeStateChanged(bool isRecognizing); + void EmitAsrResult(std::string text); + void EmitTTSPlayStateChanged(bool isPlaying); + + private: + std::list eventListenerList_; + napi_env env_; + + virtual void Emit(VoiceAssistantEventType type, BaseEvent* event); + }; + +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h new file mode 100644 index 0000000..bbb4c40 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h @@ -0,0 +1,33 @@ +#ifndef VOICE_ASSISTANT_NAPI_TOOLS_H +#define VOICE_ASSISTANT_NAPI_TOOLS_H + +#include "napi/native_api.h" +#include "napi/native_node_api.h" + +#define MAX_VALUE_LEN 4096 + +namespace OHOS { +namespace CarVoiceAssistant { + napi_value WrapVoidToJS(napi_env env); + + napi_value GetUndefinedToJS(napi_env env); + + napi_value GetIntToJs(napi_env env, int number); + + napi_value GetBoolToJs(napi_env env, bool value); + + int GetIntProperty(napi_env env, napi_value obj); + + bool GetBoolProperty(napi_env env, napi_value obj); + + double GetDoubleProperty(napi_env env, napi_value obj); + + int64_t GetLongIntProperty(napi_env env, napi_value obj); + + std::string GetStringProperty(napi_env env, napi_value obj); + + napi_value GetGlobal(napi_env env); +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp new file mode 100644 index 0000000..a749358 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp @@ -0,0 +1,223 @@ +#include "voice_assistant_event_target.h" +#include "securec.h" +#include "voice_assistant_napi_tools.h" +#include +#include + +namespace OHOS { +namespace CarVoiceAssistant { + struct EventTargetCB { + napi_env env_; + sptr eventTarget_; + VoiceAssistantEventType type_; + BaseEvent* event_; + }; + + RecognizeStateEvent::RecognizeStateEvent(bool isRecognizing) + : isRecognizing_(isRecognizing) + { + } + + napi_value RecognizeStateEvent::ToJsObject(napi_env env) + { + napi_value object = nullptr; + napi_create_object(env, &object); + + napi_value isRecognizingToJs = nullptr; + napi_get_boolean(env, isRecognizing_, &isRecognizingToJs); + napi_set_named_property(env, object, "isRecognizing", isRecognizingToJs); + + return object; + } + + ArsResultEvent::ArsResultEvent(std::string text) + : text_(text) + { + } + + napi_value ArsResultEvent::ToJsObject(napi_env env) + { + napi_value object = nullptr; + napi_create_object(env, &object); + + napi_value textToJs = nullptr; + napi_create_string_utf8(env, text_.c_str(), text_.length(), &textToJs); + napi_set_named_property(env, object, "result", textToJs); + + return object; + } + + TTSPlayStateEvent::TTSPlayStateEvent(bool isPlaying) + : isPlaying_(isPlaying) + { + } + + napi_value TTSPlayStateEvent::ToJsObject(napi_env env) + { + napi_value object = nullptr; + napi_create_object(env, &object); + + napi_value isPlayingToJs = nullptr; + napi_get_boolean(env, isPlaying_, &isPlayingToJs); + napi_set_named_property(env, object, "isPlaying", isPlayingToJs); + + return object; + } + + VoiceAssistantEventTarget::VoiceAssistantEventTarget(napi_env env) { env_ = env; } + + VoiceAssistantEventTarget::~VoiceAssistantEventTarget() { } + + void VoiceAssistantEventTarget::On(napi_env env, VoiceAssistantEventType type, napi_value callbackRef, napi_value thisVar) + { + struct VoiceAssistantEventListener listener; + listener.env_ = env; + listener.eventType_ = type; + listener.isOnce_ = false; + napi_create_reference(env, callbackRef, 1, &listener.callbackRef_); + napi_create_reference(env, thisVar, 1, &listener.thisVarRef_); + eventListenerList_.push_back(listener); + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget:On:size:%{public}d", eventListenerList_.size()); + } + + void VoiceAssistantEventTarget::Once(napi_env env, VoiceAssistantEventType type, napi_value callbackRef, napi_value thisVar) + { + struct VoiceAssistantEventListener listener; + listener.env_ = env; + listener.eventType_ = type; + listener.isOnce_ = true; + napi_create_reference(env, callbackRef, 1, &listener.callbackRef_); + napi_create_reference(env, thisVar, 1, &listener.thisVarRef_); + eventListenerList_.push_back(listener); + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget:Once:size:%{public}d", eventListenerList_.size()); + } + + void VoiceAssistantEventTarget::Off(napi_env env, VoiceAssistantEventType type, napi_value thisVar) + { + eventListenerList_.remove_if([env, thisVar, type](VoiceAssistantEventListener listener) -> bool { + bool isEqualsThisVar = false; + napi_value thisVarTemp = nullptr; + napi_get_reference_value(env, listener.thisVarRef_, &thisVarTemp); + napi_strict_equals(env, thisVar, thisVarTemp, &isEqualsThisVar); + bool isMatch = (isEqualsThisVar && listener.eventType_ == type); + if (isMatch) { + napi_delete_reference(env, listener.thisVarRef_); + napi_delete_reference(env, listener.callbackRef_); + } + return isMatch; + }); + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTargets:Off:size:%{public}d", eventListenerList_.size()); + } + + void VoiceAssistantEventTarget::EmitOnWakeUp() + { + VOICE_ASSISTANT_LOGI("EmitOnWakeUp"); + Emit(VoiceAssistantEventTypeOnWakeUp, nullptr); + } + + void VoiceAssistantEventTarget::EmitRecognizeStateChanged(bool isRecognizing) + { + VOICE_ASSISTANT_LOGI("EmitRecognizeStateChanged:%{public}s", isRecognizing ? "true" : "false"); + RecognizeStateEvent* event = new RecognizeStateEvent(isRecognizing); + Emit(VoiceAssistantEventTypeRecognizeStateChanged, (BaseEvent*)event); + } + + void VoiceAssistantEventTarget::EmitAsrResult(std::string text) + { + VOICE_ASSISTANT_LOGI("EmitAsrResult:%{public}s", text.c_str()); + ArsResultEvent* event = new ArsResultEvent(text); + Emit(VoiceAssistantEventTypeAsrResult, (BaseEvent*)event); + } + + void VoiceAssistantEventTarget::EmitTTSPlayStateChanged(bool isPlaying) + { + VOICE_ASSISTANT_LOGI("EmitTTSPlayStateChanged:%{public}s", isPlaying ? "true" : "false"); + TTSPlayStateEvent* event = new TTSPlayStateEvent(isPlaying); + Emit(VoiceAssistantEventTypeTTSPlayStateChanged, (BaseEvent*)event); + } + + void VoiceAssistantEventTarget::Emit(VoiceAssistantEventType type, BaseEvent* event) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget::Emit:%{publidc}d", (int)getpid()); + uv_loop_s* loop = nullptr; + napi_get_uv_event_loop(env_, &loop); + if (loop == nullptr) { + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget::Emit loop == nullptr"); + return; + } + + uv_work_t* work = new (std::nothrow) uv_work_t; + if (work == nullptr) { + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget::Emit No memory work == nullptr"); + return; + } + + EventTargetCB* eventTaegetCB = new (std::nothrow) EventTargetCB { .env_ = env_, .eventTarget_ = this, .type_ = type, .event_ = event }; + + work->data = (void*)eventTaegetCB; + + int ret = uv_queue_work( + loop, work, [](uv_work_t* work) {}, + [](uv_work_t* work, int status) { + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget::Emit start work"); + + // Js Thread + if (work == nullptr) { + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget::Emit work == nullptr"); + return; + } + EventTargetCB* eventTargetCB = (EventTargetCB*)work->data; + napi_handle_scope scope = nullptr; + napi_open_handle_scope(eventTargetCB->env_, &scope); + + sptr eventTarget = eventTargetCB->eventTarget_; + for (std::list::iterator listenerIterator = eventTarget->eventListenerList_.begin(); listenerIterator != eventTarget->eventListenerList_.end(); ++listenerIterator) { + if (listenerIterator->eventType_ != eventTargetCB->type_) { + continue; + } + + napi_env env = listenerIterator->env_; + napi_ref thisVarRef = listenerIterator->thisVarRef_; + napi_ref callbackRef = listenerIterator->callbackRef_; + + napi_value thisVar = nullptr; + napi_get_reference_value(env, thisVarRef, &thisVar); + + napi_value callbackFunc = nullptr; + napi_get_reference_value(env, callbackRef, &callbackFunc); + + napi_value callbackValues[2] = { 0 }; + callbackValues[0] = GetUndefinedToJS(env); + if (eventTargetCB->event_) { + callbackValues[1] = eventTargetCB->event_->ToJsObject(env); + } else { + callbackValues[1] = GetUndefinedToJS(env); + } + + napi_value returnVal = nullptr; + napi_call_function(env, thisVar, callbackFunc, 2, callbackValues, &returnVal); + if (listenerIterator->isOnce_) { + eventTargetCB->eventTarget_->Off(env, listenerIterator->eventType_, thisVar); + } + } + + napi_close_handle_scope(eventTargetCB->env_, scope); + + if (eventTargetCB->event_) { + delete eventTargetCB->event_; + } + + if (eventTargetCB) { + delete eventTargetCB; + } + delete work; + }); + + if (ret != 0) { + VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget::Emit failed to execute libuv work queue"); + delete work; + } + } + +} +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp new file mode 100644 index 0000000..9eadbb9 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp @@ -0,0 +1,380 @@ +#include "common_utils.h" +#include "napi/native_api.h" +#include "napi/native_node_api.h" +#include "refbase.h" +#include "voice_assistant_client_manager.h" +#include "voice_assistant_event_target.h" +#include "voice_assistant_log.h" +#include "voice_assistant_napi_tools.h" +#include +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + static napi_ref g_voiceassistantManagerConstructorJS = nullptr; + static napi_ref g_voiceassistantManagerRef = nullptr; + + napi_value VoiceAssistantManagerConstructor(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantManagerConstructor"); + std::size_t argc = 1; + napi_value argv[1]; + + napi_value thisVar = nullptr; + NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); + + sptr target = new VoiceAssistantEventTarget(env); + VoiceAssistantClientManager::GetInstance()->SetEventTarget(target); + + return thisVar; + } + + napi_value GetManager(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("GetManager"); + + if (g_voiceassistantManagerRef != nullptr) { + VOICE_ASSISTANT_LOGI("GetManager isExist"); + napi_value result = nullptr; + napi_get_reference_value(env, g_voiceassistantManagerRef, &result); + return result; + } + + napi_value thisVar = nullptr; + NAPI_CALL(env, + napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr)); + + napi_value cons = nullptr; + napi_get_reference_value(env, g_voiceassistantManagerConstructorJS, &cons); + + napi_value result = nullptr; + napi_new_instance(env, cons, 0, nullptr, &result); + + napi_create_reference(env, result, 1, &g_voiceassistantManagerRef); + + return result; + } + + napi_value IsEnableWakeUp(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("IsEnableWakeUp"); + bool isEnabled = false; + VoiceAssistantClientManager::GetInstance()->IsEnableWakeUp(isEnabled); + return GetBoolToJs(env, isEnabled); + } + + napi_value EnableWakeUp(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("EnableWakeUp"); + int32_t rst = VoiceAssistantClientManager::GetInstance()->EnableWakeUp(); + return GetIntToJs(env, rst); + } + + napi_value DisableWakeUp(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("DisableWakeUp"); + int32_t rst = VoiceAssistantClientManager::GetInstance()->DisableWakeUp(); + return GetIntToJs(env, rst); + } + + napi_value IsRecognizing(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("IsRecognizing"); + bool isRecognizing = false; + VoiceAssistantClientManager::GetInstance()->IsRecognizing(isRecognizing); + return GetBoolToJs(env, isRecognizing); + } + + napi_value StartRecognize(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("StartRecognize"); + CommonUtils::VoiceAssistantErrorCode result = CommonUtils::VOICE_ASSISTANT_ERR; + VoiceAssistantClientManager::GetInstance()->StartRecognize(result); + return GetIntToJs(env, result); + } + + napi_value StopRecognize(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("StopRecognize"); + int32_t rst = VoiceAssistantClientManager::GetInstance()->StopRecognize(); + return GetIntToJs(env, rst); + } + + napi_value PlayTTS(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("PlayTTS"); + size_t argc = 1; + napi_value argv[1] = { 0 }; + napi_value thisVar = nullptr; + void* data = nullptr; + + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + + napi_valuetype valueType = napi_undefined; + napi_typeof(env, argv[0], &valueType); + + if (valueType == napi_string) { + std::string tts = GetStringProperty(env, argv[0]); + CommonUtils::VoiceAssistantErrorCode result = CommonUtils::VOICE_ASSISTANT_ERR; + VoiceAssistantClientManager::GetInstance()->PlayTTS(result, tts); + return GetIntToJs(env, result); + } else { + VOICE_ASSISTANT_LOGI("PlayTTS params is not string"); + } + + return GetIntToJs(env, CommonUtils::VOICE_ASSISTANT_ERR); + } + + napi_value StopPlayTTS(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("StopPlayTTS"); + int32_t rst = VoiceAssistantClientManager::GetInstance()->StopPlayTTS(); + return GetIntToJs(env, rst); + } + + napi_value RegisterHotwords(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("RegisterHotwords"); + size_t argc = 1; + napi_value argv[1] = { 0 }; + napi_value thisVar = nullptr; + void* data = nullptr; + + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + + napi_valuetype valueType = napi_undefined; + napi_typeof(env, argv[0], &valueType); + + if (valueType == napi_string) { + std::string hotwords = GetStringProperty(env, argv[0]); + int32_t rst = VoiceAssistantClientManager::GetInstance()->RegisterHotwords(hotwords); + return GetIntToJs(env, rst); + } else { + VOICE_ASSISTANT_LOGI("RegisterHotwords params is not string"); + } + + return GetIntToJs(env, CommonUtils::VOICE_ASSISTANT_ERR); + } + + napi_value SetCoord(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("SetCoord-napi"); + size_t argc = 2; + napi_value argv[2] = { 0 }; + napi_value thisVar = nullptr; + void* data = nullptr; + double latitude = 0; + double longitude = 0; + + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + + napi_valuetype valueType = napi_undefined; + napi_typeof(env, argv[0], &valueType); + + if (valueType == napi_number) { + latitude = GetDoubleProperty(env, argv[0]); + } else { + VOICE_ASSISTANT_LOGI("SetCoord params is not string"); + return GetIntToJs(env, CommonUtils::VOICE_ASSISTANT_ERR); + } + + napi_typeof(env, argv[1], &valueType); + if (valueType == napi_number) { + longitude = GetDoubleProperty(env, argv[1]); + } else { + VOICE_ASSISTANT_LOGI("SetCoord params is not string"); + return GetIntToJs(env, CommonUtils::VOICE_ASSISTANT_ERR); + } + VOICE_ASSISTANT_LOGI("SetCoord-napi:%{public}f,%{public}f", latitude, longitude); + int32_t rst = VoiceAssistantClientManager::GetInstance()->SetCoord(latitude, longitude); + return GetIntToJs(env, rst); + } + + napi_value ChangeSpeakerType(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("ChangeSpeakerType"); + size_t argc = 1; + napi_value argv[1] = { 0 }; + napi_value thisVar = nullptr; + void* data = nullptr; + + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + + napi_valuetype valueType = napi_undefined; + napi_typeof(env, argv[0], &valueType); + + if (valueType == napi_string) { + std::string speaker = GetStringProperty(env, argv[0]); + int32_t rst = VoiceAssistantClientManager::GetInstance()->ChangeSpeakerType(speaker); + return GetIntToJs(env, rst); + } else { + VOICE_ASSISTANT_LOGI("ChangeSpeakerType params is not string"); + } + + return GetIntToJs(env, CommonUtils::VOICE_ASSISTANT_ERR); + } + + napi_value On(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("On"); + size_t argc = 2; + napi_value argv[2] = { 0 }; + napi_value thisVar = nullptr; + void* data = nullptr; + + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + + napi_valuetype valueType = napi_undefined; + napi_typeof(env, argv[0], &valueType); + VoiceAssistantEventType type = static_cast(GetIntProperty(env, argv[0])); + + VoiceAssistantClientManager::GetInstance()->GetEventTarget()->On(env, type, argv[1], thisVar); + + return GetUndefinedToJS(env); + } + + napi_value Off(napi_env env, napi_callback_info info) + { + VOICE_ASSISTANT_LOGI("Off"); + size_t argc = 1; + napi_value argv[1] = { 0 }; /* 参数定义 */ + napi_value thisVar = nullptr; /* JS对象this */ + void* data = nullptr; + + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + + napi_valuetype valueType = napi_undefined; + napi_typeof(env, argv[0], &valueType); + VoiceAssistantEventType type = static_cast(GetIntProperty(env, argv[0])); + + VoiceAssistantClientManager::GetInstance()->GetEventTarget()->Off(env, type, thisVar); + + return GetUndefinedToJS(env); + } + + void CreateErrorCodeEnum(napi_env env, napi_value object) + { + VOICE_ASSISTANT_LOGI("CreateErrorCodeEnum"); + napi_value okJs = nullptr; + napi_create_int32(env, CommonUtils::VOICE_ASSISTANT_OK, &okJs); + napi_set_named_property(env, object, "VOICE_ASSISTANT_OK", okJs); + + napi_value errJs = nullptr; + napi_create_int32(env, CommonUtils::VOICE_ASSISTANT_ERR, &errJs); + napi_set_named_property(env, object, "VOICE_ASSISTANT_ERR", errJs); + + napi_value recordFailedJs = nullptr; + napi_create_int32(env, CommonUtils::VOICE_ASSISTANT_START_RECORD_FAILED, &recordFailedJs); + napi_set_named_property(env, object, "RADIO_STATUS_SCANNING", recordFailedJs); + + napi_value websocketFailedJs = nullptr; + napi_create_int32(env, CommonUtils::VOICE_ASSISTANT_START_WEBSOCKET_CONNECT_FAILED, &websocketFailedJs); + napi_set_named_property(env, object, "VOICE_ASSISTANT_START_WEBSOCKET_CONNECT_FAILED", websocketFailedJs); + } + + void CreateEventTypeEnum(napi_env env, napi_value object) + { + VOICE_ASSISTANT_LOGI("CreateEventTypeEnum"); + napi_value wakeUpJs = nullptr; + napi_create_int32(env, VoiceAssistantEventTypeOnWakeUp, &wakeUpJs); + napi_set_named_property(env, object, "VoiceAssistantEventTypeOnWakeUp", wakeUpJs); + + napi_value recognizeStateChangedJs = nullptr; + napi_create_int32(env, VoiceAssistantEventTypeRecognizeStateChanged, &recognizeStateChangedJs); + napi_set_named_property(env, object, "VoiceAssistantEventTypeRecognizeStateChanged", recognizeStateChangedJs); + + napi_value asrResultJs = nullptr; + napi_create_int32(env, VoiceAssistantEventTypeAsrResult, &asrResultJs); + napi_set_named_property(env, object, "VoiceAssistantEventTypeAsrResult", asrResultJs); + + napi_value ttsStateChangedJs = nullptr; + napi_create_int32(env, VoiceAssistantEventTypeTTSPlayStateChanged, &ttsStateChangedJs); + napi_set_named_property(env, object, "VoiceAssistantEventTypeTTSPlayStateChanged", ttsStateChangedJs); + } + + static napi_value GetManagerFuction(napi_env env, napi_value exports) + { + + VOICE_ASSISTANT_LOGI("GetManagerFuction"); + // ErrorCode enum + napi_value errorCodeJs = nullptr; + napi_create_object(env, &errorCodeJs); + CreateErrorCodeEnum(env, errorCodeJs); + + // EventType enum + napi_value eventTypeJs = nullptr; + napi_create_object(env, &eventTypeJs); + CreateEventTypeEnum(env, eventTypeJs); + + napi_status status; + napi_property_descriptor desc[] = { + DECLARE_NAPI_FUNCTION("getManager", GetManager), + DECLARE_NAPI_PROPERTY("ErrorCode", errorCodeJs), + DECLARE_NAPI_PROPERTY("EventType", eventTypeJs) + }; + status = napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), + desc); + assert(status == napi_ok); + + return (exports); + } + + static napi_value RegisterManagerFuction(napi_env env, napi_value exports) + { + VOICE_ASSISTANT_LOGI("RegisterManagerFuction"); + + napi_status status; + napi_property_descriptor desc[] = { + DECLARE_NAPI_FUNCTION("isEnableWakeUp", IsEnableWakeUp), + DECLARE_NAPI_FUNCTION("enableWakeUp", EnableWakeUp), + DECLARE_NAPI_FUNCTION("disableWakeUp", DisableWakeUp), + DECLARE_NAPI_FUNCTION("isRecognizing", IsRecognizing), + DECLARE_NAPI_FUNCTION("startRecognize", StartRecognize), + DECLARE_NAPI_FUNCTION("stopRecognize", StopRecognize), + DECLARE_NAPI_FUNCTION("playTTS", PlayTTS), + DECLARE_NAPI_FUNCTION("stopPlayTTS", StopPlayTTS), + DECLARE_NAPI_FUNCTION("registerHotwords", RegisterHotwords), + DECLARE_NAPI_FUNCTION("setCoord", SetCoord), + DECLARE_NAPI_FUNCTION("changeSpeakerType", ChangeSpeakerType), + DECLARE_NAPI_FUNCTION("on", On), + DECLARE_NAPI_FUNCTION("off", Off) + }; + + napi_value cons = nullptr; + status = napi_define_class(env, "CarVoiceAssistantManager", NAPI_AUTO_LENGTH, + VoiceAssistantManagerConstructor, nullptr, + sizeof(desc) / sizeof(desc[0]), desc, &cons); + assert(status == napi_ok); + + napi_create_reference(env, cons, 1, &g_voiceassistantManagerConstructorJS); + + return (exports); + } + + static napi_value Init(napi_env env, napi_value exports) + { + RegisterManagerFuction(env, exports); + GetManagerFuction(env, exports); + + return (exports); + } + + /* NAPI_MODULE(js_radio, Init) */ + + static napi_module sampleModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "carvoiceassistant", + .nm_priv = ((void*)0), + .reserved = { 0 }, + }; + + extern "C" __attribute__((constructor)) void Register() + { + napi_module_register(&sampleModule); + } +} // namespace TUNER +} // namespace OHOS \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp new file mode 100644 index 0000000..ca6d225 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp @@ -0,0 +1,90 @@ +#include "voice_assistant_napi_tools.h" +#include "voice_assistant_log.h" + +namespace OHOS { +namespace CarVoiceAssistant { + napi_value WrapVoidToJS(napi_env env) + { + napi_value result = nullptr; + NAPI_CALL(env, napi_get_null(env, &result)); + return (result); + } + + napi_value GetUndefinedToJS(napi_env env) + { + napi_value result = nullptr; + NAPI_CALL(env, napi_get_undefined(env, &result)); + return (result); + } + + napi_value GetIntToJs(napi_env env, int number) + { + napi_value intToJs = nullptr; + napi_create_int32(env, number, &intToJs); + return intToJs; + } + + napi_value GetBoolToJs(napi_env env, bool value) + { + napi_value boolToJs = nullptr; + napi_get_boolean(env, value, &boolToJs); + return boolToJs; + } + + int GetIntProperty(napi_env env, napi_value obj) + { + int intTypeToJs = 0; + if (napi_get_value_int32(env, obj, &intTypeToJs) != napi_ok) { + } + + return (intTypeToJs); + } + + bool GetBoolProperty(napi_env env, napi_value obj) + { + bool boolTypeToJs = 0; + if (napi_get_value_bool(env, obj, &boolTypeToJs) != napi_ok) { + } + + return (boolTypeToJs); + } + + double GetDoubleProperty(napi_env env, napi_value obj) + { + double doubleTypeToJs = 0; + if (napi_get_value_double(env, obj, &doubleTypeToJs) != napi_ok) { + } + + return doubleTypeToJs; + } + + int64_t GetLongIntProperty(napi_env env, napi_value obj) + { + int64_t intTypeToJs = 0; + if (napi_get_value_int64(env, obj, &intTypeToJs) != napi_ok) { + } + + return (intTypeToJs); + } + + std::string GetStringProperty(napi_env env, napi_value obj) + { + char propValue[MAX_VALUE_LEN] = { 0 }; + size_t propLen; + if (napi_get_value_string_utf8(env, obj, propValue, MAX_VALUE_LEN, + &propLen) + != napi_ok) { + VOICE_ASSISTANT_LOGI("Can not get string param from argv"); + } + + return (std::string(propValue)); + } + + napi_value GetGlobal(napi_env env) + { + napi_value global; + napi_get_global(env, &global); + return global; + } +} +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/ohos.build b/FA/PATEO_CarVoiceAssistant/voiceassistant/ohos.build new file mode 100644 index 0000000..c8889bc --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/ohos.build @@ -0,0 +1,56 @@ +{ + "subsystem": "miscservices", + "parts": { + "voiceassistant": { + "variants": [ + "phone", + "wearable", + "ivi" + ], + "module_list": [ + "//base/miscservices/voiceassistant/frameworks/pocketsphinx:pocketsphinx", + "//base/miscservices/voiceassistant/frameworks/vad:ps_vad", + "//base/miscservices/voiceassistant/frameworks/voiceclouddll:voicecloud_dll", + "//base/miscservices/voiceassistant/etc/init:voice_assistant_service.rc", + "//base/miscservices/voiceassistant/profile:voice_assistant_sa_profiles", + "//base/miscservices/voiceassistant/resources:pocketsphinx_all_source", + "//base/miscservices/voiceassistant/services:voiceassistant_service_group", + "//base/miscservices/voiceassistant/interfaces/kits/js/declaration:voiceassistant_js", + "//base/miscservices/voiceassistant/test/client_test:client_test" + ], + "inner_kits": [ + { + "name": "//base/miscservices/voiceassistant/services:carvoiceassistant", + "header": { + "header_files": [ + "voice_assistant_ability_agent.h", + "voice_assistant_ability_proxy.h", + "voice_assistant_client_callback_stub.h", + "voice_assistant_client_callback.h", + "voice_assistant_client_manager.h" + ], + "header_base": "//base/miscservices/voiceassistant/services/include/client" + } + }, + { + "name": "//base/miscservices/voiceassistant/frameworks/pocketsphinx:pocketsphinx", + "header": { + "header_files": [ + "pocketsphinx.h" + ], + "header_base": "//base/miscservices/voiceassistant/frameworks/pocketsphinx/include" + } + }, + { + "name": "//base/miscservices/voiceassistant/frameworks/vad:ps_vad", + "header": { + "header_files": [ + "webrtc_vad.h" + ], + "header_base": "//base/miscservices/voiceassistant/frameworks/vad/include" + } + } + ] + } + } +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh b/FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh new file mode 100755 index 0000000..5fb3f83 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh @@ -0,0 +1,14 @@ + +shpath=$(dirname $0) + +cd ${shpath} +#解压data.zip +unzip ../data.zip -d ../ +#拷贝libvoicecloud.z.so到frameworks/voiceclouddll/目录下 +cp ../data/libvoicecloud.z.so ${shpath}/frameworks/voiceclouddll/ + +#解压zh.tar到resources/目录下 +tar xvf ../data/zh.tar -C ${shpath}/resources/ + +#拷贝voice_tip.mp3到resources/目录下并解压 +cp ../data/voice_tip.mp3 ${shpath}/resources/ diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml b/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml new file mode 100644 index 0000000..e843e80 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml @@ -0,0 +1,24 @@ + + + + voice_assistant_service + + 5102 + libvoiceassistant_service.z.so + true + false + 1 + + diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn new file mode 100644 index 0000000..bc6928c --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn @@ -0,0 +1,19 @@ +# Copyright (C) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos/sa_profile/sa_profile.gni") + +ohos_sa_profile("voice_assistant_sa_profiles") { + sources = [ "5102.xml" ] + part_name = "voiceassistant" +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn new file mode 100644 index 0000000..33f029f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn @@ -0,0 +1,117 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import("//build/ohos.gni") + +ohos_prebuilt_etc("pocketsphinx_source1") { + source = "zh/zh_cn.dic" + deps = [] + relative_install_dir = "pocketsphinx/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source2") { + source = "zh/zh_cn.lm.bin" + deps = [] + relative_install_dir = "pocketsphinx/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source3") { + source = "zh/zh/feat.params" + deps = [] + relative_install_dir = "pocketsphinx/zh/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source4") { + source = "zh/zh/feature_transform" + deps = [] + relative_install_dir = "pocketsphinx/zh/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source5") { + source = "zh/zh/mdef" + deps = [] + relative_install_dir = "pocketsphinx/zh/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source6") { + source = "zh/zh/means" + deps = [] + relative_install_dir = "pocketsphinx/zh/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source7") { + source = "zh/zh/mixture_weights" + deps = [] + relative_install_dir = "pocketsphinx/zh/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source8") { + source = "zh/zh/noisedict" + deps = [] + relative_install_dir = "pocketsphinx/zh/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source9") { + source = "zh/zh/transition_matrices" + deps = [] + relative_install_dir = "pocketsphinx/zh/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("pocketsphinx_source10") { + source = "zh/zh/variances" + deps = [] + relative_install_dir = "pocketsphinx/zh/zh" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +ohos_prebuilt_etc("voice_tip_source") { + source = "voice_tip.mp3" + deps = [] + relative_install_dir = "pocketsphinx/" + part_name = "voiceassistant" + subsystem_name = "miscservices" +} + +group("pocketsphinx_all_source") { + deps = [ + ":pocketsphinx_source1", + ":pocketsphinx_source2", + ":pocketsphinx_source3", + ":pocketsphinx_source4", + ":pocketsphinx_source5", + ":pocketsphinx_source6", + ":pocketsphinx_source7", + ":pocketsphinx_source8", + ":pocketsphinx_source9", + ":pocketsphinx_source10", + ":voice_tip_source" + ] +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn new file mode 100644 index 0000000..9b2da59 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn @@ -0,0 +1,140 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import("//build/ohos.gni") + +ohos_shared_library("carvoiceassistant") { + cflags = ["-Wno-unused-variable", "-Wno-unused-function", "-Wno-implicit-function-declaration", "-Wno-unused-private-field"] + cflags_cc = ["-fexceptions"] + + include_dirs = [ + "//base/miscservices/voiceassistant/frameworks/utils/include", + "//base/miscservices/voiceassistant/interfaces/kits/js/napi/include", + "//base/miscservices/voiceassistant/services/include/client", + "//foundation/ace/napi/interfaces/kits", + "//utils/native/base/include", + "//utils/system/safwk/native/include", + "//third_party/openssl/include", + "//third_party/json/single_include", + "//third_party" + ] + + sources = [ + "src/client/voice_assistant_ability_proxy.cpp", + "src/client/voice_assistant_client_callback_stub.cpp", + "src/client/voice_assistant_client_manager.cpp", + "../interfaces\kits\js\napi\src\voice_assistant_event_target.cpp", + "../interfaces\kits\js\napi\src\voice_assistant_napi_tools.cpp", + "../interfaces\kits\js\napi\src\voice_assistant_napi.cpp" + ] + + deps = [ + "//foundation/ace/napi/:ace_napi", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core", + "//foundation/communication/ipc/interfaces/innerkits/ipc_single:ipc_single", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//foundation/distributedschedule/samgr/interfaces/innerkits/samgr_proxy:samgr_proxy", + "//utils/native/base:utils", + "//third_party/libwebsockets:websockets", + "//third_party/openssl:libcrypto_static", + "//third_party/openssl:ssl_source", + "//third_party/zlib:libz", + ] + + external_deps = [ + "hiviewdfx_hilog_native:libhilog" + ] + + subsystem_name = "miscservices" + part_name = "voiceassistant" +} + +ohos_shared_library("voiceassistant_service") { + cflags = ["-Wno-unused-variable", "-Wno-unused-function", "-Wno-implicit-function-declaration", "-Wno-unused-private-field"] + cflags_cc = ["-fexceptions"] + + include_dirs = [ + "//foundation/multimedia/audio_standard/interfaces/inner_api/native/audiocapturer/include", + "//foundation/multimedia/audio_standard/interfaces/inner_api/native/audiocommon/include", + "//base/miscservices/voiceassistant/frameworks/manager/include", + "//base/miscservices/voiceassistant/frameworks/pocketsphinx/include", + "//base/miscservices/voiceassistant/frameworks/vad/include", + "//base/miscservices/voiceassistant/frameworks/utils/include", + "//base/miscservices/voiceassistant/frameworks/websocket/include", + "//base/miscservices/voiceassistant/services/include/client", + "//base/miscservices/voiceassistant/services/include/server", + "//base/miscservices/voiceassistant/frameworks/voiceclouddll", + "//utils/native/base/include", + "//third_party/libwebsockets/include", + "//third_party/openssl/include", + "//third_party/json/single_include", + "//third_party/curl/include", + "//foundation/graphic/standard/interfaces/innerkits/wmclient", + "//foundation/graphic/standard/interfaces/innerkits/common", + "//foundation/multimedia/media_standard/interfaces/innerkits/native/media/include", + "//foundation/multimedia/media_standard/services/utils/include" + ] + + sources = [ + "../frameworks/manager/src/audio_record_manager.cpp", + "../frameworks/manager/src/tts_manager.cpp", + "../frameworks/manager/src/wakeup_manager.cpp", + "../frameworks/manager/src/voice_cloud_loader.cpp", + "src/server/voice_assistant_ability_stub.cpp", + "src/server/voice_assistant_agent_service.cpp", + "src/server/voice_assistant_callback_event_target.cpp", + "src/server/voice_assistant_client_callback_proxy.cpp" + ] + + deps = [ + "//base/miscservices/voiceassistant/frameworks/pocketsphinx:pocketsphinx", + "//base/miscservices/voiceassistant/frameworks/vad:ps_vad", + "//foundation/ace/napi/:ace_napi", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core", + "//foundation/communication/ipc/interfaces/innerkits/ipc_single:ipc_single", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//foundation/distributedschedule/safwk/interfaces/innerkits/safwk:system_ability_fwk", + "//foundation/distributedschedule/samgr/interfaces/innerkits/samgr_proxy:samgr_proxy", + "//foundation/distributeddatamgr/appdatamgr/interfaces/innerkits/native_preferences:native_preferences", + "//utils/native/base:utils", + "//third_party/libwebsockets:websockets", + "//third_party/openssl:libcrypto_static", + "//third_party/openssl:ssl_source", + "//third_party/zlib:libz", + "//foundation/multimedia/audio_standard/interfaces/inner_api/native/audiocapturer:audio_capturer", + "//foundation/graphic/standard:libsurface", + "//foundation/graphic/standard:libwmclient", + "//foundation/graphic/standard/frameworks/surface:surface", + "//foundation/multimedia/image_standard/interfaces/innerkits:image_native", + "//third_party/libjpeg:libjpeg_static", + "//third_party/curl:curl" + ] + + external_deps = [ + "hiviewdfx_hilog_native:libhilog", + "multimedia_media_standard:media_client" + ] + + subsystem_name = "miscservices" + part_name = "voiceassistant" +} + +group("voiceassistant_service_group") { + deps = [":carvoiceassistant", + ":voiceassistant_service"] +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h new file mode 100644 index 0000000..37e26f8 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h @@ -0,0 +1,48 @@ +#ifndef CAR_VOICE_ASSISTANT_ABILITY_AGENT_H +#define CAR_VOICE_ASSISTANT_ABILITY_AGENT_H + +#include +#include +#include + +#include "iremote_broker.h" +#include "common_utils.h" + +namespace OHOS { +namespace CarVoiceAssistant { + class IVoiceAssistantAbilityAgent : public IRemoteBroker { + public: + enum { + VOICE_ASSITANT_CMD_IS_ENABLE_WAKEUP = 0, //是否开启了唤醒 + VOICE_ASSITANT_CMD_ENABLE_WAKEUP, //开启唤醒 + VOICE_ASSITANT_CMD_DISABLE_WAKEUP, //取消唤醒 + VOICE_ASSITANT_CMD_IS_RECOGNIZING, //是否识别中 + VOICE_ASSITANT_CMD_START_RECOGNIZE, //开始识别 + VOICE_ASSITANT_CMD_STOP_RECOGNIZE, //停止识别 + VOICE_ASSITANT_CMD_PLAY_TTS, //播放TTS + VOICE_ASSITANT_CMD_STOP_PLAY_TTS, //停止播放TTS + VOICE_ASSITANT_CMD_REGISTER_HOTWORDS, //注册热词 + VOICE_ASSISTANT_CMD_SET_COORD, //设置经纬度 + VOICE_ASSITANT_CMD_REGISTER_CALLBACK, //注册回调 + VOICE_ASSITANT_CMD_CHANGE_SPEAKER_TYPE, //修改TTS播报声音 + }; + + virtual int32_t IsEnableWakeUp(bool& isEnable) = 0; + virtual int32_t EnableWakeUp() = 0; + virtual int32_t DisableWakeUp() = 0; + virtual int32_t IsRecognizing(bool& isRecognizing) = 0; + virtual int32_t StartRecognize(CommonUtils::VoiceAssistantErrorCode& result) = 0; + virtual int32_t StopRecognize() = 0; + virtual int32_t PlayTTS(CommonUtils::VoiceAssistantErrorCode& result, std::string& tts) = 0; + virtual int32_t StopPlayTTS() = 0; + virtual int32_t RegisterHotwords(std::string& hotwords) = 0; + virtual int32_t SetCoord(double latitude, double longitude) = 0; + virtual int32_t RegisterCallback() = 0; + virtual int32_t ChangeSpeakerType(std::string speaker) = 0; + + DECLARE_INTERFACE_DESCRIPTOR(u"ohos.miscservices.voiceassistant.IVoiceAssistantAbilityAgent"); + }; +} // namespace CarVoiceAssistant +} // namespace OHOS + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h new file mode 100644 index 0000000..bf2f787 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h @@ -0,0 +1,35 @@ +#ifndef CAR_VOICE_ASSISTANT_ABILITY_PROXY_H +#define CAR_VOICE_ASSISTANT_ABILITY_PROXY_H + +#include "voice_assistant_ability_agent.h" +#include "common_utils.h" +#include "iremote_proxy.h" +#include "refbase.h" + +namespace OHOS { +namespace CarVoiceAssistant { + class VoiceAssistantAbilityAgentProxy : public IRemoteProxy { + public: + explicit VoiceAssistantAbilityAgentProxy(const sptr& object); + ~VoiceAssistantAbilityAgentProxy() = default; + virtual int32_t IsEnableWakeUp(bool& isEnable) override; + virtual int32_t EnableWakeUp() override; + virtual int32_t DisableWakeUp() override; + virtual int32_t IsRecognizing(bool& isRecognizing) override; + virtual int32_t StartRecognize(CommonUtils::VoiceAssistantErrorCode& result) override; + virtual int32_t StopRecognize() override; + virtual int32_t PlayTTS(CommonUtils::VoiceAssistantErrorCode& result,std::string& tts) override; + virtual int32_t StopPlayTTS() override; + virtual int32_t RegisterHotwords(std::string& hotwords) override; + virtual int32_t SetCoord(double latitude, double longitude) override; + virtual int32_t RegisterCallback() override; + virtual int32_t ChangeSpeakerType(std::string speaker) override; + + private: + static inline BrokerDelegator delegator_; + CommonUtils::VoiceAssistantErrorCode DoDispatch(uint32_t cmd, MessageParcel& data, MessageParcel& reply); + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h new file mode 100644 index 0000000..50cf90a --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h @@ -0,0 +1,37 @@ +#ifndef CAR_VOICE_ASSISTANT_AGENT_PROXY_DEATH_RECIPIENT_H +#define CAR_VOICE_ASSISTANT_AGENT_PROXY_DEATH_RECIPIENT_H + +#include "iremote_object.h" +#include "refbase.h" + +namespace OHOS +{ + namespace CarVoiceAssistant + { + class VoiceAssistantAgentProxyDeathRecipient : public IRemoteObject::DeathRecipient + { + public: + VoiceAssistantAgentProxyDeathRecipient() = default; + virtual ~VoiceAssistantAgentProxyDeathRecipient() = default; + + virtual void OnRemoteDied(const wptr &remote) + { + if (diedCb_ != nullptr) + { + diedCb_(remote); + } + } + + using NotifyFunc = std::function &)>; + void SetNotifyCb(NotifyFunc func) + { + diedCb_ = func; + } + + private: + NotifyFunc diedCb_ = nullptr; + }; + } +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h new file mode 100644 index 0000000..9b47409 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h @@ -0,0 +1,28 @@ +#ifndef CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_H +#define CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_H + +#include "iremote_broker.h" +#include + +namespace OHOS { +namespace CarVoiceAssistant { + class IVoiceAssistantClientCallback : public IRemoteBroker { + public: + enum { + VOICE_ASSITANT_CALLBACK_ON_WAKEUP, //被唤醒 + VOICE_ASSITANT_CALLBACK_RECOGNIZE_STATE_CHANGED, //识别状态改变 + VOICE_ASSITANT_CALLBACK_ASR_RESULT, //语音识别结果返回 + VOICE_ASSISTANT_CALLBACK_TTS_STATE_CHANGED, // tts播报状态改变 + }; + + virtual size_t NotifyWakeUp() = 0; + virtual size_t NotifyRecognizeStateChanged(bool isRecognizing) = 0; + virtual size_t NotifyAsrResult(std::string result) = 0; + virtual size_t NotifyTTSPlayStateChanged(bool isPlaying) = 0; + + DECLARE_INTERFACE_DESCRIPTOR(u"ohos.miscservices.voiceassistant.IVoiceAssistantClientCallback"); + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h new file mode 100644 index 0000000..9836255 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h @@ -0,0 +1,22 @@ +#ifndef CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_STUB_H +#define CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_STUB_H + +#include "voice_assistant_client_callback.h" +#include "iremote_stub.h" + +namespace OHOS { +namespace CarVoiceAssistant { + class VoiceAssistantClientCallbackStub : public IRemoteStub { + public: + virtual int OnRemoteRequest(uint32_t code, + MessageParcel& data, MessageParcel& reply, MessageOption& option) override; + + virtual size_t NotifyWakeUp() override; + virtual size_t NotifyRecognizeStateChanged(bool isRecognizing) override; + virtual size_t NotifyAsrResult(std::string result) override; + virtual size_t NotifyTTSPlayStateChanged(bool isPlaying) override; + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h new file mode 100644 index 0000000..3964515 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h @@ -0,0 +1,53 @@ +#ifndef VOICE_ASSISTANT_CLIENT_MANAGER_H +#define VOICE_ASSISTANT_CLIENT_MANAGER_H + +#include "voice_assistant_ability_proxy.h" +#include "voice_assistant_agent_proxy_death_recipient.h" +#include "voice_assistant_event_target.h" +#include "common_utils.h" +#include "refbase.h" +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + class VoiceAssistantClientManager : public RefBase { + public: + static sptr GetInstance(); + + VoiceAssistantClientManager(); + ~VoiceAssistantClientManager(); + + void SetEventTarget(sptr eventTarget); + sptr GetEventTarget(); + + int32_t IsEnableWakeUp(bool& isEnable); + int32_t EnableWakeUp(); + int32_t DisableWakeUp(); + int32_t IsRecognizing(bool& isRecognizing); + int32_t StartRecognize(CommonUtils::VoiceAssistantErrorCode& result); + int32_t StopRecognize(); + int32_t PlayTTS(CommonUtils::VoiceAssistantErrorCode& result,std::string& tts); + int32_t StopPlayTTS(); + int32_t RegisterHotwords(std::string& hotwords); + int32_t SetCoord(double latitude, double longitude); + int32_t RegisterCallback(); + int32_t ChangeSpeakerType(std::string speaker); + + private: + sptr eventTarget_; + sptr mAbilityManager_; + sptr deathRecipient_; + std::mutex createProxyLock_; + + static std::mutex instanceLock_; + static sptr instance_; + + sptr CreateAbilityAgentProxy(); + void ResetAgentProxy(); + }; + +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h new file mode 100644 index 0000000..3f192ca --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h @@ -0,0 +1,85 @@ +#ifndef CAR_VOICE_ASSISTANT_ABILITY_STUB_H +#define CAR_VOICE_ASSISTANT_ABILITY_STUB_H + +#include "audio_record_manager.h" +#include "common_utils.h" +#include "i_voice_cloud_manager.h" +#include "i_wakeup_manager.h" +#include "iremote_stub.h" +#include "tts_manager.h" +#include "voice_assistant_ability_agent.h" +#include "voice_assistant_callback_event_target.h" +#include +#include +#include + +namespace OHOS { +namespace CarVoiceAssistant { + + class VoiceAssistantAbilityAgentStub : public IRemoteStub, + public IVoiceCloudManagerCallback, + public IAudioRecordCallback, + public IWakeUpCallback, + public ITTSManagerCallback { + public: + explicit VoiceAssistantAbilityAgentStub(); + virtual ~VoiceAssistantAbilityAgentStub(); + virtual int32_t OnRemoteRequest(uint32_t code, + MessageParcel& data, + MessageParcel& reply, + MessageOption& option) override; + + virtual int32_t IsEnableWakeUp(bool& isEnable) override; + virtual int32_t EnableWakeUp() override; + virtual int32_t DisableWakeUp() override; + virtual int32_t IsRecognizing(bool& isRecognizing) override; + virtual int32_t StartRecognize(CommonUtils::VoiceAssistantErrorCode& result) override; + virtual int32_t StopRecognize() override; + virtual int32_t PlayTTS(CommonUtils::VoiceAssistantErrorCode& result, std::string& tts) override; + virtual int32_t StopPlayTTS() override; + virtual int32_t RegisterHotwords(std::string& hotwords) override; + virtual int32_t SetCoord(double latitude, double longitude) override; + virtual int32_t RegisterCallback() override; + virtual int32_t ChangeSpeakerType(std::string speaker) override; + + bool ConnectWebsocket(); + void RemoveCallback(const wptr& remoteObject); + + virtual void VoiceCloudStatusChanged(VoiceCloudStatus status) override; + virtual void ReveiceVoiceCloudMessage(void* data, size_t length, bool isBinary) override; + + virtual void AudioRecordStatusChanged(AudioRecordStatus status) override; + virtual void ReceiveAudioBuffer(void* data, size_t length) override; + + virtual void WakeUpCallback(std::string text) override; + + virtual void AudioPlayerStatusChanged(bool isPlaying) override; + + void SendAudioBufferToWebsocketIfNeeded(void* data, size_t length); + void CheckWakeUpIfNeeded(void* data, size_t length); + + private: + bool isWakeUpEnabled_; //唤醒功能是否开启 + bool isRecognizing_; + std::pair coord_; + std::string hotwords_; + + // time_t startRecognizingTime_; //开始识别时间 + + std::mutex mutex_; + + sptr callbackEventTarget_; + IVoiceCloudManager* voiceCloudManager_; + sptr audioRecordManager_; + sptr ttsManager_; + IWakeUpManager* wakeUpManager_; + + std::shared_ptr player_; + + void SendStartAudioStreamIfNeeded(); + void PlayStartRecoginizingSound(); + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h new file mode 100644 index 0000000..5599a69 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h @@ -0,0 +1,36 @@ +#ifndef CAR_VOICE_ASSISTANT_AGENT_SERVICE_H +#define CAR_VOICE_ASSISTANT_AGENT_SERVICE_H + +#include "voice_assistant_ability_stub.h" +#include "system_ability.h" + +namespace OHOS { +namespace CarVoiceAssistant { + + enum ServiceRunState { + ServiceRunStateNotStart, + ServiceRunStateRunning + }; + + class VoiceAssistantAgentService : public SystemAbility, + public VoiceAssistantAbilityAgentStub { + DECLARE_SYSTEM_ABILITY(VoiceAssistantAgentService); + + public: + DISALLOW_COPY_AND_MOVE(VoiceAssistantAgentService); + VoiceAssistantAgentService(int32_t systemAbilityId, bool runOnCreate); + VoiceAssistantAgentService(); + ~VoiceAssistantAgentService(); + + protected: + void OnStart() override; + void OnStop() override; + + private: + ServiceRunState state_; + int32_t Init(); + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h new file mode 100644 index 0000000..c01761b --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h @@ -0,0 +1,35 @@ +#ifndef CAR_VOICE_ASSISTANT_CALLBACK_EVENT_TARGET_H +#define CAR_VOICE_ASSISTANT_CALLBACK_EVENT_TARGET_H + +#include "voice_assistant_callback_proxy_death_recipient.h" +#include "voice_assistant_client_callback.h" +#include "refbase.h" +#include + +namespace OHOS { +namespace CarVoiceAssistant { + struct VoiceAssistantCallbackEventListener { + sptr proxy_; + sptr deathRecipient_; + }; + + class VoiceAssistantCallbackEventTarget : public RefBase { + public: + void AddListener(sptr proxy, sptr deathRecipient); + void RemoveListener(const wptr& remote); + + void EmitOnWakeUp(); + void EmitRecognizeStateChanged(bool isRecognizing); + void EmitAsrResult(std::string& result); + void EmitTTSPlayStateChanged(bool isPlaying); + template + void DoEmit(Callback callback); + + private: + std::list listenerList_; + }; + +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h new file mode 100644 index 0000000..22d2488 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h @@ -0,0 +1,37 @@ +#ifndef CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_DEATH_RECIPIENT_H +#define CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_DEATH_RECIPIENT_H + +#include "iremote_object.h" +#include "refbase.h" + +namespace OHOS +{ + namespace CarVoiceAssistant + { + class VoiceAssistantClientCallbackDeathRecipient : public IRemoteObject::DeathRecipient + { + public: + VoiceAssistantClientCallbackDeathRecipient() = default; + virtual ~VoiceAssistantClientCallbackDeathRecipient() = default; + + virtual void OnRemoteDied(const wptr &remote) + { + if (diedCb_ != nullptr) + { + diedCb_(remote); + } + } + + using NotifyFunc = std::function &)>; + void SetNotifyCb(NotifyFunc func) + { + diedCb_ = func; + } + + private: + NotifyFunc diedCb_ = nullptr; + }; + } +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h new file mode 100644 index 0000000..c519175 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h @@ -0,0 +1,27 @@ +#ifndef CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_PROXY_H +#define CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_PROXY_H + +#include "voice_assistant_client_callback.h" +#include "common_utils.h" +#include "iremote_object.h" +#include "iremote_proxy.h" + +namespace OHOS { +namespace CarVoiceAssistant { + class VoiceAssistantClientCallbackProxy : public IRemoteProxy { + public: + explicit VoiceAssistantClientCallbackProxy(const sptr& impl); + + virtual size_t NotifyWakeUp() override; + virtual size_t NotifyRecognizeStateChanged(bool isRecognizing) override; + virtual size_t NotifyAsrResult(std::string result) override; + virtual size_t NotifyTTSPlayStateChanged(bool isPlaying) override; + + private: + static inline BrokerDelegator delegator_; + CommonUtils::VoiceAssistantErrorCode DoDispatch(uint32_t cmd, MessageParcel& data, MessageParcel& reply); + }; +} +} + +#endif \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp new file mode 100644 index 0000000..10910ec --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp @@ -0,0 +1,253 @@ +#include "voice_assistant_ability_proxy.h" +#include "voice_assistant_client_callback_stub.h" +#include "voice_assistant_log.h" +#include "common_utils.h" +#include + +using namespace OHOS::CarVoiceAssistant::CommonUtils; + +namespace OHOS { +namespace CarVoiceAssistant { + +#define WRITE_PARCEL_WITH_RET(parcel, type, data, retval) \ + do { \ + if (!(parcel).Write##type(data)) { \ + VOICE_ASSISTANT_LOGI("%{public}s write " #data " failed", __func__); \ + return (retval); \ + } \ + } while (0) + +#define READ_PARCEL_WITH_RET(parcel, type, out, retval) \ + do { \ + if (!(parcel).Read##type(out)) { \ + VOICE_ASSISTANT_LOGI("%{public}s read " #out " failed", __func__); \ + return (retval); \ + } \ + } while (0) + + VoiceAssistantAbilityAgentProxy::VoiceAssistantAbilityAgentProxy(const sptr& object) + : IRemoteProxy(object) + { + } + + int32_t VoiceAssistantAbilityAgentProxy::IsEnableWakeUp(bool& isEnable) + { + VOICE_ASSISTANT_LOGI("IsEnableWakeUp"); + MessageParcel data; + MessageParcel reply; + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_IS_ENABLE_WAKEUP, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("IsEnableWakeUp failed"); + return code; + } + + READ_PARCEL_WITH_RET(reply, Bool, isEnable, VOICE_ASSISTANT_ERR); + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::EnableWakeUp() + { + VOICE_ASSISTANT_LOGI("EnableWakeUp"); + MessageParcel data; + MessageParcel reply; + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_ENABLE_WAKEUP, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("EnableWakeUp failed"); + return code; + } + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::DisableWakeUp() + { + VOICE_ASSISTANT_LOGI("DisableWakeUp"); + MessageParcel data; + MessageParcel reply; + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_DISABLE_WAKEUP, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("DisableWakeUp failed"); + return code; + } + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::IsRecognizing(bool& isRecognizing) + { + VOICE_ASSISTANT_LOGI("IsRecognizing"); + MessageParcel data; + MessageParcel reply; + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_IS_RECOGNIZING, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("IsRecognizing failed"); + return code; + } + + READ_PARCEL_WITH_RET(reply, Bool, isRecognizing, VOICE_ASSISTANT_ERR); + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::StartRecognize(CommonUtils::VoiceAssistantErrorCode& result) + { + VOICE_ASSISTANT_LOGI("StartRecognize"); + MessageParcel data; + MessageParcel reply; + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_START_RECOGNIZE, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("StartRecognize failed"); + return code; + } + + int32_t rst = VOICE_ASSISTANT_ERR; + READ_PARCEL_WITH_RET(reply, Int32, rst, VOICE_ASSISTANT_ERR); + result = static_cast(rst); + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::StopRecognize() + { + VOICE_ASSISTANT_LOGI("StopRecognize"); + MessageParcel data; + MessageParcel reply; + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_STOP_RECOGNIZE, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("StopRecognize failed"); + return code; + } + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::PlayTTS(CommonUtils::VoiceAssistantErrorCode& result, std::string& tts) + { + VOICE_ASSISTANT_LOGI("PlayTTS"); + MessageParcel data; + MessageParcel reply; + + WRITE_PARCEL_WITH_RET(data, String, tts, VOICE_ASSISTANT_ERR); + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_PLAY_TTS, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("PlayTTS failed"); + return code; + } + + int32_t rst = VOICE_ASSISTANT_ERR; + READ_PARCEL_WITH_RET(reply, Int32, rst, VOICE_ASSISTANT_ERR); + result = static_cast(rst); + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::StopPlayTTS() + { + VOICE_ASSISTANT_LOGI("StopPlayTTS"); + MessageParcel data; + MessageParcel reply; + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_STOP_PLAY_TTS, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("StopPlayTTS failed"); + return code; + } + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::RegisterHotwords(std::string& hotwords) + { + VOICE_ASSISTANT_LOGI("RegisterHotwords"); + MessageParcel data; + MessageParcel reply; + + WRITE_PARCEL_WITH_RET(data, String, hotwords, VOICE_ASSISTANT_ERR); + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_REGISTER_HOTWORDS, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("RegisterHotwords failed"); + return code; + } + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::SetCoord(double latitude, double longitude) + { + VOICE_ASSISTANT_LOGI("SetCoord"); + MessageParcel data; + MessageParcel reply; + + WRITE_PARCEL_WITH_RET(data, Double, latitude, VOICE_ASSISTANT_ERR); + WRITE_PARCEL_WITH_RET(data, Double, longitude, VOICE_ASSISTANT_ERR); + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSISTANT_CMD_SET_COORD, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("SetCoord failed"); + return code; + } + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::RegisterCallback() + { + VOICE_ASSISTANT_LOGI("RegisterCallback"); + MessageParcel data; + MessageParcel reply; + + sptr callback = new VoiceAssistantClientCallbackStub(); + sptr remoteObject = callback->AsObject(); + WRITE_PARCEL_WITH_RET(data, RemoteObject, remoteObject, VOICE_ASSISTANT_ERR); + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_REGISTER_CALLBACK, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("RegisterCallback failed"); + return code; + } + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentProxy::ChangeSpeakerType(std::string speaker) + { + VOICE_ASSISTANT_LOGI("ChangeSpeakerType"); + MessageParcel data; + MessageParcel reply; + + WRITE_PARCEL_WITH_RET(data, String, speaker, VOICE_ASSISTANT_ERR); + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CMD_CHANGE_SPEAKER_TYPE, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("ChangeSpeakerType failed"); + return code; + } + + return VOICE_ASSISTANT_OK; + } + + CommonUtils::VoiceAssistantErrorCode VoiceAssistantAbilityAgentProxy::DoDispatch(uint32_t cmd, MessageParcel& data, MessageParcel& reply) + { + VOICE_ASSISTANT_LOGI("%{public}s:%{public}d cmd:%{public}d", __func__, __LINE__, cmd); + + MessageOption option; + auto ret = Remote()->SendRequest(cmd, data, reply, option); + VOICE_ASSISTANT_LOGI("%{public}s:%{public}d SendRequest end cmd:%{public}d ", __func__, __LINE__, cmd); + if (ret != ERR_NONE) { + VOICE_ASSISTANT_LOGI("failed to send request, cmd: %{public}d, ret: %{public}d", cmd, ret); + return VOICE_ASSISTANT_ERR; + } + VOICE_ASSISTANT_LOGI(" success to dispatch cmd: %{public}d", cmd); + return VOICE_ASSISTANT_OK; + } + +} +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp new file mode 100644 index 0000000..ef7ea49 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp @@ -0,0 +1,77 @@ +#include "voice_assistant_client_callback_stub.h" +#include "common_utils.h" +#include "voice_assistant_client_manager.h" +#include "voice_assistant_log.h" + +using namespace OHOS::CarVoiceAssistant::CommonUtils; + +namespace OHOS { +namespace CarVoiceAssistant { + + int VoiceAssistantClientCallbackStub::OnRemoteRequest(uint32_t code, + MessageParcel& data, MessageParcel& reply, MessageOption& option) + { + switch (code) { + case VOICE_ASSITANT_CALLBACK_ON_WAKEUP: + NotifyWakeUp(); + break; + case VOICE_ASSITANT_CALLBACK_RECOGNIZE_STATE_CHANGED: { + bool isRecognizing = data.ReadBool(); + NotifyRecognizeStateChanged(isRecognizing); + } break; + case VOICE_ASSITANT_CALLBACK_ASR_RESULT: { + std::string result = data.ReadString(); + NotifyAsrResult(result); + } break; + case VOICE_ASSISTANT_CALLBACK_TTS_STATE_CHANGED: { + bool isPlaying = data.ReadBool(); + NotifyTTSPlayStateChanged(isPlaying); + } break; + default: + break; + } + + return 0; + } + + size_t VoiceAssistantClientCallbackStub::NotifyWakeUp() + { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientCallbackStub::NotifyWakeUp"); + sptr eventTarget = VoiceAssistantClientManager::GetInstance()->GetEventTarget(); + if (eventTarget) { + eventTarget->EmitOnWakeUp(); + } + return VOICE_ASSISTANT_OK; + } + + size_t VoiceAssistantClientCallbackStub::NotifyRecognizeStateChanged(bool isRecognizing) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientCallbackStub::NotifyRecognizeStateChanged"); + sptr eventTarget = VoiceAssistantClientManager::GetInstance()->GetEventTarget(); + if (eventTarget) { + eventTarget->EmitRecognizeStateChanged(isRecognizing); + } + return VOICE_ASSISTANT_OK; + } + + size_t VoiceAssistantClientCallbackStub::NotifyAsrResult(std::string result) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientCallbackStub::NotifyAsrResult"); + sptr eventTarget = VoiceAssistantClientManager::GetInstance()->GetEventTarget(); + if (eventTarget) { + eventTarget->EmitAsrResult(result); + } + return VOICE_ASSISTANT_OK; + } + + size_t VoiceAssistantClientCallbackStub::NotifyTTSPlayStateChanged(bool isPlaying) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientCallbackStub::NotifyTTSPlayStateChanged"); + sptr eventTarget = VoiceAssistantClientManager::GetInstance()->GetEventTarget(); + if (eventTarget) { + eventTarget->EmitTTSPlayStateChanged(isPlaying); + } + return VOICE_ASSISTANT_OK; + } +} +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp new file mode 100644 index 0000000..471243f --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp @@ -0,0 +1,173 @@ +#include "voice_assistant_client_manager.h" +#include "voice_assistant_log.h" +#include "common_utils.h" +#include "iservice_registry.h" + +using namespace OHOS::CarVoiceAssistant::CommonUtils; + +namespace OHOS { +namespace CarVoiceAssistant { + +#define CHECK_PROXY_VALID() \ + if (CreateAbilityAgentProxy() == NULL) { \ + VOICE_ASSISTANT_LOGI("CreateAbilityAgentProxy failed"); \ + return VOICE_ASSISTANT_ERR; \ + } + + sptr VoiceAssistantClientManager::instance_; + std::mutex VoiceAssistantClientManager::instanceLock_; + + sptr VoiceAssistantClientManager::GetInstance() + { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::GetInstance"); + if (instance_ == nullptr) { + std::lock_guard autoLock(instanceLock_); + if (instance_ == nullptr) { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::GetInstance"); + instance_ = new VoiceAssistantClientManager(); + } + } + return instance_; + } + + VoiceAssistantClientManager::VoiceAssistantClientManager() + { + CreateAbilityAgentProxy(); + } + + VoiceAssistantClientManager::~VoiceAssistantClientManager() + { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::~VoiceAssistantClientManager"); + instance_ = NULL; + } + + void VoiceAssistantClientManager::SetEventTarget(sptr eventTarget) + { + eventTarget_ = eventTarget; + } + + sptr VoiceAssistantClientManager::GetEventTarget() + { + return eventTarget_; + } + + sptr VoiceAssistantClientManager::CreateAbilityAgentProxy() + { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::VoiceAssistantAbilityAgentProxy"); + + std::lock_guard autoLock(createProxyLock_); + + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::VoiceAssistantAbilityAgentProxy Start"); + + if (mAbilityManager_) { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::VoiceAssistantAbilityAgentProxy isExist"); + return mAbilityManager_; + } + + sptr systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (systemAbilityManager == nullptr) { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::VoiceAssistantAbilityAgentProxy systemAbilityManager is nullptr"); + return nullptr; + } + + auto systemAbility = systemAbilityManager->GetSystemAbility(CAR_VOICE_ASSISTANT_SERVICE_SA_ID, ""); + if (systemAbility == nullptr) { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::VoiceAssistantAbilityAgentProxy systemAbility is nullptr"); + return nullptr; + } + + mAbilityManager_ = iface_cast(systemAbility); + + deathRecipient_ = new VoiceAssistantAgentProxyDeathRecipient(); + deathRecipient_->SetNotifyCb(std::bind(&VoiceAssistantClientManager::ResetAgentProxy, this)); + mAbilityManager_->AsObject()->AddDeathRecipient(deathRecipient_); + + RegisterCallback(); + + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::VoiceAssistantAbilityAgentProxy finished"); + + return mAbilityManager_; + } + + void VoiceAssistantClientManager::ResetAgentProxy() + { + VOICE_ASSISTANT_LOGI("VoiceAssistantClientManager::ResetAgentProxy"); + if (mAbilityManager_ != nullptr && mAbilityManager_->AsObject() != nullptr) { + mAbilityManager_->AsObject()->RemoveDeathRecipient(deathRecipient_); + } + mAbilityManager_ = nullptr; + } + + int32_t VoiceAssistantClientManager::IsEnableWakeUp(bool& isEnable) + { + CHECK_PROXY_VALID(); + return mAbilityManager_->IsEnableWakeUp(isEnable); + } + + int32_t VoiceAssistantClientManager::EnableWakeUp() + { + CHECK_PROXY_VALID(); + return mAbilityManager_->EnableWakeUp(); + } + + int32_t VoiceAssistantClientManager::DisableWakeUp() + { + CHECK_PROXY_VALID(); + return mAbilityManager_->DisableWakeUp(); + } + + int32_t VoiceAssistantClientManager::IsRecognizing(bool& isRecognizing) + { + CHECK_PROXY_VALID(); + return mAbilityManager_->IsRecognizing(isRecognizing); + } + + int32_t VoiceAssistantClientManager::StartRecognize(CommonUtils::VoiceAssistantErrorCode& result) + { + CHECK_PROXY_VALID(); + return mAbilityManager_->StartRecognize(result); + } + + int32_t VoiceAssistantClientManager::StopRecognize() + { + CHECK_PROXY_VALID(); + return mAbilityManager_->StopRecognize(); + } + + int32_t VoiceAssistantClientManager::PlayTTS(CommonUtils::VoiceAssistantErrorCode& result, std::string& tts) + { + CHECK_PROXY_VALID(); + return mAbilityManager_->PlayTTS(result, tts); + } + + int32_t VoiceAssistantClientManager::StopPlayTTS() + { + CHECK_PROXY_VALID(); + return mAbilityManager_->StopPlayTTS(); + } + + int32_t VoiceAssistantClientManager::RegisterHotwords(std::string& hotwords) + { + CHECK_PROXY_VALID(); + return mAbilityManager_->RegisterHotwords(hotwords); + } + + int32_t VoiceAssistantClientManager::SetCoord(double latitude, double longitude) + { + CHECK_PROXY_VALID(); + return mAbilityManager_->SetCoord(latitude, longitude); + } + + int32_t VoiceAssistantClientManager::RegisterCallback() + { //由于在CreateAbilityAgentProxy调用,此处不需要CHECK_PROXY_VALID + return mAbilityManager_->RegisterCallback(); + } + + int32_t VoiceAssistantClientManager::ChangeSpeakerType(std::string speaker) + { + CHECK_PROXY_VALID(); + return mAbilityManager_->ChangeSpeakerType(speaker); + } + +} +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp new file mode 100644 index 0000000..d70f2fc --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp @@ -0,0 +1,497 @@ +#include "voice_assistant_ability_stub.h" +#include "common_utils.h" +#include "nlohmann/json.hpp" +#include "voice_assistant_log.h" +#include "voice_cloud_loader.h" +#include "wakeup_manager.h" +#include +#include + +using namespace OHOS::CarVoiceAssistant::CommonUtils; + +namespace OHOS { +namespace CarVoiceAssistant { + +#define WRITE_PARCEL_WITH_RET(parcel, type, data, retval) \ + do { \ + if (!(parcel).Write##type(data)) { \ + VOICE_ASSISTANT_LOGI("%{public}s write " #data " failed", __func__); \ + return (retval); \ + } \ + } while (0) + +#define READ_PARCEL_WITH_RET(parcel, type, out, retval) \ + do { \ + if (!(parcel).Read##type(out)) { \ + VOICE_ASSISTANT_LOGI("%{public}s read " #out " failed", __func__); \ + return (retval); \ + } \ + } while (0) + + VoiceAssistantAbilityAgentStub::VoiceAssistantAbilityAgentStub() + { + isWakeUpEnabled_ = false; + isRecognizing_ = false; + coord_ = std::make_pair(31.32751, 118.8921); + hotwords_ = ""; + // startRecognizingTime_ = 0; + player_ = nullptr; + + callbackEventTarget_ = new VoiceAssistantCallbackEventTarget(); + + voiceCloudManager_ = CreateVoiceCloudManager(); + if (voiceCloudManager_) { + voiceCloudManager_->SetCallback(static_cast(this)); + } + + audioRecordManager_ = new AudioRecordManager(); + audioRecordManager_->SetCallback(static_cast(this)); + + ttsManager_ = new TTSManager(); + ttsManager_->SetCallback(static_cast(this)); + ttsManager_->voiceCloudManager_ = voiceCloudManager_; + + wakeUpManager_ = new WakeUpManager(); + wakeUpManager_->SetCallback(static_cast(this)); + wakeUpManager_->Init(); + } + + VoiceAssistantAbilityAgentStub::~VoiceAssistantAbilityAgentStub() + { + callbackEventTarget_ = nullptr; + if (voiceCloudManager_) { + DestoryVoiceCloudManager(voiceCloudManager_); + voiceCloudManager_ = nullptr; + } + audioRecordManager_ = nullptr; + ttsManager_ = nullptr; + if (wakeUpManager_) { + delete wakeUpManager_; + wakeUpManager_ = nullptr; + } + } + + int32_t VoiceAssistantAbilityAgentStub::OnRemoteRequest(uint32_t code, + MessageParcel& data, + MessageParcel& reply, + MessageOption& option) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantAbilityAgentStub::OnRemoteRequest code = %{public}u, pid=%{public}lu", code, pthread_self()); + switch (code) { + case VOICE_ASSITANT_CMD_IS_ENABLE_WAKEUP: { + bool isEnableWakeUp = false; + IsEnableWakeUp(isEnableWakeUp); + WRITE_PARCEL_WITH_RET(reply, Bool, isEnableWakeUp, VOICE_ASSISTANT_ERR); + } break; + case VOICE_ASSITANT_CMD_ENABLE_WAKEUP: + EnableWakeUp(); + break; + case VOICE_ASSITANT_CMD_DISABLE_WAKEUP: + DisableWakeUp(); + break; + case VOICE_ASSITANT_CMD_IS_RECOGNIZING: { + bool isRecognizing; + IsRecognizing(isRecognizing); + WRITE_PARCEL_WITH_RET(reply, Bool, isRecognizing, VOICE_ASSISTANT_ERR); + } break; + case VOICE_ASSITANT_CMD_START_RECOGNIZE: { + VoiceAssistantErrorCode result = VOICE_ASSISTANT_OK; + StartRecognize(result); + WRITE_PARCEL_WITH_RET(reply, Int32, result, VOICE_ASSISTANT_ERR); + + } break; + case VOICE_ASSITANT_CMD_STOP_RECOGNIZE: + StopRecognize(); + break; + case VOICE_ASSITANT_CMD_PLAY_TTS: { + std::string tts; + VoiceAssistantErrorCode result = VOICE_ASSISTANT_OK; + READ_PARCEL_WITH_RET(data, String, tts, VOICE_ASSISTANT_ERR); + PlayTTS(result, tts); + WRITE_PARCEL_WITH_RET(reply, Int32, result, VOICE_ASSISTANT_ERR); + + } break; + case VOICE_ASSITANT_CMD_STOP_PLAY_TTS: + StopPlayTTS(); + break; + case VOICE_ASSITANT_CMD_REGISTER_HOTWORDS: { + std::string hotwords; + READ_PARCEL_WITH_RET(data, String, hotwords, VOICE_ASSISTANT_ERR); + RegisterHotwords(hotwords); + } break; + case VOICE_ASSISTANT_CMD_SET_COORD: { + double latitude; + double longitude; + READ_PARCEL_WITH_RET(data, Double, latitude, VOICE_ASSISTANT_ERR); + READ_PARCEL_WITH_RET(data, Double, longitude, VOICE_ASSISTANT_ERR); + SetCoord(latitude, longitude); + } break; + case VOICE_ASSITANT_CMD_REGISTER_CALLBACK: { + sptr proxy = iface_cast(data.ReadRemoteObject()); + if (!proxy) { + VOICE_ASSISTANT_LOGI("OnRemoteRequest-VOICE_ASSITANT_CMD_REGISTER_CALLBACK: is null"); + return 0; + } + sptr deathRecipient = new VoiceAssistantClientCallbackDeathRecipient(); + deathRecipient->SetNotifyCb(std::bind(&VoiceAssistantAbilityAgentStub::RemoveCallback, this, std::placeholders::_1)); + proxy->AsObject()->AddDeathRecipient(deathRecipient); + callbackEventTarget_->AddListener(proxy, deathRecipient); + } break; + case VOICE_ASSITANT_CMD_CHANGE_SPEAKER_TYPE: { + std::string speakerType; + READ_PARCEL_WITH_RET(data, String, speakerType, VOICE_ASSISTANT_ERR); + ChangeSpeakerType(speakerType); + } break; + default: + break; + } + return 0; + } + + int32_t VoiceAssistantAbilityAgentStub::IsEnableWakeUp(bool& isEnable) + { + VOICE_ASSISTANT_LOGI("IsEnableWakeUp:%{public}s", isWakeUpEnabled_ ? "true" : "false"); + std::lock_guard lock(mutex_); + isEnable = isWakeUpEnabled_; + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::EnableWakeUp() + { + VOICE_ASSISTANT_LOGI("EnableWakeUp"); + std::lock_guard lock(mutex_); + if (isWakeUpEnabled_) { + VOICE_ASSISTANT_LOGI("EnableWakeUp: is already enabled"); + return VOICE_ASSISTANT_OK; + } + if (audioRecordManager_->GetStatus() != AudioRecordStatusNone) { + isWakeUpEnabled_ = true; + VOICE_ASSISTANT_LOGI("EnableWakeUp: recording is running"); + return VOICE_ASSISTANT_OK; + } + VOICE_ASSISTANT_LOGI("EnableWakeUp: start record"); + bool rst = audioRecordManager_->StartRecord(); + if (rst) { + VOICE_ASSISTANT_LOGI("EnableWakeUp: start record success"); + isWakeUpEnabled_ = true; + } else { + VOICE_ASSISTANT_LOGI("EnableWakeUp: start record failed"); + } + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::DisableWakeUp() + { + VOICE_ASSISTANT_LOGI("DisableWakeUp"); + std::lock_guard lock(mutex_); + if (!isWakeUpEnabled_) { + VOICE_ASSISTANT_LOGI("DisableWakeUp: is already disabled"); + return VOICE_ASSISTANT_OK; + } + + if (audioRecordManager_->GetStatus() == AudioRecordStatusNone) { + isWakeUpEnabled_ = false; + VOICE_ASSISTANT_LOGI("DisableWakeUp: audio is not recording"); + return VOICE_ASSISTANT_OK; + } + + if (isRecognizing_) { + VOICE_ASSISTANT_LOGI("DisableWakeUp: isRecognizing, do not stop recording"); + isWakeUpEnabled_ = false; + return VOICE_ASSISTANT_OK; + } + + VOICE_ASSISTANT_LOGI("DisableWakeUp: stop recording"); + audioRecordManager_->StopRecord(); + isWakeUpEnabled_ = false; + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::IsRecognizing(bool& isRecognizing) + { + VOICE_ASSISTANT_LOGI("IsRecognizing:%{public}s", isRecognizing_ ? "true" : "false"); + std::lock_guard lock(mutex_); + isRecognizing = isRecognizing_; + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::StartRecognize(CommonUtils::VoiceAssistantErrorCode& result) + { + VOICE_ASSISTANT_LOGI("StartRecognize"); + std::lock_guard lock(mutex_); + + if (isRecognizing_) { + VOICE_ASSISTANT_LOGI("StopRecognize: is already recognizing"); + result = VOICE_ASSISTANT_OK; + return VOICE_ASSISTANT_OK; + } + + ttsManager_->CancelAll(); + + if (audioRecordManager_->GetStatus() == AudioRecordStatusNone) { + bool rst = audioRecordManager_->StartRecord(); + if (rst) { + VOICE_ASSISTANT_LOGI("StartRecognize: start record success"); + } else { + VOICE_ASSISTANT_LOGI("StartRecognize: start record failed"); + result = VOICE_ASSISTANT_START_RECORD_FAILED; + return VOICE_ASSISTANT_ERR; + } + } + + //启动websocket + bool rst = ConnectWebsocket(); + if (!rst) { + VOICE_ASSISTANT_LOGI("StartRecognize: connect websocket failed"); + result = VOICE_ASSISTANT_START_WEBSOCKET_CONNECT_FAILED; + return VOICE_ASSISTANT_ERR; + } + + PlayStartRecoginizingSound(); + isRecognizing_ = true; + // startRecognizingTime_ = CommonUtils::GetTimestamp(); + + callbackEventTarget_->EmitRecognizeStateChanged(isRecognizing_); + + std::thread startAudioStreamThread(&VoiceAssistantAbilityAgentStub::SendStartAudioStreamIfNeeded, this); + startAudioStreamThread.detach(); + + result = VOICE_ASSISTANT_OK; + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::StopRecognize() + { + VOICE_ASSISTANT_LOGI("StopRecognize"); + std::lock_guard lock(mutex_); + if (!isRecognizing_) { + VOICE_ASSISTANT_LOGI("StopRecognize: is already not recognizing"); + return VOICE_ASSISTANT_OK; + } + + if (!isWakeUpEnabled_ && audioRecordManager_->GetStatus() != AudioRecordStatusNone) { + VOICE_ASSISTANT_LOGI("StopRecognize:stop record"); + audioRecordManager_->StopRecord(); + } + + voiceCloudManager_->SendEndAudioStream(); + + wakeUpManager_->SetNeedClearBeforeProcess(); + isRecognizing_ = false; + + callbackEventTarget_->EmitRecognizeStateChanged(isRecognizing_); + + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::PlayTTS(CommonUtils::VoiceAssistantErrorCode& result, std::string& tts) + { + VOICE_ASSISTANT_LOGI("PlayTTS:%{public}s", tts.c_str()); + ttsManager_->RequestPlay(tts); + result = VOICE_ASSISTANT_OK; + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::StopPlayTTS() + { + VOICE_ASSISTANT_LOGI("StopPlayTTS"); + ttsManager_->CancelAll(); + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::RegisterHotwords(std::string& hotwords) + { + VOICE_ASSISTANT_LOGI("RegisterHotwords:%{public}s", hotwords.c_str()); + std::lock_guard lock(mutex_); + hotwords_ = hotwords; + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::SetCoord(double latitude, double longitude) + { + VOICE_ASSISTANT_LOGI("SetCoord:%{public}f,%{public}f", latitude, longitude); + coord_ = std::make_pair(latitude, longitude); + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::RegisterCallback() + { + return VOICE_ASSISTANT_OK; + } + + int32_t VoiceAssistantAbilityAgentStub::ChangeSpeakerType(std::string speakerType) + { + VOICE_ASSISTANT_LOGI("ChangeSpeakerType:%{public}s", speakerType.c_str()); + ttsManager_->ChangeSpeakerType(speakerType); + return VOICE_ASSISTANT_OK; + } + + void VoiceAssistantAbilityAgentStub::RemoveCallback(const wptr& remoteObject) + { + callbackEventTarget_->RemoveListener(remoteObject); + } + + bool VoiceAssistantAbilityAgentStub::ConnectWebsocket() + { + VOICE_ASSISTANT_LOGI("ConnectWebsocket"); + if (voiceCloudManager_->GetStatus() == VoiceCloudStatusConnected || voiceCloudManager_->GetStatus() == VoiceCloudStatusConnecting) { + VOICE_ASSISTANT_LOGI("ConnectWebsocket: is connect or connectting, need not connect"); + return true; + } + + return voiceCloudManager_->Connect(); + } + + void VoiceAssistantAbilityAgentStub::SendStartAudioStreamIfNeeded() + { + VOICE_ASSISTANT_LOGI("SendStartAudioStreamIfNeeded"); + usleep(1000000); + + if (!isRecognizing_) { + VOICE_ASSISTANT_LOGI("SendStartAudioStreamIfNeeded: Is not recognizing, not need send start"); + return; + } + + if (voiceCloudManager_->IsSendingAudioStream()) { + VOICE_ASSISTANT_LOGI("SendStartAudioStreamIfNeeded: Is sending stream, not need send start"); + return; + } + if (voiceCloudManager_->GetStatus() == VoiceCloudStatusConnected) { + voiceCloudManager_->SendTrackStat(coord_.first, coord_.second, hotwords_); + voiceCloudManager_->SendStartAudioStream(); + VOICE_ASSISTANT_LOGI("SendStartAudioStreamIfNeeded: send start audio stream"); + } + } + + void VoiceAssistantAbilityAgentStub::VoiceCloudStatusChanged(VoiceCloudStatus status) + { + switch (status) { + case VoiceCloudStatusNone: + if (isRecognizing_) { + StopRecognize(); + } + break; + case VoiceCloudStatusConnected: { + std::thread startAudioStreamThread(&VoiceAssistantAbilityAgentStub::SendStartAudioStreamIfNeeded, this); + startAudioStreamThread.detach(); + } break; + default: + break; + } + } + + void VoiceAssistantAbilityAgentStub::ReveiceVoiceCloudMessage(void* data, size_t length, bool isBinary) + { + if (isBinary) { + VOICE_ASSISTANT_LOGI("ReveiceVoiceCloudMessage: not need parse binary"); + return; + } + + if (length == 0) { + return; + } + + std::string dataStr(static_cast(data), length); + VOICE_ASSISTANT_LOGI("ReveiceVoiceCloudMessage:length:%{public}zu, %{public}s", length, dataStr.c_str()); + nlohmann::json json = nlohmann::json::parse(dataStr, nullptr, false); + if (json.is_discarded()) { + VOICE_ASSISTANT_LOGI("ReveiceVoiceCloudMessage: json parse failed"); + return; + } + + std::string op = json.at("op"); + if (op == "stopListen") { + StopRecognize(); + } else { + if (op == "realTimeASRResult") { + bool isFinish = json.at("isFinish"); + if (isFinish) { + StopRecognize(); + } + } + + callbackEventTarget_->EmitAsrResult(dataStr); + } + } + + void VoiceAssistantAbilityAgentStub::AudioRecordStatusChanged(AudioRecordStatus status) + { + switch (status) { + case AudioRecordStatusNone: + if (isRecognizing_) { + StopRecognize(); + } + if (isWakeUpEnabled_) { + DisableWakeUp(); + } + break; + default: + break; + } + } + + void VoiceAssistantAbilityAgentStub::ReceiveAudioBuffer(void* data, size_t length) + { + SendAudioBufferToWebsocketIfNeeded(data, length); + CheckWakeUpIfNeeded(data, length); + } + + void VoiceAssistantAbilityAgentStub::WakeUpCallback(std::string text) + { + if (isRecognizing_ || !isWakeUpEnabled_) { + return; + } + + if (text == "你好博泰") { + callbackEventTarget_->EmitOnWakeUp(); + CommonUtils::VoiceAssistantErrorCode result = VOICE_ASSISTANT_OK; + StartRecognize(result); + } + } + + void VoiceAssistantAbilityAgentStub::AudioPlayerStatusChanged(bool isPlaying) + { + if (callbackEventTarget_ != nullptr) { + callbackEventTarget_->EmitTTSPlayStateChanged(isPlaying); + } + } + + void VoiceAssistantAbilityAgentStub::SendAudioBufferToWebsocketIfNeeded(void* data, size_t length) + { + if (!isRecognizing_) { + return; + } + + if (!voiceCloudManager_->IsSendingAudioStream()) { + return; + } + + voiceCloudManager_->SendBinary(data, length); + } + + void VoiceAssistantAbilityAgentStub::CheckWakeUpIfNeeded(void* data, size_t length) + { + if (!isWakeUpEnabled_) { + return; + } + + if (isRecognizing_) { + return; + } + + wakeUpManager_->Process(data, length); + } + + void VoiceAssistantAbilityAgentStub::PlayStartRecoginizingSound() + { + if (player_ == nullptr) { + player_ = OHOS::Media::PlayerFactory::CreatePlayer(); + } + player_->SetSource("/system/etc/pocketsphinx/voice_tip.mp3"); + player_->Prepare(); + player_->Play(); + } +} +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp new file mode 100644 index 0000000..3ca5a04 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp @@ -0,0 +1,64 @@ +#include "voice_assistant_agent_service.h" +#include "voice_assistant_log.h" +#include "ipc_skeleton.h" +#include "iservice_registry.h" +#include "system_ability.h" +#include "common_utils.h" +#include "voice_cloud_loader.h" + +using namespace OHOS::CarVoiceAssistant::CommonUtils; + +namespace OHOS { +namespace CarVoiceAssistant { + + REGISTER_SYSTEM_ABILITY_BY_ID(VoiceAssistantAgentService, CAR_VOICE_ASSISTANT_SERVICE_SA_ID, true); + + VoiceAssistantAgentService::VoiceAssistantAgentService(int32_t systemAbilityId, bool runOnCreate) + : SystemAbility(systemAbilityId, runOnCreate) + , state_(ServiceRunStateNotStart) + { + } + + VoiceAssistantAgentService::VoiceAssistantAgentService() + : state_(ServiceRunStateNotStart) + { + } + + VoiceAssistantAgentService::~VoiceAssistantAgentService() + { + } + + void VoiceAssistantAgentService::OnStart() + { + std::cout<<"Version: 0.0.1"< proxy, sptr deathRecipient) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::addListener"); + listenerList_.push_back({ proxy, deathRecipient }); + } + + void VoiceAssistantCallbackEventTarget::RemoveListener(const wptr& remote) + { + listenerList_.remove_if([remote](VoiceAssistantCallbackEventListener listener) -> bool { + if (listener.proxy_ == nullptr) { + return false; + } + sptr object = listener.proxy_->AsObject(); + if (object != nullptr && remote == object) { + if (listener.deathRecipient_) { + object->RemoveDeathRecipient(listener.deathRecipient_); + } + return true; + } + + return false; + }); + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::RemoveListener by remote:%{public}d", listenerList_.size()); + } + + void VoiceAssistantCallbackEventTarget::EmitOnWakeUp() + { + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::EmitOnWakeUp"); + DoEmit([](sptr& proxy) { + proxy->NotifyWakeUp(); + }); + } + + void VoiceAssistantCallbackEventTarget::EmitRecognizeStateChanged(bool isRecognizing) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::EmitRecognizeStateChanged:%{public}s", isRecognizing ? "true" : "false"); + DoEmit([isRecognizing](sptr& proxy) { + proxy->NotifyRecognizeStateChanged(isRecognizing); + }); + } + + void VoiceAssistantCallbackEventTarget::EmitAsrResult(std::string& result) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::EmitFavoriteListChanged:%{public}s", result.c_str()); + DoEmit([result](sptr& proxy) { + proxy->NotifyAsrResult(result); + }); + } + + void VoiceAssistantCallbackEventTarget::EmitTTSPlayStateChanged(bool isPlaying){ + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::EmitTTSPlayStateChanged:%{public}s", isPlaying ? "true" : "false"); + DoEmit([isPlaying](sptr& proxy) { + proxy->NotifyTTSPlayStateChanged(isPlaying); + }); + } + + template + void VoiceAssistantCallbackEventTarget::DoEmit(Callback callback) + { + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::DoEmit"); + for (std::list::iterator it = listenerList_.begin(); it != listenerList_.end(); it++) { + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::DoEmit schedule"); + if (it->proxy_ == nullptr) { + VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::DoEmit:proxy_ is null"); + continue; + } else { + callback(it->proxy_); + } + } + } + +} +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp new file mode 100644 index 0000000..792eb43 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp @@ -0,0 +1,109 @@ +#include "voice_assistant_client_callback_proxy.h" +#include "common_utils.h" +#include "iremote_object.h" +#include "iremote_proxy.h" +#include "voice_assistant_log.h" + +using namespace OHOS::CarVoiceAssistant::CommonUtils; + +namespace OHOS { +namespace CarVoiceAssistant { + +#define WRITE_PARCEL_WITH_RET(parcel, type, data, retval) \ + do { \ + if (!(parcel).Write##type(data)) { \ + VOICE_ASSISTANT_LOGI("%{public}s write " #data " failed", __func__); \ + return (retval); \ + } \ + } while (0) + +#define READ_PARCEL_WITH_RET(parcel, type, out, retval) \ + do { \ + if (!(parcel).Read##type(out)) { \ + VOICE_ASSISTANT_LOGI("%{public}s read " #out " failed", __func__); \ + return (retval); \ + } \ + } while (0) + + VoiceAssistantClientCallbackProxy::VoiceAssistantClientCallbackProxy(const sptr& impl) + : IRemoteProxy(impl) + { + } + + size_t VoiceAssistantClientCallbackProxy::NotifyWakeUp() + { + VOICE_ASSISTANT_LOGI("NotifyWakeUp"); + MessageParcel data; + MessageParcel reply; + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CALLBACK_ON_WAKEUP, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("NotifyWakeUp failed"); + return code; + } + return VOICE_ASSISTANT_OK; + } + + size_t VoiceAssistantClientCallbackProxy::NotifyRecognizeStateChanged(bool isRecognizing) + { + VOICE_ASSISTANT_LOGI("NotifyRecognizeStateChanged:%{public}s", isRecognizing ? "true" : "false"); + MessageParcel data; + MessageParcel reply; + + WRITE_PARCEL_WITH_RET(data, Bool, isRecognizing, VOICE_ASSISTANT_ERR); + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CALLBACK_RECOGNIZE_STATE_CHANGED, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("NotifyRecognizeStateChanged failed"); + return code; + } + return VOICE_ASSISTANT_OK; + } + + size_t VoiceAssistantClientCallbackProxy::NotifyAsrResult(std::string result) + { + VOICE_ASSISTANT_LOGI("NotifyAsrResult:%{public}s", result.c_str()); + MessageParcel data; + MessageParcel reply; + + WRITE_PARCEL_WITH_RET(data, String, result, VOICE_ASSISTANT_ERR); + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSITANT_CALLBACK_ASR_RESULT, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("NotifyAsrResult failed"); + return code; + } + return VOICE_ASSISTANT_OK; + } + + size_t VoiceAssistantClientCallbackProxy::NotifyTTSPlayStateChanged(bool isPlaying) + { + VOICE_ASSISTANT_LOGI("NotifyTTSPlayStateChanged:%{public}s", isPlaying ? "true" : "false"); + MessageParcel data; + MessageParcel reply; + + WRITE_PARCEL_WITH_RET(data, Bool, isPlaying, VOICE_ASSISTANT_ERR); + + CommonUtils::VoiceAssistantErrorCode code = DoDispatch(VOICE_ASSISTANT_CALLBACK_TTS_STATE_CHANGED, data, reply); + if (code != VOICE_ASSISTANT_OK) { + VOICE_ASSISTANT_LOGI("NotifyTTSPlayStateChanged failed"); + return code; + } + return VOICE_ASSISTANT_OK; + } + + CommonUtils::VoiceAssistantErrorCode VoiceAssistantClientCallbackProxy::DoDispatch(uint32_t cmd, MessageParcel& data, MessageParcel& reply) + { + VOICE_ASSISTANT_LOGI("%{public}s:%{public}d cmd:%{public}d", __func__, __LINE__, cmd); + + MessageOption option; + auto ret = Remote()->SendRequest(cmd, data, reply, option); + VOICE_ASSISTANT_LOGI("%{public}s:%{public}d SendRequest end cmd:%{public}d ", __func__, __LINE__, cmd); + if (ret != ERR_NONE) { + VOICE_ASSISTANT_LOGI("failed to send request, cmd: %{public}d, ret: %{public}d", cmd, ret); + return VOICE_ASSISTANT_ERR; + } + VOICE_ASSISTANT_LOGI(" success to dispatch cmd: %{public}d", cmd); + return VOICE_ASSISTANT_OK; + } +} +} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt new file mode 100644 index 0000000..5cc475e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt @@ -0,0 +1,77 @@ +voicecloud语音识别返回数据格式: + +op: string // 消息类型 realTimeASRResult 实时上屏文字 / nluResult 语义解析返回 / stopListen 停止识别 +isFinish: true/false //识别是否结束 +text: string //识别的文字 +needDeclare: true/false //是否多轮 +tts: string //回复文字 +intentName: string //意图 +control:string //热词 intentName为UIControl时有效 +modeType: string //模式 +action:string //动作 +value: int //值 +positions: string //位置 + +示例: + +// 实时上屏 +op: realTimeASRResult +isFinish: false +text: 你好 + +//停止识别 +op: stopListen + +// 闲聊,例如 今天天气怎么样 +op: nluResult +intentName: CHAT +needDeclare: false +tts: "今天白天20摄氏度...." + + +//热词 +op: nluResult +intentName: UIControl +control: uicontrol_commo$OpenAir + +//空调温度/风量增减 +op: nluResult +intentName: CAR_AIR_CONDITION_CTRL +modeType: TEMPERATURE_ADJUST/AIRVOLUME_ADJUST +action:INCREASE/DECREASE + +//空调温度、风量设置 +op: nluResult +intentName: CAR_AIR_CONDITION_CTRL +modeType: TEMPERATURE_SET/AIRVOLUME_SET +value: 20 + +//空调外循环/内循环/制热/制冷/通风/除湿/自动/开关 +op: nluResult +intentName: CAR_AIR_CONDITION_CTRL +modeType: OUT_LOOP/IN_LOOP/HOT/COLD/VENTILATION/AREF/AUTO/DOACTION +action: OPEN/CLOSE + +//空调除雾/除霜 +op: nluResult +intentName: CAR_AIR_CONDITION_CTRL +modeType: DEFROST/DEMIST +action: OPEN/CLOSE +positions: FRONT/BACK/ + +//天窗开关 +op: nluResult +intentName: CAR_SKYLIGHT_CTRL +modeType: DOACTION +action: OPEN/CLOSE + +op: nluResult +intentName: CAR_SKYLIGHT_CTRL +modeType: SKYLIGHT_SET +value: 0.5 + +//遮阳帘开关 +op: nluResult +intentName: CAR_SUNSHADE_CTRL +modeType: DOACTION +action: OPEN/CLOSE \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn new file mode 100644 index 0000000..c9d0d70 --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn @@ -0,0 +1,68 @@ +#Copyright (C) 2021 HiHope Open Source Organization . +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. + +import("//build/ohos.gni") +import("//build/ohos/ndk/ndk.gni") + + + +ohos_executable("client_test") { + cflags = ["-Wno-unused-variable", "-Wno-unused-function", "-Wno-implicit-function-declaration", "-Wno-unused-private-field"] + cflags_cc = ["-fexceptions"] + + install_enable = true + include_dirs = [ + "//base/miscservices/voiceassistant/frameworks/utils/include", + "//base/miscservices/voiceassistant/interfaces/kits/js/napi/include", + "//base/miscservices/voiceassistant/services/include/client", + "//foundation/ace/napi/interfaces/kits", + "//utils/native/base/include", + "//utils/system/safwk/native/include", + "//third_party/openssl/include", + "//third_party/json/single_include", + "//third_party" + ] + + sources = [ + "client_test.cpp" + ] + + deps = [ + "//base/miscservices/voiceassistant/services:carvoiceassistant", + "//foundation/ace/napi/:ace_napi", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base:appexecfwk_base", + "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler", + "//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core", + "//foundation/communication/ipc/interfaces/innerkits/ipc_single:ipc_single", + "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", + "//foundation/distributedschedule/samgr/interfaces/innerkits/samgr_proxy:samgr_proxy", + "//utils/native/base:utils", + "//third_party/libwebsockets:websockets", + "//third_party/openssl:libcrypto_static", + "//third_party/openssl:ssl_source", + "//third_party/zlib:libz" + ] + + external_deps = [ + "hiviewdfx_hilog_native:libhilog" + ] + + subsystem_name = "miscservices" + part_name = "voiceassistant" + install_images = [ + "system", + "updater", + ] + +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp new file mode 100644 index 0000000..6cd479e --- /dev/null +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp @@ -0,0 +1,71 @@ +#include "voice_assistant_client_manager.h" +#include "common_utils.h" +#include +#include +#include + +using namespace OHOS; +using namespace OHOS::CarVoiceAssistant; +using namespace std; + +int main() +{ + VoiceAssistantClientManager* manager = VoiceAssistantClientManager::GetInstance(); + + bool isEnableWakeUp = true; + manager->IsEnableWakeUp(isEnableWakeUp); + cout << "isEnableWakeUp:" << isEnableWakeUp << endl; + + while (true) { + cout << "**************************************" << endl; + cout << "1. change speaker" << endl; + cout << "2. speak tts" << endl; + cout << "3. start recognizer" << endl; + cout << "4. stop recognizer" << endl; + cout << "5. register hotwords" << endl; + cout << "6. enable wakeup" << endl; + cout << "7. disable wakeup" << endl; + cout << "8. stop speak tts" << endl; + cout << "**************************************" << endl; + + std::string line; + getline(cin, line); + if (line == "1") { + cout << "input speaker:" << endl; + std::string speaker; + getline(cin, speaker); + if (speaker.length() > 0) { + manager->ChangeSpeakerType(speaker); + } + } else if (line == "2") { + std::string tts = "大连市今天多云,气温15~21℃,西北风6~7级, 温度适宜。"; + CommonUtils::VoiceAssistantErrorCode result = CommonUtils::VOICE_ASSISTANT_OK; + manager->PlayTTS(result, tts); + } else if (line == "3") { + CommonUtils::VoiceAssistantErrorCode result = CommonUtils::VOICE_ASSISTANT_OK; + manager->StartRecognize(result); + cout << "result:" << result << endl; + } else if (line == "4") { + manager->StopRecognize(); + } else if (line == "5") { + std::list> items; + items.push_back({ { "title", "打开车窗" }, { "url", "uicontrol_common$Open_Car_Window" } }); + items.push_back({ { "title", "关闭车窗" }, { "url", "uicontrol_common$Close_Car_Window" } }); + items.push_back({ { "title", "打开空调" }, { "url", "uicontrol_common$Open_Car_Air" } }); + items.push_back({ { "title", "关闭空调" }, { "url", "uicontrol_common$Close_Car_Air" } }); + + nlohmann::json j = items; + std::string jsonStr = j.dump(); + + manager->RegisterHotwords(jsonStr); + } else if (line == "6") { + manager->EnableWakeUp(); + } else if (line == "7") { + manager->DisableWakeUp(); + } else if (line == "8") { + manager->StopPlayTTS(); + } + } + + return 0; +} \ No newline at end of file diff --git a/docs/PATEO_CarVoiceAssistant/README_zh.md b/docs/PATEO_CarVoiceAssistant/README_zh.md new file mode 100644 index 0000000..e6b927c --- /dev/null +++ b/docs/PATEO_CarVoiceAssistant/README_zh.md @@ -0,0 +1,78 @@ +[博泰OpenHarmony语音助理](../../FA/PATEO_CarVoiceAssistant) +========= +### 概述 + +博泰OpenHarmony语音助理项目,是由博泰&开放原子基金会联合立项的项目,由博泰车联网(南京)有限公司负责研发。 + +该项目是基于OpenHarmony系统研发的一款语音类产品,包含了语音AI子系统和语音助理应用两大功能模块。 + +OpenHarmony语音助理突破了层层技术难关,实现了OH设备可见即可说的闭环能力,可对开发者基于语音能力的拓展开发进行赋能,对OpenHarmony系统生态共建具有里程碑的意义。 + +### UI效果图 + +![](./media/AppUI.jpg) + +### 视频演示 + +[视频链接](https://www.bilibili.com/video/BV1Ed4y1t7SW/) + +### 涉及OpenHarmony技术特性 + +- eTSUI + +- 音频数据采集AudioStandard::AudioCapturer + +- 音频播放OHOS::Media::Player + +- 子系统开发 + +- IPC通信 + +- NAPI + +### 基础信息 + +| 开发平台 | 系统类型 | 系统版本 | 开发语言 | IDE | +| -------- | -------- | ----------------------- | ------------ | ---------------- | +| DAYU200 | 标准系统 | OpenHarmony 3.1 Release | C++、JS、eTS | VS code、Dev Eco | + +**项目源码目录:[源码目录](../../FA/PATEO_CarVoiceAssistant)** + + +### 软件架构 +![框架图](media/架构图.jpg) + +服务补充说明: + +**QingAI:**博泰云服务,音频/文字互转,自然语言解析,最终语义反馈 + +**Sphinx:**唤醒词训练、声音采集,唤醒 + +**VAD:**语音活动检测,截取有效音频 + +**QGSpeechKit:**与QingAI云端通信的服务,含WebSocket网络连接,音频传输,云端ASR解析,NLU解析 + +**TTS****:**语音播报服务 + +**SA Service:**服务管理,跨进程通信服务 + +**NAPI:**服务层C++与应用层eTS转译服务 + +### 功能用例图 + +![用例图](media/功能图.png) + +### 交互流程图 + +![流程图](media/流程图.jpg) + + + +### 开发文档 + +本项目分为语音助理App和语音AI子系统两部分; + +如果你只关注语音助理App部分,可以参考[语音AI子系统集成文档](./语音AI子系统集成文档.md)将语音子系统服务集成到开发板中,然后参考[语音助理App开发文档](./语音助理App开发文档.md)安装App体验。 + +如果你想深入了解语音子系统源码,可以参考[语音AI子系统开发文档](./语音AI子系统开发文档.md)。 + diff --git a/docs/PATEO_CarVoiceAssistant/media/AppUI.jpg b/docs/PATEO_CarVoiceAssistant/media/AppUI.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afc6f3a2a995caa4133ea11849094451e668aca8 GIT binary patch literal 426105 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 W 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

ZP$DQ*yNW8URTOO_LL>I3s6C6? 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 F{{?X5b;kez literal 0 HcmV?d00001 diff --git "a/docs/PATEO_CarVoiceAssistant/media/\345\212\237\350\203\275\345\233\276.png" "b/docs/PATEO_CarVoiceAssistant/media/\345\212\237\350\203\275\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..49e5f595041f34c795fb66891e7fc77acaafbc7d GIT binary patch literal 102650 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 Tzk5xP0SG)@{an^LB{Ts5(SV0} literal 0 HcmV?d00001 diff --git "a/docs/PATEO_CarVoiceAssistant/media/\345\255\220\347\263\273\347\273\237\345\224\244\351\206\222\346\265\201\347\250\213\345\233\276.jpg" "b/docs/PATEO_CarVoiceAssistant/media/\345\255\220\347\263\273\347\273\237\345\224\244\351\206\222\346\265\201\347\250\213\345\233\276.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..bf2cda84db2fb1a33705d471b63e2d5c39075584 GIT binary patch literal 95122 zcmeFZ2V7I#wl5k)P*6~+0s>M(2Q{Gx0!k;LhAIS5T7b|bG-;xu^crfY(g{^sXaW{` zCxp;Nx>S{3L>}&M@2%&&Z=ZYazUSVz@4av4m$m+xYt1p|nrpW4pJU`?^yCxZGE^C& z3?Lx^07yzg#$T6>u8P-UI*~o!n45D)QIw8yR2!8TYqf zZt42yZ}?Bnr*e0RKcxczL&AS@{l67OVP)-Vd3w{=)2|!qH1pHKTAgBgn?La5pV;CL z9R3rd^mG(X?|F5K`D}i}7QbOnw?}TL_jLTc-|`XaC!RdT(vA-9KlAz-ewO&6wUfT? z>G}TY_Zq+zpaW0=$e-f>((tQ3owERd+dBXNY4oo+3k(2I^AZ5KI{qt;`xO9i=>-6Q z>wjd9GXG0q&Ym96AP@k+W@bU$U3#YOFo#Esy zfaW~eeNr7#5>CJw8WK_(l9Lty+iBZ9ZPuiJIsQ=z=g*O!C8HocLqd6a{lR4bfQ*!s z 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 R-|x5o|L*_84DkP%`Zvpai`oDH literal 0 HcmV?d00001 diff --git "a/docs/PATEO_CarVoiceAssistant/media/\346\236\266\346\236\204\345\233\276.jpg" "b/docs/PATEO_CarVoiceAssistant/media/\346\236\266\346\236\204\345\233\276.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..765d1895805d38121ba30a910c7a63a6fc14791e GIT binary patch literal 197288 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%0DYv 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

AFvXOzXKJb)~ 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�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 s^y(YE`u0ynZ+i9ZPmB8W8v8%qtI%ug3=9|K|Kq literal 0 HcmV?d00001 diff --git "a/docs/PATEO_CarVoiceAssistant/media/\346\265\201\347\250\213\345\233\276.jpg" "b/docs/PATEO_CarVoiceAssistant/media/\346\265\201\347\250\213\345\233\276.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..c62af73f38e1b5afc9da3907815ec47d0e2f85c2 GIT binary patch literal 147681 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%0DN}4+mAKBupIMcvWa!GWF@o-Sgd{< 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 literal 0 HcmV?d00001 diff --git "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" new file mode 100644 index 0000000..d92adfb --- /dev/null +++ "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" @@ -0,0 +1,121 @@ +## [语音AI子系统开发文档](../../FA/PATEO_CarVoiceAssistant/voiceassistant) + +### 1. 子系统介绍 + +语音子系统作为`miscservices`子系统下一个`part`(`voiceassistant`)集成在系统代码中;包含9个`module`,实现语音唤醒、语义解析、TTS播报、录音等功能;App调用JS接口,通过NPI调用client端代码,client发消息给server端,server端执行具体逻辑。 + +**代码目录: [语音AI子系统目录](../../FA/PATEO_CarVoiceAssistant/voiceassistant)** + +### 2. 编译代码 + +1. 准备好OpenHarmony源码编译环境,参考[标准系统编译构建指导](https://docs.openharmony.cn/pages/v3.1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md/); +2. 执行`prebuild.sh`( [脚本所在目录](../../FA/PATEO_CarVoiceAssistant/voiceassistant))脚本,将云语音动态库、唤醒语言模型等资源解压到代码目录中; +3. 将`voiceassistant`目录拷贝到系统源码`系统源码目录/base/miscservices/`下; +4. 修改`系统源码目录/productdefine/common/products/DAYU.json`文件,添加`"miscservices:voiceassistant":{},`; +5. 执行编译指令`build.sh --product-name DAYU` + +### 3. 开发板集成 + +集成有两种方式: + +1. 将源码编译生成的镜像刷到开发版中;具体参考开发板的刷机教程; + +2. 如果您开发板已经安装好OpenHarmony 3.1 Release系统,可以将生成的动态库、资源文件,参考[语音AI子系统集成文档](语音AI子系统集成文档.md)集成。 + +### 4. 代码架构 + +1. 代码目录如下: + +```bash +├── etc #语音助理SA服务启动配置 +├── frameworks #FWK目录 +│   ├── manager #管理类,包括录音管理、唤醒管理、TTS播报管理、云语音动态库管理 +│   ├── pocketsphinx #开源库pocketsphinx,用于语音识别 +│   ├── utils #工具类、日志等 +│   ├── vad #开源库VAD检测,用于分割录音中有效音频部分 +│   └── voiceclouddll #云语音动态库,用于语义解析、TTS文字转语音 +├── interfaces #NAPI模块 +│   └── kits +│   └── js +│   ├── declaration #定义ts接口文件 +│   └── napi #NAPI实现类 +├── profile #语音助理SA服务配置 +├── resources #资源文件:语言模型、提示音文件 +├── services #SA服务server、client代码 +└── test #测试类 + +``` + +2. 唤醒、语义识别流程图如下: + +![子系统唤醒流程图](./media/子系统唤醒流程图.jpg) + +3. module说明: + + `pocketsphinx`:语音唤醒库; + + `ps_vad`:VAD检测库,用于检测有效音频流; + + `voicecloud_dll`:云语音动态库; + + `voice_assistant_service.rc`:语音助理SA服务启动配置,开机后自动启动语音助理服务; + + `voice_assistant_sa_profiles`:语音助理SA服务配置; + + `pocketsphinx_all_source`:语音助理相关资源,包含语言模型、提示音文件; + + `voiceassistant_js`: JS声明文件; + + `voiceassistant_service_group`:包含SA服务动态库和语音助理动态库 + + `carvoiceassistant`:语音助理动态库,App层调用引用JS声明文件,自动加载该动态库,JS接口的具体实现代码也在该动态库中; + + `voiceassistant_service`:SA服务动态库,系统启动时加载该动态库启动语音助理SA服务; + + `client_test`:测试程序。 + +4. 相关类和文件说明: + + NAPI: + + `@ohos.carvoiceassistant.d.ts`:语音助理ts声明文件; + + `VoiceAssistantEventTarget`:client端回调到App的NAPI接口实现; + + `voice_assistant_napi.cpp`:NAPI接口实现; + + framework: + + `AudioRecordManager`:音频录制类,用于录制音频,返回音频流; + + `IWakeUpManager`:唤醒抽象类,包含音频流处理接口,唤醒结果回调接口,开发者可以实现该抽象类接口来替换样例的唤醒引擎; + + `WakeUpManager`: `IWakeUpManager`的具体实现类,使用 WebRtcVad分割音频,pocketsphinx语音识别; + + `TTSManager`:TTS管理类,用于TTS文字转语音(调用云语音接口),并调用播放器播放; + + `voice_cloud_loader`:云语音动态库加载,提供文字转语音接口和语义解析功能。 + + `IVoiceCloudManager`:云语音解析抽象类,包含语义解析、TTS文字转语音接口,开发者可以实现该抽象类接口来替换样例的云语音动态库; + + server端: + + `VoiceAssistantAbilityAgentStub`:负责接收client端发来的消息,并调用相关管理类处理消息; + + `VoiceAssistantAgentService`:SA服务管理类; + + `VoiceAssistantCallbackEventTarget`:client回调管理类,用于client回调的注册、注销、回调处理; + + `VoiceAssistantClientCallbackProxy`:client回调类,用于回调语义解析消息、唤醒状态、识别状态等到client端; + + `VoiceAssistantClientCallbackDeathRecipient`:client回调状态监听类,client断开时注销回调; + + client端: + + `IVoiceAssistantAbilityAgent`:与server通信抽象类; + + `VoiceAssistantAbilityAgentProxy`:实现与server具体通信逻辑; + + `VoiceAssistantClientCallbackStub`:接收server回调,并通过NAPI接口回调到App; + + `VoiceAssistantClientManager`:client端管理类,用于与server端建立连接,发送消息。 \ No newline at end of file diff --git "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\351\233\206\346\210\220\346\226\207\346\241\243.md" "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\351\233\206\346\210\220\346\226\207\346\241\243.md" new file mode 100644 index 0000000..bb38aff --- /dev/null +++ "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\351\233\206\346\210\220\346\226\207\346\241\243.md" @@ -0,0 +1,44 @@ +## 语音AI子系统集成 + +1. 系统版本要求:OpenHarmony 3.1Release, 请确认当前开发板的版本**录音功能、网络功能**是否正常。 + +2. 解压[data.zip文件](../../FA/PATEO_CarVoiceAssistant/data.zip) + +3. 使用hdc工具将data中的文件发送到OpenHarmony系统中: + + ```bash + #1. 将动态库和资源文件发送到OpenHarmony系统中 + # 如果提示Read only system;进入OH系统后执行:"mount -o rw,remount /"命令后再发送文件 + hdc_std.exe file send voice_assistant_service.xml /system/profile/ + hdc_std.exe file send libcarvoiceassistant.z.so /system/lib/module/libcarvoiceassistant.z.so + hdc_std.exe file send libvoiceassistant_service.z.so /system/lib/libvoiceassistant_service.z.so + hdc_std.exe file send libpocketsphinx.z.so /system/lib/module/libpocketsphinx.z.so + hdc_std.exe file send libps_vad.z.so /system/lib/module/libps_vad.z.so + hdc_std.exe file send libvoicecloud.z.so /system/lib/libvoicecloud.z.so + hdc_std.exe file send voice_assistant_service.cfg /system/etc/init/ + + #在系统/system/etc/下,创建目录pocketsphinx; 创建目录命令: mkdir /system/etc/pocketsphinx + hdc_std.exe file send voice_tip.mp3 /system/etc/pocketsphinx/ + hdc_std.exe file send zh.tar /system/etc/pocketsphinx/ + + #在OpenHarmony系统中解压zh.tar + tar xvf zh.tar + + #确保/system/etc/pocketsphinx/下文件目录结构如下: + ├── zh + │   ├── zh + │   │   ├── feat.params + │   │   ├── feature_transform + │   │   ├── mdef + │   │   ├── means + │   │   ├── mixture_weights + │   │   ├── noisedict + │   │   ├── transition_matrices + │   │   └── variances + │   ├── zh_cn.dic + │   └── zh_cn.lm.bin + ├── voice_tip.mp3 + + #重启系统 + ``` + diff --git "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" new file mode 100644 index 0000000..93e5c9e --- /dev/null +++ "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" @@ -0,0 +1,74 @@ +## [语音助理App开发文档](../../FA/PATEO_CarVoiceAssistant/VoiceAssistantApp) + +### 1. 介绍 + +语音助理App主要实现语音唤醒、语音识别、热词注册、文字上屏、车辆控制等功能;使用eTS语言开发。运行此App时,请确认开发板已集成语音子系统服务,语音子系统集成文档链接:[语音AI子系统集成文档](./语音AI子系统集成文档.md)。 + +**代码目录:[语音助理App目录](../../FA/PATEO_CarVoiceAssistant/VoiceAssistantApp)** + +### 2. 主要功能介绍 + +1. 引入语音助理声明文件,声明文件:[文件链接](../../FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts) + + ```js + import carvoiceassistant from '@ohos.carvoiceassistant' + let voiceManager = carvoiceassistant.getManager(); // 获取语音助理管理类 + ``` + +2. 开启唤醒 + + ```js + voiceManager.enableWakeUp() + ``` + +3. 注册热词 + + ```js + voiceManager.registerHotwords(JSON.stringify(hotwords)) + ``` + +4. 经纬度设置,用于云语音定位地理位置;例如“今天天气怎么样?”语义可以返回设置的经纬度地区的天气信息。 + + ```js + voiceManager.setCoord(23.025978, 113.754969) + ``` + +5. 监听回调,可以监听识别状态、语义解析回调、TTS播报状态。 + + ```js + voiceManager.on(carvoiceassistant.EventType.VoiceAssistantEventTypeRecognizeStateChanged, (err, data) => { + this.isRecognizing = data['isRecognizing'] + if (this.isRecognizing) { + this.voiceText = "我正在听..." + } else if (this.voiceText == "我正在听...") { + this.voiceText = '' + } + }) + voiceManager.on(carvoiceassistant.EventType.VoiceAssistantEventTypeAsrResult, (err, data) => { + let json: AsrModel = JSON.parse(data['result']) + ... + }) + voiceManager.on(carvoiceassistant.EventType.VoiceAssistantEventTypeTTSPlayStateChanged, (err, data) => { + let isPlaying = data["isPlaying"] + if (isPlaying == false) { + if (this.needDeclare) { + this.isUserStopRecognizing = false; + this.needDeclare = false; + voiceManager.startRecognize(); + } + this.voiceText = ''; + } + }) + } + ``` + + 5. 识别接口 + + ```js + voiceManager.startRecognize(); //开始识别 + voiceManager.stopRecognize(); //停止识别 + ``` + + + +​ \ No newline at end of file -- Gitee From b698de16da982449d48f7a99c7ccfaa181c3b19e Mon Sep 17 00:00:00 2001 From: boyang Date: Thu, 24 Nov 2022 14:28:01 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=89=88=E6=9D=83?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E3=80=81=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: boyang --- .../VoiceAssistantApp/build-profile.json5 | 12 ----- .../entry/build-profile.json5 | 3 -- .../entry/src/main/ets/MainAbility/app.ets | 15 +++++- .../MainAbility/components/speakerComp.ets | 42 ---------------- .../ets/MainAbility/components/toastComp.ets | 49 ------------------- .../main/ets/MainAbility/models/asrModel.ets | 15 ++++++ .../src/main/ets/MainAbility/pages/index.ets | 41 ++++++---------- .../main/ets/MainAbility/utils/logUtil.ets | 16 +++++- .../VoiceAssistantApp/local.properties | 6 +-- .../VoiceAssistantApp/package.json | 30 ++++++------ .../voiceassistant/etc/init/BUILD.gn | 7 +-- .../etc/init/voice_assistant_service.rc | 6 +-- .../manager/include/audio_record_manager.h | 15 ++++++ .../manager/include/i_wakeup_manager.h | 16 ++++++ .../frameworks/manager/include/tts_manager.h | 15 ++++++ .../manager/include/voice_cloud_loader.h | 15 ++++++ .../manager/include/wakeup_manager.h | 16 ++++++ .../manager/src/audio_record_manager.cpp | 15 ++++++ .../frameworks/manager/src/tts_manager.cpp | 16 ++++++ .../manager/src/voice_cloud_loader.cpp | 15 ++++++ .../frameworks/manager/src/wakeup_manager.cpp | 15 ++++++ .../frameworks/pocketsphinx/BUILD.gn | 7 +-- .../frameworks/utils/include/common_utils.h | 15 ++++++ .../utils/include/voice_assistant_log.h | 15 ++++++ .../voiceassistant/frameworks/vad/BUILD.gn | 7 +-- .../frameworks/voiceclouddll/BUILD.gn | 7 +-- .../voiceclouddll/i_voice_cloud_manager.h | 15 ++++++ .../declaration/@ohos.carvoiceassistant.d.ts | 16 ++++++ .../interfaces/kits/js/declaration/BUILD.gn | 6 +-- .../include/voice_assistant_event_target.h | 15 ++++++ .../napi/include/voice_assistant_napi_tools.h | 15 ++++++ .../napi/src/voice_assistant_event_target.cpp | 15 ++++++ .../kits/js/napi/src/voice_assistant_napi.cpp | 15 ++++++ .../napi/src/voice_assistant_napi_tools.cpp | 15 ++++++ .../voiceassistant/prebuild.sh | 12 +++++ .../voiceassistant/profile/5102.xml | 24 ++++----- .../voiceassistant/profile/BUILD.gn | 6 +-- .../voiceassistant/resources/BUILD.gn | 7 +-- .../voiceassistant/services/BUILD.gn | 7 +-- .../client/voice_assistant_ability_agent.h | 16 ++++++ .../client/voice_assistant_ability_proxy.h | 16 ++++++ ...ce_assistant_agent_proxy_death_recipient.h | 16 ++++++ .../client/voice_assistant_client_callback.h | 16 ++++++ .../voice_assistant_client_callback_stub.h | 16 ++++++ .../client/voice_assistant_client_manager.h | 16 ++++++ .../server/voice_assistant_ability_stub.h | 16 ++++++ .../server/voice_assistant_agent_service.h | 16 ++++++ .../voice_assistant_callback_event_target.h | 15 ++++++ ...assistant_callback_proxy_death_recipient.h | 15 ++++++ .../voice_assistant_client_callback_proxy.h | 15 ++++++ .../client/voice_assistant_ability_proxy.cpp | 15 ++++++ .../voice_assistant_client_callback_stub.cpp | 15 ++++++ .../client/voice_assistant_client_manager.cpp | 15 ++++++ .../server/voice_assistant_ability_stub.cpp | 15 ++++++ .../server/voice_assistant_agent_service.cpp | 15 ++++++ .../voice_assistant_callback_event_target.cpp | 15 ++++++ .../voice_assistant_client_callback_proxy.cpp | 15 ++++++ .../services/src/voice_cloud_doc.txt | 15 ++++++ .../voiceassistant/test/client_test/BUILD.gn | 24 ++++----- .../test/client_test/client_test.cpp | 15 ++++++ 60 files changed, 728 insertions(+), 203 deletions(-) delete mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/speakerComp.ets delete mode 100644 FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/toastComp.ets diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 index da3c134..bbc7585 100644 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 @@ -1,18 +1,6 @@ { "app": { "signingConfigs": [ - { - "name": "default", - "material": { - "certpath": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_com.pateo.voiceassistant.cer", - "storePassword": "0000001AD71F1522D391A581FD55351890116B3FEF1EF70DCA414A32BEF5A47A765DBC85405ECD31F888", - "keyAlias": "debugKey", - "keyPassword": "0000001A16B4CDD9E39FEFE8D9FC01091B4C6CFF802F472F1CDCC40F3FAC55AF8D210246515E29B98B09", - "profile": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_com.pateo.voiceassistant.p7b", - "signAlg": "SHA256withECDSA", - "storeFile": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_com.pateo.voiceassistant.p12" - } - } ], "compileSdkVersion": 8, "compatibleSdkVersion": 8, diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 index bc9939e..5dd873a 100644 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 @@ -5,9 +5,6 @@ "targets": [ { "name": "default" - }, - { - "name": "ohosTest", } ] } \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets index b705469..58ff7c4 100644 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets @@ -1,4 +1,17 @@ - +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ export default { onCreate() { diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/speakerComp.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/speakerComp.ets deleted file mode 100644 index 35cbf32..0000000 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/speakerComp.ets +++ /dev/null @@ -1,42 +0,0 @@ -@Component -export default struct SpeakerDialog { - action: (speaker: string) => void - @Link visible: boolean - speakers = ['common', 'zhilingfa', 'qianranfa', 'tzruim', 'gqlanf', - 'jlshim', 'madoufp_wenrou', 'gdfanf_boy', 'gdfanfp', 'mandarin', - 'hchunf_ctn', 'wqingf_csn', 'aningf', 'yukaim_all'] - - tapAction(speaker: string) { - return () => { - this.action(speaker) - this.visible = false - } - } - - build() { - Stack() { - Scroll() { - Grid() { - ForEach(this.speakers, item => { - GridItem() { - Button(item) - .fontSize(40) - .height(70) - .fontColor(Color.White) - }.onClick(this.tapAction(item)) - }) - } - .columnsGap(15) - .rowsGap(15) - .padding({ top: 39, bottom: 39 }) - .columnsTemplate('1fr 1fr 1fr') - } - .backgroundColor('#FF0D0F10') - .borderRadius(18) - .width(950).height(500) - } - .width('100%') - .height('100%') - .visibility(this.visible ? Visibility.Visible : Visibility.Hidden) - } -} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/toastComp.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/toastComp.ets deleted file mode 100644 index 1f202b1..0000000 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/components/toastComp.ets +++ /dev/null @@ -1,49 +0,0 @@ -class ToastCompCallBack { - //通知组件显示toast - public tellShowToastCallback: (message: string, duration?: number) => void; -} - -export class ToastCompController extends ToastCompCallBack { - constructor() { - super(); - console.log("tttttt"); - } - - // 显示toast - public showToast(message: string, duration?: number) { - this.tellShowToastCallback(message, duration); - } -} - -@Component -export struct ToastComp { - @State show: boolean = false; - @State message: string = ''; - public controller: ToastCompController; - - aboutToAppear() { - this.controller.tellShowToastCallback = (message, duration) => { - this.show = true; - this.message = message; - setTimeout(() => { - this.show = false; - }, duration == null ? 2000 : duration); - } - } - - build() { - Stack() { - Text(this.message) - .fontColor('#FFFFFF') - .fontSize(30) - .textAlign(TextAlign.Center) - .backgroundColor('#BF0D0F10') - .width(720) - .borderRadius(18) - .padding({ top: 39, bottom: 39 }) - } - .width(1280) - .height(720) - .visibility(this.show ? Visibility.Visible : Visibility.None) - } -} \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets index 52c9101..ec1f209 100644 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + export default class AsrModel { op: 'realTimeASRResult' | 'nluResult' isFinish: boolean diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets index 029111a..92780ac 100644 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets @@ -1,11 +1,23 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import LogUtil from '../utils/logUtil' import carvoiceassistant from '@ohos.carvoiceassistant' -import { ToastCompController, ToastComp } from '../components/toastComp' -import SpeakerDialog from '../components/speakerComp' import AsrModel from '../models/asrModel'; import window from '@ohos.window'; import app from '@system.app'; -import geolocation from '@ohos.geolocation'; let voiceManager = carvoiceassistant.getManager(); @@ -53,7 +65,6 @@ struct Index { @State airWindColor: string = '#FFFFFF' @State airModeColor: string = '#FFFFFF' @State windowImage:Resource = $r('app.media.wind0') - private toastController = new ToastCompController() private isUserStopRecognizing = false private needDeclare = false @@ -66,16 +77,8 @@ struct Index { } } - requestLocation() { - var requestInfo = {'scenario': geolocation.LocationRequestScenario.NAVIGATION, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0}; - geolocation.on('locationChange', requestInfo, (location) => { - console.log('locationChanger: data: ' + JSON.stringify(location)); - }); - } - aboutToAppear() { this.fullWindow() -// this.requestLocation() this.isEnableWakeUp = voiceManager.isEnableWakeUp() this.isRecognizing = voiceManager.isRecognizing() @@ -421,18 +424,6 @@ struct Index { this.speakTTS('遮阳帘已关闭') } - selectSpeaker(speaker: string) { - this.changeSpeaker(speaker); - this.showToast("设置成功", true); - } - - showToast(text: string, needSpeak: boolean) { - this.toastController.showToast(text) - if (needSpeak) { - this.speakTTS(text); - } - } - speakTTS(tts: string) { if (tts.length == 0) { return @@ -614,8 +605,6 @@ struct Index { .width('100%') .height('100%') - ToastComp({ controller: this.toastController }) - SpeakerDialog({ action: this.selectSpeaker.bind(this), visible: $speakerDialogVisible }) } .backgroundColor("FF17212E") .width(screenHeight + 'px') diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets index b84ded7..8b4f682 100644 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets @@ -1,4 +1,18 @@ - +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + export default class LogUtil { static info(tag:String, str:string):void { console.info('[VA][' + tag + ']' + str) diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties index 5335e8e..d35a18a 100644 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties @@ -4,6 +4,6 @@ # This file should *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # -# For customization when using a Version Control System, please read the header note. -sdk.dir=C:/Users/Administrator/AppData/Local/OpenHarmony/Sdk -nodejs.dir=C:/Users/Administrator/nodejs \ No newline at end of file +# For customization when using a Version Control System, please read the header note. +sdk.dir=/Users/jihaihui/Library/OpenHarmony/sdk +nodejs.dir=/Users/jihaihui/nodejs \ No newline at end of file diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json index 4405e61..7b20761 100644 --- a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json +++ b/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json @@ -1,18 +1,18 @@ { - "license":"ISC", - "devDependencies":{}, - "name":"voiceassistant", - "ohos":{ - "org":"huawei", - "directoryLevel":"project", - "buildTool":"hvigor" + "license": "ISC", + "devDependencies": {}, + "name": "voiceassistant", + "ohos": { + "org": "huawei", + "directoryLevel": "project", + "buildTool": "hvigor" }, - "description":"example description", - "repository":{}, - "version":"1.0.0", - "dependencies":{ - "@ohos/hypium":"1.0.2", - "@ohos/hvigor-ohos-plugin":"1.2.2", - "@ohos/hvigor":"1.2.2" + "description": "example description", + "repository": {}, + "version": "1.0.0", + "dependencies": { + "@ohos/hypium": "1.0.2", + "@ohos/hvigor-ohos-plugin": "1.2.2", + "@ohos/hvigor": "1.2.2" } -} \ No newline at end of file +} diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn index 80146f6..cb3076f 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn @@ -1,15 +1,16 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import("//build/ohos.gni") diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc index 20711e5..76cdd95 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc @@ -1,10 +1,10 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h index 4c9ed8f..f246fa1 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_AUDIO_RECORD_MANAGER_H #define CAR_VOICE_ASSISTANT_AUDIO_RECORD_MANAGER_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h index 598274c..3d0ff4c 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_I_WAKEUP_MANAGER_H #define CAR_VOICE_ASSISTANT_I_WAKEUP_MANAGER_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h index e6439f3..d84b4bb 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_TTS_MANAGER_H #define CAR_VOICE_ASSISTANT_TTS_MANAGER_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h index ded440b..624c2e9 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_VOICE_CLOUD_LOADER_H #define CAR_VOICE_ASSISTANT_VOICE_CLOUD_LOADER_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h index 7d8f2c3..2db5e90 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_WAKEUP_MANAGER_H #define CAR_VOICE_ASSISTANT_WAKEUP_MANAGER_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp index 8cc35bb..3786a2b 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "audio_record_manager.h" #include "voice_assistant_log.h" #include "common_utils.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp index 177f5c9..7cca51e 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #include "tts_manager.h" #include "common_utils.h" #include "voice_assistant_log.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp index f9f6fca..e837c9f 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_cloud_loader.h" #include "voice_assistant_log.h" #include diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp index 0c04422..af0359a 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "wakeup_manager.h" #include "voice_assistant_log.h" #include diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn index 6dc0606..0fafe45 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn @@ -1,15 +1,16 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import("//build/ohos.gni") config("pocketsphinx_config") { diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h index df6ea22..e89597e 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_COMMON_UTILS_H #define CAR_VOICE_ASSISTANT_COMMON_UTILS_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h index 6d5cdad..1128ef2 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_LOG #define CAR_VOICE_ASSISTANT_LOG diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn index 57e73ac..4a00afe 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn @@ -1,15 +1,16 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import("//build/ohos.gni") config("ps_vad_config") { diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn index 4f8cecc..050e38c 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn @@ -1,15 +1,16 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import("//build/ohos.gni") ohos_prebuilt_shared_library("voicecloud_dll") { diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h index c514f48..a64838c 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_I_VOICE_CLOUD_H #define CAR_VOICE_ASSISTANT_I_VOICE_CLOUD_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts index 8835fb1..3d0bf61 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + import { AsyncCallback } from './basic'; declare namespace carVoiceAssistant { diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn index 2ea6378..10cd6ce 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2022 Huawei Device Co., Ltd. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h index 89b74b6..4069cb6 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef VOICE_ASSISTANT_EVENT_TARGET_H #define VOICE_ASSISTANT_EVENT_TARGET_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h index bbb4c40..618b55d 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef VOICE_ASSISTANT_NAPI_TOOLS_H #define VOICE_ASSISTANT_NAPI_TOOLS_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp index a749358..5d1e961 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_event_target.h" #include "securec.h" #include "voice_assistant_napi_tools.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp index 9eadbb9..0719a23 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "common_utils.h" #include "napi/native_api.h" #include "napi/native_node_api.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp index ca6d225..cbcf966 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_napi_tools.h" #include "voice_assistant_log.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh b/FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh index 5fb3f83..4fe678b 100755 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh @@ -1,3 +1,15 @@ +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. shpath=$(dirname $0) diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml b/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml index e843e80..3c93510 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml @@ -1,16 +1,16 @@ - voice_assistant_service diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn index bc6928c..42a9c8c 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn @@ -1,10 +1,10 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn index 33f029f..616eb91 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn @@ -1,15 +1,16 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import("//build/ohos.gni") ohos_prebuilt_etc("pocketsphinx_source1") { diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn index 9b2da59..00c7c5a 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn @@ -1,15 +1,16 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import("//build/ohos.gni") ohos_shared_library("carvoiceassistant") { diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h index 37e26f8..d2030f5 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_ABILITY_AGENT_H #define CAR_VOICE_ASSISTANT_ABILITY_AGENT_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h index bf2f787..9470ee1 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_ABILITY_PROXY_H #define CAR_VOICE_ASSISTANT_ABILITY_PROXY_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h index 50cf90a..8a0bebd 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_AGENT_PROXY_DEATH_RECIPIENT_H #define CAR_VOICE_ASSISTANT_AGENT_PROXY_DEATH_RECIPIENT_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h index 9b47409..1b6322d 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_H #define CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h index 9836255..f35da12 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_STUB_H #define CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_STUB_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h index 3964515..b709830 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef VOICE_ASSISTANT_CLIENT_MANAGER_H #define VOICE_ASSISTANT_CLIENT_MANAGER_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h index 3f192ca..ac576b9 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_ABILITY_STUB_H #define CAR_VOICE_ASSISTANT_ABILITY_STUB_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h index 5599a69..0db5adf 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef CAR_VOICE_ASSISTANT_AGENT_SERVICE_H #define CAR_VOICE_ASSISTANT_AGENT_SERVICE_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h index c01761b..29a29ca 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_CALLBACK_EVENT_TARGET_H #define CAR_VOICE_ASSISTANT_CALLBACK_EVENT_TARGET_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h index 22d2488..898535d 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_DEATH_RECIPIENT_H #define CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_DEATH_RECIPIENT_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h index c519175..25464bf 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_PROXY_H #define CAR_VOICE_ASSISTANT_CLIENT_CALLBACK_PROXY_H diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp index 10910ec..d851601 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_ability_proxy.h" #include "voice_assistant_client_callback_stub.h" #include "voice_assistant_log.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp index ef7ea49..e54ba74 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_client_callback_stub.h" #include "common_utils.h" #include "voice_assistant_client_manager.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp index 471243f..8fc3b57 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_client_manager.h" #include "voice_assistant_log.h" #include "common_utils.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp index d70f2fc..8e4da92 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_ability_stub.h" #include "common_utils.h" #include "nlohmann/json.hpp" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp index 3ca5a04..9810a67 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_agent_service.h" #include "voice_assistant_log.h" #include "ipc_skeleton.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp index daf70d7..a6d920b 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_callback_event_target.h" #include "voice_assistant_log.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp index 792eb43..acff1ba 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_client_callback_proxy.h" #include "common_utils.h" #include "iremote_object.h" diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt index 5cc475e..dce4fb2 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + voicecloud语音识别返回数据格式: op: string // 消息类型 realTimeASRResult 实时上屏文字 / nluResult 语义解析返回 / stopListen 停止识别 diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn b/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn index c9d0d70..5041c86 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn @@ -1,15 +1,15 @@ -#Copyright (C) 2021 HiHope Open Source Organization . -#Licensed under the Apache License, Version 2.0 (the "License"); -#you may not use this file except in compliance with the License. -#You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -#Unless required by applicable law or agreed to in writing, software -#distributed under the License is distributed on an "AS IS" BASIS, -#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -#See the License for the specific language governing permissions and -#limitations under the License. +# Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. import("//build/ohos.gni") import("//build/ohos/ndk/ndk.gni") diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp b/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp index 6cd479e..838d79a 100644 --- a/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp +++ b/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2022 PATEO CONNECT+ (Nanjing) Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "voice_assistant_client_manager.h" #include "common_utils.h" #include -- Gitee From 91caf0db45708448a3dff6b4d9c549958d986f06 Mon Sep 17 00:00:00 2001 From: boyang Date: Thu, 24 Nov 2022 15:52:22 +0800 Subject: [PATCH 3/6] =?UTF-8?q?voiceassistant=E7=A7=BB=E5=8A=A8=E5=88=B0de?= =?UTF-8?q?v=E7=9B=AE=E5=BD=95=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: boyang --- .gitattributes | 2 +- .../{VoiceAssistantApp => }/build-profile.json5 | 0 .../entry/build-profile.json5 | 0 .../{VoiceAssistantApp => }/entry/hvigorfile.js | 0 .../{VoiceAssistantApp => }/entry/package-lock.json | 0 .../{VoiceAssistantApp => }/entry/package.json | 0 .../entry/src/main/config.json | 0 .../entry/src/main/ets/MainAbility/app.ets | 0 .../src/main/ets/MainAbility/models/asrModel.ets | 0 .../entry/src/main/ets/MainAbility/pages/index.ets | 0 .../src/main/ets/MainAbility/utils/logUtil.ets | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/btn_focus.png | Bin .../src/main/resources/base/media/btn_normal.png | Bin .../entry/src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/media/icon_close.png | Bin .../src/main/resources/base/media/icon_temp.png | Bin .../src/main/resources/base/media/icon_wind.png | Bin .../entry/src/main/resources/base/media/seat.png | Bin .../src/main/resources/base/media/voice_ball.png | Bin .../src/main/resources/base/media/voice_bottom.png | Bin .../entry/src/main/resources/base/media/wind0.png | Bin .../entry/src/main/resources/base/media/wind1.png | Bin .../entry/src/main/resources/base/media/wind10.png | Bin .../entry/src/main/resources/base/media/wind2.png | Bin .../entry/src/main/resources/base/media/wind3.png | Bin .../entry/src/main/resources/base/media/wind4.png | Bin .../entry/src/main/resources/base/media/wind5.png | Bin .../entry/src/main/resources/base/media/wind6.png | Bin .../entry/src/main/resources/base/media/wind7.png | Bin .../entry/src/main/resources/base/media/wind8.png | Bin .../entry/src/main/resources/base/media/wind9.png | Bin .../src/main/resources/base/media/wind_close.png | Bin .../src/main/resources/base/media/wind_cold.png | Bin .../src/main/resources/base/media/wind_hot.png | Bin .../{VoiceAssistantApp => }/hvigorfile.js | 0 .../{VoiceAssistantApp => }/local.properties | 0 .../{VoiceAssistantApp => }/package-lock.json | 0 .../{VoiceAssistantApp => }/package.json | 0 {FA => dev/team_x}/PATEO_CarVoiceAssistant/data.zip | 0 .../voiceassistant/etc/init/BUILD.gn | 0 .../etc/init/voice_assistant_service.cfg | 0 .../etc/init/voice_assistant_service.rc | 0 .../manager/include/audio_record_manager.h | 0 .../frameworks/manager/include/i_wakeup_manager.h | 0 .../frameworks/manager/include/tts_manager.h | 0 .../frameworks/manager/include/voice_cloud_loader.h | 0 .../frameworks/manager/include/wakeup_manager.h | 0 .../frameworks/manager/src/audio_record_manager.cpp | 0 .../frameworks/manager/src/tts_manager.cpp | 0 .../frameworks/manager/src/voice_cloud_loader.cpp | 0 .../frameworks/manager/src/wakeup_manager.cpp | 0 .../voiceassistant/frameworks/pocketsphinx/BUILD.gn | 0 .../frameworks/pocketsphinx/include/CMakeLists.txt | 0 .../pocketsphinx/include/android/config.h | 0 .../pocketsphinx/include/android/sphinx_config.h | 0 .../frameworks/pocketsphinx/include/pocketsphinx.h | 0 .../pocketsphinx/include/pocketsphinx/cmdln_macro.h | 0 .../pocketsphinx/include/pocketsphinx/export.h | 0 .../pocketsphinx/include/pocketsphinx/ps_lattice.h | 0 .../pocketsphinx/include/pocketsphinx/ps_mllr.h | 0 .../pocketsphinx/include/pocketsphinx/ps_search.h | 0 .../pocketsphinx/include/sphinxbase/agc.h | 0 .../pocketsphinx/include/sphinxbase/bio.h | 0 .../pocketsphinx/include/sphinxbase/bitarr.h | 0 .../pocketsphinx/include/sphinxbase/bitvec.h | 0 .../pocketsphinx/include/sphinxbase/byteorder.h | 0 .../pocketsphinx/include/sphinxbase/case.h | 0 .../pocketsphinx/include/sphinxbase/ckd_alloc.h | 0 .../pocketsphinx/include/sphinxbase/clapack_lite.h | 0 .../pocketsphinx/include/sphinxbase/cmd_ln.h | 0 .../pocketsphinx/include/sphinxbase/cmn.h | 0 .../pocketsphinx/include/sphinxbase/err.h | 0 .../pocketsphinx/include/sphinxbase/f2c.h | 0 .../frameworks/pocketsphinx/include/sphinxbase/fe.h | 0 .../pocketsphinx/include/sphinxbase/feat.h | 0 .../pocketsphinx/include/sphinxbase/filename.h | 0 .../pocketsphinx/include/sphinxbase/fixpoint.h | 0 .../pocketsphinx/include/sphinxbase/fsg_model.h | 0 .../pocketsphinx/include/sphinxbase/genrand.h | 0 .../pocketsphinx/include/sphinxbase/glist.h | 0 .../pocketsphinx/include/sphinxbase/hash_table.h | 0 .../pocketsphinx/include/sphinxbase/heap.h | 0 .../pocketsphinx/include/sphinxbase/jsgf.h | 0 .../include/sphinxbase/listelem_alloc.h | 0 .../pocketsphinx/include/sphinxbase/logmath.h | 0 .../pocketsphinx/include/sphinxbase/matrix.h | 0 .../pocketsphinx/include/sphinxbase/mmio.h | 0 .../pocketsphinx/include/sphinxbase/ngram_model.h | 0 .../pocketsphinx/include/sphinxbase/pio.h | 0 .../pocketsphinx/include/sphinxbase/prim_type.h | 0 .../include/sphinxbase/priority_queue.h | 0 .../pocketsphinx/include/sphinxbase/profile.h | 0 .../pocketsphinx/include/sphinxbase/sbthread.h | 0 .../pocketsphinx/include/sphinxbase/sphinx_config.h | 0 .../include/sphinxbase/sphinxbase_export.h | 0 .../pocketsphinx/include/sphinxbase/strfuncs.h | 0 .../pocketsphinx/include/sphinxbase/yin.h | 0 .../frameworks/pocketsphinx/include/win32/config.h | 0 .../pocketsphinx/include/win32/sphinx_config.h | 0 .../frameworks/pocketsphinx/include/wince/assert.h | 0 .../frameworks/pocketsphinx/include/wince/config.h | 0 .../frameworks/pocketsphinx/include/wince/errno.h | 0 .../pocketsphinx/include/wince/sphinx_config.h | 0 .../frameworks/pocketsphinx/src/CMakeLists.txt | 0 .../frameworks/pocketsphinx/src/acmod.c | 0 .../frameworks/pocketsphinx/src/acmod.h | 0 .../frameworks/pocketsphinx/src/allphone_search.c | 0 .../frameworks/pocketsphinx/src/allphone_search.h | 0 .../frameworks/pocketsphinx/src/bin_mdef.c | 0 .../frameworks/pocketsphinx/src/bin_mdef.h | 0 .../frameworks/pocketsphinx/src/blkarray_list.c | 0 .../frameworks/pocketsphinx/src/blkarray_list.h | 0 .../frameworks/pocketsphinx/src/dict.c | 0 .../frameworks/pocketsphinx/src/dict.h | 0 .../frameworks/pocketsphinx/src/dict2pid.c | 0 .../frameworks/pocketsphinx/src/dict2pid.h | 0 .../frameworks/pocketsphinx/src/fast_ptm.txt | 0 .../frameworks/pocketsphinx/src/fe/fe_interface.c | 0 .../frameworks/pocketsphinx/src/fe/fe_internal.h | 0 .../frameworks/pocketsphinx/src/fe/fe_noise.c | 0 .../frameworks/pocketsphinx/src/fe/fe_noise.h | 0 .../frameworks/pocketsphinx/src/fe/fe_sigproc.c | 0 .../frameworks/pocketsphinx/src/fe/fe_type.h | 0 .../frameworks/pocketsphinx/src/fe/fe_warp.c | 0 .../frameworks/pocketsphinx/src/fe/fe_warp.h | 0 .../frameworks/pocketsphinx/src/fe/fe_warp_affine.c | 0 .../frameworks/pocketsphinx/src/fe/fe_warp_affine.h | 0 .../pocketsphinx/src/fe/fe_warp_inverse_linear.c | 0 .../pocketsphinx/src/fe/fe_warp_inverse_linear.h | 0 .../pocketsphinx/src/fe/fe_warp_piecewise_linear.c | 0 .../pocketsphinx/src/fe/fe_warp_piecewise_linear.h | 0 .../frameworks/pocketsphinx/src/fe/fixlog.c | 0 .../pocketsphinx/src/fe/make_log_sub_table.py | 0 .../pocketsphinx/src/fe/make_log_table.py | 0 .../frameworks/pocketsphinx/src/fe/yin.c | 0 .../frameworks/pocketsphinx/src/feat/agc.c | 0 .../frameworks/pocketsphinx/src/feat/cmn.c | 0 .../frameworks/pocketsphinx/src/feat/cmn_live.c | 0 .../frameworks/pocketsphinx/src/feat/feat.c | 0 .../frameworks/pocketsphinx/src/feat/lda.c | 0 .../frameworks/pocketsphinx/src/fsg_history.c | 0 .../frameworks/pocketsphinx/src/fsg_history.h | 0 .../frameworks/pocketsphinx/src/fsg_lextree.c | 0 .../frameworks/pocketsphinx/src/fsg_lextree.h | 0 .../frameworks/pocketsphinx/src/fsg_search.c | 0 .../pocketsphinx/src/fsg_search_internal.h | 0 .../frameworks/pocketsphinx/src/hmm.c | 0 .../frameworks/pocketsphinx/src/hmm.h | 0 .../frameworks/pocketsphinx/src/kws_detections.c | 0 .../frameworks/pocketsphinx/src/kws_detections.h | 0 .../frameworks/pocketsphinx/src/kws_search.c | 0 .../frameworks/pocketsphinx/src/kws_search.h | 0 .../frameworks/pocketsphinx/src/lm/_jsgf_scanner.l | 0 .../frameworks/pocketsphinx/src/lm/fsg_model.c | 0 .../frameworks/pocketsphinx/src/lm/jsgf.c | 0 .../frameworks/pocketsphinx/src/lm/jsgf_internal.h | 0 .../frameworks/pocketsphinx/src/lm/jsgf_parser.c | 0 .../frameworks/pocketsphinx/src/lm/jsgf_parser.h | 0 .../frameworks/pocketsphinx/src/lm/jsgf_parser.y | 0 .../frameworks/pocketsphinx/src/lm/jsgf_scanner.c | 0 .../frameworks/pocketsphinx/src/lm/jsgf_scanner.h | 0 .../frameworks/pocketsphinx/src/lm/lm_trie.c | 0 .../frameworks/pocketsphinx/src/lm/lm_trie.h | 0 .../frameworks/pocketsphinx/src/lm/lm_trie_quant.c | 0 .../frameworks/pocketsphinx/src/lm/lm_trie_quant.h | 0 .../frameworks/pocketsphinx/src/lm/ngram_model.c | 0 .../pocketsphinx/src/lm/ngram_model_internal.h | 0 .../pocketsphinx/src/lm/ngram_model_set.c | 0 .../pocketsphinx/src/lm/ngram_model_set.h | 0 .../pocketsphinx/src/lm/ngram_model_trie.c | 0 .../pocketsphinx/src/lm/ngram_model_trie.h | 0 .../frameworks/pocketsphinx/src/lm/ngrams_raw.c | 0 .../frameworks/pocketsphinx/src/lm/ngrams_raw.h | 0 .../frameworks/pocketsphinx/src/mdef.c | 0 .../frameworks/pocketsphinx/src/mdef.h | 0 .../frameworks/pocketsphinx/src/ms_gauden.c | 0 .../frameworks/pocketsphinx/src/ms_gauden.h | 0 .../frameworks/pocketsphinx/src/ms_mgau.c | 0 .../frameworks/pocketsphinx/src/ms_mgau.h | 0 .../frameworks/pocketsphinx/src/ms_senone.c | 0 .../frameworks/pocketsphinx/src/ms_senone.h | 0 .../frameworks/pocketsphinx/src/ngram_search.c | 0 .../frameworks/pocketsphinx/src/ngram_search.h | 0 .../pocketsphinx/src/ngram_search_fwdflat.c | 0 .../pocketsphinx/src/ngram_search_fwdflat.h | 0 .../pocketsphinx/src/ngram_search_fwdtree.c | 0 .../pocketsphinx/src/ngram_search_fwdtree.h | 0 .../frameworks/pocketsphinx/src/phone_loop_search.c | 0 .../frameworks/pocketsphinx/src/phone_loop_search.h | 0 .../frameworks/pocketsphinx/src/pocketsphinx.c | 0 .../pocketsphinx/src/pocketsphinx_internal.h | 0 .../frameworks/pocketsphinx/src/ps_alignment.c | 0 .../frameworks/pocketsphinx/src/ps_alignment.h | 0 .../frameworks/pocketsphinx/src/ps_lattice.c | 0 .../pocketsphinx/src/ps_lattice_internal.h | 0 .../frameworks/pocketsphinx/src/ps_mllr.c | 0 .../frameworks/pocketsphinx/src/ptm_mgau.c | 0 .../frameworks/pocketsphinx/src/ptm_mgau.h | 0 .../frameworks/pocketsphinx/src/s2_semi_mgau.c | 0 .../frameworks/pocketsphinx/src/s2_semi_mgau.h | 0 .../frameworks/pocketsphinx/src/s3types.h | 0 .../pocketsphinx/src/state_align_search.c | 0 .../pocketsphinx/src/state_align_search.h | 0 .../frameworks/pocketsphinx/src/tied_mgau_common.h | 0 .../frameworks/pocketsphinx/src/tmat.c | 0 .../frameworks/pocketsphinx/src/tmat.h | 0 .../frameworks/pocketsphinx/src/util/README.python | 0 .../frameworks/pocketsphinx/src/util/bio.c | 0 .../frameworks/pocketsphinx/src/util/bitarr.c | 0 .../frameworks/pocketsphinx/src/util/bitvec.c | 0 .../frameworks/pocketsphinx/src/util/blas_lite.c | 0 .../frameworks/pocketsphinx/src/util/case.c | 0 .../frameworks/pocketsphinx/src/util/ckd_alloc.c | 0 .../pocketsphinx/src/util/clapack_scrub.py | 0 .../frameworks/pocketsphinx/src/util/cmd_ln.c | 0 .../frameworks/pocketsphinx/src/util/dtoa.c | 0 .../frameworks/pocketsphinx/src/util/err.c | 0 .../frameworks/pocketsphinx/src/util/errno.c | 0 .../frameworks/pocketsphinx/src/util/f2c_lite.c | 0 .../frameworks/pocketsphinx/src/util/filename.c | 0 .../frameworks/pocketsphinx/src/util/fortran.py | 0 .../frameworks/pocketsphinx/src/util/genrand.c | 0 .../frameworks/pocketsphinx/src/util/glist.c | 0 .../frameworks/pocketsphinx/src/util/hash_table.c | 0 .../frameworks/pocketsphinx/src/util/heap.c | 0 .../pocketsphinx/src/util/listelem_alloc.c | 0 .../frameworks/pocketsphinx/src/util/logmath.c | 0 .../frameworks/pocketsphinx/src/util/make_lite.py | 0 .../frameworks/pocketsphinx/src/util/matrix.c | 0 .../frameworks/pocketsphinx/src/util/mmio.c | 0 .../frameworks/pocketsphinx/src/util/pio.c | 0 .../pocketsphinx/src/util/priority_queue.c | 0 .../frameworks/pocketsphinx/src/util/profile.c | 0 .../frameworks/pocketsphinx/src/util/sbthread.c | 0 .../frameworks/pocketsphinx/src/util/slamch.c | 0 .../frameworks/pocketsphinx/src/util/slapack_lite.c | 0 .../frameworks/pocketsphinx/src/util/strfuncs.c | 0 .../pocketsphinx/src/util/wrapped_routines | 0 .../frameworks/pocketsphinx/src/vector.c | 0 .../frameworks/pocketsphinx/src/vector.h | 0 .../frameworks/utils/include/common_utils.h | 0 .../frameworks/utils/include/voice_assistant_log.h | 0 .../voiceassistant/frameworks/vad/BUILD.gn | 0 .../vad/include/signal_processing_library.h | 0 .../voiceassistant/frameworks/vad/include/spl_inl.h | 0 .../frameworks/vad/include/spl_inl_armv7.h | 0 .../frameworks/vad/include/spl_inl_mips.h | 0 .../voiceassistant/frameworks/vad/include/vad.h | 0 .../frameworks/vad/include/vad_core.h | 0 .../frameworks/vad/include/vad_filterbank.h | 0 .../voiceassistant/frameworks/vad/include/vad_gmm.h | 0 .../voiceassistant/frameworks/vad/include/vad_sp.h | 0 .../frameworks/vad/include/webrtc_vad.h | 0 .../frameworks/vad/src/signal_processing_library.c | 0 .../voiceassistant/frameworks/vad/src/vad.cc | 0 .../voiceassistant/frameworks/vad/src/vad_core.c | 0 .../frameworks/vad/src/vad_filterbank.c | 0 .../voiceassistant/frameworks/vad/src/vad_gmm.c | 0 .../voiceassistant/frameworks/vad/src/vad_sp.c | 0 .../voiceassistant/frameworks/vad/src/webrtc_vad.c | 0 .../frameworks/voiceclouddll/BUILD.gn | 0 .../voiceclouddll/i_voice_cloud_manager.h | 0 .../js/declaration/@ohos.carvoiceassistant.d.ts | 0 .../interfaces/kits/js/declaration/BUILD.gn | 0 .../js/napi/include/voice_assistant_event_target.h | 0 .../js/napi/include/voice_assistant_napi_tools.h | 0 .../js/napi/src/voice_assistant_event_target.cpp | 0 .../kits/js/napi/src/voice_assistant_napi.cpp | 0 .../kits/js/napi/src/voice_assistant_napi_tools.cpp | 0 .../voiceassistant/ohos.build | 0 .../voiceassistant/prebuild.sh | 0 .../voiceassistant/profile/5102.xml | 0 .../voiceassistant/profile/BUILD.gn | 0 .../voiceassistant/resources/BUILD.gn | 0 .../voiceassistant/services/BUILD.gn | 0 .../include/client/voice_assistant_ability_agent.h | 0 .../include/client/voice_assistant_ability_proxy.h | 0 .../voice_assistant_agent_proxy_death_recipient.h | 0 .../client/voice_assistant_client_callback.h | 0 .../client/voice_assistant_client_callback_stub.h | 0 .../include/client/voice_assistant_client_manager.h | 0 .../include/server/voice_assistant_ability_stub.h | 0 .../include/server/voice_assistant_agent_service.h | 0 .../server/voice_assistant_callback_event_target.h | 0 ...voice_assistant_callback_proxy_death_recipient.h | 0 .../server/voice_assistant_client_callback_proxy.h | 0 .../src/client/voice_assistant_ability_proxy.cpp | 0 .../client/voice_assistant_client_callback_stub.cpp | 0 .../src/client/voice_assistant_client_manager.cpp | 0 .../src/server/voice_assistant_ability_stub.cpp | 0 .../src/server/voice_assistant_agent_service.cpp | 0 .../voice_assistant_callback_event_target.cpp | 0 .../voice_assistant_client_callback_proxy.cpp | 0 .../voiceassistant/services/src/voice_cloud_doc.txt | 0 .../voiceassistant/test/client_test/BUILD.gn | 0 .../voiceassistant/test/client_test/client_test.cpp | 0 docs/PATEO_CarVoiceAssistant/README_zh.md | 4 +++- ...\274\200\345\217\221\346\226\207\346\241\243.md" | 4 ++-- ...\233\206\346\210\220\346\226\207\346\241\243.md" | 2 +- ...\274\200\345\217\221\346\226\207\346\241\243.md" | 4 ++-- 302 files changed, 9 insertions(+), 7 deletions(-) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/build-profile.json5 (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/build-profile.json5 (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/hvigorfile.js (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/package-lock.json (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/package.json (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/config.json (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/ets/MainAbility/app.ets (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/ets/MainAbility/models/asrModel.ets (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/ets/MainAbility/pages/index.ets (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/ets/MainAbility/utils/logUtil.ets (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/element/color.json (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/element/string.json (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/btn_focus.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/btn_normal.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/icon.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/icon_close.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/icon_temp.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/icon_wind.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/seat.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/voice_ball.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/voice_bottom.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind0.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind1.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind10.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind2.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind3.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind4.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind5.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind6.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind7.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind8.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind9.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind_close.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind_cold.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/entry/src/main/resources/base/media/wind_hot.png (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/hvigorfile.js (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/local.properties (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/package-lock.json (100%) rename FA/PATEO_CarVoiceAssistant/{VoiceAssistantApp => }/package.json (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/data.zip (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fsg_model.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/yin.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/blas_lite.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/ohos.build (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn (100%) rename {FA => dev/team_x}/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp (100%) diff --git a/.gitattributes b/.gitattributes index 52654a0..9f5ca56 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ FA/GreyWolf_NetConfig/gradle/wrapper/gradle-wrapper.jar filter=lfs diff=lfs merge=lfs -text -FA/PATEO_CarVoiceAssistant/data.zip filter=lfs diff=lfs merge=lfs -text +dev/team_x/PATEO_CarVoiceAssistant/data.zip filter=lfs diff=lfs merge=lfs -text diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 b/FA/PATEO_CarVoiceAssistant/build-profile.json5 similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/build-profile.json5 rename to FA/PATEO_CarVoiceAssistant/build-profile.json5 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 b/FA/PATEO_CarVoiceAssistant/entry/build-profile.json5 similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/build-profile.json5 rename to FA/PATEO_CarVoiceAssistant/entry/build-profile.json5 diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/hvigorfile.js b/FA/PATEO_CarVoiceAssistant/entry/hvigorfile.js similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/hvigorfile.js rename to FA/PATEO_CarVoiceAssistant/entry/hvigorfile.js diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package-lock.json b/FA/PATEO_CarVoiceAssistant/entry/package-lock.json similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package-lock.json rename to FA/PATEO_CarVoiceAssistant/entry/package-lock.json diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package.json b/FA/PATEO_CarVoiceAssistant/entry/package.json similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/package.json rename to FA/PATEO_CarVoiceAssistant/entry/package.json diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/config.json b/FA/PATEO_CarVoiceAssistant/entry/src/main/config.json similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/config.json rename to FA/PATEO_CarVoiceAssistant/entry/src/main/config.json diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets b/FA/PATEO_CarVoiceAssistant/entry/src/main/ets/MainAbility/app.ets similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/app.ets rename to FA/PATEO_CarVoiceAssistant/entry/src/main/ets/MainAbility/app.ets diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets b/FA/PATEO_CarVoiceAssistant/entry/src/main/ets/MainAbility/models/asrModel.ets similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/models/asrModel.ets rename to FA/PATEO_CarVoiceAssistant/entry/src/main/ets/MainAbility/models/asrModel.ets diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets b/FA/PATEO_CarVoiceAssistant/entry/src/main/ets/MainAbility/pages/index.ets similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/pages/index.ets rename to FA/PATEO_CarVoiceAssistant/entry/src/main/ets/MainAbility/pages/index.ets diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets b/FA/PATEO_CarVoiceAssistant/entry/src/main/ets/MainAbility/utils/logUtil.ets similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/ets/MainAbility/utils/logUtil.ets rename to FA/PATEO_CarVoiceAssistant/entry/src/main/ets/MainAbility/utils/logUtil.ets diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/color.json b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/element/color.json similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/color.json rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/element/color.json diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/string.json b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/element/string.json similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/element/string.json rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/element/string.json diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/btn_focus.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/btn_focus.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/btn_focus.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/btn_focus.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/btn_normal.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/btn_normal.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/btn_normal.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/btn_normal.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/icon.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/icon.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_close.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/icon_close.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_close.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/icon_close.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_temp.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/icon_temp.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_temp.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/icon_temp.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_wind.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/icon_wind.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/icon_wind.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/icon_wind.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/seat.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/seat.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/seat.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/seat.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_ball.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/voice_ball.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_ball.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/voice_ball.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_bottom.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/voice_bottom.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/voice_bottom.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/voice_bottom.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind0.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind0.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind0.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind0.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind1.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind1.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind1.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind1.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind10.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind10.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind10.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind10.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind2.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind2.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind2.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind2.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind3.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind3.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind3.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind3.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind4.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind4.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind4.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind4.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind5.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind5.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind5.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind5.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind6.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind6.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind6.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind6.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind7.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind7.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind7.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind7.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind8.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind8.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind8.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind8.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind9.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind9.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind9.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind9.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_close.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind_close.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_close.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind_close.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_cold.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind_cold.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_cold.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind_cold.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_hot.png b/FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind_hot.png similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/entry/src/main/resources/base/media/wind_hot.png rename to FA/PATEO_CarVoiceAssistant/entry/src/main/resources/base/media/wind_hot.png diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/hvigorfile.js b/FA/PATEO_CarVoiceAssistant/hvigorfile.js similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/hvigorfile.js rename to FA/PATEO_CarVoiceAssistant/hvigorfile.js diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties b/FA/PATEO_CarVoiceAssistant/local.properties similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/local.properties rename to FA/PATEO_CarVoiceAssistant/local.properties diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package-lock.json b/FA/PATEO_CarVoiceAssistant/package-lock.json similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package-lock.json rename to FA/PATEO_CarVoiceAssistant/package-lock.json diff --git a/FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json b/FA/PATEO_CarVoiceAssistant/package.json similarity index 100% rename from FA/PATEO_CarVoiceAssistant/VoiceAssistantApp/package.json rename to FA/PATEO_CarVoiceAssistant/package.json diff --git a/FA/PATEO_CarVoiceAssistant/data.zip b/dev/team_x/PATEO_CarVoiceAssistant/data.zip similarity index 100% rename from FA/PATEO_CarVoiceAssistant/data.zip rename to dev/team_x/PATEO_CarVoiceAssistant/data.zip diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/etc/init/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.cfg diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/etc/init/voice_assistant_service.rc diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/audio_record_manager.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/i_wakeup_manager.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/tts_manager.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/voice_cloud_loader.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/include/wakeup_manager.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/tts_manager.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/voice_cloud_loader.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/wakeup_manager.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/CMakeLists.txt diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/config.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/android/sphinx_config.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/cmdln_macro.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/export.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_lattice.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_mllr.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/pocketsphinx/ps_search.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/agc.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bio.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitarr.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/bitvec.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/byteorder.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/case.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ckd_alloc.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/clapack_lite.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmd_ln.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/cmn.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/err.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/f2c.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fe.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/feat.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/filename.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fixpoint.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fsg_model.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fsg_model.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fsg_model.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/fsg_model.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/genrand.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/glist.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/hash_table.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/heap.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/jsgf.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/listelem_alloc.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/logmath.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/matrix.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/mmio.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/ngram_model.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/pio.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/prim_type.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/priority_queue.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/profile.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sbthread.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinx_config.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/sphinxbase_export.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/strfuncs.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/sphinxbase/yin.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/config.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/win32/sphinx_config.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/assert.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/config.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/errno.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/include/wince/sphinx_config.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/CMakeLists.txt diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/acmod.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/allphone_search.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/bin_mdef.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/blkarray_list.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/dict2pid.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fast_ptm.txt diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_interface.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_internal.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_noise.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_sigproc.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_type.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_affine.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_inverse_linear.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fe_warp_piecewise_linear.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/fixlog.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_sub_table.py diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/make_log_table.py diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/yin.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/yin.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/yin.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fe/yin.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/agc.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/cmn_live.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/feat.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/feat/lda.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_history.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_lextree.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/fsg_search_internal.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/hmm.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_detections.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/kws_search.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/_jsgf_scanner.l diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/fsg_model.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_internal.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_parser.y diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/jsgf_scanner.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/lm_trie_quant.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_internal.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_set.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngram_model_trie.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/lm/ngrams_raw.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/mdef.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_gauden.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_mgau.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ms_senone.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdflat.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ngram_search_fwdtree.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/phone_loop_search.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/pocketsphinx_internal.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_alignment.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_lattice_internal.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ps_mllr.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/ptm_mgau.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s2_semi_mgau.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/s3types.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/state_align_search.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tied_mgau_common.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/tmat.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/README.python diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bio.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitarr.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/bitvec.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/blas_lite.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/blas_lite.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/blas_lite.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/blas_lite.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/case.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/ckd_alloc.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/clapack_scrub.py diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/cmd_ln.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/dtoa.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/err.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/errno.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/f2c_lite.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/filename.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/fortran.py diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/genrand.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/glist.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/hash_table.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/heap.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/listelem_alloc.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/logmath.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/make_lite.py diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/matrix.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/mmio.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/pio.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/priority_queue.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/profile.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/sbthread.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slamch.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/slapack_lite.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/strfuncs.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/util/wrapped_routines diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/pocketsphinx/src/vector.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/common_utils.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/utils/include/voice_assistant_log.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/signal_processing_library.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_armv7.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/spl_inl_mips.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_core.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_filterbank.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_gmm.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/vad_sp.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/include/webrtc_vad.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/signal_processing_library.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad.cc diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_core.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_filterbank.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_gmm.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/vad_sp.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/vad/src/webrtc_vad.c diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/voiceclouddll/i_voice_cloud_manager.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_event_target.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/include/voice_assistant_napi_tools.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_napi_tools.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/ohos.build b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/ohos.build similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/ohos.build rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/ohos.build diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/prebuild.sh diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/profile/5102.xml diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/profile/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/resources/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_agent.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_ability_proxy.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_agent_proxy_death_recipient.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_callback_stub.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/client/voice_assistant_client_manager.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_ability_stub.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_agent_service.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_event_target.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_callback_proxy_death_recipient.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/include/server/voice_assistant_client_callback_proxy.h diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_ability_proxy.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_callback_stub.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/client/voice_assistant_client_manager.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_ability_stub.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_agent_service.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_client_callback_proxy.cpp diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/voice_cloud_doc.txt diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/BUILD.gn diff --git a/FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp similarity index 100% rename from FA/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp rename to dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/test/client_test/client_test.cpp diff --git a/docs/PATEO_CarVoiceAssistant/README_zh.md b/docs/PATEO_CarVoiceAssistant/README_zh.md index e6b927c..4e7e6ec 100644 --- a/docs/PATEO_CarVoiceAssistant/README_zh.md +++ b/docs/PATEO_CarVoiceAssistant/README_zh.md @@ -36,7 +36,9 @@ OpenHarmony语音助理突破了层层技术难关,实现了OH设备可见即 | -------- | -------- | ----------------------- | ------------ | ---------------- | | DAYU200 | 标准系统 | OpenHarmony 3.1 Release | C++、JS、eTS | VS code、Dev Eco | -**项目源码目录:[源码目录](../../FA/PATEO_CarVoiceAssistant)** +**语音助理App源码目录:[源码目录](../../FA/PATEO_CarVoiceAssistant)** + +**语音AI子系统源码目录:[源码目录](../../dev/team_x/PATEO_CarVoiceAssistant)** ### 软件架构 diff --git "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" index d92adfb..e119a48 100644 --- "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" +++ "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" @@ -4,12 +4,12 @@ 语音子系统作为`miscservices`子系统下一个`part`(`voiceassistant`)集成在系统代码中;包含9个`module`,实现语音唤醒、语义解析、TTS播报、录音等功能;App调用JS接口,通过NPI调用client端代码,client发消息给server端,server端执行具体逻辑。 -**代码目录: [语音AI子系统目录](../../FA/PATEO_CarVoiceAssistant/voiceassistant)** +**代码目录: [语音AI子系统目录](../../dev/team_x/PATEO_CarVoiceAssistant/voiceassistant)** ### 2. 编译代码 1. 准备好OpenHarmony源码编译环境,参考[标准系统编译构建指导](https://docs.openharmony.cn/pages/v3.1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md/); -2. 执行`prebuild.sh`( [脚本所在目录](../../FA/PATEO_CarVoiceAssistant/voiceassistant))脚本,将云语音动态库、唤醒语言模型等资源解压到代码目录中; +2. 执行`prebuild.sh`( [脚本所在目录](../../dev/team_x/PATEO_CarVoiceAssistant/voiceassistant))脚本,将云语音动态库、唤醒语言模型等资源解压到代码目录中; 3. 将`voiceassistant`目录拷贝到系统源码`系统源码目录/base/miscservices/`下; 4. 修改`系统源码目录/productdefine/common/products/DAYU.json`文件,添加`"miscservices:voiceassistant":{},`; 5. 执行编译指令`build.sh --product-name DAYU` diff --git "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\351\233\206\346\210\220\346\226\207\346\241\243.md" "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\351\233\206\346\210\220\346\226\207\346\241\243.md" index bb38aff..c2dc9fc 100644 --- "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\351\233\206\346\210\220\346\226\207\346\241\243.md" +++ "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\351\233\206\346\210\220\346\226\207\346\241\243.md" @@ -2,7 +2,7 @@ 1. 系统版本要求:OpenHarmony 3.1Release, 请确认当前开发板的版本**录音功能、网络功能**是否正常。 -2. 解压[data.zip文件](../../FA/PATEO_CarVoiceAssistant/data.zip) +2. 解压[data.zip文件](../../dev/team_x/PATEO_CarVoiceAssistant/data.zip) 3. 使用hdc工具将data中的文件发送到OpenHarmony系统中: diff --git "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" index 93e5c9e..b74e92f 100644 --- "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" +++ "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" @@ -4,11 +4,11 @@ 语音助理App主要实现语音唤醒、语音识别、热词注册、文字上屏、车辆控制等功能;使用eTS语言开发。运行此App时,请确认开发板已集成语音子系统服务,语音子系统集成文档链接:[语音AI子系统集成文档](./语音AI子系统集成文档.md)。 -**代码目录:[语音助理App目录](../../FA/PATEO_CarVoiceAssistant/VoiceAssistantApp)** +**代码目录:[语音助理App目录](../../FA/PATEO_CarVoiceAssistant)** ### 2. 主要功能介绍 -1. 引入语音助理声明文件,声明文件:[文件链接](../../FA/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts) +1. 引入语音助理声明文件,声明文件:[文件链接](../../dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/declaration/@ohos.carvoiceassistant.d.ts) ```js import carvoiceassistant from '@ohos.carvoiceassistant' -- Gitee From b77247abe903a69979df8f698edfcd2df815048e Mon Sep 17 00:00:00 2001 From: boyang Date: Thu, 24 Nov 2022 15:59:44 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=86=85=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: boyang --- ...\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" | 2 +- ...0\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" index e119a48..a97fc60 100644 --- "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" +++ "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263AI\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221\346\226\207\346\241\243.md" @@ -1,4 +1,4 @@ -## [语音AI子系统开发文档](../../FA/PATEO_CarVoiceAssistant/voiceassistant) +## [语音AI子系统开发文档](../../dev/team_x/PATEO_CarVoiceAssistant) ### 1. 子系统介绍 diff --git "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" index b74e92f..b709388 100644 --- "a/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" +++ "b/docs/PATEO_CarVoiceAssistant/\350\257\255\351\237\263\345\212\251\347\220\206App\345\274\200\345\217\221\346\226\207\346\241\243.md" @@ -1,4 +1,4 @@ -## [语音助理App开发文档](../../FA/PATEO_CarVoiceAssistant/VoiceAssistantApp) +## [语音助理App开发文档](../../FA/PATEO_CarVoiceAssistant) ### 1. 介绍 -- Gitee From 026573f520079367fff31419cec368bb3624a6e4 Mon Sep 17 00:00:00 2001 From: boyang Date: Tue, 29 Nov 2022 10:30:01 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=88=A0=E9=99=A4local.properties?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: boyang --- FA/PATEO_CarVoiceAssistant/local.properties | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 FA/PATEO_CarVoiceAssistant/local.properties diff --git a/FA/PATEO_CarVoiceAssistant/local.properties b/FA/PATEO_CarVoiceAssistant/local.properties deleted file mode 100644 index d35a18a..0000000 --- a/FA/PATEO_CarVoiceAssistant/local.properties +++ /dev/null @@ -1,9 +0,0 @@ -# This file is automatically generated by DevEco Studio. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file should *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. -# -# For customization when using a Version Control System, please read the header note. -sdk.dir=/Users/jihaihui/Library/OpenHarmony/sdk -nodejs.dir=/Users/jihaihui/nodejs \ No newline at end of file -- Gitee From 607a0eb5eab69117b27a574ef2f5de2711491f20 Mon Sep 17 00:00:00 2001 From: boyang Date: Tue, 29 Nov 2022 19:12:58 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: boyang --- .../frameworks/manager/src/audio_record_manager.cpp | 2 +- .../kits/js/napi/src/voice_assistant_event_target.cpp | 2 +- .../src/server/voice_assistant_callback_event_target.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp index 3786a2b..e903392 100644 --- a/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp +++ b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/frameworks/manager/src/audio_record_manager.cpp @@ -131,7 +131,7 @@ namespace CarVoiceAssistant { VOICE_ASSISTANT_LOGI("AudioPerf Capturer First Frame Read, BUFFER_LEN = %zu", bufferLen); while (true) { - size_t bytesRead = 0; + int32_t bytesRead = 0; while (bytesRead < bufferLen) { if (audioCapturer_ == nullptr) { break; diff --git a/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp index 5d1e961..b6744d4 100644 --- a/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp +++ b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/interfaces/kits/js/napi/src/voice_assistant_event_target.cpp @@ -181,7 +181,7 @@ namespace CarVoiceAssistant { VOICE_ASSISTANT_LOGI("VoiceAssistantEventTarget::Emit work == nullptr"); return; } - EventTargetCB* eventTargetCB = (EventTargetCB*)work->data; + EventTargetCB* eventTargetCB = reinterpret_cast(work->data); napi_handle_scope scope = nullptr; napi_open_handle_scope(eventTargetCB->env_, &scope); diff --git a/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp index a6d920b..285123f 100644 --- a/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp +++ b/dev/team_x/PATEO_CarVoiceAssistant/voiceassistant/services/src/server/voice_assistant_callback_event_target.cpp @@ -79,7 +79,7 @@ namespace CarVoiceAssistant { void VoiceAssistantCallbackEventTarget::DoEmit(Callback callback) { VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::DoEmit"); - for (std::list::iterator it = listenerList_.begin(); it != listenerList_.end(); it++) { + for (std::list::iterator it = listenerList_.begin(); it != listenerList_.end(); ++it) { VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::DoEmit schedule"); if (it->proxy_ == nullptr) { VOICE_ASSISTANT_LOGI("VoiceAssistantCallbackEventTarget::DoEmit:proxy_ is null"); -- Gitee