From 645de02e5560acbb589c00d5179a0e6193b9a852 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Mon, 25 Jan 2021 19:13:08 +0100 Subject: [PATCH] Moving second article --- static/css/blog.css | 4 ++ static/css/common.css | 4 -- static/css/home.css | 6 +- static/img/voice-assistant-1.png | Bin 0 -> 40810 bytes ...omizable-voice-assistant-with-Platypush.md | 67 ++++++++++++++++++ templates/article.html | 2 +- templates/index.html | 2 +- 7 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 static/img/voice-assistant-1.png create mode 100644 static/pages/Build-your-customizable-voice-assistant-with-Platypush.md diff --git a/static/css/blog.css b/static/css/blog.css index ed726dc..90e5a6a 100644 --- a/static/css/blog.css +++ b/static/css/blog.css @@ -10,6 +10,10 @@ main .content code, .codehilite { font-size: .85em; } +a:hover { + opacity: 0.7; +} + .description h3 { font-weight: normal; opacity: 0.6; diff --git a/static/css/common.css b/static/css/common.css index 6639bf0..83dd2f5 100644 --- a/static/css/common.css +++ b/static/css/common.css @@ -20,10 +20,6 @@ a, a:visited { text-decoration: none; } -a:hover { - opacity: 0.7; -} - header { display: flex; align-items: center; diff --git a/static/css/home.css b/static/css/home.css index 867e14b..ae10312 100644 --- a/static/css/home.css +++ b/static/css/home.css @@ -12,7 +12,6 @@ main { box-shadow: 0 1px 3px 1px #ddd; overflow: hidden; text-overflow: ellipsis; - max-height: 30em; color: black !important; } @@ -76,6 +75,11 @@ a { border-bottom: 0; } + +a:hover { + opacity: 0.8; +} + .description { color: rgba(0, 0, 0, 0.7); font-size: .9em; diff --git a/static/img/voice-assistant-1.png b/static/img/voice-assistant-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ec24983091504b7f1e3c127ad3c592818aeba847 GIT binary patch literal 40810 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 literal 0 HcmV?d00001 diff --git a/static/pages/Build-your-customizable-voice-assistant-with-Platypush.md b/static/pages/Build-your-customizable-voice-assistant-with-Platypush.md new file mode 100644 index 0000000..05a7842 --- /dev/null +++ b/static/pages/Build-your-customizable-voice-assistant-with-Platypush.md @@ -0,0 +1,67 @@ +[//]: # (title: Build your customizable voice assistant with Platypush) +[//]: # (description: Use the available integrations to build a voice assistant with a simple microphone) +[//]: # (image: /img/voice-assistant-1.png) +[//]: # (published: 2019-09-05) + +My dream of a piece of software that you could simply talk to and get things done started more than 10 years ago, when I +was still a young M.Sc student who imagined getting common tasks done on my computer through the same kind of natural +interaction you see between Dave and [HAL 9000](https://en.wikipedia.org/wiki/HAL_9000) in +[2001: A Space Odyssey](https://en.wikipedia.org/wiki/2001:_A_Space_Odyssey_(film)). Together with a friend I developed +[Voxifera](https://github.com/BlackLight/Voxifera) way back in 2008. Although the software worked well enough for basic +tasks, as long as it was always me to provide the voice commands and as long as the list of custom voice commands was +below 10 items, Google and Amazon in the latest years have gone way beyond what an M.Sc student alone could do with +fast-Fourier transforms and Markov models. + +When years later I started building [Platypush](https://git.platypush.tech/platypush/platypush), I still dreamed of the +same voice interface, leveraging the new technologies, while not being caged by the interactions natively provided by +those commercial assistants. My goal was still to talk to my assistant and get it to do whatever I wanted to, regardless +of the skills/integrations supported by the product, regardless of whichever answer its AI was intended to provide for +that phrase. And, most of all, my goal was to have all the business logic of the actions to run on my own device(s), not +on someone else’s cloud. I feel like by now that goal has been mostly accomplished (assistant technology with 100% +flexibility when it comes to phrase patterns and custom actions), and today I’d like to show you how to set up your own +Google Assistant on steroids as well with a Raspberry Pi, microphone and platypush. I’ll also show how to run your +custom hotword detection models through the [Snowboy](https://snowboy.kitt.ai/) integration, for those who wish greater flexibility when it comes to +how to summon your digital butler besides the boring “Ok Google” formula, or those who aren’t that happy with the idea +of having Google to constantly listen to everything that is said in the room. For those who are unfamiliar with +platypush, I suggest +reading [my previous article](https://blog.platypush.tech/article/Ultimate-self-hosted-automation-with-Platypush) on +what it is, what it can do, why I built it and how to get started with it. + +## Context and expectations + +First, a bit of context around the current state of the assistant integration (and the state of the available assistant APIs/SDKs in general). + +My initial goal was to have a voice assistant that could: + +1. Continuously listen through an audio device for a specific audio pattern or phrase and process the subsequent voice + requests. + +2. Support multiple models for the hotword, so that multiple phrases could be used to trigger a request process, and + optionally one could even associate a different assistant language to each hotword. + +3. Support conversation start/end actions even without hotword detection — something like “start listening when I press + a button or when I get close to a distance sensor”. + +4. Provide the possibility to configure a list of custom phrases or patterns (ideally + through [regular expressions](https://en.wikipedia.org/wiki/Regular_expression)) that, when matched, would run a + custom pre-configured task or list of tasks on the executing device, or on any device connected through it. + +5. If a phrase doesn’t match any of those pre-configured patterns, then the assistant would go on and process the + request in the default way (e.g. rely on Google’s “how’s the weather?” or “what’s on my calendar?” standard response). + +Basically, I needed an assistant SDK or API that could be easily wrapped into a library or tiny module, a module that could listen for hotwords, start/stop conversations programmatically, and return the detected phrase directly back to my business logic if any speech was recognized. + +I eventually decided to develop the integration with the Google Assistant and ignore Alexa because: + +- Alexa’s original [sample app](https://github.com/alexa/alexa-avs-sample-app.git) for developers was a relatively heavy + piece of software that relied on a Java backend and a Node.js web service. + +- In the meantime Amazon has pulled the plug off that original project. + +- The sample app has been replaced by the [Amazon AVS (Alexa Voice Service)](https://github.com/alexa/avs-device-sdk), + which is a C++ service mostly aimed to commercial applications and doesn’t provide a decent quickstart for custom + Python integrations. + +- There are [few Python examples for the Alexa SDK](https://developer.amazon.com/en-US/alexa/alexa-skills-kit/alexa-skill-python-tutorial#sample-python-projects), + but they focus on how to develop a skill. I’m not interested in building a skill that runs on Amazon’s servers — I’m + interested in detecting hotwords and raw speech on any device, and the SDK should let me do whatever I want with that. diff --git a/templates/article.html b/templates/article.html index f1a26d8..cf3f52a 100644 --- a/templates/article.html +++ b/templates/article.html @@ -10,7 +10,7 @@
-
Platypush blog
+
PlatyBlog
diff --git a/templates/index.html b/templates/index.html index d6ea44b..5effc02 100644 --- a/templates/index.html +++ b/templates/index.html @@ -9,7 +9,7 @@
-
Platypush blog
+
PlatyBlog