{"id":16278269,"url":"https://github.com/gbaptista/ion","last_synced_at":"2025-08-03T04:32:54.769Z","repository":{"id":211653509,"uuid":"729643714","full_name":"gbaptista/ion","owner":"gbaptista","description":"Build your own JARVIS: An AI voice interface that enables you to talk with an AI model, creating a conversational experience. It offers a modern alternative to traditional virtual assistants. Highly customizable, leveraging Picovoice; powerful, backed by Nano Bots compatible with OpenAI ChatGPT and Google Gemini; and hackable, supporting Nano Apps.","archived":false,"fork":false,"pushed_at":"2024-06-22T19:17:54.000Z","size":162,"stargazers_count":21,"open_issues_count":0,"forks_count":6,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-03T08:51:25.219Z","etag":null,"topics":["ai","alexa","chatgpt","chatgpt-functions","gemini-ai","google-gemini","gpt-4","jarvis","llm","nano-bots","openai","raspberry-pi","speech","speech-recognition","speech-to-text","text-to-speech","virtual-assistant","voice","voice-assistant","voice-control"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gbaptista.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-09T21:58:58.000Z","updated_at":"2024-12-24T20:33:27.000Z","dependencies_parsed_at":"2023-12-16T19:48:34.865Z","dependency_job_id":"52927619-7d2c-4ebc-8aec-daa1962158c9","html_url":"https://github.com/gbaptista/ion","commit_stats":null,"previous_names":["gbaptista/ion"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gbaptista/ion","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fion","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fion/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fion/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fion/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gbaptista","download_url":"https://codeload.github.com/gbaptista/ion/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fion/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268495881,"owners_count":24259396,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-03T02:00:12.545Z","response_time":2577,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","alexa","chatgpt","chatgpt-functions","gemini-ai","google-gemini","gpt-4","jarvis","llm","nano-bots","openai","raspberry-pi","speech","speech-recognition","speech-to-text","text-to-speech","virtual-assistant","voice","voice-assistant","voice-control"],"created_at":"2024-10-10T18:58:02.372Z","updated_at":"2025-08-03T04:32:54.347Z","avatar_url":"https://github.com/gbaptista.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ion\n\nA [voice user interface](https://en.wikipedia.org/wiki/Voice_user_interface) that enables you to talk with a [Nano Bot](https://spec.nbots.io), aiming to create a [conversational](https://en.wikipedia.org/wiki/Conversational_user_interface) experience.\n\nIt provides a modern alternative to traditional [virtual assistants](https://en.wikipedia.org/wiki/Virtual_assistant). It's highly **customizable**, leveraging [Picovoice](https://picovoice.ai); **powerful**, backed by [Nano Bots](https://spec.nbots.io), which are compatible with providers such as [OpenAI ChatGPT](https://openai.com/chatgpt) and [Google Gemini](https://deepmind.google/technologies/gemini); and **hackable**, offering support for [Nano Apps](https://github.com/gbaptista/nano-apps) that can be coded in [Lua](https://www.lua.org/about.html), [Fennel](https://fennel-lang.org), or [Clojure](https://clojure.org).\n\n- [TL;DR and Quick Start](#tldr-and-quick-start)\n- [Documentation](#index)\n\n[![Ion Device Video](https://raw.githubusercontent.com/gbaptista/assets/main/ion/device.png)](https://youtu.be/6rIIyNRAWYE)\n\u003e [_click to watch the video_](https://youtu.be/6rIIyNRAWYE)\n\n[![Ion Console Video](https://raw.githubusercontent.com/gbaptista/assets/main/ion/console.png)](https://youtu.be/PhZbug7Qq4A)\n\u003e [_click to watch the video_](https://youtu.be/PhZbug7Qq4A)\n\n## TL;DR and Quick Start\n\n\u003e If you are running a Raspberry Pi, check its [specific additional instructions](#raspberry-pi).\n\n```sh\ngit clone https://github.com/gbaptista/ion.git\n\ncd ion\n\ngit clone https://github.com/gbaptista/ion-assets.git assets\n\ncp .env.example .env # Fill the environment variables.\n\nsudo pacman -S mpv # Arch / Manjaro\nsudo apt-get install mpv # Debian / Ubuntu / Raspberry Pi OS\nsudo dnf install mpv # Fedora / CentOS / RHEL\n\ncurl -s https://raw.githubusercontent.com/babashka/babashka/master/install | sudo bash\n\nsudo pacman -S ruby # Arch / Manjaro\nsudo apt-get install ruby-full # Debian / Ubuntu / Raspberry Pi OS\nsudo dnf install ruby # Fedora / CentOS / RHEL\n\nsudo gem install bundler\nsudo gem install nano-bots\n\nsudo bundle install\n\npip install -r requirements.txt\n\n# https://github.com/icebaker/ruby-nano-bots#setup\n# Nano Bots CLI need to be installed and configured:\nnb static/cartridges/default.yml - repl\n\n# 🤖\u003e Hi!\n#\n# Hello! How can I assist you today?\n#\n# 🤖\u003e exit\n\n./ion.sh static/personas/default.yml\n\n# \u003e 🐍 Monitor Engine started.\n# \u003e 👋 Welcome to Ion!\n# \u003e 🎧 Listening and waiting for a wake word.\n```\n\nRemember that some [Nano Apps](https://github.com/gbaptista/nano-apps) may have their own dependencies, so check if you have them installed for proper functioning.\n\n## Index\n\n- [TL;DR and Quick Start](#tldr-and-quick-start)\n- [Index](#index)\n- [Setup](#setup)\n    - [Services](#services)\n    - [Installation](#installation)\n- [Usage](#usage)\n- [Personas](#personas)\n    - [Voice Engine](#voice-engine)\n        - [Tweaking](#tweaking)\n        - [Custom Wake Words](#custom-wake-words)\n    - [Speech to Text](#speech-to-text)\n    - [Text to Speech](#text-to-speech)\n        - [Fragment Speech](#fragment-speech)\n        - [Providers](#providers)\n            - [OpenAI Text to Speech](#openai-text-to-speech)\n            - [AWS Amazon Polly](#aws-amazon-polly)\n            - [Google Text to Speech](#google-text-to-speech)\n- [Events](#events)\n    - [Flow of Events](#flow-of-events)\n    - [Customizing Events](#customizing-events)\n        - [Normalizing Volumes](#normalizing-volumes)\n        - [Special Events](#special-events)\n- [Hardware](#hardware)\n    - [Raspberry Pi](#raspberry-pi)\n    - [Known Pitfalls](#known-pitfalls)\n- [Development](#development)\n    - [Updating the README](#updating-the-readme)\n- [Accessibility](#accessibility)\n- [Version](#version)\n- [Acknowledgments](#acknowledgments)\n- [Disclaimer](#disclaimer)\n\n## Setup\n\n### Services\n\nTo use Nano Bots with [OpenAI ChatGPT](https://openai.com/chatgpt), you'll need an API Key, which you can obtain from the [OpenAI Platform](https://platform.openai.com). It is a paid service for which you are [charged based on consumption](https://openai.com/pricing).\n\nIf you're planning to use Nano Bots with [Google Gemini](https://deepmind.google/technologies/gemini), check [here](https://github.com/gbaptista/gemini-ai#credentials) to learn how to obtain your credentials. It's also a paid service.\n\nObtain an Access Key for [Picovoice](https://picovoice.ai) by registering at the [Picovoice Console](https://console.picovoice.ai/). It's _Forever-Free_ for _\"individuals exploring, experimenting, and evaluating\"_, and [paid for other use cases](https://picovoice.ai/pricing/).\n\n### Installation\n\nTo enable speech and sound cues, you need to be able to play audio files, which requires the installation of [mpv](https://mpv.io):\n\n```sh\nsudo pacman -S mpv # Arch / Manjaro\nsudo apt-get install mpv # Debian / Ubuntu / Raspberry Pi OS\nsudo dnf install mpv # Fedora / CentOS / RHEL\n```\n\nClone the necessary repositories:\n\n```sh\ngit clone https://github.com/gbaptista/ion.git\n\ncd ion\n\ngit clone https://github.com/gbaptista/ion-assets.git assets\n```\n\nGet the necessary keys from the [Requirements](#services) section and set up your `.env` file:\n\n```sh\ncp .env.example .env\n```\n\nEdit the content of the `.env` file to add your keys, example:\n```sh\nPICOVOICE_ACCESS_KEY=your-key\n\nOPENAI_API_ADDRESS=https://api.openai.com\nOPENAI_API_KEY=your-access-token\n\nNANO_BOTS_ENCRYPTION_PASSWORD=UNSAFE\nNANO_BOTS_END_USER=your-user\n```\n\nAlternatively, you can export the environment variables on your system:\n```sh\nexport PICOVOICE_ACCESS_KEY=your-key\n\nexport OPENAI_API_ADDRESS=https://api.openai.com\nexport OPENAI_API_KEY=your-access-token\n\nexport NANO_BOTS_ENCRYPTION_PASSWORD=UNSAFE\nexport NANO_BOTS_END_USER=your-user\n```\n\nInstall [Babashka](https://babashka.org):\n\n```sh\ncurl -s https://raw.githubusercontent.com/babashka/babashka/master/install | sudo bash\n```\n\nYou need to have [Ruby 3](https://www.ruby-lang.org) (with [RubyGems](https://rubygems.org)) and [Python 3](https://www.python.org) (with [PyPI](https://pypi.org)) installed on your system.\n\nInstall Ruby and Bundler:\n```sh\nsudo pacman -S ruby # Arch / Manjaro\nsudo apt-get install ruby-full # Debian / Ubuntu / Raspberry Pi OS\nsudo dnf install ruby # Fedora / CentOS / RHEL\n\nsudo gem install bundler\n```\n\nInstall and set up the [Nano Bots CLI](https://github.com/icebaker/ruby-nano-bots):\n```sh\nsudo gem install nano-bots\n```\n\nInstall Ruby dependencies:\n```sh\nsudo bundle install\n```\n\nInstall Python dependencies:\n\u003e If you are running a Raspberry Pi, check its [specific additional instructions](#raspberry-pi).\n```sh\npip install -r requirements.txt\n```\n\n## Usage\n\nStart by ensuring that your Nano Bot is operating correctly by testing it through the REPL:\n\n```sh\nnb static/cartridges/default.yml - repl\n```\n\n```text\n🤖\u003e Hi!\n\nHello! How can I assist you today?\n\n🤖\u003e What time is it?\n\ndate-and-time {}\n{:date-time 2023-12-08T07:42:54-03:00, :timezone America/Sao_Paulo}\n\nRight now it's 7:42 a.m.\n\n🤖\u003e |\n```\n\nYou can exit the REPL by typing `exit`.\n\nWith Nano Bots properly working, start Ion:\n\n```sh\n./ion.sh static/personas/default.yml\n```\n\nYou can use the [wake word](https://en.wikipedia.org/wiki/Keyword_spotting) `Jarvis` to speak and interact:\n\n```text\n\u003e 🐍 Monitor Engine started.\n\u003e 👋 Welcome to Ion!\n\u003e 🎧 Listening and waiting for a wake word.\n\u003e 🎙️ Awake and recording your speech.\n\u003e 🎶 Audio successfully recorded.\n\u003e 💾 Recorded audio temporarily saved to disk.\n\u003e 💎 Interaction Engine started.\n\u003e ✍️ Converting speech to text.\n\u003e 📝 Speech converted to text: What time is it?\n\u003e 🛠️ Nano Bot is executing a tool: date-and-time {}\n\u003e 📦 Nano Bot received a response from a tool: date-and-time {} {:date-time 2023-12-09T17...\n\u003e 📜 Nano Bot answer received: The current time is 17:34, or 5:34 PM.\n\u003e 🔊 Starting to speak: The current time is 17:34, or 5:34 PM.\n\u003e ✨ Interaction completed.\n\u003e 🎙️ Recording a possible follow-up.\n\u003e 🎶 Audio successfully recorded.\n\u003e 🕳️ No follow-up detected.\n```\n\nRemember that some [Nano Apps](https://github.com/gbaptista/nano-apps) may have their own dependencies, so check if you have them installed for proper functioning.\n\n## Personas\n\nA _persona_ YAML file contains human-readable data that defines how the voice will sound, custom configurations for service providers, voice engine tweaks, logs, events, and audio cues, as well as the path for a Nano Bot [_cartridge_](https://github.com/gbaptista/ion/blob/main/static/cartridges/default.yml) that defines goals, expected behaviors, tools (functions), and settings for authentication and provider utilization.\n\nThe default persona is available at [`static/personas/default.yml`](https://github.com/gbaptista/ion/blob/main/static/personas/default.yml). Feel free to modify it or create a new one.\n\n### Voice Engine\n\n#### Tweaking\n\nYou can tweak settings to have a better experience for your specific scenario, setup, environment, and hardware:\n\n```yaml\n---\nvoice-engine:\n  settings:\n    maximum-recording-duration:\n      seconds: 30\n    duration-of-silence-to-stop-recording:\n      seconds: 2\n    minimum-recording-duration-to-be-a-valid-input:\n      seconds: 3\n    voice-probability-threshold: 0.5\n```\n\n#### Custom Wake Words\n\n[Picovoice](https://picovoice.ai), by default, support the following [wake words](https://en.wikipedia.org/wiki/Keyword_spotting):\n\n```text\nalexa, americano, blueberry, bumblebee, computer,\ngrapefruit, grasshopper, hey barista, hey google,\nhey siri, jarvis, ok google, pico clock, picovoice,\nporcupine, smart mirror, snowboy, terminator, view glass\n```\n\nYou can use multiple wake words if you want:\n```yaml\n---\nvoice-engine:\n  provider:\n    settings:\n      porcupine:\n        keywords:\n          - jarvis\n          - alexa\n        sensitivities:\n          - 0.5\n          - 0.5\n```\n\nYou can also create a custom wake word [through their platform](https://picovoice.ai/blog/console-tutorial-custom-wake-word/).\n\n### Speech to Text\n\nThe current Speech to Text support is provided by OpenAI's [Whisper](https://openai.com/research/whisper):\n```yaml\n---\nspeech-to-text:\n  provider:\n    id: openai\n    credentials:\n      address: ENV/OPENAI_API_ADDRESS\n      access-token: ENV/OPENAI_API_KEY\n    settings:\n      model: whisper-1\n```\n\n### Text to Speech\n\n#### Fragment Speech\n\nEnables the system to perform text-to-speech on partially received content. As answers are generated through streaming, it tries to infer optimal points where we have enough text to create speech and gradually create new speeches to be played. This improves speed, as we don't need to wait for the entire answer from Nano Bot to be provided before starting the text-to-speech process.\n\n```yaml\n---\ntext-to-speech:\n  settings:\n    fragment-speech: true\n```\n\n#### Providers\n\nYou can use one of the three supported text-to-speech providers: OpenAI, AWS, or Google.\n\n##### OpenAI Text to Speech\n\n```yaml\n---\ntext-to-speech:\n  provider:\n    id: openai\n    credentials:\n      address: ENV/OPENAI_API_ADDRESS\n      access-token: ENV/OPENAI_API_KEY\n    settings:\n      model: tts-1\n      voice: onyx\n```\n\nExamples of possible voices:\n```text\nalloy, echo, fable, onyx, nova, shimmer\n```\n\nFor high-quality audio, you can use `model: tts-1-hd`, though it is slower and [more expensive](https://openai.com/pricing).\n\nOpenAI's text-to-speech is language-agnostic; it can speak multiple languages.\n\nCheck all the available voices in the [official documentation](https://platform.openai.com/docs/guides/text-to-speech/voice-options).\n\n##### AWS Amazon Polly\n\n```yaml\n---\ntext-to-speech:\n  provider:\n    id: aws\n    credentials:\n      access-key: ENV/AWS_ACCESS_KEY\n      secret-key: ENV/AWS_SECRET_KEY\n      region: ENV/AWS_REGION\n    settings:\n      voice_id: Danielle\n      engine: neural\n```\n\nExamples of possible Brazillian Portuguese voices:\n```text\nCamila, Vitoria, Thiago\n```\n\nExamples of possible American English voices:\n```text\nDanielle, Matthew, Gregory, Joanna, Kendra, Kimberly, Salli, Joey, Ruth, Stephen\n```\n\nCheck all the available voices in the [official documentation](https://docs.aws.amazon.com/polly/latest/dg/voicelist.html).\n\nYou need to add your AWS credentials to your [environment](#installation).\n\nNote that Polly voices are designed for specific languages (e.g., `pt-BR`, `en-US`), and you need to correctly match the `voice_id` with the type of voice `engine` (`neural` or `standard`).\n\nBe aware of [the costs](https://aws.amazon.com/polly/pricing/), as `neural` and `standard` voices are priced differently.\n\n##### Google Text to Speech\n\n```yaml\n---\ntext-to-speech:\n  provider:\n    id: google\n    credentials:\n      service: cloud-text-to-speech-api\n      file-path: ENV/GOOGLE_CREDENTIALS_FILE_PATH\n    settings:\n      name: pt-BR-Neural2-A\n      ssml_gender: FEMALE\n      language_code: pt-BR\n```\n\nAlternatively, if you are using [_Application Default Credentials_](https://cloud.google.com/docs/authentication/application-default-credentials), you can omit the `file-path`:\n\n```yaml\n---\ntext-to-speech:\n  provider:\n    id: google\n    credentials:\n      service: cloud-text-to-speech-api\n    settings:\n      name: pt-BR-Neural2-A\n      ssml_gender: FEMALE\n      language_code: pt-BR\n```\n\nExamples of possible Brazillian Portuguese voices:\n```text\npt-BR | FEMALE:\npt-BR-Neural2-A, pt-BR-Neural2-C, pt-BR-Wavenet-A, pt-BR-Wavenet-C\n\npt-BR | MALE:\npt-BR-Neural2-B, pt-BR-Wavenet-B\n```\n\nExamples of possible American English voices:\n```text\nen-US | FEMALE:\nen-US-Neural2-C, en-US-Neural2-E, en-US-Neural2-F, en-US-Neural2-G, en-US-Neural2-H,\nen-US-News-K, en-US-News-L, en-US-Studio-O, en-US-Wavenet-C, en-US-Wavenet-E,\nen-US-Wavenet-F, en-US-Wavenet-G, en-US-Wavenet-H\n\nen-US | MALE:\nen-US-Neural2-A, en-US-Neural2-D, en-US-Neural2-I, en-US-Neural2-J, en-US-News-N,\nen-US-Studio-Q, en-US-Wavenet-A, en-US-Wavenet-B, en-US-Wavenet-D, en-US-Wavenet-I,\nen-US-Wavenet-J\n```\n\nCheck all the available voices in the [official documentation](https://cloud.google.com/text-to-speech/docs/voices).\n\nYou may need to add the path to your `google-credentials.json` file to your [environment](#installation).\n\nNote that Google voices are designed for specific languages (e.g., `pt-BR`, `en-US`), and you need to correctly match the `name` with the `ssml_gender` and `language_code`.\n\nBe aware of [the costs](https://cloud.google.com/text-to-speech/pricing), as _Neural_, _Studio_, and _WaveNet_ voices are priced differently.\n\nGoogle offers a preview of [_Polyglot Voices_](https://cloud.google.com/text-to-speech/docs/polyglot), which can speak multiple languages.\n\n## Events\n\n### Flow of Events\n\nIon operation is based on a flow of events. To understand this flow and all the associated events, you can inspect the following flow chart:\n\n[![Ion Events Flow Chart, accessible description above.](https://raw.githubusercontent.com/gbaptista/assets/main/ion/events-flow.jpg)](https://raw.githubusercontent.com/gbaptista/assets/main/ion/events-flow.jpg)\n\u003e [_click to view in a larger size_](https://raw.githubusercontent.com/gbaptista/assets/main/ion/events-flow.jpg)\n\nAccessible description of all possible events:\n\n**Monitor Engine:**\n\n```text\n\u003e monitor-engine-started\n  \u003e welcome-message-booted\n  \u003e listening-and-waiting\n    \u003e awake-and-recording\n    \u003e recording-follow-up\n    \u003e audio-recorded\n      \u003e audio-discarded\n      \u003e no-follow-up-received\n      \u003e audio-stored\n\n\u003e interaction-interrupted\n```\n\n**Interaction Engine:**\n\n```text\n\u003e interaction-engine-started\n  \u003e speech-to-text-started\n    \u003e speech-to-text-completed\n      \u003e nano-bot-tool-confirming\n      \u003e nano-bot-tool-executing\n      \u003e nano-bot-tool-responding\n      \u003e nano-bot-answer-received\n        \u003e speaking-started\n          \u003e interaction-completed\n\n\u003e interruption-requested\n```\n\n**Other Events:**\n\n```\n\u003e error-raised\n```\n\n### Customizing Events\n\nEach of the [21 possible distinct events](#flow-of-events) that can be dispatched during the operation of Ion, can be individually customizable with symbols (Unicode emojis), audio cues, volume, and messages.\n\nWhich events should have audio cues, at what volume, etc., will be a personal decision based on the experience that you are trying to create for your [_persona_](#personas). Here's how you can customize an event:\n\n```yaml\nevent:\n  listening-and-waiting:\n    symbol: 🎧\n    message: Listening and waiting for a wake word.\n    audio: assets/audio/clue.wav\n    volume: 1\n```\n\nSymbols (Unicode emojis) and messages are used in the logs of Ion. Audio and volume settings are used for playing audio files, which can be in WAV, OGG, or MP3 formats.\n\n#### Normalizing Volumes\n\nYou can adjust the individual volumes for each event to normalize the varying levels of audio. The recommendation is to not have volumes above 1.0, as this may create distortion in the audio on some speakers. Ideally, set your highest volume at or below 1.0, and reduce the others accordingly to maintain balance.\n\n#### Special Events\n\nThe `welcome-message-booted` can be used to play a welcome message using text-to-speech:\n\n```yaml\n---\nevents:\n  welcome-message-booted:\n    symbol: 👋\n    message: Welcome to Ion!\n    speak: true\n    volume: 1\n```\n\nThe `speaking-started` event can be used to set the volume of the text-to-speech answer audios:\n\n```yaml\n---\nevents:\n  speaking-started:\n    symbol: 🔊\n    message: 'Starting to speak:'\n    volume: 0.8\n```\n\n## Hardware\n\nIon performs well using simple headphones and a microphone. For open environments, you may want to consider investing in speakers that will provide the audio experience you are seeking and, specifically, a microphone appropriate for open spaces, such as an omnidirectional one or those designed for conference rooms.\n\n### Raspberry Pi\n\nBefore running `pip install -r requirements.txt`, you need to create a Python virtual environment:\n\n```sh\npython3 -m venv env\nsource env/bin/activate\n```\n\nCheck out [Python on Raspberry Pi](https://www.raspberrypi.com/documentation/computers/os.html#python-on-raspberry-pi).\n\nTo display Unicode emojis in console terminals on a Raspberry Pi, you need to install a font that supports Unicode emojis:\n\n```sh\nsudo apt-get install fonts-noto-color-emoji\n```\n\nYou need to restart the Raspberry Pi to see the results.\n\n### Known Pitfalls\n\nIf you connect a speaker to your computer using a jack plug, you might experience issues with audio inactivity which can lead to hearing \"static noise.\" On Linux, you can fix this by:\n\n```sh\n/etc/modprobe.d/alsa-base.conf\noptions snd_hda_intel power_save=0 power_save_controller=N\n\n\n/etc/pulse/daemon.conf\nexit-idle-time = -1\n```\n\n## Development\n\n### Updating the README\n\nUpdate the `template.md` file and then:\n\n```sh\nbb tasks/generate-readme.clj\n```\n\nTrick for automatically updating the `README.md` when `template.md` changes:\n\n```sh\nsudo pacman -S inotify-tools # Arch / Manjaro\nsudo apt-get install inotify-tools # Debian / Ubuntu / Raspberry Pi OS\nsudo dnf install inotify-tools # Fedora / CentOS / RHEL\n\nwhile inotifywait -e modify template.md; do bb tasks/generate-readme.clj; done\n```\n\nTrick for Markdown Live Preview:\n```sh\npip install -U markdown_live_preview\n\nmlp README.md -p 8076\n```\n\n## Accessibility\n\nWe are committed to making Ion accessible. If you face any accessibility issues or have recommendations for improvement, please feel free to fill out an [issue](https://github.com/gbaptista/ion/issues)!\n\n## Version\n\n`1.1.0`\n\n## Acknowledgments\n\nI have been trying (and failing) to build this for over a decade, and we finally have all the core pieces of the puzzle to make it possible at the level I envisioned:\n\n- Voice User Interface\n    - Speech-to-Text\n    - Text-to-Speech\n    - Keyword Spotting\n- Conversational User Interface\n    - Large Language Models\n    - Function Calling\n- Hardware\n    - IoT\n\nThese six ingredients make the magic happen, and beyond this point, it's all about continuing to improve the underlying technology and build on top of it. The puzzle for the first chapter has been solved, and although this is probably just an early glimpse of what the future holds for us, I'm thrilled about the possibilities.\n\nThat being said, over the years of my attempts, I want to acknowledge three main projects that along the way gave me hope for the future:\n\n- [Mycroft](https://en.wikipedia.org/wiki/Mycroft_(software))\n- [Mozilla Common Voice](https://en.wikipedia.org/wiki/Common_Voice)\n- [Amazon Alexa](https://en.wikipedia.org/wiki/Amazon_Alexa)\n\n## Disclaimer\n\nThis is an experimental, early-stage project. Ion may be dangerous, so be careful with what you try to build; it could execute destructive actions on your computer. Also, be mindful of your budget: Ensure you monitor and budget for whatever provider you are using. Ion may produce unexpectedly lengthy content or infinite/too-long loops that could cause your costs to skyrocket.\n\nThis software is distributed under the [MIT License](https://github.com/gbaptista/ion/blob/main/LICENSE), which includes a disclaimer of warranty. Furthermore, the authors assume no responsibility for any damage or costs that may arise from the use of this experimental, early-stage project. Use Ion at your own risk.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgbaptista%2Fion","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgbaptista%2Fion","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgbaptista%2Fion/lists"}