Al telefono con Ruby e Adhearsion
Luca Pradovera

Hackatron

26 Novembre 2013
Adh-cosa?
• Framework Ruby per applicazioni VoIP

• Componente di logica per le app vocali (3PCC)

• Open source e gestito da una Fondazione

• Versione 2.4.x

• Attivo e rilasciato costantemente

2
Parliamone (al telefono)!
• Compatibile con Asterisk, FreeSWITCH e… Ruby!

AMI, IES

HTTP, DRb

SIP	

WebRTC

3
Cos’è una “voice application”
• Interagisce con il flusso logico di chiamata

• Gestisce le sorgenti audio, ma non il flusso di media vero e proprio

• Integra i canali di comunicazione ed i servizi a disposizione

Non serve fare così!
4
Lista della spesa
• Cosa mi serve?

• Adhearsion: gem install adhearsion

• Una piattaforma telefonica (Asterisk o FreeSWITCH): https://github.com/
mojolingo/Telephony-Dev-Box

• Un softphone: Jitsi, Blink, X-Lite, e molti altri

5
Hello, Adhearsion!
• ahn create hackatron
# lib/hello_controller.rb!
class HelloController  Adhearsion::CallController!
!
def run!
answer!
play hello-world!
hangup!
end!
end

6
Connettersi ad Asterisk
# config/adhearsion.rb!
Adhearsion.config do |config|!

!
config.development do |dev|!
dev.platform.logging.level = :debug!
end!

!
config.punchblock.platform = :asterisk!
config.punchblock.username = manager!
config.punchblock.password = password!
config.punchblock.host = asterisk.local-dev.mojolingo.com!
end!

!
Adhearsion.router do!
route 'default', HelloController!
end!

7
Configurazione
• config/adhearsion.rb contiene la configurazione

• rake config:show visualizza nella console i valori attuali e i nomi delle
chiavi di ENV

