Raspberry

Configurar PBX Asterisk no Raspberry Pi

Há um bom tempo eu mostrei como configurar um PBX Asterisk no notebook/desktop com Linux, para controlar um LED RGB conectado a um Arduino através de uma URA (Unidade de Resposta Audível). Dessa vez, vamos dispensar qualquer microcontrolador, configurando tudo do Asterisk no Raspberry Pi e vamos configurar um ramal para um softphone.

Aplicação

E para quê ter um PBX em casa? Bom, uma das razões pode ser justamente controlar GPIO através de uma URA. Vamos começar pelo básico, depois do artigo eu publico um video no canal DobitAoByteBrasil e discorro mais a respeito.

Primeiro passo – Instalando pacotes



O Asterisk é bastante modular. Nessa instalação haverão coisas que não serão utilizadas agora, mas esse artigo será referência para outros, por isso sugiro que instale tudo conforme recomendado. Mas antes, temos que burlar um problema. Faça o seguinte:

Só mostro meus sorrisos, as lágrimas não estão dispostas nos artigos. Esse processo aparentemente “estranho” vai resolver um problemão.

Se você chegar na tela seguinte, parabéns, primeiro passo concluído. Se não chegou, supra as dependências. Eu levei praticamente um dia inteiro pra acertar a configuração até aqui. Seja perseverante.

asterisk no raspberry
asterisk no raspberry

Segundo passo – configurar add-ons

Agora no menu vamos selecionar alguns ítens. à direita, selecione os ítens marcados com asterisco.

asterisk no raspberry
asterisk no raspberry

Com Tab, alterne para Save & Exit. Agora 2 comandos extremamente demorados. Vá almoçar, jantar, dormir, tomar café da manhã, fazer uma hora de esteira, jogar um video-game, pintar um quadro e volte para ver se deu certo.

O parâmetro -j4 é para utilizar os 4 núcleos, senão ele vai compilar tudo em 1 só, e aí meu amigo, case hoje e volte nas bodas de prata.

Após a compilação…

asterisk no raspberry
asterisk no raspberry

Se a compilação ocorreu sem erros, parabéns, agora já podemos instalar o asterisk. Vamos fazer o que está descrito ao final da mensagem:

asterisk no raspberry
asterisk no raspberry

Dá pra ser mais rápido?

Claro que dá, mas como eu estava com preguiça, fiz desse jeito mesmo, “ao vivo”. Só que poderia ter sido feito a partir de uma imagem no computador, de modo a aproveitar o processamento de uma plataforma x86. Se desejar, siga esse tutorial para preparar a imagem.

Terceiro passo – Configurar o Asterisk no Raspberry

Agora as configurações envolvem conceitos, os quais você poderá adquirir depois. Vamos focar em fazer funcionar primeiramente.

Configurar um ramal

Vamos configurar um ramal. Os ramais são configurados no arquivo /etc/asterisk/sip.conf. No final do arquivo, adicionei um ramal para utilizar nesse artigo:

Configurar um contexto

Um contexto é o processo que deverá ocorrer em resposta a uma situação, no sentido literal. O número a ser discado será 8888. Quando o ramal discar para 8888, o contexto correspondente será o arduino. O número que segue a discagem é o primeiro passo> Supondo que a discagem fosse encaminhada para o contexto arduino e depois tivesse um segundo passo, ele retornaria para dar sequência. Mas não é o caso.

Estou replicando primeiramente o exemplo do Arduino citado ao início desse, justamente para testar a funcionalidade. Se estiver funcionando da mesma forma, podemos avançar com tutoriais. Mas invés de conectar um Arduino, agora vou abrir um socket UDP em meu desktop e apenas imprimir os valores advindos da rede. Ainda assim vou manter o nome do contexto para realmente replicar a configuração e provar o conceito.

Vamos agora criar o contexto editando o arquivo /etc/asterisk/extensions.conf:

As primeiras 5 linhas estão relacionadas ao tratamento da ligação. Em seguida, os passos 1,1 1,2 se referem à escolha feita na URA. Do mesmo modo, a opção 3, que também possuem dois passos cada. Ou seja, ao entrar no contexto, ele executa um script AGI com o parâmetro numérico que o segue, então volta para o contexto de s no passo 4, que é onde se seleciona uma opção. Apenas na escolha do passo 3 a ligação é encerrada. Não estranhe a extension global dentro do contexto.

O parãmetro Background(dobitaobyte) toca um áudio antes da interação com a URA. O áudio deverá estar em /var/lib/asterisk/sounds.

É um processo diferente, mas não é complicado, certo?

