{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":142376721,"defaultBranch":"master","name":"Naomi","ownerLogin":"aaronchantrill","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2018-07-26T02:18:33.000Z","ownerAvatar":"https://github.com/avatars/u/7544675?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1722823262.0","currentOid":""},"activityList":{"items":[{"before":null,"after":"f9ff9fc4cc8f92c30655816a40fe68b8b80a8a8a","ref":"refs/heads/async_greeting","pushedAt":"2024-08-05T02:01:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Play greeting before starting mic\n\nI realized that one of the big problems with Naomi listening to\nitself speak is that it says all of its keywords/wakewords as\npart of the first message, which causes it to scan its greeting\nfor intent and causes it to respond with a message immediately,\nwhich isn't great.\n\nI added a say_sync method to the mic.py interface and used that\ndirectly in conversation.py. I also changed the askName method\nto sayName since that's what it actually does now.\n\nI also made a small change to plugin.py so that the messages\nabout which plugin it is configuring when configuring plugins\nappears highlighted.\n\nFinally, I made a small change to commandline.py so that if a\nlistbox setting has only one option, that option will be selected\nby default.\n\nSmall changes, nothing earth shattering here.","shortMessageHtmlLink":"Play greeting before starting mic"}},{"before":null,"after":"f07c483784f5736c9c00ba582d3c6351f4770b99","ref":"refs/heads/array_settings","pushedAt":"2024-07-22T20:53:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Add an array setting\n\nThis is a special type of setting for a set of related values that\ncan be repeated an arbitrary number of times. It requires an \"each\"\nproperty, which contains the list of subsettings to be repeated.\nAn example would be when adding a number of custom lights from\nHomeAssistant. Each light needs an ID which allows Naomi to tell\nHomeAssistant which light is being controlled, plus a friendly\nname that lets the user request that particular light:\n\n```\n(\"SimpleHomeAssistant\", \"light\"), {\n \"type\": \"array\",\n \"each\": OrderedDict([\n (\n (\"id\",), {\n \"title\": _(\"ID of your light\"),\n \"description\": _(\"The ID of your light from HomeAssistant\")\n }\n ),\n (\n (\"name\",), {\n \"title\": _(\"Name of your light\"),\n \"description\": _(\"The name you would like to use to refer to your light.\")\n }\n )\n ])\n }\n)\n```\n\nwill allow you to create a structure like:\n\n```\n light:\n - id: light1\n name: cottage light\n - id: light2\n name: test light\n```\nin your profile.yml file.","shortMessageHtmlLink":"Add an array setting"}},{"before":null,"after":"2adf96f8624398ca0529d911f7f363c9977fc26e","ref":"refs/heads/Fix_Empty_Profile_File","pushedAt":"2024-06-28T17:32:33.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix issue with empty profile.yml file\n\nWhen using yaml.safe_load() on an empty text file, the returned\nvalue is None rather than an empty dictionary as I expected. This\ncaused an error when adding the first value, as I would get the\nerror message \"NoneType object does not support item assignment\".\n\nThis patch changes a None value into an empty dictionary.","shortMessageHtmlLink":"Fix issue with empty profile.yml file"}},{"before":null,"after":"cb06fed9b6d55e8a66f322d229e5138768cba547","ref":"refs/heads/Phonetisaurus_fix","pushedAt":"2024-06-26T20:59:57.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Phonetisaurus Fix\n\nImport sphinxvocab and PhonetisaurusG2P modules after installing\nphonetisaurus with pip. Add locale to default pocketsphinx hmm_dir.","shortMessageHtmlLink":"Phonetisaurus Fix"}},{"before":null,"after":"f7ee64e5e5bf5cd94212211561b93cac176fb81c","ref":"refs/heads/fixed_microphone_test","pushedAt":"2024-06-05T23:17:12.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix the microphone test\n\nThis fixes the microphone test that comes up during configuration.\n\nI switched from using the local_mic to mic_synchronous for the\nmicrophone, plus fixed the basic Mic __init__ method to not\nfail if some of the options being passed in through kwargs are\nmissing.","shortMessageHtmlLink":"Fix the microphone test"}},{"before":"d73153dc7a6d5d4b9fecf0362a6aad219761a340","after":"65f109036a751f53fb1f871d548b27d41190615c","ref":"refs/heads/alsafix","pushedAt":"2024-06-05T02:10:53.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Removed pyAudio code\n\nRemoved some pyaudio code that I copied into the alsa audio engine\nplugin while fixing some of the formatting.","shortMessageHtmlLink":"Removed pyAudio code"}},{"before":null,"after":"d73153dc7a6d5d4b9fecf0362a6aad219761a340","ref":"refs/heads/alsafix","pushedAt":"2024-06-05T01:49:11.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fixes for Alsa\n\nWhen the asynchronous mic was introduced, some formatting changes\nwere made that were not copied into the Alsa audio engine plugin.","shortMessageHtmlLink":"Fixes for Alsa"}},{"before":null,"after":"45bb9980f58b546afe083379ea8858f37cb1b8da","ref":"refs/heads/AudiologFixes","pushedAt":"2024-04-22T00:44:38.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Audiolog fixes\n\nLog audio when using asynchronous mic, check database exists\nbefore attempting to record intent.","shortMessageHtmlLink":"Audiolog fixes"}},{"before":null,"after":"595998901f86b562c4f39396a88b2a9bbb61a00c","ref":"refs/heads/small_fixes","pushedAt":"2024-03-21T02:41:36.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"These are some small fixes\n\nProbably the most notable here is the breaking change of changing\nthe \"verify_wakeword\" argument to \"verify_keyword\". This really\nisn't an important change, and it may cause some issues with the\nVOSK plugin depending on which version is installed.\n\nThis fixes an issue where the asyncronous mic assumes you are\nusing verify_keywords even if you are not.\n\nFinally, this sets the variable keyword to a string and keywords\nto a list in application.py, and saves the keywords to an arg\nvariable.","shortMessageHtmlLink":"These are some small fixes"}},{"before":"77b4f54e2a611e5a6209c03c2116f93e407783b9","after":"2608277d099b759172262e65a8ccddb7e1e81615","ref":"refs/heads/sync_and_async_mics","pushedAt":"2024-03-03T21:16:55.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Added Utterance class\n\nI added an Utterance class that returns information from the mic\nlisten() and active_listen() methods. This object returns the\ntranscription when called without an parameters, so it is\nbackwards compatible with plugins that expect to get a string or\nlist of strings back from those methods.","shortMessageHtmlLink":"Added Utterance class"}},{"before":"c80299afac93cda23e0df8dc2b2c0dbcaa5526cb","after":"77b4f54e2a611e5a6209c03c2116f93e407783b9","ref":"refs/heads/sync_and_async_mics","pushedAt":"2024-03-03T15:04:05.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix Mic initialization\n\nMic class is a child class of i18n.GettextMixin but was not using\nthat parent class correctly. Edited the __init__ method.","shortMessageHtmlLink":"Fix Mic initialization"}},{"before":"b6e6baeefb5a53b2efc81e23c2ae6634d9117345","after":"c80299afac93cda23e0df8dc2b2c0dbcaa5526cb","ref":"refs/heads/sync_and_async_mics","pushedAt":"2024-03-03T14:35:03.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Small fixes for flake8","shortMessageHtmlLink":"Small fixes for flake8"}},{"before":null,"after":"b6e6baeefb5a53b2efc81e23c2ae6634d9117345","ref":"refs/heads/sync_and_async_mics","pushedAt":"2024-03-02T22:19:57.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Synchronous and Asynchronous Mic\n\nI have turned the Mic class into an abstract class and used it to\ncreate two new classes, MicSynchronous and MicAsynchronous. I'm\nhoping to expand it to all the different mic classes, including\nthe local (text) mic and the batch mic.\n\nI'm attempting to support both active listen mode (where the\ncomputer only starts listening for a command after hearing its\nwakeword - Siri-like mode) and passive listen mode (where the\ncomputer records blocks of audio, then checks for the wake word\nand then checks the same block of audio for a command - Echo-like).\n\nRight now, I am having trouble with the expect function when using\npassive listen mode with the asynchronous listener. This has to do\nwith the pyaudio device play_file, which returns when it has\nfinished writing to the queue, but before the audio is done\nplaying. This leads to situations where the next audio starts\ngetting queued before the last audio finishes playing. If the\naudio's have different frame sizes, this leads to a segmentation\nfault.\n\nI have been testing by using the \"knock knock joke\" and \"time\"\nspeechhandler plugins. Knock-knock joke uses expect quite a bit.\nI have been using Pocketsphinx_KWS for my passive STT engine,\nPocketsphinx for my special STT engine and VOSK (which is\navailable here: https://github.com/aaronchantrill/Naomi_VOSK_STT)\nas my active STT engine. VOSK works well, at least in English,\nbut requires some additional training if you have non-standard\nwords in your vocabulary. I'd like to make VOSK officially\navailable through NPE but the last time I trained VOSK to\nrecognize some additional words, it required a computer with\n32GiB of ram. I will test on my Raspberry Pi 5 with 8 GiB and\nsee if it can handle it, but have low expectations. I would\nlike to add an option to export the Naomi vocabulary so VOSK\ncan be trained on another computer, as it does run well on the\nRaspberry Pi 4 and 5.","shortMessageHtmlLink":"Synchronous and Asynchronous Mic"}},{"before":"317bff0b01acf6b3b631bbd3646d3d1c4e6ad969","after":"d3e1be12f842a392e9d70ff56886c2c936476b9a","ref":"refs/heads/asynchronous_mic","pushedAt":"2024-03-02T22:12:47.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Synchronous and Asynchronous Mic\n\nI have turned the Mic class into an abstract class and used it to\ncreate two new classes, MicSynchronous and MicAsynchronous. I'm\nhoping to expand it to all the different mic classes, including\nthe local (text) mic and the batch mic.\n\nI'm attempting to support both active listen mode (where the\ncomputer only starts listening for a command after hearing its\nwakeword - Siri-like mode) and passive listen mode (where the\ncomputer records blocks of audio, then checks for the wake word\nand then checks the same block of audio for a command - Echo-like).\n\nRight now, I am having trouble with the expect function when using\npassive listen mode with the asynchronous listener. This has to do\nwith the pyaudio device play_file, which returns when it has\nfinished writing to the queue, but before the audio is done\nplaying. This leads to situations where the next audio starts\ngetting queued before the last audio finishes playing. If the\naudio's have different frame sizes, this leads to a segmentation\nfault.\n\nI have been testing by using the \"knock knock joke\" and \"time\"\nspeechhandler plugins. Knock-knock joke uses expect quite a bit.\nI have been using Pocketsphinx_KWS for my passive STT engine,\nPocketsphinx for my special STT engine and VOSK (which is\navailable here: https://github.com/aaronchantrill/Naomi_VOSK_STT)\nas my active STT engine. VOSK works well, at least in English,\nbut requires some additional training if you have non-standard\nwords in your vocabulary. I'd like to make VOSK officially\navailable through NPE but the last time I trained VOSK to\nrecognize some additional words, it required a computer with\n32GiB of ram. I will test on my Raspberry Pi 5 with 8 GiB and\nsee if it can handle it, but have low expectations. I would\nlike to add an option to export the Naomi vocabulary so VOSK\ncan be trained on another computer, as it does run well on the\nRaspberry Pi 4 and 5.","shortMessageHtmlLink":"Synchronous and Asynchronous Mic"}},{"before":null,"after":"317bff0b01acf6b3b631bbd3646d3d1c4e6ad969","ref":"refs/heads/asynchronous_mic","pushedAt":"2024-02-21T13:53:37.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Asynchronous Mic\n\nI have added an asynchronous mic, which records constantly. Right\nnow things are in flux, so this only works if you have selected\nthe \"listen while talking\" option. I'm working on creating an\nabstract \"Mic\" class that all the mics (local_mic, batch_mic,\nsynchronous_mic and asynchronous_mic) will inherit from.","shortMessageHtmlLink":"Asynchronous Mic"}},{"before":null,"after":"a8caac8ac9390236375f2204ff04e93383b907db","ref":"refs/heads/fix_translations","pushedAt":"2024-02-21T02:11:16.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix Translations\n\nWe ran into several problems with translations today. The biggest\nwas that because the i18n module is being initialized in the\nGenericPlugin class in naomi/plugin.py, every plugin was looking\nfor its phrases in naomi/data/locale, so most translations were\nfailing even after updating the .po files.\n\nThe next was that the first line Naomi speaks \"My name is {}\"\nhad the format inside the parameter being passed to GetText, so\nthe string was getting the name substituted before attempting to\nfind a matching string in the .po file, so most names were causing\nthat to default to english.\n\nFinally, even when passing the \"My name is {}\" string correctly,\nthe French .po file had no translation in the match for it, and\nthe \"My name is {} but you can also call me {}\" line was not even\nincluded in the translation file, plus I was not even attempting\nto use gettext on the \" or \" string.\n\nNow that all these issues are fixed, when I start Naomi in French\nI get the proper startup message:\n```\nComputer: Je suis Computer\nComputer: Comment puis-je être utile?\n```","shortMessageHtmlLink":"Fix Translations"}},{"before":null,"after":"dd0a8669427645f10ee0ffb74cf66fe92669351c","ref":"refs/heads/logfile_fix2","pushedAt":"2024-02-18T19:11:18.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Remove default location from logfile\n\nIn my last request, I accidentally left the logfile with a default,\nso Naomi still records log entries to that file. Also, my idea for\nhaving two log handlers - one that writes to a file for anything\nbelow ERROR level messages and another that also sends ERROR and\nCRITICAL messages to the screen did not work because the handler\nsettings do not automatically come with the logger, just the\nsettings passed to logging.basicConfig do. So every time a logger\nis created, the handlers have to be added.","shortMessageHtmlLink":"Remove default location from logfile"}},{"before":null,"after":"29f3c3aded8234141b28e6dbc2cb5ee3fbcdfdac","ref":"refs/heads/RestoreLogging","pushedAt":"2024-02-16T20:20:45.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Restore logging to screen\n\nBecause of excessive messages being written to the screen, I\nset the logging to write to the ~/.config/naomi/Naomi.log file\nby default. The problem with that is that critical error messages\nwould not get written to the screen.\n\nHere I have set logging to log to a log file if one is explicitly\nset in the profile.yml file, but also to write ERROR and CRITICAL\nlevel messages to the screen. If running in DEBUG mode with a log\nfile, then DEBUG, INFO and WARN messages are written to the log\nfile and only ERROR or CRITICAL messages appear on the screen.\n\nWe might want to think about having Naomi attempt to also speak\nERROR and CRITICAL level messages.\n\nI also removed the redirect of stderr to /dev/null that surrounded\ncalls to opening pyAudio output streams, which was causing buffer\nunderflow error messages to write to the screen. The constant\nstream redirects were causing \"Too many open files\" errors, which\neventually cause Naomi to crash.","shortMessageHtmlLink":"Restore logging to screen"}},{"before":null,"after":"21f73064d8bbd4a93a94706b359b33f8382b30c3","ref":"refs/heads/fix_check_python_import","pushedAt":"2024-02-16T00:59:58.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix check_python_import()\n\nThe file diagnose.py has a test called check_python_import which\nis run during the unit testing. This function is failing with the\nmessage \"'FrozenImporter' has no attribute 'get_filename'\".\n\nApparently pkgutil.get_loader() can return different types of\nloaders.","shortMessageHtmlLink":"Fix check_python_import()"}},{"before":"615096eaa6b637ee7d2d2da022bbbbb8466e40cd","after":"72651376e44bccde9dd6909bc516eca7d76674fe","ref":"refs/heads/visual_downloads","pushedAt":"2023-11-22T00:31:39.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Small fixes\n\nFixed a possibly uninitialized variable in naomi/app_utils.py.\nAlso fixed a couple of flake8 complaints about inline comments\nwithout two spaces between the code and the hash symbol.\n\nFixed an error that was causing the unittests to fail in\ndiagnose.py.","shortMessageHtmlLink":"Small fixes"}},{"before":"103e1db2a733d4d78abc62b24a4692985ddbff4d","after":"615096eaa6b637ee7d2d2da022bbbbb8466e40cd","ref":"refs/heads/visual_downloads","pushedAt":"2023-11-21T21:16:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Convert naomi/app_utils.py to unix eol\n\nnaomi/app_utils.py appears to have been saved in dos eol format.\nThis just updates the format to unix eol format for linux users.\nWindows users should have their line endings converted automatically\nwhen they clone the repository. Leaving the lines in dos eol\nformat makes changes show up with ^M characters at the end when\ndoing git diff. This commit is only changing the line endings in\nthis one file.","shortMessageHtmlLink":"Convert naomi/app_utils.py to unix eol"}},{"before":null,"after":"103e1db2a733d4d78abc62b24a4692985ddbff4d","ref":"refs/heads/visual_downloads","pushedAt":"2023-11-20T21:51:08.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Add progress bar to download_file()\n\nAdd a progress bar to app_utils.download_file(url, local_filename)\nfunction. This is only really useful when using the command line\nclient (we don't have another client right now) and only before\nthe microphone feedback starts to display. It would be nice to\nmove this into a visualization someday, but this is pretty tightly\nintegrated with the operation itself.\n\nThis commit also gives the download_file function the ability to\nresume partial downloads.","shortMessageHtmlLink":"Add progress bar to download_file()"}},{"before":null,"after":"e018e712fe3b7e458d14fbeffc67642ace753200","ref":"refs/heads/loader_fix","pushedAt":"2023-07-03T00:43:54.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix error in unit tests\n\nOn my Debian Bookworm system, the loader returned as output from\npkgutil.get_loader() no longer has a get_filename() method. Instead\nit has a _resolve_filename() method which helpfully accepts the\nname of the module.\n\nI'm not sure what changed, but this change should be compatible\nwith both types of systems.","shortMessageHtmlLink":"Fix error in unit tests"}},{"before":null,"after":"5e6a649e2ac9cfa0a7a07e3655113f8f0303e7c0","ref":"refs/heads/apt_install_virtualenvwrapper","pushedAt":"2023-06-21T03:07:56.660Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"This environment is externally managed\n\nI just tried installing Naomi on my new Bookworm computer and got\nthe above error message. It seems that Python now allows the OS\nto lock down the main python environment so you can't install\nto it using pip or conda or whatnot. You have to use the OS\nrepositories if you want to install packages on the main python\nenvironment.\n\nThis is good, and I'm sure it's the right way to do it. But\nalthough almost all of our packages are installed within the\nNaomi virtual environment, we have been using pip to install\nvirtualenvwrapper itself to the main python environment as a\nuser package. Since we can't, the install script breaks.\n\nTo fix this issue, I had to add the python3-virtualenvwrapper\npackage to the apt_requirements.txt file, then remove the pip3\ninstall --user virtualenvwrapper line from script.deb.sh.\n\nThe location of the virtualenvwrapper.sh script changes from\n~/.local/bin/virtualenvwrapper.sh to\n/usr/share/virtualenvwrapper/virtualenvwrapper.sh\nsince it is now being installed by the OS.\n\nThe location of virtualenv also changes. In this case, it\nworked to simply remove all the VIRTUALENVWRAPPER_VIRTUALENV\nlines.\n\nI also made a small change to sphinxplugin.py where I am no\nlonger checking for the g2p fst model when deciding whether to\nclone the CMUSphinx standard language model, since that file\nis generated after the model is downloaded. If something\nhappens between downloading the language model and generating the\ng2p model things would get confused.","shortMessageHtmlLink":"This environment is externally managed"}},{"before":null,"after":"d111ea66898da8995e8eaa36f3b85ad98726b391","ref":"refs/heads/CMUDictionaryFix","pushedAt":"2023-05-13T14:22:40.926Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix issue with path to CMU Dictionary\n\nBack in the old days, we used to require the user to download\ntheir own HMM model and CMU dictionary. The HMM model might be\ninstalled by installing a system package, along with the download\nof the pocketsphinx source code, or independently. Same with the\nCMU dictionary file.\n\nAt one point, it just seemed easier to host copies of the HMM\nmodel and dictionary ourselves. That way we would know where to\ndownload them from and could help the user with that, and would\nknow what format everything is in.\n\nRecently, I decided instead of asking for the locations of both the\nHMM model and the dictionary, just ask for the HMM model and assume\nthat the dictionary is in that same folder and named CMUDict.dict.\n\nUnfortunately, if it isn't, then that causes problems. I may need\nto revert to keeping the two settings separate in the future, but\nfor right now, I am going to stop searching in all the odd places\nfor the HMM model and dictionary and just assume we are using our\nhosted version. If the user does not have that installed, then\ndownload it for them.\n\nThere was an additional problem where if you did not download the\nHMM model and CMUDict during startup, the CMUDict variable did not\nget set. I have moved the initialization of that variable outside\nof that if/then block.","shortMessageHtmlLink":"Fix issue with path to CMU Dictionary"}},{"before":"4eaed8cbff91afe6ab138c09991a8a2fa43c4e11","after":"7821b1efd914dcd6747f9ded762ed65d330baeac","ref":"refs/heads/new_pocketsphinx","pushedAt":"2023-04-20T20:13:01.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"2nd attempt to control wavfile path\n\nCodeQL still didn't like my solution, I think because the path\ncheck is disconnected from the use. 2nd attempt.","shortMessageHtmlLink":"2nd attempt to control wavfile path"}},{"before":"13c7a60b0639f5683f7dfa2c4252d059be75de70","after":"4eaed8cbff91afe6ab138c09991a8a2fa43c4e11","ref":"refs/heads/new_pocketsphinx","pushedAt":"2023-04-20T19:52:42.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix \"Too many open files\" error\n\nRecently, I am getting a \"Too many open files\" error. This appears\nto be because a file handle is opened to /dev/null so STDERR can\nbe redirected to it before performing some operations in\nPocketsphinx, but never getting closed. This gives the io.open\nmethod context so it will close automatically when it goes out\nof scope.\n\nAlso fixed an issue reported by CodeQL where a user-provided path\nis being used to serve content.","shortMessageHtmlLink":"Fix \"Too many open files\" error"}},{"before":"bbf4985004dcaf54f81554ccdb10957796b3f2aa","after":"13c7a60b0639f5683f7dfa2c4252d059be75de70","ref":"refs/heads/new_pocketsphinx","pushedAt":"2023-04-13T18:56:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Fix G2P word translations\n\nFixed error in NaomiSTTTrainer.py when transcribing the last\navailable record.\n\nPut words fed to g2pconverter.translate into a list. Otherwise,\nwords get translated letter by letter which causes long words to\nmatch just about any noise.","shortMessageHtmlLink":"Fix G2P word translations"}},{"before":"5febb3a8111482d55a06bf070d7ea9edf3b32fba","after":"bbf4985004dcaf54f81554ccdb10957796b3f2aa","ref":"refs/heads/new_pocketsphinx","pushedAt":"2023-04-11T00:45:08.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Remove the fst file setting\n\nThe fst file is now generated inside the pocketsphinx hmm dir from\nthe cmudict.txt file. This means I can eliminate the fst_model\nsetting in addition to the phonetisaurus_executable setting. This\nleaves only the hmm_dir setting.","shortMessageHtmlLink":"Remove the fst file setting"}},{"before":"529fb2ded4afdc32a9c68f07c29c48e0cf038283","after":"5febb3a8111482d55a06bf070d7ea9edf3b32fba","ref":"refs/heads/new_pocketsphinx","pushedAt":"2023-04-08T18:41:38.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"aaronchantrill","name":null,"path":"/aaronchantrill","primaryAvatarUrl":"https://github.com/avatars/u/7544675?s=80&v=4"},"commit":{"message":"Reinit Pocketsphinx vocabularies\n\nI am working on a Libre ROC-RK3328-CC Renegade computer as my main\ndevelopment board for Naomi. I am suddenly getting this error\nafter using \"expect\" (in the joke plugin):\n\nERROR:naomi.mic:Passive transcription failed!\nTraceback (most recent call last):\n File \"/home/naomi/Naomi/naomi/mic.py\", line 318, in wait_for_keyword\n transcribed = [word.upper() for word in self.passive_stt_engine.transcribe(f)]\n File \"/home/naomi/Naomi/plugins/stt/pocketsphinx-stt/sphinxplugin.py\", line 417, in transcribe\n self._decoder.process_raw(data, False, True)\n File \"_pocketsphinx.pyx\", line 960, in _pocketsphinx.Decoder.process_raw\nIndexError: Out of bounds on buffer access (axis 0)\n\nI'm not sure what this error means. It always seems to affect the\npassive listening engine. Usually I use the pocketsphinx_kws plugin\nfor passive listening, so this may have been happening for a while\nand I just didn't notice. Re-initializing the engine seems to work\nfine, so I'm just keeping an eye on it. The biggest problem with\nre-initializing is that with our current audio system, Naomi tends\nto stutter when the re-initialization happens. This is one reason\nfor wanting to move to a multi-threaded approach and see if that\nhelps.","shortMessageHtmlLink":"Reinit Pocketsphinx vocabularies"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOC0wNVQwMjowMTowMi4wMDAwMDBazwAAAASRkAdD","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOC0wNVQwMjowMTowMi4wMDAwMDBazwAAAASRkAdD","endCursor":"Y3Vyc29yOnYyOpK7MjAyMy0wNC0wOFQxODo0MTozOC4wMDAwMDBazwAAAAMUwC2D"}},"title":"Activity · aaronchantrill/Naomi"}