Uma interface de usuário de voz que permite conversar com um Nano Bot, com o objetivo de criar uma experiência de conversação.
Ele fornece uma alternativa moderna aos assistentes virtuais tradicionais. É altamente personalizável , aproveitando o Picovoice; poderoso , apoiado por Nano Bots, que são compatíveis com provedores como OpenAI ChatGPT e Google Gemini; e hackable , oferecendo suporte para Nano Apps que podem ser codificados em Lua, Fennel ou Clojure.
clique para assistir ao vídeo
clique para assistir ao vídeo
Se você estiver executando um Raspberry Pi, verifique as instruções adicionais específicas.
git clone https://github.com/gbaptista/ion.git
cd ion
git clone https://github.com/gbaptista/ion-assets.git assets
cp .env.example .env # Fill the environment variables.
sudo pacman -S mpv # Arch / Manjaro
sudo apt-get install mpv # Debian / Ubuntu / Raspberry Pi OS
sudo dnf install mpv # Fedora / CentOS / RHEL
curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | sudo bash
sudo pacman -S ruby # Arch / Manjaro
sudo apt-get install ruby-full # Debian / Ubuntu / Raspberry Pi OS
sudo dnf install ruby # Fedora / CentOS / RHEL
sudo gem install bundler
sudo gem install nano-bots
sudo bundle install
pip install -r requirements.txt
# https://github.com/icebaker/ruby-nano-bots#setup
# Nano Bots CLI need to be installed and configured:
nb static/cartridges/default.yml - repl
# ?> Hi!
#
# Hello! How can I assist you today?
#
# ?> exit
./ion.sh static/personas/default.yml
# > ? Monitor Engine started.
# > Welcome to Ion!
# > Listening and waiting for a wake word.
Lembre-se de que alguns Nano Apps podem ter suas próprias dependências, portanto verifique se você os possui instalados para funcionar corretamente.
Para usar Nano Bots com OpenAI ChatGPT, você precisará de uma chave de API, que pode ser obtida na plataforma OpenAI. É um serviço pago que é cobrado com base no consumo.
Se você planeja usar Nano Bots com o Google Gemini, clique aqui para saber como obter suas credenciais. Também é um serviço pago.
Obtenha uma chave de acesso para o Picovoice registrando-se no console do Picovoice. É Forever-Free para "indivíduos que exploram, experimentam e avaliam" e é pago para outros casos de uso.
Para ativar sinais de fala e som, você precisa ser capaz de reproduzir arquivos de áudio, o que requer a instalação do mpv:
sudo pacman -S mpv # Arch / Manjaro
sudo apt-get install mpv # Debian / Ubuntu / Raspberry Pi OS
sudo dnf install mpv # Fedora / CentOS / RHEL
Clone os repositórios necessários:
git clone https://github.com/gbaptista/ion.git
cd ion
git clone https://github.com/gbaptista/ion-assets.git assets
Obtenha as chaves necessárias na seção Requisitos e configure seu arquivo .env
:
cp .env.example .env
Edite o conteúdo do arquivo .env
para adicionar suas chaves, exemplo:
PICOVOICE_ACCESS_KEY=your-key
OPENAI_API_ADDRESS=https://api.openai.com
OPENAI_API_KEY=your-access-token
NANO_BOTS_ENCRYPTION_PASSWORD=UNSAFE
NANO_BOTS_END_USER=your-user
Alternativamente, você pode exportar as variáveis de ambiente no seu sistema:
export PICOVOICE_ACCESS_KEY=your-key
export OPENAI_API_ADDRESS=https://api.openai.com
export OPENAI_API_KEY=your-access-token
export NANO_BOTS_ENCRYPTION_PASSWORD=UNSAFE
export NANO_BOTS_END_USER=your-user
Instale Babashka:
curl -s https://raw.githubusercontent.com/babashka/babashka/master/install | sudo bash
Você precisa ter Ruby 3 (com RubyGems) e Python 3 (com PyPI) instalados em seu sistema.
Instale Ruby e Bundler:
sudo pacman -S ruby # Arch / Manjaro
sudo apt-get install ruby-full # Debian / Ubuntu / Raspberry Pi OS
sudo dnf install ruby # Fedora / CentOS / RHEL
sudo gem install bundler
Instale e configure a CLI do Nano Bots:
sudo gem install nano-bots
Instale dependências Ruby:
sudo bundle install
Instale dependências do Python:
Se você estiver executando um Raspberry Pi, verifique as instruções adicionais específicas.
pip install -r requirements.txt
Comece garantindo que seu Nano Bot esteja funcionando corretamente testando-o por meio do REPL:
nb static/cartridges/default.yml - repl
?> Hi!
Hello! How can I assist you today?
?> What time is it?
date-and-time {}
{:date-time 2023-12-08T07:42:54-03:00, :timezone America/Sao_Paulo}
Right now it's 7:42 a.m.
?> |
Você pode sair do REPL digitando exit
.
Com os Nano Bots funcionando corretamente, inicie o Ion:
./ion.sh static/personas/default.yml
Você pode usar a palavra de ativação Jarvis
para falar e interagir:
> ? Monitor Engine started.
> Welcome to Ion!
> Listening and waiting for a wake word.
> ?️ Awake and recording your speech.
> ? Audio successfully recorded.
> ? Recorded audio temporarily saved to disk.
> ? Interaction Engine started.
> ✍️ Converting speech to text.
> Speech converted to text: What time is it?
> Nano Bot is executing a tool: date-and-time {}
> ? Nano Bot received a response from a tool: date-and-time {} {:date-time 2023-12-09T17...
> Nano Bot answer received: The current time is 17:34, or 5:34 PM.
> ? Starting to speak: The current time is 17:34, or 5:34 PM.
> Interaction completed.
> ?️ Recording a possible follow-up.
> ? Audio successfully recorded.
> ?️ No follow-up detected.
Lembre-se de que alguns Nano Apps podem ter suas próprias dependências, portanto verifique se você os possui instalados para funcionar corretamente.
Um arquivo YAML pessoal contém dados legíveis por humanos que definem como a voz soará, configurações personalizadas para provedores de serviços, ajustes de mecanismo de voz, registros, eventos e dicas de áudio, bem como o caminho para um cartucho Nano Bot que define objetivos, esperados comportamentos, ferramentas (funções) e configurações para autenticação e utilização do provedor.
A persona padrão está disponível em static/personas/default.yml
. Sinta-se à vontade para modificá-lo ou criar um novo.
Você pode ajustar as configurações para ter uma experiência melhor para seu cenário, configuração, ambiente e hardware específicos:
---
voice-engine :
settings :
maximum-recording-duration :
seconds : 30
duration-of-silence-to-stop-recording :
seconds : 2
minimum-recording-duration-to-be-a-valid-input :
seconds : 3
voice-probability-threshold : 0.5
O Picovoice, por padrão, suporta as seguintes palavras de ativação:
alexa, americano, blueberry, bumblebee, computer,
grapefruit, grasshopper, hey barista, hey google,
hey siri, jarvis, ok google, pico clock, picovoice,
porcupine, smart mirror, snowboy, terminator, view glass
Você pode usar várias palavras de ativação se desejar:
---
voice-engine :
provider :
settings :
porcupine :
keywords :
- jarvis
- alexa
sensitivities :
- 0.5
- 0.5
Você também pode criar uma palavra de ativação personalizada por meio da plataforma deles.
O suporte atual de Speech to Text é fornecido pelo Whisper da OpenAI:
---
speech-to-text :
provider :
id : openai
credentials :
address : ENV/OPENAI_API_ADDRESS
access-token : ENV/OPENAI_API_KEY
settings :
model : whisper-1
Permite que o sistema realize conversão de texto em fala em conteúdo parcialmente recebido. À medida que as respostas são geradas através do streaming, ele tenta inferir pontos ótimos onde temos texto suficiente para criar a fala e gradativamente criar novas falas para serem reproduzidas. Isso melhora a velocidade, pois não precisamos esperar que toda a resposta do Nano Bot seja fornecida antes de iniciar o processo de conversão de texto em fala.
---
text-to-speech :
settings :
fragment-speech : true
Você pode usar um dos três provedores de conversão de texto em fala suportados: OpenAI, AWS ou Google.
---
text-to-speech :
provider :
id : openai
credentials :
address : ENV/OPENAI_API_ADDRESS
access-token : ENV/OPENAI_API_KEY
settings :
model : tts-1
voice : onyx
Exemplos de vozes possíveis:
alloy, echo, fable, onyx, nova, shimmer
Para áudio de alta qualidade, você pode usar model: tts-1-hd
, embora seja mais lento e mais caro.
A conversão de texto em fala da OpenAI é independente do idioma; ele pode falar vários idiomas.
Confira todas as vozes disponíveis na documentação oficial.
---
text-to-speech :
provider :
id : aws
credentials :
access-key : ENV/AWS_ACCESS_KEY
secret-key : ENV/AWS_SECRET_KEY
region : ENV/AWS_REGION
settings :
voice_id : Danielle
engine : neural
Exemplos de possíveis vozes do português brasileiro:
Camila, Vitoria, Thiago
Exemplos de possíveis vozes do inglês americano:
Danielle, Matthew, Gregory, Joanna, Kendra, Kimberly, Salli, Joey, Ruth, Stephen
Confira todas as vozes disponíveis na documentação oficial.
Você precisa adicionar suas credenciais da AWS ao seu ambiente.
Observe que as vozes Polly são projetadas para idiomas específicos (por exemplo, pt-BR
, en-US
) e você precisa combinar corretamente o voice_id
com o tipo de engine
de voz ( neural
ou standard
).
Esteja ciente dos custos, pois as vozes neural
e standard
têm preços diferentes.
---
text-to-speech :
provider :
id : google
credentials :
service : cloud-text-to-speech-api
file-path : ENV/GOOGLE_CREDENTIALS_FILE_PATH
settings :
name : pt-BR-Neural2-A
ssml_gender : FEMALE
language_code : pt-BR
Como alternativa, se você estiver usando Application Default Credentials , poderá omitir o file-path
:
---
text-to-speech :
provider :
id : google
credentials :
service : cloud-text-to-speech-api
settings :
name : pt-BR-Neural2-A
ssml_gender : FEMALE
language_code : pt-BR
Exemplos de possíveis vozes do português brasileiro:
pt-BR | FEMALE:
pt-BR-Neural2-A, pt-BR-Neural2-C, pt-BR-Wavenet-A, pt-BR-Wavenet-C
pt-BR | MALE:
pt-BR-Neural2-B, pt-BR-Wavenet-B
Exemplos de possíveis vozes do inglês americano:
en-US | FEMALE:
en-US-Neural2-C, en-US-Neural2-E, en-US-Neural2-F, en-US-Neural2-G, en-US-Neural2-H,
en-US-News-K, en-US-News-L, en-US-Studio-O, en-US-Wavenet-C, en-US-Wavenet-E,
en-US-Wavenet-F, en-US-Wavenet-G, en-US-Wavenet-H
en-US | MALE:
en-US-Neural2-A, en-US-Neural2-D, en-US-Neural2-I, en-US-Neural2-J, en-US-News-N,
en-US-Studio-Q, en-US-Wavenet-A, en-US-Wavenet-B, en-US-Wavenet-D, en-US-Wavenet-I,
en-US-Wavenet-J
Confira todas as vozes disponíveis na documentação oficial.
Pode ser necessário adicionar o caminho do arquivo google-credentials.json
ao seu ambiente.
Observe que as vozes do Google são projetadas para idiomas específicos (por exemplo, pt-BR
, en-US
) e você precisa combinar corretamente o name
com ssml_gender
e language_code
.
Esteja ciente dos custos, pois as vozes Neural , Studio e WaveNet têm preços diferentes.
O Google oferece uma prévia do Polyglot Voices , que pode falar vários idiomas.
A operação iônica é baseada em um fluxo de eventos. Para entender esse fluxo e todos os eventos associados, você pode inspecionar o seguinte fluxograma:
clique para ver em tamanho maior
Descrição acessível de todos os eventos possíveis:
Monitorar mecanismo:
> monitor-engine-started
> welcome-message-booted
> listening-and-waiting
> awake-and-recording
> recording-follow-up
> audio-recorded
> audio-discarded
> no-follow-up-received
> audio-stored
> interaction-interrupted
Mecanismo de interação:
> interaction-engine-started
> speech-to-text-started
> speech-to-text-completed
> nano-bot-tool-confirming
> nano-bot-tool-executing
> nano-bot-tool-responding
> nano-bot-answer-received
> speaking-started
> interaction-completed
> interruption-requested
Outros eventos:
> error-raised
Cada um dos 21 eventos distintos possíveis que podem ser despachados durante a operação do Ion podem ser personalizáveis individualmente com símbolos (emojis Unicode), sinais de áudio, volume e mensagens.
Quais eventos deverão ter sinais de áudio, em que volume, etc., será uma decisão pessoal baseada na experiência que você está tentando criar para sua persona . Veja como você pode personalizar um evento:
event :
listening-and-waiting :
symbol :
message : Listening and waiting for a wake word.
audio : assets/audio/clue.wav
volume : 1
Símbolos (emojis Unicode) e mensagens são usados nos logs do Ion. As configurações de áudio e volume são usadas para reproduzir arquivos de áudio, que podem estar nos formatos WAV, OGG ou MP3.
Você pode ajustar os volumes individuais de cada evento para normalizar os diversos níveis de áudio. A recomendação é não ter volumes acima de 1,0, pois isso pode gerar distorção no áudio de alguns alto-falantes. O ideal é definir o volume mais alto igual ou inferior a 1,0 e reduzir os outros de acordo para manter o equilíbrio.
A welcome-message-booted
pode ser usada para reproduzir uma mensagem de boas-vindas usando conversão de texto em fala:
---
events :
welcome-message-booted :
symbol :
message : Welcome to Ion!
speak : true
volume : 1
O evento speaking-started
pode ser usado para definir o volume dos áudios de resposta de conversão de texto em fala:
---
events :
speaking-started :
symbol : ?
message : ' Starting to speak: '
volume : 0.8
O Ion funciona bem usando fones de ouvido simples e um microfone. Para ambientes abertos, você pode considerar investir em alto-falantes que proporcionem a experiência de áudio que você procura e, especificamente, um microfone apropriado para espaços abertos, como um omnidirecional ou aqueles projetados para salas de conferência.
Antes de executar pip install -r requirements.txt
, você precisa criar um ambiente virtual Python:
python3 -m venv env
source env/bin/activate
Confira Python no Raspberry Pi.
Para exibir emojis Unicode em terminais de console em um Raspberry Pi, você precisa instalar uma fonte que suporte emojis Unicode:
sudo apt-get install fonts-noto-color-emoji
Você precisa reiniciar o Raspberry Pi para ver os resultados.
Se você conectar um alto-falante ao computador usando um plugue jack, poderá ter problemas de inatividade de áudio, o que pode levar à audição de "ruído estático". No Linux, você pode corrigir isso:
/etc/modprobe.d/alsa-base.conf
options snd_hda_intel power_save=0 power_save_controller=N
/etc/pulse/daemon.conf
exit-idle-time = -1
Atualize o arquivo template.md
e então:
bb tasks/generate-readme.clj
Truque para atualizar automaticamente o README.md
quando template.md
muda:
sudo pacman -S inotify-tools # Arch / Manjaro
sudo apt-get install inotify-tools # Debian / Ubuntu / Raspberry Pi OS
sudo dnf install inotify-tools # Fedora / CentOS / RHEL
while inotifywait -e modify template.md ; do bb tasks/generate-readme.clj ; done
Truque para visualização ao vivo do Markdown:
pip install -U markdown_live_preview
mlp README.md -p 8076
Estamos empenhados em tornar o Ion acessível. Se você enfrentar algum problema de acessibilidade ou tiver recomendações de melhorias, sinta-se à vontade para preencher um problema!
1.1.0
Tenho tentado (sem sucesso) construir isso há mais de uma década e finalmente temos todas as peças principais do quebra-cabeça para torná-lo possível no nível que imaginei:
Esses seis ingredientes fazem a mágica acontecer e, além desse ponto, trata-se de continuar a melhorar a tecnologia subjacente e desenvolver sobre ela. O quebra-cabeça do primeiro capítulo foi resolvido e, embora este seja provavelmente apenas um vislumbre do que o futuro nos reserva, estou entusiasmado com as possibilidades.
Dito isto, ao longo dos anos de minhas tentativas, quero reconhecer três projetos principais que ao longo do caminho me deram esperança para o futuro:
Este é um projeto experimental em estágio inicial. Ion pode ser perigoso, então tome cuidado com o que você tenta construir; poderia executar ações destrutivas em seu computador. Além disso, esteja atento ao seu orçamento: certifique-se de monitorar e orçamentar qualquer fornecedor que estiver usando. O Ion pode produzir conteúdo inesperadamente longo ou loops infinitos/muito longos que podem fazer com que seus custos disparem.
Este software é distribuído sob a licença MIT, que inclui uma isenção de garantia. Além disso, os autores não assumem nenhuma responsabilidade por quaisquer danos ou custos que possam surgir do uso deste projeto experimental em estágio inicial. Use Ion por sua própria conta e risco.