As últimas duas linhas são para outro número dentro do mesmo contexto. Se esse usuário discar 1234, tocará o áudio e fará hangup em seguida. O áudio pode ser qualquer um, desde que siga o padrão descrito mais adiante.

Criar o script AGI

O script Python para o envio de dados via socket UDP deve ficar em /var/lib/asterisk/agi-bin. Seu conteúdo deverá ser o seguinte:

Qualquer porta acima de 1024 é permitida, fica a seu critério. O IP deve corresponder ao IP do host que receberá a mensagem.

O UDP não garante a entrega de pacotes, não tem CRC, não entrega ordenadamente. Por isso preferi fazer um loop e enviar 3 vezes a mesma mensagem, apenas para garantir sua transmissão. Se sua rede estiver ruim a ponto de não conseguir entregar o pacote em 3 tentativas, talvez esteja na hora de uma manutenção por aí.

Criar o arquivo de áudio

Tem algumas maneiras de fazer isso, escolha a sua.

Google Translator

Não gosto de trapaça, mas acho que não tem nada que nos impeça de utilizar o Google Translator para gerar a voz. Se desejar fazê-lo, o procedimento é o seguinte:

1 – Remova todos os arquivos de midia do cache do Google Chrome:

Depois acesse o site translator.google.com e digite o texto em português, então clique em Falar (ícone do canto esquerdo). Após, o arquivo estará lá no cache de mídias do browser:

asterisk no raspberry
asterisk no raspberry

Nuance Vocalizer Expressive

Se quiser um ótimo resultado, pode pegar uma demonstração do Loquendo. Entre com o texto, selecione o idioma e a voz de quem vai falar e o arquivo será automaticamente baixado. Porém esse vocalizador expressivo da Nuance não é gratuito e os áudios gerados por ele não podem ser utilizados comercialmente sem uma licença, ok? Baixe o arquivo, brinque, faça uso pessoal e considere comprar uma licença caso deseje criar um produto.

Linux TTS

Tem soluções gratuítas para Linux, inclusive sendo possível gerar a voz diretamente no asterisk usando text-to-speech. Se não me engano, o padrão do Asterisk é o Festival. Uma lista extensa das possiblidades podem ser vistas nesse link.

Se quiser fazer TTS on-the-fly no Google Translator, pode usar esse script perl.

Converter o áudio para GSM

Para o Asterisk tocar o áudio adequadamente, é necessário que alguns parâmetros sejam definidos; 8KHz, mono e GSM. Para converter um arquivo comum como um desses supracitados, utilize o seguinte comando:

Sei que não é necessário dizer que o nome do arquivo corresponde ao que foi especificado no arquivo extensions.conf, certo?

Executar o asterisk

Para executar, simplesmente digite asterisk, que rodará o serviço em segundo plano. Se não houver nenhum erro na configuração ou nas dependências, você conseguirá acessar o console com alguns diferentes parâmetros. O mais básico:

Para ver o plano de discagem configurado conforme os passos anteriores, digite:

Isso deve retornar a configuração do plano de discagem que criamos no arquivo extensions.conf.

asterisk no raspberry
asterisk no raspberry

Para ter maior verbosidade, inclua um monte de ‘vvvvv’ antes de iniciar o prompt do Asterisk:

Para saber se a porta SIP está disponível no sistema, digite:

Que deve retornar algo como:

asterisk no raspberry
asterisk no raspberry

Agora precisamos configurar um softphone.

Softphone

O softphone lhe permitirá estabelecer uma conexão SIP com o PBX Asterisk. Instale-o e siga o Wizard.

Apenas configure usuário, senha e sip server. Depois, disque para 8888.

asterisk no raspberry
asterisk no raspberry

O video está disponível no canal DobitAoByteBrasil no Youtube, não deixe de dar seu like e se inscrever no canal, valeu?

Conclusão

A conclusão é que não tem nada concluído. Isso foi só um exemplo de URA, mas tem uma quantidade enorme de configurações ainda, inclusive várias que não dá pra fazer no Raspberry. Mas com isso, já podemos interagir com os GPIO do Raspberry de uma maneira diferente. O contexto arduino está configurado para executar o mesmo AGI com diferentes parâmetros, mas podemos executar diferentes AGIs para diferentes mensagens, basta gravar uma introdução e depois, uma mensagem para cada ítem. Utilizando o festival para fazer text-to-speech é possível obter informações do sistema através desses scripts e por fim, criar muitas outras coisa!

Para discar de ramal para ramal é necessário uma configuração um pouco diferente, vou tentar escrever mais a respeito.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!