• Se ENV contiene una variabile con quel nome, il suo valore viene
sovrascritto, stile 12Factor (http://12factor.net/config)

• Di solito si utilizza un file .env con Foreman

8
Se telefonando…
• Il metodo consigliato per avviare le applicazioni è Foreman

• foreman start

• Oppure bundle exec ahn start .
{14:14}[2.0.0]~/projects/hackatron ➭ foreman start
14:15:47 ahn.1 | started with pid 35661
14:15:49 ahn.1 | Starting Adhearsion server at /Users/luca/projects/hackatron
14:15:49 ahn.1 | You tried to initialize with an invalid environment name . Valid values are
[:production, :development, :staging, :test].
14:15:49 ahn.1 | [2013-11-26 14:15:49] INFO Adhearsion::Initializer: Setting RAILS_ENV to development
14:15:49 ahn.1 | [2013-11-26 14:15:49] DEBUG Punchblock::Connection::Asterisk: Starting up...
14:15:49 ahn.1 | [2013-11-26 14:15:49] INFO Adhearsion::PunchblockPlugin::Initializer: Starting connection to
server
[2013-11-26 14:15:49] INFO Adhearsion::Console: Launching Adhearsion Console
14:15:51 ahn.1 | [2013-11-26 14:15:51] INFO Adhearsion::PunchblockPlugin::Initializer: Connected to Punchblock
server
14:15:51 ahn.1 | [2013-11-26 14:15:51] INFO Adhearsion::Process: Transitioning from booting to running with 0
active calls due to booted event.
14:15:51 ahn.1 | [2013-11-26 14:15:51] INFO Adhearsion::Initializer: Adhearsion v2.4.0 initialized in
development!

9
Demo time!
• Connettiamo un softphone alla nostra VM Asterisk usando l’utente SIP
usera@asterisk.local-dev.mojolingo.com e la password “usera”

• Avviamo Adhearsion

• Chiamiamo una extension (numero) qualunque e…

10
Cosa mi fornisce?
• Menu interattivi con #ask e #menu
• Audio con #play e #speak
• Chiamare altri utenti con #dial
• Funzionalità avanzate: chiamata in uscita (originate), controller di conferma,
eventi di chiamata come on_joined e on_end 

• Text-to-speech (TTS) e automated speech recognition (ASR) sono supportati
secondo gli standard SSML e GRXML se la piattaforma li supporta

11
Unit testing
• I controller sono normali classi Ruby, testarli con RSpec è semplice

• Fare integration testing è più complesso (SIPp, NuBot)
describe SimonGame do!
!
let(:example_response) { OpenStruct.new(:response = 5)
}!
!

let(:example_number)
let(:long_response)
let(:long_number)

{ 5
}!
{ OpenStruct.new(:response = 55555) }!
{ 55555
}!

let(:mock_call) { double 'Call' }!
subject { SimonGame.new(mock_call) }!

!
describe #random_number do!
!
before { subject.stub!(:rand).and_return(example_number) }!
!
it generates a random number do!
subject.random_number.should eq example_number!
end!
end!

!
describe #update_number do!
!
!

before { subject.number = 123 }!
before { subject.stub!(:random_number).and_return 4 }!

it adds a digit to the end of the number do!
subject.update_number!
subject.number.should eq 1234!
end!
end!
# …!
end

12
Plugin
• I plugin consentono di aggiungere agevolmente funzionalità già realizzate

• http://ahnhub.com/ fa da repository centralizzato

• Alcuni esempi

• Virginia include un server HTTP in Adhearsion

• Matrioska per in-call apps (premo un tasto, eseguo un controller)

• adhearsion-reporter per il supporto ad Airbrake/Errbit e New Relic

• Molto altro! DRb, funzioni specifiche per la piattaforma Asterisk, Voicemail,
LDAP, Mongoid…

13
Case Studies
• Servizio di dettatura con trascrizione e traduzione

• Predictive dialer e call center outbound

• IVR con servizi self-service

• Operatore telefonico virtuale con servizi in-call avanzati

• Servizio di registrazione e sottotitolatura video didattici

• Call center inbound con servizio di segreteria per professionisti

14
Riferimenti
• http://adhearsion.com/

• @adhearsion su Twitter

• #adhearsion su Freenode IRC

• Mailing list: https://groups.google.com/forum/#!forum/adhearsion

!

• Noi siamo http://mojolingo.com/

• Il mio handle Twitter è @lucaprado

• Github e IRC: polysics

15
Grazie a tutti!
• http://www.slideshare.net/polysics/al-telefono-con-adhearsion-e-ruby

• https://github.com/polysics/hackatron_ahn_demo

Ridiamo vita alla voce!
16

Al telefono con Adhearsion e Ruby

  • 1.
    Al telefono conRuby e Adhearsion Luca Pradovera Hackatron 26 Novembre 2013
  • 2.
    Adh-cosa? • Framework Rubyper applicazioni VoIP • Componente di logica per le app vocali (3PCC) • Open source e gestito da una Fondazione • Versione 2.4.x • Attivo e rilasciato costantemente 2
  • 3.
    Parliamone (al telefono)! •Compatibile con Asterisk, FreeSWITCH e… Ruby! AMI, IES HTTP, DRb SIP WebRTC 3
  • 4.
    Cos’è una “voiceapplication” • Interagisce con il flusso logico di chiamata • Gestisce le sorgenti audio, ma non il flusso di media vero e proprio • Integra i canali di comunicazione ed i servizi a disposizione Non serve fare così! 4
  • 5.
    Lista della spesa •Cosa mi serve? • Adhearsion: gem install adhearsion • Una piattaforma telefonica (Asterisk o FreeSWITCH): https://github.com/ mojolingo/Telephony-Dev-Box • Un softphone: Jitsi, Blink, X-Lite, e molti altri 5
  • 6.
    Hello, Adhearsion! • ahncreate hackatron # lib/hello_controller.rb! class HelloController Adhearsion::CallController! ! def run! answer! play hello-world! hangup! end! end 6
  • 7.
    Connettersi ad Asterisk #config/adhearsion.rb! Adhearsion.config do |config|! ! config.development do |dev|! dev.platform.logging.level = :debug! end! ! config.punchblock.platform = :asterisk! config.punchblock.username = manager! config.punchblock.password = password! config.punchblock.host = asterisk.local-dev.mojolingo.com! end! ! Adhearsion.router do! route 'default', HelloController! end! 7
  • 8.
    Configurazione • config/adhearsion.rb contienela configurazione • rake config:show visualizza nella console i valori attuali e i nomi delle chiavi di ENV • Se ENV contiene una variabile con quel nome, il suo valore viene sovrascritto, stile 12Factor (http://12factor.net/config) • Di solito si utilizza un file .env con Foreman 8
  • 9.
    Se telefonando… • Ilmetodo consigliato per avviare le applicazioni è Foreman • foreman start • Oppure bundle exec ahn start . {14:14}[2.0.0]~/projects/hackatron ➭ foreman start 14:15:47 ahn.1 | started with pid 35661 14:15:49 ahn.1 | Starting Adhearsion server at /Users/luca/projects/hackatron 14:15:49 ahn.1 | You tried to initialize with an invalid environment name . Valid values are [:production, :development, :staging, :test]. 14:15:49 ahn.1 | [2013-11-26 14:15:49] INFO Adhearsion::Initializer: Setting RAILS_ENV to development 14:15:49 ahn.1 | [2013-11-26 14:15:49] DEBUG Punchblock::Connection::Asterisk: Starting up... 14:15:49 ahn.1 | [2013-11-26 14:15:49] INFO Adhearsion::PunchblockPlugin::Initializer: Starting connection to server [2013-11-26 14:15:49] INFO Adhearsion::Console: Launching Adhearsion Console 14:15:51 ahn.1 | [2013-11-26 14:15:51] INFO Adhearsion::PunchblockPlugin::Initializer: Connected to Punchblock server 14:15:51 ahn.1 | [2013-11-26 14:15:51] INFO Adhearsion::Process: Transitioning from booting to running with 0 active calls due to booted event. 14:15:51 ahn.1 | [2013-11-26 14:15:51] INFO Adhearsion::Initializer: Adhearsion v2.4.0 initialized in development! 9
  • 10.
    Demo time! • Connettiamoun softphone alla nostra VM Asterisk usando l’utente SIP usera@asterisk.local-dev.mojolingo.com e la password “usera” • Avviamo Adhearsion • Chiamiamo una extension (numero) qualunque e… 10
  • 11.
    Cosa mi fornisce? •Menu interattivi con #ask e #menu • Audio con #play e #speak • Chiamare altri utenti con #dial • Funzionalità avanzate: chiamata in uscita (originate), controller di conferma, eventi di chiamata come on_joined e on_end • Text-to-speech (TTS) e automated speech recognition (ASR) sono supportati secondo gli standard SSML e GRXML se la piattaforma li supporta 11
  • 12.
    Unit testing • Icontroller sono normali classi Ruby, testarli con RSpec è semplice • Fare integration testing è più complesso (SIPp, NuBot) describe SimonGame do! ! let(:example_response) { OpenStruct.new(:response = 5) }! ! let(:example_number) let(:long_response) let(:long_number) { 5 }! { OpenStruct.new(:response = 55555) }! { 55555 }! let(:mock_call) { double 'Call' }! subject { SimonGame.new(mock_call) }! ! describe #random_number do! ! before { subject.stub!(:rand).and_return(example_number) }! ! it generates a random number do! subject.random_number.should eq example_number! end! end! ! describe #update_number do! ! ! before { subject.number = 123 }! before { subject.stub!(:random_number).and_return 4 }! it adds a digit to the end of the number do! subject.update_number! subject.number.should eq 1234! end! end! # …! end 12
  • 13.
    Plugin • I pluginconsentono di aggiungere agevolmente funzionalità già realizzate • http://ahnhub.com/ fa da repository centralizzato • Alcuni esempi • Virginia include un server HTTP in Adhearsion • Matrioska per in-call apps (premo un tasto, eseguo un controller) • adhearsion-reporter per il supporto ad Airbrake/Errbit e New Relic • Molto altro! DRb, funzioni specifiche per la piattaforma Asterisk, Voicemail, LDAP, Mongoid… 13
  • 14.
    Case Studies • Serviziodi dettatura con trascrizione e traduzione • Predictive dialer e call center outbound • IVR con servizi self-service • Operatore telefonico virtuale con servizi in-call avanzati • Servizio di registrazione e sottotitolatura video didattici • Call center inbound con servizio di segreteria per professionisti 14
  • 15.
    Riferimenti • http://adhearsion.com/ • @adhearsionsu Twitter • #adhearsion su Freenode IRC • Mailing list: https://groups.google.com/forum/#!forum/adhearsion ! • Noi siamo http://mojolingo.com/ • Il mio handle Twitter è @lucaprado • Github e IRC: polysics 15
  • 16.
    Grazie a tutti! •http://www.slideshare.net/polysics/al-telefono-con-adhearsion-e-ruby • https://github.com/polysics/hackatron_ahn_demo Ridiamo vita alla voce! 16