Alexa Skill written in D
• programming, dlang, and alexa
As I wrote last week in my post about Alexa I started looking into developing custom skills for Alexa.
Custom Skills for Alexa are like apps for mobile devices. Amazon makes it easy to upload the source into their Lambda service. Custom Skills are webservices - everyhing happens in the cloud. Amazon Lambda lets you choose between:
- C#
- Java
- Nodejs
- Python
When facing the options I remembered the article I read on the dlang forums about how to use a D application in there. AWS Lambda Functions in D
Why D then?
So why chose D over the alternatives ?
- blazing fast
- statically typed
- insane compile time functionality
- personal taste and freedom to choose
Blazing fast ? Yes this is meant in two ways:
- fast compile time
- fast execution time
The dlang was designed to be fast - written by a experienced C++ compiler writer it was created to be compiled in a faster way. And since D is a system programming language and even shares the same compiler backend as a lot of other system languages it is equally fast as C++ and co. Why is performance especially interesting for an Alexa Skill? Because if you host it on AWS Lambda you pay per use - this means you pay per CPU/memory usage.
Template programming for the sane - D has a meta programming capability that is so strong because it allows the average programmer to go wild in it. I am using this to delegate incoming requests to the right endpoint here and to create simple to use REST interfaces to existing services like openwebif
You are not familiar with D yet? Then I have some resources for you to start:
- dlang feature overview
- free online book
- vibe.d (the web framework I am using)
- great article for people who came from C++ like me: How-does-D-improve-on-C++17
How does it work?
steps (tl;dr):
- prepare nodejs wrapper
- start up vagrant box
- build linux binary
- bundle zip for upload to lambda
- upload to lambda
- do a test invoke of lambda function
- setup alexa skill in Amazon developer console
- talk to a D application :)
Nodejs wrapper (0.)
This is necessary since Amazon Lambda does not natively support dlang in their service. I chose nodejs because I had the basis for the wrapper already in the mentioned “D in Lambda” article.
Vagrant and bulding … (1. - 5.)
Since Amazon Lambda is powered by linux machines we have to build a Linux binary of our D application. I am a mac and windows user, so I had to find a way to build and test my code on linux. Previously I would have set up a virtual box myself but I rememberd how tedious and error prone that is and decided to give vagrant a try. This makes the setup of exactly the kind of machine I needed a piece of cake:
As you can see it is based on a centos machine (that apparently is closest to the amayon AMI images) and only sets a couple of environment variables that we need to access AWS. The rest of the initialization of the box is delagated to a install.sh script that is run on first boot:
- install depedendencies like libevent
- download and install dmd d compiler
- download and install aws cli tool
- setup environment variables
- setup aws cli config based ont provided env
Using this box I have a new dev machine up and running after 2 minutes.
Then it is just a matter of running the run.sh
(see on github) in the box and it will compile, bundle, upload, configure and test the lambda function to and on AWS.
Setup alexa skill (6.)
This is a whole different beast unfortunately. Amazon does not yet support cli/remote control of their Amazon developer console. This means you have to setup the skill manually in a web interface. There are lots of tutorials on how to do that though and all the information needed to fill in the fields that my skill expects are in the repository: speech assets. Fortunately Amazon acknowledged this to be a big concern by developers and claims to be working on it.
One tutorial I found very good to follow by Amazon: Build a Trivia Skill in under an Hour
Talk to a D application (7.)
So what can this skill do for me now ?
Alexa is capable of controlling my televison tuner now and reacts to sentences like these now (although it is only in german currently):
Alexa, ask telly what is currently running
Alexa, ask telly for a list of channels
Alexa, ask telly what I recorded
Alexa, mute with telly
Alexa, switch to CNN with telly
Alexa, ask telly to go to standby
Alexa, start recording with telly
Alexa, ask telly to go to sleep in 30 minutes
You can find that skill on github: alexa-openwebif