From 683d08525a28995e920cad72ad8661c522624e3f Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 17:35:30 -0400 Subject: [PATCH 01/31] =?UTF-8?q?major=20refactor=20to=20many=20parts=20of?= =?UTF-8?q?=20this=20repository=20=E2=80=94=20added=20bootstrap,=20rewrote?= =?UTF-8?q?=20recipes=20to=20use=20tjbot-lib,=20updated=20READMEs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 21 +- FAQ.md | 21 -- MAINTAINERS.md | 7 +- README.md | 82 +++-- bootstrap/README.md | 50 +++ bootstrap/bootstrap.sh | 2 + .../led_test.js | 0 .../tjbot-blacklist-snd.conf | 0 featured/README.md | 32 +- images/wiring.png | Bin 0 -> 327611 bytes recipes/README.md | 31 +- recipes/conversation/.gitignore | 19 +- recipes/conversation/README.md | 89 ++---- recipes/conversation/config.default.js | 27 ++ recipes/conversation/config.js | 24 -- recipes/conversation/conversation.js | 227 +++----------- recipes/conversation/package.json | 15 +- recipes/conversation/workspace-sample.json | 1 + recipes/sentiment_analysis/.gitignore | 19 +- recipes/sentiment_analysis/README.md | 132 +++----- recipes/sentiment_analysis/config.default.js | 27 ++ recipes/sentiment_analysis/config.js | 21 -- recipes/sentiment_analysis/package.json | 17 +- recipes/sentiment_analysis/sentiment.js | 295 +++++++++--------- recipes/speech_to_text/.gitignore | 19 +- recipes/speech_to_text/README.md | 99 +++--- recipes/speech_to_text/blacklist-rgb-led.conf | 5 - recipes/speech_to_text/config.default.js | 16 + recipes/speech_to_text/config.js | 6 - recipes/speech_to_text/led_test.js | 27 -- recipes/speech_to_text/package.json | 27 +- recipes/speech_to_text/stt.js | 235 ++++---------- 32 files changed, 651 insertions(+), 942 deletions(-) delete mode 100644 FAQ.md create mode 100644 bootstrap/README.md create mode 100755 bootstrap/bootstrap.sh rename {recipes/sentiment_analysis => bootstrap}/led_test.js (100%) rename recipes/sentiment_analysis/blacklist-rgb-led.conf => bootstrap/tjbot-blacklist-snd.conf (100%) mode change 100755 => 100644 create mode 100644 images/wiring.png create mode 100755 recipes/conversation/config.default.js delete mode 100755 recipes/conversation/config.js mode change 100755 => 100644 recipes/conversation/conversation.js mode change 100755 => 100644 recipes/conversation/package.json create mode 100644 recipes/conversation/workspace-sample.json create mode 100755 recipes/sentiment_analysis/config.default.js delete mode 100755 recipes/sentiment_analysis/config.js delete mode 100755 recipes/speech_to_text/blacklist-rgb-led.conf create mode 100755 recipes/speech_to_text/config.default.js delete mode 100755 recipes/speech_to_text/config.js delete mode 100755 recipes/speech_to_text/led_test.js diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 51b56a4a..7aa45161 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,26 +1,27 @@ ## Questions - -If you are having difficulties using the APIs or have a question about the IBM Watson Services, please ask a question on [dW Answers] (https://developer.ibm.com/answers/questions/ask/?topics=watson) or [Stack Overflow] (https://stackoverflow.com/users/login?ssrc=anon_ask&returnurl=http%3a%2f%2fstackoverflow.com%2fquestions%2fask%3ftags%3dibm-watson). +If you are having difficulties using the Watson APIs or have a question about the IBM Watson Services, please ask a question on [dW Answers] (https://developer.ibm.com/answers/questions/ask/?topics=watson) or [Stack Overflow] (https://stackoverflow.com/users/login?ssrc=anon_ask&returnurl=http%3a%2f%2fstackoverflow.com%2fquestions%2fask%3ftags%3dibm-watson). ## Issues - If you encounter an issue with the kit, you are welcome to submit an issue. Before that, please search for similar issues. It's possible somebody has encountered this issue already. -##Pull Requests -If you want to contribute to the repository, fork the project, create a pull request. Your commit request needs to be in the following format: +## Pull Requests +If you want to contribute to the repository, please fork the project and create a pull request. Your commit request needs to be in the following format: - (#idOfIssue) Simple description +``` + (#idOfIssue) Simple description + More details. This line is optional. +``` - More details. This line is optional. - If there is no issue related to your commit, create one first. It will be better to understand the goal of your work. After your Pull Request (PR) has been reviewed and signed off, a maintainer will merge it into the master branch. ### Legal stuff -We have tried to make it as easy as possible to make contributions. This applies to how we handle the legal aspects of contribution. We use the same approach—the [Developer's Certificate of Origin 1.1 (DCO)](DCO1.1.txt)—that the Linux® Kernel [community](http://elinux.org/Developer_Certificate_Of_Origin) uses to manage code contributions. + +We have tried to make it as easy as possible to make contributions. This applies to how we handle the legal aspects of contribution. We use the same approach — the [Developer's Certificate of Origin 1.1 (DCO)](DCO1.1.txt) — that the Linux® Kernel [community](http://elinux.org/Developer_Certificate_Of_Origin) uses to manage code contributions. + We simply ask that when submitting a pull request, the developer must include a sign-off statement in the pull request description. Here is an example Signed-off-by line, which indicates that the submitter accepts the DCO: ``` Signed-off-by: John Doe - +``` diff --git a/FAQ.md b/FAQ.md deleted file mode 100644 index 9e44c1c0..00000000 --- a/FAQ.md +++ /dev/null @@ -1,21 +0,0 @@ -# FAQs and Bugs - -> Documenting some known bugs or issues and how to address them - -#Speech to text crashing - - -# Watson Conversation - Resource not found - - - -##Noisy Speaker - - - -##Bluetooth Audio - - - - -##Cannot find module diff --git a/MAINTAINERS.md b/MAINTAINERS.md index a6daada4..e2c1aa4c 100755 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,4 +1,7 @@ # Maintainers -- Maryam Ashoori. maryam at us.ibm.com -- Victor Dibia. dibiavc at us.ibm.com +TJBot was lovingly created by researchers at IBM Research. + +- [Maryam Ashoori](https://github.com/maryamashoori) is the creator of TJBot and is the ringleader of our merry band of cardboard robots. +- [Justin Weisz](https://github.com/jweisz) created the TJBot library and generally tries to bring order to our chaos. +- [Victor Dibia](https://github.com/victordibia) created TJBot’s initial receipes and is our master of demos. diff --git a/README.md b/README.md index 2f12553a..a2846ea8 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,66 @@ # IBM TJBot - + -[IBM Watson Maker Kits](http://ibm.biz/mytjbot) are a collection of DIY open source templates to connect to [Watson services](https://www.ibm.com/watson/developercloud/services-catalog.html) in a fun way. [IBM TJBot](http://ibm.biz/mytjbot) is the first maker kit in the collection. You can 3D print or laser cut the robot frame, then use one of the available [recipes](recipes) to bring him to life! +[IBM Watson Maker Kits](http://ibm.biz/mytjbot) are a collection of DIY open source templates to build things with [Watson](https://www.ibm.com/watson/developercloud/services-catalog.html) in a fun and easy way. [IBM TJBot](http://ibm.biz/mytjbot) is the first maker kit in the collection. You can 3D print or laser cut the robot body, then use one of our [recipes](recipes) to bring him to life! -Better still, you can create your own custom recipes to bring exciting ideas to life using any combination of Watson's Cognitive API's! +In addition, you can unleash your own creativity and create new recipes that bring TJBot to life using any of the available [Watson services](https://www.ibm.com/watson/developercloud/services-catalog.html)! -**TJBot will only run on Raspberry Pi.** +**TJBot only works with a Raspberry Pi.** -# Get TJBot -You can download [the design files](https://ibmtjbot.github.io/#gettj) and 3D print or laser cut TJBot. -[Here is an instructable](http://www.instructables.com/id/Build-TJ-Bot-Out-of-Cardboard/) to help you with the details. +# Build TJBot +You can make your own TJBot in a number of ways. -# Bring TJBot to life -[Recipes](recipes) are step by step instructions to help you connect your TJBot to [Watson services](https://www.ibm.com/watson/developercloud/services-catalog.html). -The [recipes](recipes) are designed based on a Raspberry Pi. You can either run one of the available [recipes](recipes) or create your own recipe that brings sweet ideas to life using any combination of [Watson API](https://www.ibm.com/watson/developercloud/services-catalog.html)! +- **3d Print or Laser Cut**. If you have access to a 3D printer or laser cutter, you can print/cut TJBot yourself. Begin by downloading the [design files](https://ibmtjbot.github.io/#gettj) and firing up your printer/cutter. +- **TJBot Full Kit**. You can order a full TJBot kit with the laser cut cardboard and all the electronics from [Sparkfun](https://www.sparkfun.com/products/14123). +- **TJBot Cardboard Kit**. You can purchase the TJBot laser cut cardboard from [Texas Laser Creations](http://texlaser.com). -We have provided three initial [recipes](recipes) for you: -- Use your voice to control a light with Watson [[instructions](http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/speech_to_text)] -- Make your robot respond to emotions using Watson [[instructions](http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/sentiment_analysis)] -- Build a talking robot with Watson Conversation [[instructions](http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/conversation)] - -Here are some of the featured recipes created by TJBot enthusiasts: -- Tjwave: Fun controller recipe for TJBot's servo arm [[instructions](http://www.instructables.com/id/Build-a-Waving-Robot-Using-Watson-Services/)] [[github](https://github.com/victordibia/tjwave)] -- Tjdashboard: Web interface to visualize underlying processes on TJBot. [[github](https://github.com/victordibia/tjdashboard)] -- Tjvision: Get your TJBot to recognize images using the Watson Visual Recognition API. [[github](https://github.com/victordibia/tjvision)] -- SwiftyTJ that enables TJBot’s LED to be controlled from a Swift program [[github](https://github.com/jweisz/swifty-tj)] -- Build a TJBot that cares [[instructions](https://medium.com/ibm-watson-developer-cloud/build-a-chatbot-that-cares-part-1-d1c273e17a63#.6sg1yfh4w)] [[github](https://github.com/boxcarton/tjbot-raspberrypi-nodejs)] -- Project Intu, not a recipe but a middleware that can be installed on TJBot and be used to architect more complex interactions for your robot [[developercloud](http://www.ibm.com/watson/developercloud/project-intu.html)] [[github](https://github.com/watson-intu/self-sdk#raspberry-pi)] +## Electronics +There are a number of components you can add to TJBot to bring him to life. Not all of these are required for all recipes. -# Contribute to TJBot -TJBot is open source and we'd love to see what you can make with him. Here are some ideas to get you started. +- [Raspberry Pi 3 + SD card preloaded with NOOBS](http://www.mcmelectronics.com/product/RASPBERRY-PI-RPI-MODB-16GB-NOOBS-/83-17304). **This is a required component to make TJBot work!** 🤖 +- [NeoPixel RGB LED (8mm)](https://www.adafruit.com/product/1734). Note that if you are using other kinds of LEDs, you may need to add a resistor; this LED doesn’t require one. +- [Female-to-female jumper wires](https://www.amazon.com/dp/B00KOL5BCC/). TJBot will only need 3 of these wires, so you’ll have extra. +- [Female-to-male jumper wires](https://www.amazon.com/dp/B00PBZMN7C/). TJBot will only need 3 of these wires, so you’ll have extra. +- [USB Microphone](https://www.amazon.com/gp/product/B00IR8R7WQ/). Other brands of USB microphones should also work. +- [Mini Bluetooth Speaker](https://www.amazon.com/gp/product/B00OEPCHL2/). Any small speaker with either a 3.5mm audio jack or Bluetooth will work. Note that if you are using the 3.5mm audio jack, you may wish to add a [USB Audio Adapter](https://www.adafruit.com/product/1475) to avoid audio interference with the LED. +- [Servo Motor](https://www.amazon.com/RioRand-micro-Helicopter-Airplane-Controls/dp/B00JJZXRR0/). Note that the red (middle) wire is 5v, the brown wire is ground, and the orange wire is data. +- [Raspberry Pi Camera](https://www.amazon.com/dp/B01ER2SKFS/). Either the 5MP or 8MP camera will work. + +## Assembly +Once you have obtained your TJBot, please refer to [the assembly instructions](http://www.instructables.com/id/Build-TJ-Bot-Out-of-Cardboard/) to put it all together. + +For reference, here is the wiring diagram to hook up the LED and servo to your Raspberry Pi. + +![](images/wiring.png) + +> 💡 Be careful when connecting the LED! If it is connected the wrong way, you may end up burning it out. The LED has a flat notch on one side; use this to orient the LED and figure out which pin is which. - - Visual recognition. TJBot has a placeholder behind his left eye to insert a Raspberry Pi camera. Try connecting the camera to the Watson Visual Recognition API so TJ can say hello when he sees you. +> For the servo, note that the red (middle) wire is 5v, the brown wire is ground, and the orange wire is data. - - IoT. The Watson IoT service lets you control smart home devices (e.g. Philips Hue, LIFX lights, etc. ). Connect TJBot to IoT and have him control your home. +# Bring TJBot to Life +[Recipes](recipes) are step-by-step instructions to bring your TJBot to life with [Watson](https://www.ibm.com/watson/developercloud/services-catalog.html). - - Connected robots. You can program multiple TJBots to send messages to each other using the Watson IoT platform. +We have provided three initial [recipes](recipes) for you: + +- Use Your Voice to Control a Light with Watson [[instructions](http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/speech_to_text)] +- Make Your Robot Respond to Emotions Using Watson [[instructions](http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/sentiment_analysis)] +- Build a Talking Robot with Watson [[instructions](http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/conversation)] + +After checking out our sample receipes, we encourage you to take a look at [featured recipes](../featured) created by members of our community. + +# Contribute to TJBot +TJBot is an open source project designed to make it fun and easy to interact with [Watson](https://www.ibm.com/watson/developercloud/services-catalog.html). We’d love to see what you can make with him. Here are some ideas to get you started. -If you have created your own recipe, we would love to include it as a [featured recipe](featured/README.md)! Just submit a pull request for your receipe instructions and code and send a link to a demo video to tjbot@us.ibm.com (Vimeo & YouTube preferred). We will review it and if we decide to include it in our repository, you'll be listed as the developer. See [CONTRIBUTING.md](CONTRIBUTING.md). +- **Visual recognition**. Make TJBot recognize your face using the [Watson Visual Recognition](https://www.ibm.com/watson/developercloud/visual-recognition.html) service and the Raspberry Pi Camera. +- **IoT**. Let TJBot control your smart home devices using the [Watson IoT platform](https://www.ibm.com/internet-of-things/platform/watson-iot-platform/). +- **Connected robots**. Program multiple TJBots to chat with each other! -We cannot wait to see what you build with [TJBot](http://ibm.biz/mytjbot)! +If you would like your own recipe included in our [featured recipe](featured) list, please [send us email](mailto:tjbot@us.ibm.com) with a link to your repository and a demo video. # About TJBot -[TJ](http://ibm.biz/mytjbot) is affectionately named after Thomas J. Watson, the first Chairman and CEO of IBM. TJBot was born at IBM Research as an experiment to find the best practices in the design and implementation of cognitive objects. +[TJBot](http://ibm.biz/mytjbot) was affectionately named after Thomas J. Watson, the first Chairman and CEO of IBM. TJBot was created by [Maryam Ashoori](https://github.com/maryamashoori) at IBM Research as an experiment to find the best practices in the design and implementation of cognitive objects. He was born on November 9, 2016 via [this blog post](https://www.ibm.com/blogs/research/2016/11/calling-makers-meet-tj-bot/). -Feel free to contact TJBot at tjbot@us.ibm.com +Feel free to [contact the team](mailto:tjbot@us.ibm.com) with any questions about this project. -## License -This library uses the [Apache License Version 2.0 software license] (LICENSE). +# License +This project uses the [Apache License Version 2.0](LICENSE) software license. diff --git a/bootstrap/README.md b/bootstrap/README.md new file mode 100644 index 00000000..59587a06 --- /dev/null +++ b/bootstrap/README.md @@ -0,0 +1,50 @@ +# TJBot Bootstrap + +Perform the following operations to prepare your Raspberry Pi for becoming a TJBot. + +**Note: This is coming soon as a shell script. Stay tuned.** + +1. Boot your Pi and connect to Wifi (click the icon in the menu bar) + +2. Upgrade your Pi’s OS + + sudo apt-get update + sudo apt-get dist-upgrade + +> You’ll need to do `apt-get upgrade` first because that updates the repository cache. Otherwise, `apt-get dist-upgrade` won't do anything because it doesn't know there is a distribution upgrade. + +> During the upgrade, say "Y" when prompted to replace the `lightdm.conf` file with the package maintainers version. + +If you have plugged in your speaker via USB or Bluetooth, disable the kernel modules for the built-in audio jack. + + sudo cp bootstrap/tjbot-blacklist-snd.conf /etc/modprobe.d/ + sudo update-initramfs -u + +If you have plugged in your speaker via the headphone jack, you may experience interference between the speaker and the LED when using both simultaneously. In this case, do not disable the kernel modules for the built-in audio jack. + + sudo rm /etc/modprobe.d/tjbot-blacklist-snd.conf + sudo update-initramfs -u + +3. Reboot + + sudo reboot + +4. Remove old conf files from `/home/pi/oldconffiles` if they are present + + rm -rf ~/oldconffiles + +5. Install Node.js + + curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - + sudo apt-get install -y nodejs + +6. Check out the TJBot source code + + cd Desktop + git clone https://github.com/ibmtjbot/tjbot + +7. Run a recipe + + cd ~/Desktop/tjbot/recipes/intro + npm install + sudo node intro.js diff --git a/bootstrap/bootstrap.sh b/bootstrap/bootstrap.sh new file mode 100755 index 00000000..85821b83 --- /dev/null +++ b/bootstrap/bootstrap.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo "This is a placeholder for the TJBot boostrap script. Until it has been written, please follow the directions in README.md to configure your Raspberry Pi for TJBot." diff --git a/recipes/sentiment_analysis/led_test.js b/bootstrap/led_test.js similarity index 100% rename from recipes/sentiment_analysis/led_test.js rename to bootstrap/led_test.js diff --git a/recipes/sentiment_analysis/blacklist-rgb-led.conf b/bootstrap/tjbot-blacklist-snd.conf old mode 100755 new mode 100644 similarity index 100% rename from recipes/sentiment_analysis/blacklist-rgb-led.conf rename to bootstrap/tjbot-blacklist-snd.conf diff --git a/featured/README.md b/featured/README.md index f50c7e87..b665039c 100644 --- a/featured/README.md +++ b/featured/README.md @@ -1,27 +1,13 @@ # Featured Recipes -Featured recipes are some exciting recipes created by TJBot enthusiasts. +Featured recipes are exciting recipes created by members of the TJBot community. +If you would like your own recipe included here, please [send us email](mailto:tjbot@us.ibm.com) with a link to your repository and a demo video. -- **[TJWave](https://github.com/victordibia/tjwave)** : Fun controller recipe for TJBot's servo arm. -- **[Build a TJBot That Cares](https://medium.com/ibm-watson-developer-cloud/build-a-chatbot-that-cares-part-1-d1c273e17a63#.vtxwvsydl)** : This recipe puts a voice interface onto TJBot, then gives it the ability to converse and understand your emotional tones. -- **[SwiftyTJ](https://github.com/jweisz/swifty-tj)** : This recipe enables TJBot’s LED to be controlled from a Swift program. -- **[TJ Weather](https://github.com/suprbh/tjweather)** : TJBOt as a personal weather station -- **[Project Intu](https://github.com/watson-intu/self-sdk#raspberry-pi)** : Project Intu is an experimental service that allows developers to quickly and seamlessly integrate various cognitive services, such as Conversation and Speech-to-Text, with the capabilities of various devices, spaces and physical objects. While not being a recipe, Intu is a middleware that can be installed on TJBot and used to architect more complex interactions for your robot. Learn [more here](http://www.ibm.com/watson/developercloud/project-intu.html). - - - -# Contributing Your Own Recipes - -TJBot is open source and we'd love to see what you can make with him. If you would like your recipe to be featured here, send us an email at tjbot@us.ibm.com. -Here are some ideas to get you started. - - - Visual recognition. TJBot has a placeholder behind his left eye to insert a Raspberry Pi camera. Try connecting the camera to the Watson Visual Recognition API so TJ can say hello when he sees you. - - - IoT. The Watson IoT service lets you control smart home devices (e.g. Philips Hue, LIFX lights, etc. ). Connect TJBot to IoT and have him control your home. - - - Connected robots. You can program multiple TJBots to send messages to each other using the Watson IoT platform. - -Submit a pull request for your receipe instructions and code and send a link to a demo video to tjbot@us.ibm.com (Vimeo & YouTube preferred). We will review it and if we decide to include it in our repository, you'll be listed as the developer. See [CONTRIBUTING.md](../CONTRIBUTING.md). - -We cannot wait to see what you build with TJBot! +- **[TJWave](https://github.com/victordibia/tjwave)** by [Victor Dibia](https://github.com/victordibia). Fun controller recipe for TJBot's servo arm. +- **[Build a TJBot That Cares](https://medium.com/ibm-watson-developer-cloud/build-a-chatbot-that-cares-part-1-d1c273e17a63#.vtxwvsydl)** by [Josh Zheng](https://github.com/boxcarton). This recipe puts a voice interface onto TJBot, then gives it the ability to converse and understand your emotional tones. +- **[SwiftyTJ](https://github.com/jweisz/swifty-tj)** by [Justin Weisz](htts://github.com/jweisz). This recipe enables TJBot’s LED to be controlled from a Swift program. +- **[TJ Weather](https://github.com/suprbh/tjweather)** by [suprbh](https://github.com/suprbh). Use TJBot as a personal weather station. +- **[VisualTJ](https://github.com/samuelvogelmann/visualtj)** by [Samuel Vogelmann](https://github.com/samuelvogelmann). A Node-RED based application to make your TJbot see and recognize the world. +- **[Tell the Time](https://github.com/damiancummins/tell_the_time)** by [Damian Cummins](https://github.com/damiancummins). Have TJBot tell you the time. +- **[Project Intu](https://github.com/watson-intu/self-sdk#raspberry-pi)** by [Watson Intu](https://github.com/watson-intu). Project Intu is an experimental service that allows developers to quickly and seamlessly integrate various cognitive services, such as Conversation and Speech-to-Text, with the capabilities of various devices, spaces and physical objects. While not being a recipe, Intu is a middleware that can be installed on TJBot and used to architect more complex interactions for your robot. [Learn more](http://www.ibm.com/watson/developercloud/project-intu.html) about Project Intu. \ No newline at end of file diff --git a/images/wiring.png b/images/wiring.png new file mode 100644 index 0000000000000000000000000000000000000000..569a1ecddbc7b2ab54e813f9ce26d5b1132dd4b5 GIT binary patch literal 327611 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

Gmv*1;m6X}!Q$#iaa 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

|VkHl3J)7P+Slpy|k@uAc_#SHbR1b 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 bo%?CjT17?ggsS}V5%{sQaKgig_cVMH literal 0 HcmV?d00001 diff --git a/recipes/README.md b/recipes/README.md index 3781d22e..54e301b8 100644 --- a/recipes/README.md +++ b/recipes/README.md @@ -1,33 +1,38 @@ # Recipes -Recipes are step by step instructions to help you connect your TJBot to [Watson cognitive services](https://www.ibm.com/watson/developercloud/services-catalog.html). -The recipes are designed to be run on a Raspberry Pi. You can either run one of the available recipes or create your own recipe that brings sweet ideas to life using any combination of [Watson API](https://www.ibm.com/watson/developercloud/services-catalog.html)! +Recipes are step by step instructions to help you connect your TJBot to [Watson](https://www.ibm.com/watson/developercloud/services-catalog.html). + +The recipes are designed to be run on a Raspberry Pi. You can either run one of our sample recipes below, or create your own recipe that brings your ideas to life using [Watson](https://www.ibm.com/watson/developercloud/services-catalog.html)! ### [Speech to Text](speech_to_text) -> Use your voice to control a LED with Watson [[instructables](http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/speech_to_text)] +> Use your voice to control TJBot's LED with Watson [[instructables](http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/)] -This module provides a Node.js code to control a [8mm NeoPixel RGB led](https://www.adafruit.com/products/1734) using voice commands. It uses [Watson Speech to Text API](https://www.ibm.com/watson/developercloud/speech-to-text.html). +This receipe lets you control the [8mm NeoPixel RGB led](https://www.adafruit.com/products/1734) using voice commands. It uses the [Watson Speech to Text API](https://www.ibm.com/watson/developercloud/speech-to-text.html). [![link to a full video for use voice to control LED](https://img.youtube.com/vi/Wvnh7ie3D6o/0.jpg)](https://www.youtube.com/watch?v=Wvnh7ie3D6o) -###[Sentiment Analysis](sentiment_analysis) -> Make your bot respond to emotions using Watson [[instructables](http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/sentiment_analysis)] +### [Sentiment Analysis](sentiment_analysis) +> Make TJBot respond to emotions with Watson [[instructables](http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/)] -This module provides Node.js code to control the color of a [8mm NeoPixel RGB led](https://www.adafruit.com/products/1734) based on public perception of a given keyword (e.g. "heart" or "iPhone"). The module connects to Twitter to analyze the public sentiment about the given keyword in real time, and updates the color of the LED to reflect the sentiment. It uses [Watson Tone Analyzer](http://www.ibm.com/watson/developercloud/tone-analyzer.html) and Twitter API. +This recipe shines TJBot's [8mm NeoPixel RGB LED](https://www.adafruit.com/products/1734) different colors based on the emotions present in Twitter for a given keyword. It uses [Watson Tone Analyzer](http://www.ibm.com/watson/developercloud/tone-analyzer.html) and the [Twitter API](https://dev.twitter.com/overview/api). -###[Conversation](conversation) -> Build a talking robot with Watson [[instructables](http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/)] [[github](https://github.com/ibmtjbot/tjbot/tree/master/recipes/conversation)] +### [Conversation](conversation) +> Build a talking robot with Watson [[instructables](http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/)] -This module provides Node.js code to get your Raspberry Pi to talk. It uses [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html) to parse audio from the microphone, uses [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) to generate a response, and uses [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) to "read" out this response! +This recipe demonstrates how to use the [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html), [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html), and [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) services to build a talking chatbot. ## Featured Recipes -Check out some [featured TJ Bot recipes](../featured/README.md) created by the community. +Check out the [featured TJBot recipes](../featured) created by members of our community. ## Contributing Your Own Recipes -TJ Bot is open source and we'd love to see what you can make with him. If you have created your own recipe, we would love to include it as a [featured recipe](../featured/README.md)! Just submit a pull request for your recipe instructions and code and send a link to a demo video to tjbot@us.ibm.com (Vimeo & YouTube preferred). We will review it and if we decide to include it in our repository, you'll be listed as the developer. See [CONTRIBUTING.md](../CONTRIBUTING.md). +TJBot is an open source project designed to make it fun and easy to interact with [Watson](https://www.ibm.com/watson/developercloud/services-catalog.html). + +If you would like your own recipe included in our [featured recipe](../featured) list, please [send us email](mailto:tjbot@us.ibm.com) with a link to your repository and a demo video. + +For guidelines on contributing to the TJBot project, please refer to the [contribution guide](../CONTRIBUTING.md). -We cannot wait to see what you build with TJBot! +We can't wait to see what you make with TJBot! diff --git a/recipes/conversation/.gitignore b/recipes/conversation/.gitignore index 2ba1a0ef..24e3f987 100644 --- a/recipes/conversation/.gitignore +++ b/recipes/conversation/.gitignore @@ -1,3 +1,6 @@ +# config file +config.js + # Logs logs *.log @@ -21,6 +24,9 @@ coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt +# Bower dependency directory (https://bower.io/) +bower_components + # node-waf configuration .lock-wscript @@ -28,8 +34,11 @@ coverage build/Release # Dependency directories -node_modules -jspm_packages +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ # Optional npm cache directory .npm @@ -43,5 +52,11 @@ jspm_packages # Output of 'npm pack' *.tgz +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + # .DS_Store files .DS_Store diff --git a/recipes/conversation/README.md b/recipes/conversation/README.md index 2f077f2b..0cdb4556 100755 --- a/recipes/conversation/README.md +++ b/recipes/conversation/README.md @@ -1,82 +1,43 @@ # Conversation +> Chat with TJBot! -> Build a talking robot with [Watson](https://www.ibm.com/watson/developercloud/conversation.html) +This recipe uses the [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) and [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) services to turn TJ into a chatting robot. -This module provides Node.js code to get your Raspberry Pi to talk. It uses [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html) to parse audio from the microphone, uses [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) to generate a response, and uses [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) to "read" out this response! +## Hardware +This recipe requires a TJBot with a microphone and a speaker. -**This will only run on the Raspberry Pi.** +## Build and Run +First, make sure you have configured your Raspberry Pi for TJBot. + $ cd tjbot/bootstrap && sudo sh bootstrap.sh -## How It Works -- Listens for voice commands -- Sends audio from the microphone to the Watson Speech to Text Service - STT to transcribe [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html) -- Parses the text looking for the attention word -- Once the attention word is recognized, the text is sent to [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) to generate the response. -- The response is sent to [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) to generate the audio file. -- The robot speaks the response via the Alsa audio playback tools +Go to the `recipes/conversation` folder and install the dependencies. -##Hardware -Check out [this instructable] (http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/) to prepare your system. You will need a Raspberry Pi 3, Microphone, Speaker, and [the TJBot cardboard](https://ibmtjbot.github.io/#gettj). + $ cd ../recipes/conversation + $ npm install -##Build -> We recommend starting with our [step by step instructions] (http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/) to build this recipe. +Create instances of the [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) and [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) services and note the authentication credentials. -Get the sample code and go to the application folder. Please see this [instruction on how to clone](https://help.github.com/articles/cloning-a-repository/) a repository. +Import the `workspace-sample.json` file into the Watson Conversation service and note the workspace ID. - cd recipes/conversation +Make a copy the default configuration file and update it with the Watson service credentials and the conversation workspace ID. -Install ALSA tools (required for recording audio on Raspberry Pi) + $ cp config.default.js config.js + $ nano config.js + - sudo apt-get install alsa-base alsa-utils +Run! -Install Dependencies + sudo node conversation.js - npm install +> Note the `sudo` command. Root user access is required to run TJBot recipes. -Set the audio output to your audio jack. For more audio channels, check the [config guide. ](https://www.raspberrypi.org/documentation/configuration/audio-config.md) +# Watson Services +- [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) +- [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) - amixer cset numid=3 1 - // This sets the audio output to option 1 which is your Pi's Audio Jack. Option 0 = Auto, Option 2 = HDMI. An alternative is to type sudo raspi-config and change the audio to 3.5mm audio jack. +# License +This project is licensed under Apache 2.0. Full license text is available in [LICENSE](../../LICENSE). -Update the Config file with your Bluemix credentials for all three Watson services. - - edit config.js - enter your watson usernames, passwords and versions. - -## Creating a Conversation Flow -You need to train your robot with what to say and when to say it. For that, we use [Watson Conversation] (https://www.ibm.com/watson/developercloud/conversation.html). Open a browser and go to [IBM Watson Conversation link](http://www.ibmwatsonconversation.com) -From the top right corner, select the name of your conversation service and click 'create' to create a new workspace for your robot. You can create intents and dialogs there. [Here](http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/#step6) is a step-by-step instructions to create a conversation flow. - -##Running - -Start the application - - node conversation.js - -Then you should be able to speak to the microphone. -The robot gets better with training. You can go to your [Watson conversation module](http://www.ibmwatsonconversation.com) to train the robot with more intents and responses. - -##Customization -The attention word is the word you say to get the attention of the robot. -The default attention word is set to 'Watson' but you can change it from config.js. Some words are easier for the robot to recognize. If decided to change the attention word, experiment with multiple words and pick the one that is easier for the robot to recognize. - -The default voice of TJBot is set to a male voice (`en-US_MichaelVoice`) but you can change it from config.js. Two female voices are available for TJBot (`en-US_AllisonVoice` and `en-US_LisaVoice`). - - // The attention word to wake up the robot. - exports.attentionWord ='watson'; - - // You can change the voice of the robot to your favorite voice. - exports.voice = 'en-US_MichaelVoice'; - // Some of the available options are: - // en-US_AllisonVoice - // en-US_LisaVoice - // en-US_MichaelVoice (the default) - -# Dependencies List - -- Watson Developer Cloud - [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html), [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html), and [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html). -- mic npm package : for reading audio input - - -## Contributing +# Contributing See [CONTRIBUTING.md](../../CONTRIBUTING.md). diff --git a/recipes/conversation/config.default.js b/recipes/conversation/config.default.js new file mode 100755 index 00000000..c8b0bef6 --- /dev/null +++ b/recipes/conversation/config.default.js @@ -0,0 +1,27 @@ +// User-specific configuration +exports.voice = 'en-US_MichaelVoice'; +exports.conversationWorkspaceId = ''; // replace with the workspace identifier of your conversation + +// Create the credentials object for export +exports.credentials = {}; + +// Watson Conversation +// https://www.ibm.com/watson/developercloud/conversation.html +exports.credentials.conversation = { + password: '', + username: '' +}; + +// Watson Speech to Text +// https://www.ibm.com/watson/developercloud/speech-to-text.html +exports.credentials.speech_to_text = { + password: '', + username: '' +}; + +// Watson Text to Speech +// https://www.ibm.com/watson/developercloud/text-to-speech.html +exports.credentials.text_to_speech = { + password: '', + username: '' +}; diff --git a/recipes/conversation/config.js b/recipes/conversation/config.js deleted file mode 100755 index 860e450e..00000000 --- a/recipes/conversation/config.js +++ /dev/null @@ -1,24 +0,0 @@ -// The attention word to wake up the robot. -exports.attentionWord ='watson'; - -// You can change the voice of the robot to your favorite voice. -exports.voice = 'en-US_MichaelVoice'; -// Some of the available options are: -// en-US_AllisonVoice -// en-US_LisaVoice -// en-US_MichaelVoice (the default) - -// Credentials for Watson Speech to Text service - -exports.STTPassword = 'xxxxxx' ; -exports.STTUsername = 'xxx-xxx-xxx' ; - - -// Credentials for Watson Conversation service -exports.ConPassword = 'xxxxxx' ; -exports.ConUsername = 'xxx-xxx-xxx' ; -exports.ConWorkspace = 'xxx-xxx-xxx'; - -//Credentials for Watson Text to Speech service -exports.TTSPassword = 'xxxxxx' ; -exports.TTSUsername = 'xxx-xxx-xxx' ; diff --git a/recipes/conversation/conversation.js b/recipes/conversation/conversation.js old mode 100755 new mode 100644 index e205d1ac..dd9aa4a1 --- a/recipes/conversation/conversation.js +++ b/recipes/conversation/conversation.js @@ -1,185 +1,52 @@ -/************************************************************************ -* Copyright 2016 IBM Corp. All Rights Reserved. -* -* Watson Maker Kits -* -* This project is licensed under the Apache License 2.0, see LICENSE.* -* -************************************************************************ -* -* Build a talking robot with Watson. -* This module uses Watson Speech to Text, Watson Conversation, and Watson Text to Speech. -* To run: node conversation.js - -* Follow the instructions in http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/ to -* get the system ready to run this code. -*/ - -var watson = require('watson-developer-cloud'); //to connect to Watson developer cloud -var config = require("./config.js") // to get our credentials and the attention word from the config.js files -var exec = require('child_process').exec; -var fs = require('fs'); -var conversation_response = ""; -var attentionWord = config.attentionWord; //you can change the attention word in the config file - -/************************************************************************ -* Step #1: Configuring your Bluemix Credentials -************************************************************************ -In this step we will be configuring the Bluemix Credentials for Speech to Text, Watson Conversation -and Text to Speech services. -*/ - -var speech_to_text = watson.speech_to_text({ - username: config.STTUsername, - password: config.STTPassword, - version: 'v1' -}); - -var conversation = watson.conversation({ - username: config.ConUsername, - password: config.ConPassword, - version: 'v1', - version_date: '2016-07-11' -}); - -var text_to_speech = watson.text_to_speech({ - username: config.TTSUsername, - password: config.TTSPassword, - version: 'v1' -}); - -/************************************************************************ -* Step #2: Configuring the Microphone -************************************************************************ -In this step, we configure your microphone to collect the audio samples as you talk. -See https://www.npmjs.com/package/mic for more information on -microphone input events e.g on error, startcomplete, pause, stopcomplete etc. -*/ - -// Initiate Microphone Instance to Get audio samples -var mic = require('mic'); -var micInstance = mic({ 'rate': '44100', 'channels': '2', 'debug': false, 'exitOnSilence': 6 }); -var micInputStream = micInstance.getAudioStream(); - -micInputStream.on('data', function(data) { - //console.log("Recieved Input Stream: " + data.length); -}); - -micInputStream.on('error', function(err) { - console.log("Error in Input Stream: " + err); -}); - -micInputStream.on('silence', function() { - // detect silence. -}); -micInstance.start(); -console.log("TJBot is listening, you may speak now."); - -var textStream ; - -/************************************************************************ -* Step #3: Converting your Speech Commands to Text -************************************************************************ -In this step, the audio sample is sent (piped) to "Watson Speech to Text" to transcribe. -The service converts the audio to text and saves the returned text in "textStream" -You can also set the language model for your speech input. -The following language models are available - ar-AR_BroadbandModel - en-UK_BroadbandModel - en-UK_NarrowbandModel - en-US_BroadbandModel (the default) - en-US_NarrowbandModel - es-ES_BroadbandModel - es-ES_NarrowbandModel - fr-FR_BroadbandModel - ja-JP_BroadbandModel - ja-JP_NarrowbandModel - pt-BR_BroadbandModel - pt-BR_NarrowbandModel - zh-CN_BroadbandModel - zh-CN_NarrowbandModel -*/ - -var recognizeparams = { - content_type: 'audio/l16; rate=44100; channels=2', - interim_results: true, - keywords: [attentionWord], - smart_formatting: true, - keywords_threshold: 0.5, - model: 'en-US_BroadbandModel' // Specify your language model here +/** + * Copyright 2016 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var TJBot = require('tjbot'); +var config = require('./config'); + +// obtain our credentials from config.js +var credentials = config.credentials; + +// obtain user-specific config +var VOICE = config.voice; +var WORKSPACEID = config.conversationWorkspaceId; + +// these are the hardware capabilities that TJ needs for this recipe +var hardware = ['microphone', 'speaker']; + +// turn on debug logging to the console +var tjConfig = { + verboseLogging: false }; +// instantiate our TJBot! +var tj = new TJBot(hardware, tjConfig, credentials); -textStream = micInputStream.pipe(speech_to_text.createRecognizeStream(recognizeparams)); - -textStream.setEncoding('utf8'); - -/********************************************************************* -* Step #4: Parsing the Text and create a response -********************************************************************* -In this step, we parse the text to look for attention word and send that sentence -to watson conversation to get appropriate response. You can change it to something else if needed. -Once the attention word is detected,the text is sent to Watson conversation for processing. The response is generated by Watson Conversation and is sent back to the module. -*/ -var context = {} ; // Save information on conversation context/stage for continous conversation -textStream.setEncoding('utf8'); -textStream.on('data', function(str) { - console.log(' ===== Speech to Text ===== : ' + str); // print the text once received - - if (str.toLowerCase().indexOf(attentionWord.toLowerCase()) >= 0) { - var res = str.toLowerCase().replace(attentionWord.toLowerCase(), ""); - console.log("msg sent to conversation:" ,res); - conversation.message({ - workspace_id: config.ConWorkspace, - input: {'text': res}, - context: context - }, function(err, response) { - if (err) { - console.log('error:', err); - } else { - context = response.context ; //update conversation context - - if (Array.isArray(response.output.text)) { - conversation_response = response.output.text.join(' ').trim(); - } else { - conversation_response = undefined; - } +// listen for utterances with our attentionWord and send the result to +// the Conversation service +tj.listen(function(msg) { + // check for an attention word + if (msg.startsWith(tj.configuration.attentionWord)) { + // remove the attention word from the message + var turn = msg.toLowerCase().replace(tj.configuration.attentionWord.toLowerCase(), ""); - if (conversation_response){ - var params = { - text: conversation_response, - voice: config.voice, - accept: 'audio/wav' - }; - - console.log("Result from conversation:" ,conversation_response); - /********************************************************************* - Step #5: Speak out the response - ********************************************************************* - In this step, we text is sent out to Watsons Text to Speech service and result is piped to wave file. - Wave files are then played using alsa (native audio) tool. - */ - tempStream = text_to_speech.synthesize(params).pipe(fs.createWriteStream('output.wav')).on('close', function() { - var create_audio = exec('aplay output.wav', function (error, stdout, stderr) { - if (error !== null) { - console.log('exec error: ' + error); - } - }); - }); - }else { - console.log("The response (output) text from your conversation is empty. Please check your conversation flow \n" + JSON.stringify( response)) - } - - } - - }) - } else { - console.log("Waiting to hear", attentionWord); - } -}); - -textStream.on('error', function(err) { - console.log(' === Watson Speech to Text : An Error has occurred =====') ; // handle errors - console.log(err) ; - console.log("Press +C to exit.") ; + // send to the conversation service + tj.converse(WORKSPACEID, turn, function(response) { + // speak the result + tj.speak(response.description); + }); + } }); diff --git a/recipes/conversation/package.json b/recipes/conversation/package.json old mode 100755 new mode 100644 index f8f8f8b2..3cd67084 --- a/recipes/conversation/package.json +++ b/recipes/conversation/package.json @@ -1,18 +1,17 @@ { - "name": "conversationkit", - "version": "1.0.0", - "description": "TJ Bot Conversation recipe", - "main": "Conversation.js", + "name": "tjbot-conversation", + "version": "0.0.1", + "description": "TJBot conversation recipe", + "main": "conversation.js", "scripts": { "start": "node conversation.js", "test": "echo \"Error: no test specified\" && exit 1" }, - "repository": { + "repository": { "type": "git", - "url": "git@github.ibm.com:watsonkits/conversationkit.git" + "url": "git@github.com:ibmtjbot/tjbot.git" }, "dependencies": { - "mic": "^2.1.1", - "watson-developer-cloud": "^2.2.0" + "tjbot": "latest" } } diff --git a/recipes/conversation/workspace-sample.json b/recipes/conversation/workspace-sample.json new file mode 100644 index 00000000..25474e3b --- /dev/null +++ b/recipes/conversation/workspace-sample.json @@ -0,0 +1 @@ +{"name":"TJBot Conversation","created":"2017-01-06T19:37:51.751Z","intents":[{"intent":"introduce-self","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z","examples":[{"text":"introduce yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"please introduce yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"tell me about yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"tell me who you are","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"what are you","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"who are you","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"}],"description":null},{"intent":"tell-joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z","examples":[{"text":"i want to hear a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"make me laugh","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"please tell me a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"tell me a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"tell me something funny","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"}],"description":null}],"updated":"2017-01-06T19:50:51.713Z","entities":[],"language":"en","metadata":null,"description":"Sample conversation for TJBot.","dialog_nodes":[{"go_to":null,"output":{},"parent":null,"context":null,"created":"2017-01-06T19:40:04.560Z","updated":"2017-01-06T19:43:11.206Z","metadata":null,"conditions":"#tell-joke","description":null,"dialog_node":"node_1_1483731604403","previous_sibling":null},{"go_to":null,"output":{"text":{"values":["Hi, I'm TJ Bot!","Hi, my name is TJ Bot!","I'm TJ Bot, it's nice to meet you!","My name is TJ Bot!"],"selection_policy":"random"}},"parent":null,"context":null,"created":"2017-01-06T19:41:56.120Z","updated":"2017-01-06T19:45:53.041Z","metadata":null,"conditions":"#introduce-self","description":null,"dialog_node":"node_2_1483731715954","previous_sibling":"node_1_1483731604403"},{"type":"response_condition","go_to":null,"output":{"text":{"values":["A robot walks into a bar. “What can I get you?” the bartender asks. “I need something to loosen up,” the robot replies. So the bartender serves him a screwdriver.","Why do robots have summer holidays? To recharge their batteries.","Why did the robot cross the road? Because he was programmed to do it.","Why did the robot marry his fiancée? He couldn’t resistor.","Why was the robot bankrupt? He had used all his cache.","I'm sorry, I've run out of jokes. How about you create some new ones for me?"],"selection_policy":"sequential"}},"parent":"node_1_1483731604403","context":null,"created":"2017-01-06T19:43:10.878Z","updated":"2017-01-06T19:50:51.713Z","metadata":null,"conditions":null,"description":null,"dialog_node":"node_4_1483731790477","previous_sibling":null}],"workspace_id":"311640d4-12dd-42e2-99a6-304794077daf","counterexamples":[]} \ No newline at end of file diff --git a/recipes/sentiment_analysis/.gitignore b/recipes/sentiment_analysis/.gitignore index 2ba1a0ef..24e3f987 100644 --- a/recipes/sentiment_analysis/.gitignore +++ b/recipes/sentiment_analysis/.gitignore @@ -1,3 +1,6 @@ +# config file +config.js + # Logs logs *.log @@ -21,6 +24,9 @@ coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt +# Bower dependency directory (https://bower.io/) +bower_components + # node-waf configuration .lock-wscript @@ -28,8 +34,11 @@ coverage build/Release # Dependency directories -node_modules -jspm_packages +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ # Optional npm cache directory .npm @@ -43,5 +52,11 @@ jspm_packages # Output of 'npm pack' *.tgz +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + # .DS_Store files .DS_Store diff --git a/recipes/sentiment_analysis/README.md b/recipes/sentiment_analysis/README.md index 7e07c909..81e54d09 100644 --- a/recipes/sentiment_analysis/README.md +++ b/recipes/sentiment_analysis/README.md @@ -1,118 +1,76 @@ # Sentiment Analysis - > Make your robot respond to emotions using [Watson](http://www.ibm.com/watson/developercloud/tone-analyzer.html) -This module provides Node.js code to control the color of a [8mm NeoPixel RGB led](https://www.adafruit.com/products/1734) based on public perception of a given keyword (e.g. "heart" or "iPhone"). The module connects to Twitter to analyze the public sentiment about the given keyword in real time, and updates the color of the LED to reflect the sentiment. - -**This will only run on the Raspberry Pi.** - -[![link to a full video for use voice to control LED](https://img.youtube.com/vi/KU8DNzZNdBY/0.jpg)](https://www.youtube.com/watch?v=KU8DNzZNdBY) - -##How It Works -- Connects to the Twitter Streaming service and listens for tweets related to a given search keyword -- Sends tweets to the Watson Tone Analyzer service to determine the emotions contained in them -- Changes the color of the LED based on the emotions found by Watson +This recipe uses the [Watson Tone Analyzer](http://www.ibm.com/watson/developercloud/tone-analyzer.html) service to shine TJBot’s LED different colors based on the emotions present in Twitter for a given keyword. It also uses the [Twitter API](https://dev.twitter.com/overview/api) to fetch tweets. -##Hardware -Check out [this instructable] (http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/) to get the wiring diagram and prepare your system. You will need a Raspberry Pi 3, a [8mm NeoPixel RGB LED] (https://www.adafruit.com/products/1734), 3 Female/female jumper wires, and [the TJBot cardboard](http://ibm.biz/mytjbot) +## Hardware +This recipe requires a TJBot with an LED. -##Build ->We recommend starting with [our step by step instructions](http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/) to build this recipe. +## Build and Run +First, make sure you have configured your Raspberry Pi for TJBot. -Get the sample code and go to the application folder. Please see this [instruction on how to clone](https://help.github.com/articles/cloning-a-repository/) a repository. + $ cd tjbot/bootstrap && sudo sh bootstrap.sh - cd recipes/sentiment_analysis +Go to the `recipes/sentiment_analysis` folder and install the dependencies. -Install Dependencies + $ cd ../recipes/sentiment_analysis + $ npm install - npm install +Create an instance of the [Watson Tone Analyzer](http://www.ibm.com/watson/developercloud/tone-analyzer.html) service and note the authentication credentials. -Add your Bluemix Tone Analyzer credentials +Create a set of [Twitter developer credentials](https://apps.twitter.com/) and note the consumer key, consumer secret, access token key, and access token secret. - edit config.js - enter your Watson Tone Analyzer username, password and version. +Make a copy the default configuration file and update it with the Watson service credentials. -Since this module will be sourcing the text from Twitter, you will need valid [Twitter developer credentials](https://apps.twitter.com/) in the form of a set of consumer and access tokens/keys. + $ cp config.default.js config.js + $ nano config.js + -Add your Twitter credentials +Run! - edit config.js - enter your Twitter credentials. - -##Testing the LED -The wiring diagram is [here] (http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/). -Before running the code, you may test your LED setup to make sure the connections are correct and the library is properly installed. When you run this test module, it should turn on your LED. + sudo node sentiment.js - sudo node led_test.js +> Note the `sudo` command. Root user access is required to run TJBot recipes. -> Note the `sudo` command. Root user access is required to control the NeoPixel LEDs. +At this point, TJBot will begin listening to Twitter for tweets containing the specified keyword (specified in `exports.sentiment_keyword`). It may take some time to collect enough tweets to perform sentiment analysis, so please be patient. -If the LED does not light up, you can try moving the power from 3.3 to 5 volts. If neither the 3.3v or 5v pins work, you will need a 1N4001 diode. The diode is inserted between the power pin of the LED (the shorter of the two middle pins) and the 5v pin on the Raspberry Pi. +## Customize +Change the keyword TJBot monitors by editing `config.js` and changing the line -If you have problems with the setup, please refer to [Adafruit's Neopixel on Raspbeery Pi guide](https://learn.adafruit.com/neopixels-on-raspberry-pi/overview -) to troubleshoot. + exports.sentiment_keyword = "happy"; // keyword to monitor in Twitter -##Running +You can also change the colors that TJBot shines. The table below shows the colors that TJBot shines for each emotion. -Start the application +| Emotion | Color | +| --- | --- | +| Anger | Red | +| Joy | Yellow | +| Fear | Green | +| Disgust | Blue | +| Sadness | Magenta | - sudo node sentiment.js +You can change these colors by editing the `shineForEmotion()` function. -> Note the sudo command. Root user access is required to control the NeoPixel LEDs. +## Troubleshoot +If the LED does not light up, you can try moving the power from 3.3 to 5 volts. If neither the 3.3v or 5v pins work, you will need a 1N4001 diode. The diode is inserted between the power pin of the LED (the shorter of the two middle pins) and the 5v pin on the Raspberry Pi. -Doesn't your Pi show the right color? No worries, we can fix it. The LED library uses the PWM module (GPIO 18) to drive the data line of the LEDs. This conflicts with the built-in audio hardware, which uses the same pin to drive the audio output. Depending on your configuration of Raspbian, the sound drivers may be more aggressive in taking away control of GPIO 18 from other processes. If your LED shows random colors instead of the expected color, use this trick to fix it. +If the LED shows the wrong color, or flashes different colors very rapidly, it may be due to interference with the built-in audio hardware. Depending on your configuration of Raspbian, the sound drivers may be more aggressive in taking away control of GPIO 18 from other processes. If your LED shows random colors instead of the expected color, use this trick to fix it. - sudo cp blacklist-rgb-led.conf /etc/modprobe.d/ - sudo update-initramfs -u + sudo cp bootstrap/tjbot-blacklist-snd.conf /etc/modprobe.d/ + sudo update-initramfs -u + sudo reboot -Reboot and confirm no "snd" modules are running by executing the command "lsmod". +After TJBot finishes rebooting, confirm no "snd" modules are running. - lsmod + lsmod -## Customization -The default sentiment keyword is set to 'people' but you can change it from config.js: +If you have additional difficulties not covered in this guide, please refer to [Adafruit's NeoPixel on Raspbeery Pi guide](https://learn.adafruit.com/neopixels-on-raspberry-pi/overview) to troubleshoot. - edit config.js - Update searchkeyword - searchkeyword = "people"; +# Watson Services +- [Watson Tone Analyzer](http://www.ibm.com/watson/developercloud/tone-analyzer.html) -The default behaviour of the module assigns the following colors to sentiments. +# License +This project is licensed under Apache 2.0. Full license text is available in [LICENSE](../../LICENSE). -| Emotion | Color | -| --- | --- | -| Anger | Red | -| Joy | Yellow | -| Fear | Purple | -| Disgust | Green | -| Sadness | Blue | - -You can change this mapping by editing `sentiment.js` to add your favorite colors. Note that colors are specified using the hexademical format. - - var red = 0x00ff00 ; - var green = 0xff0000 ; - var blue = 0x0000ff ; - var yellow = 0xffff00 ; - var purple = 0x00ffff ; - - function processEmotion(emotion){ - console.log("Current Emotion Around " + searchkeyword + " is ", emotion.tone_id); - if (emotion.tone_id == "anger"){ - setLED(red); - }else if(emotion.tone_id == "joy"){ - setLED(yellow); - }else if(emotion.tone_id == "fear"){ - setLED(purple); - }else if(emotion.tone_id == "disgust"){ - setLED(green); - }else if(emotion.tone_id == "sadness"){ - setLED(blue); - } - } - -#Dependencies -- [Watson Tone Analyzer](http://www.ibm.com/watson/developercloud/tone-analyzer.html). -- Twitter npm package : An asynchronous client library for the Twitter REST and Streaming API's. -- [rpi-ws281x-native](https://github.com/beyondscreen/node-rpi-ws281x-native) - npm package for controling a ws281x LED. - -## Contributing +# Contributing See [CONTRIBUTING.md](../../CONTRIBUTING.md). diff --git a/recipes/sentiment_analysis/config.default.js b/recipes/sentiment_analysis/config.default.js new file mode 100755 index 00000000..b8dedd27 --- /dev/null +++ b/recipes/sentiment_analysis/config.default.js @@ -0,0 +1,27 @@ +// User-specific configuration +exports.sentiment_keyword = "happy"; // keyword to monitor in Twitter + +// Create the credentials object for export +exports.credentials = {}; + +// Watson Text to Speech +// https://www.ibm.com/watson/developercloud/text-to-speech.html +exports.credentials.text_to_speech = { + password: '', + username: '', +}; + +// Watson Tone Analyzer +// https://www.ibm.com/watson/developercloud/tone-analyzer.html +exports.credentials.tone_analyzer = { + password: '', + username: '' +}; + +// Twitter +exports.credentials.twitter = { + consumer_key: '', + consumer_secret: '', + access_token_key: '', + access_token_secret: '' +}; diff --git a/recipes/sentiment_analysis/config.js b/recipes/sentiment_analysis/config.js deleted file mode 100755 index 40f4e773..00000000 --- a/recipes/sentiment_analysis/config.js +++ /dev/null @@ -1,21 +0,0 @@ -//You can modify the search keywork to what you like examples are traffic, celebrities, political debates -searchkeyword = "people"; - -// Twitter credentials - Update with your Twitter credentials -var twittercredentials = {}; -twittercredentials.consumer_key = "xxxxxx" ; -twittercredentials.consumer_secret = "xxxxxx" ; -twittercredentials.access_token_key = "xxxxxx" ; -twittercredentials.access_token_secret = "xxx-xxx-xxx"; - -// Tone Analyzer Credentials - Update with your Bluemix credentals. -var toneanalyzercredentials = {} - -toneanalyzercredentials.password = 'xxxxxx' ; -toneanalyzercredentials.username = 'xxxxxx' ; -toneanalyzercredentials.version = 'v3' ; - -// Export both credentials -exports.twittercredentials = twittercredentials ; -exports.toneanalyzercredentials = toneanalyzercredentials ; -exports.searchkeyword = searchkeyword; diff --git a/recipes/sentiment_analysis/package.json b/recipes/sentiment_analysis/package.json index 4f1a2215..c3599e9c 100644 --- a/recipes/sentiment_analysis/package.json +++ b/recipes/sentiment_analysis/package.json @@ -1,19 +1,18 @@ { - "name": "sentimentkit", - "version": "1.0.0", - "description": "TJ Bot Sentiment Analysis recipe", + "name": "tjbot-sentiment", + "version": "0.0.1", + "description": "TJBot sentiment analysis recipe", "main": "sentiment.js", "scripts": { - "test": "node sentiment.js", - "start": "node sentiment.js" + "start": "node sentiment.js", + "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", - "url": "git@github.ibm.com:watsonkits/sentimentkit.git" + "url": "git@github.com:ibmtjbot/tjbot.git" }, "dependencies": { - "rpi-ws281x-native": "^0.8.1", - "twitter": "^1.4.0", - "watson-developer-cloud": "^2.0.1" + "tjbot": "latest", + "twitter": "^1.4.0" } } diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index bfd9f65e..bf864b70 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -1,166 +1,155 @@ -/************************************************************************ -* Copyright 2016 IBM Corp. All Rights Reserved. -* -* Watson Maker Kits -* -* This project is licensed under the Apache License 2.0, see LICENSE.* -* -************************************************************************ -* -* Control a NeoPixel LED unit connected to a Raspberry Pi pin by analyzing Twitter data using Watson Tone Analyzer -* Must run with root-level protection -* Sudo node sentiment.js +/** + * Copyright 2016 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var TJBot = require('../../tjbot/tjbot'); +var Twitter = require('twitter'); +var config = require('./config'); -Based on ws281x library created by Jeremy Garff (jer@jers.net) +// obtain our credentials from config.js +var credentials = config.credentials; -Follow the instructions in http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/ to -get the system ready to run this code. -*/ +// obtain user-specific config +var SENTIMENT_KEYWORD = config.sentiment_keyword; +var SENTIMENT_ANALYSIS_FREQUENCY_MSEC = config.sentiment_analysis_frequency_sec * 1000; -/************************************************************************ -* Step #1: Configuring your Twitter Credentials -************************************************************************ -In this step, we set up our Twitter credentials and parameters (keywords) and the -fetch tweets related to the keyword as text. Each tweet is added to a tweet buffer as it arrives -*/ -var config = require("./config") ; // Gets your username and passwords from the config.js file -var Twitter = require('twitter'); -var maxtweets = 20 ; -var confidencethreshold = 0.5 ; // The program only responds to the sentiments that are retrieved with a confidence level stronger than this given threshold. You may change the threshold as needed. -var tweetbuffer = [] ; -var searchkeyword = config.searchkeyword; // keyword to use in twitter search -var searchparams = {q: searchkeyword, count: maxtweets}; -var sentimentinterval = 3000 ; // calculate sentiment every 3 seconds. +// these are the hardware capabilities that TJ needs for this recipe +var hardware = ['led']; -var twitterclient = new Twitter({ //Retrieving your Twitter credentials - consumer_key: config.twittercredentials.consumer_key, - consumer_secret: config.twittercredentials.consumer_secret, - access_token_key: config.twittercredentials.access_token_key, - access_token_secret: config.twittercredentials.access_token_secret -}); +// turn on debug logging to the console +var tjConfig = { + verboseLogging: true +}; -fetchTweets(searchparams) -function fetchTweets(searchparams){ - var alltweets = ""; - console.log("Fetching tweets for keyword " + searchkeyword + ". This may take some time."); - twitterclient.stream('statuses/filter', {track: searchkeyword }, function(stream) { - stream.on('data', function(event) { - if(event && event.text){ - var tweet = event.text ; - tweet = tweet.replace(/[^\x00-\x7F]/g, "") // Remove non-ascii characters e.g chinese, japanese, arabic letters etc - tweet = tweet.replace(/(?:https?|ftp):\/\/[\n\S]+/g, ""); // Remove link - if(tweetbuffer.length == maxtweets){ // if we have enough tweets, remove one - tweetbuffer.shift() ; - } - tweetbuffer.push(tweet) +// instantiate our TJBot! +var tj = new TJBot(hardware, tjConfig, credentials); - } - }); +console.log("I am monitoring twitter for " + SENTIMENT_KEYWORD); - stream.on('error', function(error) { - console.log("\nAn error has occurred while connecting to Twitter. Please check your twitter credentials, and also refer to https://dev.twitter.com/overview/api/response-codes for more on twitter error codes. \n") - throw error; +// flash random colors +for (var i = 0; i < 10; i++) { + tj.shine('random'); + tj.sleep(150); +} +tj.shine('off'); + +monitorTwitter(); + +// --- + +var TWEETS = []; +var MAX_TWEETS = 100; +var CONFIDENCE_THRESHOLD = 0.5; + +function monitorTwitter() { + // start the pulse to show we are thinking + tj.pulse('white', 1.5, 2.0); + + // instnatiate twitter client + var twitter = new Twitter({ + consumer_key: config.credentials.twitter.consumer_key, + consumer_secret: config.credentials.twitter.consumer_secret, + access_token_key: config.credentials.twitter.access_token_key, + access_token_secret: config.credentials.twitter.access_token_secret }); - }); + + // monitor twitter + twitter.stream('statuses/filter', { + track: SENTIMENT_KEYWORD + }, function(stream) { + stream.on('data', function(event) { + if (event && event.text) { + var tweet = event.text; + + // Remove non-ascii characters (e.g chinese, japanese, arabic, etc.) and + // remove hyperlinks + tweet = tweet.replace(/[^\x00-\x7F]/g, ""); + tweet = tweet.replace(/(?:https?|ftp):\/\/[\n\S]+/g, ""); + + // keep a buffer of MAX_TWEETS tweets for sentiment analysis + while (TWEETS.length >= MAX_TWEETS) { + TWEETS.shift(); + } + TWEETS.push(cleanTweet); + } + }); + + stream.on('error', function(error) { + console.log("\nAn error has occurred while connecting to Twitter. Please check your twitter credentials, and also refer to https://dev.twitter.com/overview/api/response-codes for more information on Twitter error codes.\n"); + throw error; + }); + }); + + // perform sentiment analysis every N seconds + setInterval(function() { + console.log("Performing sentiment analysis of the tweets"); + shineFromTweetSentiment(); + }, SENTIMENT_ANALYSIS_FREQUENCY_MSEC); } -SampleTweetBuffer(); -function SampleTweetBuffer(){ - setInterval(function() { - if (tweetbuffer.length > 0){ - //console.log("sampling .. " + tweetbuffer.length); - analyzeTone(); // Analyze the tone of tweets if we have more than one tweet - } - }, sentimentinterval); +function shineFromTweetSentiment() { + // make sure we have at least 5 tweets to analyze, otherwise it + // is probably not enough. + if (TWEETS.length > 5) { + var text = TWEETS.join(' '); + console.log("Analyzing tone of " + TWEETS.length + " tweets"); + tj.analyzeTone(text, + function(tone) { + tone.document_tone.tone_categories.forEach(function(category) { + if (category.category_id == "emotion_tone") { + // find the emotion with the highest confidence + var max = category.tones.reduce(function(a, b) { + return (a.score > b.score) ? a: b; + }); + + // make sure we really are confident + if (max.score >= CONFIDENCE_THRESHOLD) { + // stop pulsing at this point, we are going to change color + if (tj.isPulsing()) { + tj.stopPulsing(); + } + shineForEmotion(max.tone_id); + } + } + }); + }); + } else { + console.log("Not enough tweets collected to perform sentiment analysis"); + } } - -/************************************************************************ -* Step #2: Analyze the tone of the Tweets -************************************************************************ -In this step, the program uses Watson Tone Analyzer to analyze the emotions that are retrieved from the tweetbuffer. -The IBM Watson™ Tone Analyzer Service uses linguistic analysis to detect three types of tones from text: emotion, social tendencies, and language style. -Emotions identified include things like anger, fear, joy, sadness, and disgust. -*/ -var watson = require('watson-developer-cloud'); -function analyzeTone(){ - var text = ""; - tweetbuffer.forEach(function(tweet){ - text = text + " " + tweet ; // Combine all texts in the tweetbuffer array into a single text. - }) - //console.log(text + "\n ====== ") - var tone_analyzer = watson.tone_analyzer({ //Retrieving your Bluemix credentials - username: config.toneanalyzercredentials.username, - password: config.toneanalyzercredentials.password, - version: config.toneanalyzercredentials.version, - version_date: '2016-05-19' - }); - tone_analyzer.tone({ text: text }, - function(err, tone) { - if (err) { - console.log(err); - } - else { - tone.document_tone.tone_categories.forEach(function(tonecategory){ - if(tonecategory.category_id == "emotion_tone"){ - //console.log(tonecategory.tones) - tonecategory.tones.forEach(function(emotion){ - if(emotion.score >= confidencethreshold) { // pulse only if the likelihood of an emotion is above the given confidencethreshold - processEmotion(emotion) - } - }) - } - }) - } - }); - } - - /********************************************************************************************* - * Step #3: Change the color of the LED based on the sentiments of the retrieve tweets - ********************************************************************************************** - In this step, the program determines the color of the LED based on the analyzed emotion. - Different colors are associated to different emotions. You can customize your own color! - Anger = Red - Joy = Yellow - Fear = Purple etc - */ - - var ws281x = require('rpi-ws281x-native'); - var NUM_LEDS = 1; - ws281x.init(NUM_LEDS); - var color = new Uint32Array(NUM_LEDS); - - // ---- reset LED before exit - process.on('SIGINT', function () { - ws281x.reset(); - process.nextTick(function () { process.exit(0); }); - }); - - var red = 0x00ff00 ; - var green = 0xff0000 ; - var blue = 0x0000ff ; - var yellow = 0xffff00 ; - var purple = 0x00ffff ; - - // Process emotion returned from Tone Analyzer Above - // Show a specific color fore each emotion - function processEmotion(emotion){ - console.log("Current Emotion Around " + searchkeyword + " is ", emotion.tone_id); - if (emotion.tone_id == "anger"){ - setLED(red); - }else if(emotion.tone_id == "joy"){ - setLED(yellow); - }else if(emotion.tone_id == "fear"){ - setLED(purple); - }else if(emotion.tone_id == "disgust"){ - setLED(green); - }else if(emotion.tone_id == "sadness"){ - setLED(blue); +function shineForEmotion(emotion) { + console.log("Current emotion around " + SENTIMENT_KEYWORD + " is " + emotion); + + switch (emotion) { + case 'anger': + tj.shine('red'); + break; + case 'joy': + tj.shine('yellow'); + break; + case 'fear': + tj.shine('magenta'); + break; + case 'disgust': + tj.shine('green'); + break; + case 'sadness': + tj.shine('blue'); + break; + default: + break; } - } - - // Set the LED to the given color value - function setLED(colorval){ - color[0] = colorval ; - ws281x.render(color); - } +} diff --git a/recipes/speech_to_text/.gitignore b/recipes/speech_to_text/.gitignore index 2ba1a0ef..24e3f987 100644 --- a/recipes/speech_to_text/.gitignore +++ b/recipes/speech_to_text/.gitignore @@ -1,3 +1,6 @@ +# config file +config.js + # Logs logs *.log @@ -21,6 +24,9 @@ coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt +# Bower dependency directory (https://bower.io/) +bower_components + # node-waf configuration .lock-wscript @@ -28,8 +34,11 @@ coverage build/Release # Dependency directories -node_modules -jspm_packages +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ # Optional npm cache directory .npm @@ -43,5 +52,11 @@ jspm_packages # Output of 'npm pack' *.tgz +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + # .DS_Store files .DS_Store diff --git a/recipes/speech_to_text/README.md b/recipes/speech_to_text/README.md index adbea68e..aac68e90 100644 --- a/recipes/speech_to_text/README.md +++ b/recipes/speech_to_text/README.md @@ -1,90 +1,63 @@ # Speech to Text -> Use your voice to control a LED with [Watson](https://www.ibm.com/watson/developercloud/speech-to-text.html) +> Control TJBot's LED with your voice! -This module provides a Node.js code to control a [8mm NeoPixel RGB led](https://www.adafruit.com/products/1734) using voice commands. For example, you may say "Turn the light green" to change the color of the LED to green. +This recipe uses the [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html) service to let you control the color of TJBot's LED with your voice. For example, if you say "turn the light green," TJBot will change the color of the LED to green. -**This will only run on the Raspberry Pi.** +## Hardware +This recipe requires a TJBot with a microphone and an LED. -[![link to a full video for use voice to control LED](https://img.youtube.com/vi/Wvnh7ie3D6o/0.jpg)](https://www.youtube.com/watch?v=Wvnh7ie3D6o) +## Build and Run +First, make sure you have configured your Raspberry Pi for TJBot. -##How It Works -- Listens for the voice commands (e.g "turn the light green") -- Sends audio from the microphone to the [Watson Speech to Text Service - STT](https://www.ibm.com/watson/developercloud/speech-to-text.html) to convert to text -- Parses the text to identify the given voice command -- Switches the LED on/off depending on the given command + $ cd tjbot/bootstrap && sudo sh bootstrap.sh -##Hardware +Go to the `recipes/speech_to_text` folder and install the dependencies. -Check out [this instructable] (http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/) for wiring diagrams and instructions to prepare your system. You will need a Raspberry Pi 3, a microphone, a [8mm NeoPixel RGB LED] (https://www.adafruit.com/products/1734), 3 Female/female jumper wires, and [the TJBot cardboard](http://ibm.biz/mytjbot). + $ cd ../recipes/speech_to_text + $ npm install -##Build -> We recommend starting with [our step by step instructions](http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/) to build this recipe. +Create an instance of the [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) service and note the authentication credentials. -Get the sample code and go to the application folder. Please see this [instruction on how to clone](https://help.github.com/articles/cloning-a-repository/) a repository. +Make a copy the default configuration file and update it with the Watson service credentials. - cd recipes/speech_to_text + $ cp config.default.js config.js + $ nano config.js + -Install ALSA tools (required for recording audio on Raspberry Pi) +Run! - sudo apt-get install alsa-base alsa-utils + sudo node stt.js -Install Dependencies +> Note the `sudo` command. Root user access is required to run TJBot recipes. - npm install +Now talk to your microphone to change the color of the LED. Say "turn the light blue" to change the light to blue. You can try other colors as well, such as yellow, green, orange, purple, magenta, red, blue, aqua, and white. You can also say "turn the light on" or "turn the light off". -Add your Bluemix Speech to text service credentials +## Customize +We have hidden a disco party for you. Find the code for disco party in `stt.js` and uncomment the code (hint: there are two places that need to be uncommented). Now you can ask TJ to show you the disco lights by saying "Let's have a disco party"! - edit config.js - enter your watson stt username, password and version. +Try implementing your own TJBot party and share it with us #TJBot! -##Testing the LED -The wiring diagram is [here] (http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/). +## Troubleshoot +If the LED does not light up, you can try moving the power from 3.3 to 5 volts. If neither the 3.3v or 5v pins work, you will need a 1N4001 diode. The diode is inserted between the power pin of the LED (the shorter of the two middle pins) and the 5v pin on the Raspberry Pi. -Before running the code, you may test your LED setup to make sure the connections are correct and the library is properly installed. When you run this module, it should turn your LED on. +If the LED shows the wrong color, or flashes different colors very rapidly, it may be due to interference with the built-in audio hardware. Depending on your configuration of Raspbian, the sound drivers may be more aggressive in taking away control of GPIO 18 from other processes. If your LED shows random colors instead of the expected color, use this trick to fix it. - sudo node led_test.js - -> Note the `sudo` command. Root user access is required to control the NeoPixel LEDs. - -If the LED does not light up, you can try moving the power from 3.3 to 5 volts. If neither the 3.3v or 5v pins work, you will need a 1N4001 diode. The diode is inserted between the power pin of the LED (the shorter of the two middle pins) and the 5v pin on the Raspberry Pi. - -If you have problems with the setup, please refer to [Adafruit's NeoPixel on Raspbeery Pi guide](https://learn.adafruit.com/neopixels-on-raspberry-pi/overview) to troubleshoot. - -##Running - -Start the application - - sudo node stt.js - -> Note the `sudo` command. Root user access is required to control the NeoPixel LEDs. - -Now talk to your microphone to change the color of the LED. -Say "Turn the light blue" to change the light to blue. You can try other colors: yellow, green, orange, purple, magenta, red, blue, aqua, white). You can either say "Turn the light on" or "Turn the light off"! - -Doesn't your Pi show the right color? No worries, we can fix it. -The LED library uses the PWM module (GPIO 18) to drive the data line of the LEDs. This conflicts with the built-in audio hardware, which uses the same pin to drive the audio output. Depending on your configuration of Raspbian, the sound drivers may be more aggressive in taking away control of GPIO 18 from other processes. If your LED shows random colors instead of the expected color, use this trick to fix it. - - sudo cp blacklist-rgb-led.conf /etc/modprobe.d/ + sudo cp bootstrap/tjbot-blacklist-snd.conf /etc/modprobe.d/ sudo update-initramfs -u + sudo reboot -Reboot and confirm no "snd" modules are running by executing the command "lsmod". - - lsmod - -##Customization -You can add new colors to your color palette in stt.js. TJBot uses a NeoPixel RGB LED, which means it can show any combination of red, green, and blue. +After TJBot finishes rebooting, confirm no "snd" modules are running. -We have hidden a disco party for you. Find the code for disco party in stt.js and uncomment the code. Now you can ask TJ to show you the disco lights by saying "Let's have a disco party"! + lsmod -Try implementing your own TJBot party and share it with us #TJBot! - -Once ready to move on, try the next recipe to [make TJBot respond to emotions using Watson](../sentiment_analysis). - -##Dependencies +If you have additional difficulties not covered in this guide, please refer to [Adafruit's NeoPixel on Raspbeery Pi guide](https://learn.adafruit.com/neopixels-on-raspberry-pi/overview) to troubleshoot. +# Watson Services - [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html) -- mic npm package for reading audio input -- [rpi-ws281x-native](https://github.com/beyondscreen/node-rpi-ws281x-native) npm package to control a ws281x LED. -## Contributing +# License +This project is licensed under Apache 2.0. Full license text is available in [LICENSE](../../LICENSE). + +# Contributing See [CONTRIBUTING.md](../../CONTRIBUTING.md). + diff --git a/recipes/speech_to_text/blacklist-rgb-led.conf b/recipes/speech_to_text/blacklist-rgb-led.conf deleted file mode 100755 index 48dfad5c..00000000 --- a/recipes/speech_to_text/blacklist-rgb-led.conf +++ /dev/null @@ -1,5 +0,0 @@ -blacklist snd_bcm2835 -blacklist snd_pcm -blacklist snd_timer -blacklist snd_pcsp -blacklist snd diff --git a/recipes/speech_to_text/config.default.js b/recipes/speech_to_text/config.default.js new file mode 100755 index 00000000..e04bbcd9 --- /dev/null +++ b/recipes/speech_to_text/config.default.js @@ -0,0 +1,16 @@ +// Create the credentials object for export +exports.credentials = {}; + +// Watson Text to Speech +// https://www.ibm.com/watson/developercloud/text-to-speech.html +exports.credentials.text_to_speech = { + password: '', + username: '' +}; + +// Watson Speech to Text +// https://www.ibm.com/watson/developercloud/speech-to-text.html +exports.credentials.speech_to_text = { + password: '', + username: '' +}; diff --git a/recipes/speech_to_text/config.js b/recipes/speech_to_text/config.js deleted file mode 100755 index eb246f91..00000000 --- a/recipes/speech_to_text/config.js +++ /dev/null @@ -1,6 +0,0 @@ -// Please replace the username and password with your bluemix credentials - - -exports.password = 'xxxxxx' ; -exports.username = 'xxx-xxx-xxx' ; -exports.version = 'v1' ; diff --git a/recipes/speech_to_text/led_test.js b/recipes/speech_to_text/led_test.js deleted file mode 100755 index e3c45622..00000000 --- a/recipes/speech_to_text/led_test.js +++ /dev/null @@ -1,27 +0,0 @@ -// Run "sudo node led_test.js" from your terminal to test your LED. -// It should set your light to white and turn the LED on. - -var ws281x = require('rpi-ws281x-native'); -var NUM_LEDS = 1; // Number of LEDs -ws281x.init(NUM_LEDS); // initialize LEDs - -// ---- reset LED before exit -process.on('SIGINT', function () { - ws281x.reset(); - process.nextTick(function () { process.exit(0); }); -}); - -var color = new Uint32Array(NUM_LEDS); -ws281x.render(color); - -console.log("turning ON the light"); -setLED("on"); // setLED sets the light - -function setLED(value) { - if (value == "on") { - color[0] = 0xffffff ; - } else { - color[0] = 0x000000 ; - } - ws281x.render(color); -} diff --git a/recipes/speech_to_text/package.json b/recipes/speech_to_text/package.json index 3435a210..db8823cc 100644 --- a/recipes/speech_to_text/package.json +++ b/recipes/speech_to_text/package.json @@ -1,28 +1,17 @@ { - "name": "sttkit", - "version": "1.0.0", - "description": "TJ Bot Speech to Text recipe", - "main": "app.js", + "name": "tjbot-stt", + "version": "0.0.1", + "description": "TJBot speech to text recipe", + "main": "stt.js", "scripts": { - "test": "node stt.js", - "start": "node stt.js" + "start": "node stt.js", + "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", - "url": "git@github.ibm.com:watsonkits/sttkit.git" + "url": "git@github.com:ibmtjbot/tjbot.git" }, - "keywords": [ - "Watson", - "IBM", - "Speech", - "To", - "Text", - "STT", - "Raspberry Pi" - ], "dependencies": { - "mic": "^2.1.1", - "rpi-ws281x-native": "^0.8.1", - "watson-developer-cloud": "^2.0.0" + "tjbot": "latest" } } diff --git a/recipes/speech_to_text/stt.js b/recipes/speech_to_text/stt.js index 3f489e93..d876d19b 100644 --- a/recipes/speech_to_text/stt.js +++ b/recipes/speech_to_text/stt.js @@ -1,185 +1,84 @@ -/************************************************************************ -* Copyright 2016 IBM Corp. All Rights Reserved. -* -* Watson Maker Kits -* -* This project is licensed under the Apache License 2.0, see LICENSE.* -* -************************************************************************ -* -* Control a NeoPixel LED unit connected to a Raspberry Pi pin through voice commands -* Must run with root-level protection -* sudo node stt.js - - Based on example NeoPixel code by Jeremy Garff (jer@jers.net) - - Follow the instructions in http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/ to - get the system ready to run this code. -*/ - -/************************************************************************ - * Step #1: Configuring your Bluemix Credentials - ************************************************************************ - In this step, the audio sample (pipe) is sent to "Watson Speech to Text" to transcribe. - The service converts the audio to text and saves the returned text in "textStream" -*/ -var watson = require('watson-developer-cloud'); -var config = require('./config'); // gets our username and passwords from the config.js files -var speech_to_text = watson.speech_to_text({ - username: config.username, - password: config.password, - version: config.version -}); - -/************************************************************************ - * Step #2: Configuring the Microphone - ************************************************************************ - In this step, we configure your microphone to collect the audio samples as you talk. - See https://www.npmjs.com/package/mic for more information on - microphone input events e.g on error, startcomplete, pause, stopcomplete etc. -*/ - -// Initiate Microphone Instance to Get audio samples -var mic = require('mic'); -var micInstance = mic({ 'rate': '44100', 'channels': '2', 'debug': false, 'exitOnSilence': 6 }); -var micInputStream = micInstance.getAudioStream(); - -micInputStream.on('data', function(data) { - //console.log("Recieved Input Stream: " + data.length); -}); - -micInputStream.on('error', function(err) { - console.log("Error in Input Stream: " + err); -}); - -micInputStream.on('silence', function() { - // detect silence. -}); -micInstance.start(); -console.log("TJBot is listening, you may speak now."); - -/************************************************************************ - * Step #3: Converting your Speech Commands to Text - ************************************************************************ - In this step, the audio sample is sent (piped) to "Watson Speech to Text" to transcribe. - The service converts the audio to text and saves the returned text in "textStream". - You can also set the language model for your speech input. - The following language models are available - ar-AR_BroadbandModel - en-UK_BroadbandModel - en-UK_NarrowbandModel - en-US_BroadbandModel (the default) - en-US_NarrowbandModel - es-ES_BroadbandModel - es-ES_NarrowbandModel - fr-FR_BroadbandModel - ja-JP_BroadbandModel - ja-JP_NarrowbandModel - pt-BR_BroadbandModel - pt-BR_NarrowbandModel - zh-CN_BroadbandModel - zh-CN_NarrowbandModel -*/ -var recognizeparams = { - content_type: 'audio/l16; rate=44100; channels=2', - model: 'en-US_BroadbandModel' // Specify your language model here +/** + * Copyright 2016 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var TJBot = require('tjbot'); +var config = require('./config'); + +// obtain our credentials from config.js +var credentials = config.credentials; + +// these are the hardware capabilities that our TJ needs for this recipe +var hardware = ['led', 'microphone', 'speaker']; + +// turn on debug logging to the console +var config = { + verboseLogging: true }; -var textStream = micInputStream.pipe( - speech_to_text.createRecognizeStream(recognizeparams) -); +// instantiate our TJBot! +var tj = new TJBot(hardware, config, credentials); -/********************************************************************* - * Step #4: Parsing the Text - ********************************************************************* - In this step, we parse the text to look for commands such as "ON" or "OFF". - You can say any variations of "lights on", "turn the lights on", "turn on the lights", etc. - You would be able to create your own customized command, such as "good night" to turn the lights off. - What you need to do is to go to parseText function and modify the text. -*/ +// full list of colors that TJ recognizes, e.g. ['red', 'green', 'blue'] +var tjColors = tj.shineColors(); -textStream.setEncoding('utf8'); -textStream.on('data', function(str) { - console.log(' ===== Speech to Text ===== : ' + str); // print each text we receive - parseText(str); -}); +console.log("Hello from TJBot! I understand lots of colors. You can tell me to shine my light a different color by saying 'turn the light red' or 'change the light to green' or 'turn the light off'."); -textStream.on('error', function(err) { - console.log(' === Watson Speech to Text : An Error has occurred =====') ; // handle errors - console.log(err) ; - console.log("Press +C to exit.") ; +// uncomment to see the full list of colors TJ understands +// console.log("Here are all the colors I understand:"); +// console.log(tjColors.join(", ")); + +// hash map to easily test if TJ understands a color, e.g. {'red': 1, 'green': 1, 'blue': 1} +var colors = {}; +tjColors.forEach(function(color) { + colors[color] = 1; }); -function parseText(str){ - var containsTurn = str.indexOf("turn") >= 0; - var containsChange = str.indexOf("change") >= 0; - var containsSet = str.indexOf("set") >= 0; - var containsLight = str.indexOf("the light") >= 0; - var containsDisco = str.indexOf("disco") >= 0; +// listen for speech +tj.listen(function(msg) { + var containsTurn = msg.indexOf("turn") >= 0; + var containsChange = msg.indexOf("change") >= 0; + var containsSet = msg.indexOf("set") >= 0; + var containsLight = msg.indexOf("the light") >= 0; + var containsDisco = msg.indexOf("disco") >= 0; if ((containsTurn || containsChange || containsSet) && containsLight) { - setLED(str); + // was there a color uttered? + var words = msg.split(" "); + for (var i = 0; i < words.length; i++) { + var word = words[i]; + if (colors[word] != undefined || word == "on" || word == "off") { + // yes! + tj.shine(word); + break; + } + } } else if (containsDisco) { - discoParty(); + // discoParty(); } -} - -/********************************************************************* - * Step #5: Switching the LED light - ********************************************************************* - Once the command is recognized, the led light gets changed to reflect that. - The npm "onoff" library is used for this purpose. https://github.com/fivdi/onoff -*/ - -var ws281x = require('rpi-ws281x-native'); -var NUM_LEDS = 1; // Number of LEDs -ws281x.init(NUM_LEDS); // initialize LEDs - -var color = new Uint32Array(NUM_LEDS); // array that stores colors for leds -color[0] = 0xffffff; // default to white - -// note that colors are specified as Green-Red-Blue, not Red-Green-Blue -// e.g. 0xGGRRBB instead of 0xRRGGBB -var colorPalette = { - "red": 0x00ff00, - "read": 0x00ff00, // sometimes, STT hears "read" instead of "red" - "green": 0xff0000, - "blue": 0x0000ff, - "purple": 0x008080, - "yellow": 0xc1ff35, - "magenta": 0x00ffff, - "orange": 0xa5ff00, - "aqua": 0xff00ff, - "white": 0xffffff, - "off": 0x000000, - "on": 0xffffff -} - -// ---- reset LED before exit -process.on('SIGINT', function () { - ws281x.reset(); - process.nextTick(function () { process.exit(0); }); }); -function setLED(msg){ - var words = msg.split(" "); - for (var i = 0; i < words.length; i++) { - if (words[i] in colorPalette) { - color[0] = colorPalette[words[i]]; - break; - } - } - ws281x.render(color); -} - +// let's have a disco party! +/* function discoParty() { - // uncomment this for a disco party! - /*for (i = 0; i < 30; i++) { + for (i = 0; i < 30; i++) { setTimeout(function() { - var colors = Object.keys(colorPalette); - var randIdx = Math.floor(Math.random() * colors.length); - var randColor = colors[randIdx]; - setLED(randColor); + var randIdx = Math.floor(Math.random() * tjColors.length); + var randColor = tjColors[randIdx]; + tj.shine(randColor); }, i * 250); - }*/ + } } +*/ \ No newline at end of file From 54cf8df7e1c04cf7097be54e84d9ea87ef2b49df Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 17:56:15 -0400 Subject: [PATCH 02/31] use config instead of tjConfig --- recipes/conversation/conversation.js | 4 ++-- recipes/sentiment_analysis/sentiment.js | 23 +++++++++++------------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/recipes/conversation/conversation.js b/recipes/conversation/conversation.js index dd9aa4a1..997159f7 100644 --- a/recipes/conversation/conversation.js +++ b/recipes/conversation/conversation.js @@ -28,12 +28,12 @@ var WORKSPACEID = config.conversationWorkspaceId; var hardware = ['microphone', 'speaker']; // turn on debug logging to the console -var tjConfig = { +var config = { verboseLogging: false }; // instantiate our TJBot! -var tj = new TJBot(hardware, tjConfig, credentials); +var tj = new TJBot(hardware, config, credentials); // listen for utterances with our attentionWord and send the result to // the Conversation service diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index bf864b70..dd1d350c 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -29,12 +29,20 @@ var SENTIMENT_ANALYSIS_FREQUENCY_MSEC = config.sentiment_analysis_frequency_sec var hardware = ['led']; // turn on debug logging to the console -var tjConfig = { +var config = { verboseLogging: true }; // instantiate our TJBot! -var tj = new TJBot(hardware, tjConfig, credentials); +var tj = new TJBot(hardware, config, credentials); + +// instnatiate twitter client +var twitter = new Twitter({ + consumer_key: config.credentials.twitter.consumer_key, + consumer_secret: config.credentials.twitter.consumer_secret, + access_token_key: config.credentials.twitter.access_token_key, + access_token_secret: config.credentials.twitter.access_token_secret +}); console.log("I am monitoring twitter for " + SENTIMENT_KEYWORD); @@ -57,14 +65,6 @@ function monitorTwitter() { // start the pulse to show we are thinking tj.pulse('white', 1.5, 2.0); - // instnatiate twitter client - var twitter = new Twitter({ - consumer_key: config.credentials.twitter.consumer_key, - consumer_secret: config.credentials.twitter.consumer_secret, - access_token_key: config.credentials.twitter.access_token_key, - access_token_secret: config.credentials.twitter.access_token_secret - }); - // monitor twitter twitter.stream('statuses/filter', { track: SENTIMENT_KEYWORD @@ -105,8 +105,7 @@ function shineFromTweetSentiment() { if (TWEETS.length > 5) { var text = TWEETS.join(' '); console.log("Analyzing tone of " + TWEETS.length + " tweets"); - tj.analyzeTone(text, - function(tone) { + tj.analyzeTone(text, function(tone) { tone.document_tone.tone_categories.forEach(function(category) { if (category.category_id == "emotion_tone") { // find the emotion with the highest confidence From fa90605b3dbb0c9a13e9a6c11e4c6e933a0fb6cb Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 17:58:47 -0400 Subject: [PATCH 03/31] minor fixup --- recipes/sentiment_analysis/sentiment.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index dd1d350c..219c72b1 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -14,9 +14,9 @@ * limitations under the License. */ -var TJBot = require('../../tjbot/tjbot'); -var Twitter = require('twitter'); +var TJBot = require('tjbot'); var config = require('./config'); +var Twitter = require('twitter'); // obtain our credentials from config.js var credentials = config.credentials; @@ -36,7 +36,7 @@ var config = { // instantiate our TJBot! var tj = new TJBot(hardware, config, credentials); -// instnatiate twitter client +// create the twitter client var twitter = new Twitter({ consumer_key: config.credentials.twitter.consumer_key, consumer_secret: config.credentials.twitter.consumer_secret, @@ -110,7 +110,7 @@ function shineFromTweetSentiment() { if (category.category_id == "emotion_tone") { // find the emotion with the highest confidence var max = category.tones.reduce(function(a, b) { - return (a.score > b.score) ? a: b; + return (a.score > b.score) ? a : b; }); // make sure we really are confident From e33a4fb21c7ead43c43be30b84b1a64c72e5e08d Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 18:11:47 -0400 Subject: [PATCH 04/31] removed unused configuration option --- recipes/conversation/config.default.js | 1 - recipes/conversation/conversation.js | 1 - 2 files changed, 2 deletions(-) diff --git a/recipes/conversation/config.default.js b/recipes/conversation/config.default.js index c8b0bef6..3a384186 100755 --- a/recipes/conversation/config.default.js +++ b/recipes/conversation/config.default.js @@ -1,5 +1,4 @@ // User-specific configuration -exports.voice = 'en-US_MichaelVoice'; exports.conversationWorkspaceId = ''; // replace with the workspace identifier of your conversation // Create the credentials object for export diff --git a/recipes/conversation/conversation.js b/recipes/conversation/conversation.js index 997159f7..19015636 100644 --- a/recipes/conversation/conversation.js +++ b/recipes/conversation/conversation.js @@ -21,7 +21,6 @@ var config = require('./config'); var credentials = config.credentials; // obtain user-specific config -var VOICE = config.voice; var WORKSPACEID = config.conversationWorkspaceId; // these are the hardware capabilities that TJ needs for this recipe From c9256b940d7152b906f23c2b8f38bcbfaa6bdcb2 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 21:55:12 -0400 Subject: [PATCH 05/31] adding missing instructions for installing alsa package --- bootstrap/README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bootstrap/README.md b/bootstrap/README.md index 59587a06..8b4bc9ef 100644 --- a/bootstrap/README.md +++ b/bootstrap/README.md @@ -33,17 +33,22 @@ If you have plugged in your speaker via the headphone jack, you may experience i rm -rf ~/oldconffiles -5. Install Node.js +5. Remove unneeded packages and install missing ALSA packages + + sudo apt-get autoremove + sudo apt-get install libasound2-dev + +6. Install Node.js curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs -6. Check out the TJBot source code +7. Check out the TJBot source code cd Desktop git clone https://github.com/ibmtjbot/tjbot -7. Run a recipe +8. Run a recipe cd ~/Desktop/tjbot/recipes/intro npm install From 3979bd48568762611626cc976fea0045fc1acb34 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:05:07 -0400 Subject: [PATCH 06/31] package.json fixup --- recipes/conversation/package.json | 27 ++++++++++++++++--------- recipes/sentiment_analysis/package.json | 27 ++++++++++++++++--------- recipes/speech_to_text/package.json | 25 +++++++++++++++-------- 3 files changed, 53 insertions(+), 26 deletions(-) diff --git a/recipes/conversation/package.json b/recipes/conversation/package.json index 3cd67084..f4e46f17 100644 --- a/recipes/conversation/package.json +++ b/recipes/conversation/package.json @@ -1,17 +1,26 @@ { - "name": "tjbot-conversation", - "version": "0.0.1", + "name": "conversation", "description": "TJBot conversation recipe", - "main": "conversation.js", - "scripts": { - "start": "node conversation.js", - "test": "echo \"Error: no test specified\" && exit 1" + "version": "0.0.1", + "author": "Justin Weisz ", + "bugs": { + "url": "https://github.com/ibmtjbot/tjbot/issues" }, + "dependencies": { + "tjbot": "latest" + }, + "main": "conversation.js", + "homepage": "https://github.com/ibmtjbot/tjbot/tree/master/recipes/conversation", + "keywords": [ + "tjbot" + ], + "license": "Apache-2.0", "repository": { "type": "git", "url": "git@github.com:ibmtjbot/tjbot.git" }, - "dependencies": { - "tjbot": "latest" + "scripts": { + "start": "node conversation.js", + "test": "echo \"Error: no test specified\" && exit 1" } -} +} \ No newline at end of file diff --git a/recipes/sentiment_analysis/package.json b/recipes/sentiment_analysis/package.json index c3599e9c..080e3bdb 100644 --- a/recipes/sentiment_analysis/package.json +++ b/recipes/sentiment_analysis/package.json @@ -1,18 +1,27 @@ { - "name": "tjbot-sentiment", + "name": "sentiment", "version": "0.0.1", "description": "TJBot sentiment analysis recipe", - "main": "sentiment.js", - "scripts": { - "start": "node sentiment.js", - "test": "echo \"Error: no test specified\" && exit 1" + "author": "Justin Weisz ", + "bugs": { + "url": "https://github.com/ibmtjbot/tjbot/issues" + }, + "dependencies": { + "tjbot": "latest", + "twitter": "^1.4.0" }, + "main": "sentiment_analysis.js", + "homepage": "https://github.com/ibmtjbot/tjbot/tree/master/recipes/sentiment_analysis", + "keywords": [ + "tjbot" + ], + "license": "Apache-2.0", "repository": { "type": "git", "url": "git@github.com:ibmtjbot/tjbot.git" }, - "dependencies": { - "tjbot": "latest", - "twitter": "^1.4.0" + "scripts": { + "start": "node sentiment_analysis.js", + "test": "echo \"Error: no test specified\" && exit 1" } -} +} \ No newline at end of file diff --git a/recipes/speech_to_text/package.json b/recipes/speech_to_text/package.json index db8823cc..7fcbf948 100644 --- a/recipes/speech_to_text/package.json +++ b/recipes/speech_to_text/package.json @@ -1,17 +1,26 @@ { - "name": "tjbot-stt", + "name": "speech_to_text", "version": "0.0.1", "description": "TJBot speech to text recipe", - "main": "stt.js", - "scripts": { - "start": "node stt.js", - "test": "echo \"Error: no test specified\" && exit 1" + "author": "Justin Weisz ", + "bugs": { + "url": "https://github.com/ibmtjbot/tjbot/issues" + }, + "dependencies": { + "tjbot": "latest" }, + "main": "stt.js", + "homepage": "https://github.com/ibmtjbot/tjbot/tree/master/recipes/speech_to_text", + "keywords": [ + "tjbot" + ], + "license": "Apache-2.0", "repository": { "type": "git", "url": "git@github.com:ibmtjbot/tjbot.git" }, - "dependencies": { - "tjbot": "latest" + "scripts": { + "start": "node stt.js", + "test": "echo \"Error: no test specified\" && exit 1" } -} +} \ No newline at end of file From a291f8fc4ad4376b49b86d45192ac83b08f217ae Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:30:29 -0400 Subject: [PATCH 07/31] fixing name of script --- recipes/sentiment_analysis/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/sentiment_analysis/package.json b/recipes/sentiment_analysis/package.json index 080e3bdb..ec2e2148 100644 --- a/recipes/sentiment_analysis/package.json +++ b/recipes/sentiment_analysis/package.json @@ -10,7 +10,7 @@ "tjbot": "latest", "twitter": "^1.4.0" }, - "main": "sentiment_analysis.js", + "main": "sentiment.js", "homepage": "https://github.com/ibmtjbot/tjbot/tree/master/recipes/sentiment_analysis", "keywords": [ "tjbot" @@ -21,7 +21,7 @@ "url": "git@github.com:ibmtjbot/tjbot.git" }, "scripts": { - "start": "node sentiment_analysis.js", + "start": "node sentiment.js", "test": "echo \"Error: no test specified\" && exit 1" } } \ No newline at end of file From 76b56cd0f15f0289c5a2869f3c4a53b5e63d4ad4 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:31:15 -0400 Subject: [PATCH 08/31] deleting unnecessary comma --- recipes/sentiment_analysis/config.default.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/sentiment_analysis/config.default.js b/recipes/sentiment_analysis/config.default.js index b8dedd27..fa7b23de 100755 --- a/recipes/sentiment_analysis/config.default.js +++ b/recipes/sentiment_analysis/config.default.js @@ -8,7 +8,7 @@ exports.credentials = {}; // https://www.ibm.com/watson/developercloud/text-to-speech.html exports.credentials.text_to_speech = { password: '', - username: '', + username: '' }; // Watson Tone Analyzer From 3e873548c3db3f791945aeec3068984b5452dd27 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:32:08 -0400 Subject: [PATCH 09/31] minor oops --- recipes/sentiment_analysis/sentiment.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index 219c72b1..fb30197a 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -38,10 +38,10 @@ var tj = new TJBot(hardware, config, credentials); // create the twitter client var twitter = new Twitter({ - consumer_key: config.credentials.twitter.consumer_key, - consumer_secret: config.credentials.twitter.consumer_secret, - access_token_key: config.credentials.twitter.access_token_key, - access_token_secret: config.credentials.twitter.access_token_secret + consumer_key: credentials.twitter.consumer_key, + consumer_secret: credentials.twitter.consumer_secret, + access_token_key: credentials.twitter.access_token_key, + access_token_secret: credentials.twitter.access_token_secret }); console.log("I am monitoring twitter for " + SENTIMENT_KEYWORD); From 128c54e0476573b9f1284781571ccc8b629bc4b0 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:33:06 -0400 Subject: [PATCH 10/31] =?UTF-8?q?turns=20out=20i=20really=20did=20mean=20t?= =?UTF-8?q?o=20call=20this=20=E2=80=98tjConfig=E2=80=99=20to=20avoid=20a?= =?UTF-8?q?=20naming=20conflict?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipes/conversation/conversation.js | 4 ++-- recipes/sentiment_analysis/sentiment.js | 4 ++-- recipes/speech_to_text/stt.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/recipes/conversation/conversation.js b/recipes/conversation/conversation.js index 19015636..a4b86872 100644 --- a/recipes/conversation/conversation.js +++ b/recipes/conversation/conversation.js @@ -27,12 +27,12 @@ var WORKSPACEID = config.conversationWorkspaceId; var hardware = ['microphone', 'speaker']; // turn on debug logging to the console -var config = { +var tjConfig = { verboseLogging: false }; // instantiate our TJBot! -var tj = new TJBot(hardware, config, credentials); +var tj = new TJBot(hardware, tjConfig, credentials); // listen for utterances with our attentionWord and send the result to // the Conversation service diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index fb30197a..ffe26ca0 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -29,12 +29,12 @@ var SENTIMENT_ANALYSIS_FREQUENCY_MSEC = config.sentiment_analysis_frequency_sec var hardware = ['led']; // turn on debug logging to the console -var config = { +var tjConfig = { verboseLogging: true }; // instantiate our TJBot! -var tj = new TJBot(hardware, config, credentials); +var tj = new TJBot(hardware, tjConfig, credentials); // create the twitter client var twitter = new Twitter({ diff --git a/recipes/speech_to_text/stt.js b/recipes/speech_to_text/stt.js index d876d19b..7b5d2689 100644 --- a/recipes/speech_to_text/stt.js +++ b/recipes/speech_to_text/stt.js @@ -24,12 +24,12 @@ var credentials = config.credentials; var hardware = ['led', 'microphone', 'speaker']; // turn on debug logging to the console -var config = { +var tjConfig = { verboseLogging: true }; // instantiate our TJBot! -var tj = new TJBot(hardware, config, credentials); +var tj = new TJBot(hardware, tjConfig, credentials); // full list of colors that TJ recognizes, e.g. ['red', 'green', 'blue'] var tjColors = tj.shineColors(); From 8c49935d9a631a8a93b29d60a19d92d8d8c7ea12 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:36:05 -0400 Subject: [PATCH 11/31] bugfix and added missing config option --- recipes/sentiment_analysis/config.default.js | 1 + recipes/sentiment_analysis/sentiment.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/recipes/sentiment_analysis/config.default.js b/recipes/sentiment_analysis/config.default.js index fa7b23de..294aa747 100755 --- a/recipes/sentiment_analysis/config.default.js +++ b/recipes/sentiment_analysis/config.default.js @@ -1,5 +1,6 @@ // User-specific configuration exports.sentiment_keyword = "happy"; // keyword to monitor in Twitter +exports.sentiment_analysis_frequency_sec = 30; // analyze sentiment every N seconds // Create the credentials object for export exports.credentials = {}; diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index ffe26ca0..5e84663c 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -82,7 +82,7 @@ function monitorTwitter() { while (TWEETS.length >= MAX_TWEETS) { TWEETS.shift(); } - TWEETS.push(cleanTweet); + TWEETS.push(tweet); } }); From 0fbabc36c6e259f7c8d1c4d6a1e5a4bdfe9afcd3 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:47:31 -0400 Subject: [PATCH 12/31] fixing how analyzeTone is called --- recipes/sentiment_analysis/sentiment.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index 5e84663c..361eef74 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -105,7 +105,8 @@ function shineFromTweetSentiment() { if (TWEETS.length > 5) { var text = TWEETS.join(' '); console.log("Analyzing tone of " + TWEETS.length + " tweets"); - tj.analyzeTone(text, function(tone) { + + tj.analyzeTone(text).then(function(tone) { tone.document_tone.tone_categories.forEach(function(category) { if (category.category_id == "emotion_tone") { // find the emotion with the highest confidence From 16d981cc9349446138d0cc8dc21f1736afa6e5e9 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:56:41 -0400 Subject: [PATCH 13/31] cleaning up permission bits --- CONDUCT.md | 0 LICENSE | 0 MAINTAINERS.md | 0 bootstrap/led_test.js | 0 recipes/conversation/README.md | 0 recipes/conversation/config.default.js | 0 recipes/sentiment_analysis/config.default.js | 0 recipes/speech_to_text/config.default.js | 0 8 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 CONDUCT.md mode change 100755 => 100644 LICENSE mode change 100755 => 100644 MAINTAINERS.md mode change 100755 => 100644 bootstrap/led_test.js mode change 100755 => 100644 recipes/conversation/README.md mode change 100755 => 100644 recipes/conversation/config.default.js mode change 100755 => 100644 recipes/sentiment_analysis/config.default.js mode change 100755 => 100644 recipes/speech_to_text/config.default.js diff --git a/CONDUCT.md b/CONDUCT.md old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/MAINTAINERS.md b/MAINTAINERS.md old mode 100755 new mode 100644 diff --git a/bootstrap/led_test.js b/bootstrap/led_test.js old mode 100755 new mode 100644 diff --git a/recipes/conversation/README.md b/recipes/conversation/README.md old mode 100755 new mode 100644 diff --git a/recipes/conversation/config.default.js b/recipes/conversation/config.default.js old mode 100755 new mode 100644 diff --git a/recipes/sentiment_analysis/config.default.js b/recipes/sentiment_analysis/config.default.js old mode 100755 new mode 100644 diff --git a/recipes/speech_to_text/config.default.js b/recipes/speech_to_text/config.default.js old mode 100755 new mode 100644 From 29f4248f0fa041885a2a4a14a0092cd3799bd80f Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Tue, 21 Mar 2017 22:59:12 -0400 Subject: [PATCH 14/31] minor tweak --- recipes/speech_to_text/stt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/speech_to_text/stt.js b/recipes/speech_to_text/stt.js index 7b5d2689..d3b4c88d 100644 --- a/recipes/speech_to_text/stt.js +++ b/recipes/speech_to_text/stt.js @@ -34,7 +34,7 @@ var tj = new TJBot(hardware, tjConfig, credentials); // full list of colors that TJ recognizes, e.g. ['red', 'green', 'blue'] var tjColors = tj.shineColors(); -console.log("Hello from TJBot! I understand lots of colors. You can tell me to shine my light a different color by saying 'turn the light red' or 'change the light to green' or 'turn the light off'."); +console.log("I understand lots of colors. You can tell me to shine my light a different color by saying 'turn the light red' or 'change the light to green' or 'turn the light off'."); // uncomment to see the full list of colors TJ understands // console.log("Here are all the colors I understand:"); From 29535506a7860da6a7ef1569f829b377626cc8cb Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 10:57:17 -0400 Subject: [PATCH 15/31] added alsa packages to bootstrap instructions --- bootstrap/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap/README.md b/bootstrap/README.md index 8b4bc9ef..2108f952 100644 --- a/bootstrap/README.md +++ b/bootstrap/README.md @@ -36,7 +36,7 @@ If you have plugged in your speaker via the headphone jack, you may experience i 5. Remove unneeded packages and install missing ALSA packages sudo apt-get autoremove - sudo apt-get install libasound2-dev + sudo apt-get install alsa-base alsa-utils libasound2-dev 6. Install Node.js From ecfcd20d8e1aa6d040d9af405afe890c1cf1ec20 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 10:58:24 -0400 Subject: [PATCH 16/31] uses robot.name as the attention word --- recipes/conversation/conversation.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/recipes/conversation/conversation.js b/recipes/conversation/conversation.js index a4b86872..0491f795 100644 --- a/recipes/conversation/conversation.js +++ b/recipes/conversation/conversation.js @@ -28,7 +28,7 @@ var hardware = ['microphone', 'speaker']; // turn on debug logging to the console var tjConfig = { - verboseLogging: false + verboseLogging: true }; // instantiate our TJBot! @@ -37,10 +37,10 @@ var tj = new TJBot(hardware, tjConfig, credentials); // listen for utterances with our attentionWord and send the result to // the Conversation service tj.listen(function(msg) { - // check for an attention word - if (msg.startsWith(tj.configuration.attentionWord)) { - // remove the attention word from the message - var turn = msg.toLowerCase().replace(tj.configuration.attentionWord.toLowerCase(), ""); + // check to see if they are talking to TJBot + if (msg.startsWith(tj.configuration.robot.name)) { + // remove our name from the message + var turn = msg.toLowerCase().replace(tj.configuration.robot.name.toLowerCase(), ""); // send to the conversation service tj.converse(WORKSPACEID, turn, function(response) { From 1540947f623819e673453aaa8bda6f585c57d6fd Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 11:06:42 -0400 Subject: [PATCH 17/31] added instructions --- recipes/conversation/conversation.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/recipes/conversation/conversation.js b/recipes/conversation/conversation.js index 0491f795..fb34d314 100644 --- a/recipes/conversation/conversation.js +++ b/recipes/conversation/conversation.js @@ -34,6 +34,10 @@ var tjConfig = { // instantiate our TJBot! var tj = new TJBot(hardware, tjConfig, credentials); +console.log("You can ask me to introduce myself or tell you a joke."); +console.log("Try saying, \"" + tj.configuration.robot.name = ", please introduce yourself\" or \"" + tj.configuration.robot.name + ", who are you?\""); +console.log("You can also say, \"" + tj.configuration.robot.name + ", tell me a joke!\""); + // listen for utterances with our attentionWord and send the result to // the Conversation service tj.listen(function(msg) { From 93ebdacc4e48e437ba40bacf4b8a276e0cf04d3a Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 11:07:53 -0400 Subject: [PATCH 18/31] typo --- recipes/conversation/conversation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/conversation/conversation.js b/recipes/conversation/conversation.js index fb34d314..bc091f32 100644 --- a/recipes/conversation/conversation.js +++ b/recipes/conversation/conversation.js @@ -35,7 +35,7 @@ var tjConfig = { var tj = new TJBot(hardware, tjConfig, credentials); console.log("You can ask me to introduce myself or tell you a joke."); -console.log("Try saying, \"" + tj.configuration.robot.name = ", please introduce yourself\" or \"" + tj.configuration.robot.name + ", who are you?\""); +console.log("Try saying, \"" + tj.configuration.robot.name + ", please introduce yourself\" or \"" + tj.configuration.robot.name + ", who are you?\""); console.log("You can also say, \"" + tj.configuration.robot.name + ", tell me a joke!\""); // listen for utterances with our attentionWord and send the result to From 7ca40020dcb97ac488540523a4b9f4fb38fa4267 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 16:06:04 -0400 Subject: [PATCH 19/31] moving hardware tests to bootstrap --- bootstrap/led_test.js | 27 ----------------- bootstrap/tests/test.camera.js | 30 +++++++++++++++++++ bootstrap/tests/test.led.js | 40 ++++++++++++++++++++++++++ bootstrap/tests/test.servo.js | 51 +++++++++++++++++++++++++++++++++ bootstrap/tests/test.speaker.js | 38 ++++++++++++++++++++++++ 5 files changed, 159 insertions(+), 27 deletions(-) delete mode 100644 bootstrap/led_test.js create mode 100644 bootstrap/tests/test.camera.js create mode 100644 bootstrap/tests/test.led.js create mode 100644 bootstrap/tests/test.servo.js create mode 100644 bootstrap/tests/test.speaker.js diff --git a/bootstrap/led_test.js b/bootstrap/led_test.js deleted file mode 100644 index e3c45622..00000000 --- a/bootstrap/led_test.js +++ /dev/null @@ -1,27 +0,0 @@ -// Run "sudo node led_test.js" from your terminal to test your LED. -// It should set your light to white and turn the LED on. - -var ws281x = require('rpi-ws281x-native'); -var NUM_LEDS = 1; // Number of LEDs -ws281x.init(NUM_LEDS); // initialize LEDs - -// ---- reset LED before exit -process.on('SIGINT', function () { - ws281x.reset(); - process.nextTick(function () { process.exit(0); }); -}); - -var color = new Uint32Array(NUM_LEDS); -ws281x.render(color); - -console.log("turning ON the light"); -setLED("on"); // setLED sets the light - -function setLED(value) { - if (value == "on") { - color[0] = 0xffffff ; - } else { - color[0] = 0x000000 ; - } - ws281x.render(color); -} diff --git a/bootstrap/tests/test.camera.js b/bootstrap/tests/test.camera.js new file mode 100644 index 00000000..297c5467 --- /dev/null +++ b/bootstrap/tests/test.camera.js @@ -0,0 +1,30 @@ +/** + * Copyright 2016 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const fs = require('fs'); +const assert = require('assert'); + +const TJBot = require('tjbot'); + +var tj = new TJBot(['camera'], {}, {}); + +tj._captureImage('picture.jpg', function(data) { + assert(fs.existsSync('picture.jpg'), "expected picture.jpg to have been created"); + fs.unlink('picture.jpg'); + assert(!fs.existsSync('picture.jpg'), "expected to have deleted picture.jpg"); +}); diff --git a/bootstrap/tests/test.led.js b/bootstrap/tests/test.led.js new file mode 100644 index 00000000..886405c8 --- /dev/null +++ b/bootstrap/tests/test.led.js @@ -0,0 +1,40 @@ +/** + * Copyright 2016 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const readline = require('readline'); +const assert = require('assert'); + +const TJBot = require('tjbot'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +var tj = new TJBot(['led'], {}, {}); +var colors = ['red', 'green', 'blue', 'orange', 'off']; + +colors.forEach(function(color) { + tj.shine(color); + rl.question('Did the LED turn ' + color + '? Y/N > ', (answer) => { + assert(answer.toLowerCase() == 'y', 'expected the LED to turn ' + color + ', please check your LED wiring.'); + }); +}); + +tj.shine('off'); +rl.close(); diff --git a/bootstrap/tests/test.servo.js b/bootstrap/tests/test.servo.js new file mode 100644 index 00000000..d242025e --- /dev/null +++ b/bootstrap/tests/test.servo.js @@ -0,0 +1,51 @@ +/** + * Copyright 2016 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const readline = require('readline'); +const assert = require('assert'); + +const TJBot = require('tjbot'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +var tj = new TJBot(['servo'], {}, {}); + +tj.armBack(); +rl.question('Is TJBot\'s arm in the BACKWARD position? Y/N > ', (answer) => { + assert(answer.toLowerCase() == 'y', 'expected arm to be in backward position, please check servo wiring.'); +}); + +tj.raiseArm(); +rl.question('Is TJBot\'s arm in the RAISED position? Y/N > ', (answer) => { + assert(answer.toLowerCase() == 'y', 'expected arm to be in raised position, please check servo wiring.'); +}); + +tj.lowerArm(); +rl.question('Is TJBot\'s arm in the LOWERED position? Y/N > ', (answer) => { + assert(answer.toLowerCase() == 'y', 'expected arm to be in lowered position, please check servo wiring.'); +}); + +tj.wave(); +rl.question('Did TJBot wave? Y/N > ', (answer) => { + assert(answer.toLowerCase() == 'y', 'expected tj to wave, please check servo wiring.'); +}); + +rl.close(); diff --git a/bootstrap/tests/test.speaker.js b/bootstrap/tests/test.speaker.js new file mode 100644 index 00000000..1070a0b2 --- /dev/null +++ b/bootstrap/tests/test.speaker.js @@ -0,0 +1,38 @@ +/** + * Copyright 2016 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const readline = require('readline'); +const assert = require('assert'); + +const TJBot = require('tjbot'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +var tj = new TJBot(['speaker'], {}, {}); + +var sound = '/usr/share/sounds/alsa/Front_Center.wav'; +tj.play(sound).then(function() { + rl.question('Did you hear the words "Front Center"? Y/N', (answer) => { + assert(answer.toLowerCase() == 'y', 'expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); + }); +}); + +rl.close(); From f07781a00ef2e6d2447eda74d0d6512bf0f04d55 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 16:10:21 -0400 Subject: [PATCH 20/31] added test description --- bootstrap/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/bootstrap/README.md b/bootstrap/README.md index 2108f952..bcef1897 100644 --- a/bootstrap/README.md +++ b/bootstrap/README.md @@ -53,3 +53,15 @@ If you have plugged in your speaker via the headphone jack, you may experience i cd ~/Desktop/tjbot/recipes/intro npm install sudo node intro.js + +## Hardware Tests +Hardware tests are included with bootstrap to ensure the TJBot hardware is set up correctly. Tests are included for the `camera`, `led`, `servo`, and `speaker`. + +Tests can be run in the following manner. + +``` +$ sudo node test/test.camera.js +$ sudo node test/test.led.js +$ sudo node test/test.servo.js +$ sudo node test/test.speaker.js +``` From d1cb0648fa983b429ded6ea1cab3c120fece0c41 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 16:12:07 -0400 Subject: [PATCH 21/31] need to run npm install before running tests --- bootstrap/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/bootstrap/README.md b/bootstrap/README.md index bcef1897..e44c972b 100644 --- a/bootstrap/README.md +++ b/bootstrap/README.md @@ -60,6 +60,7 @@ Hardware tests are included with bootstrap to ensure the TJBot hardware is set u Tests can be run in the following manner. ``` +$ npm install $ sudo node test/test.camera.js $ sudo node test/test.led.js $ sudo node test/test.servo.js From 87243c0a015f7cc04b18e4748b6501c9c26a38a4 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 16:28:53 -0400 Subject: [PATCH 22/31] fixed up interactive prompts to use readline-sync --- bootstrap/tests/package.json | 28 ++++++++++++++++++++++++++++ bootstrap/tests/test.camera.js | 2 +- bootstrap/tests/test.led.js | 8 +------- bootstrap/tests/test.servo.js | 9 +-------- bootstrap/tests/test.speaker.js | 9 +-------- 5 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 bootstrap/tests/package.json diff --git a/bootstrap/tests/package.json b/bootstrap/tests/package.json new file mode 100644 index 00000000..9d470534 --- /dev/null +++ b/bootstrap/tests/package.json @@ -0,0 +1,28 @@ +{ + "name": "tests", + "description": "TJBot hardware tests", + "version": "1.0.0", + "author": "Justin Weisz ", + "bugs": { + "url": "https://github.com/ibmtjbot/tjbot/issues" + }, + "dependencies": { + "assert": "^1.4.1", + "readline-sync": "^1.4.7", + "tjbot": "0.0.10" + }, + "devDependencies": {}, + "homepage": "https://github.com/ibmtjbot/tjbot#readme", + "keywords": [ + "TJBot" + ], + "license": "Apache-2.0", + "main": "test.led.js", + "repository": { + "type": "git", + "url": "git+https://github.com/ibmtjbot/tjbot.git" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + } +} diff --git a/bootstrap/tests/test.camera.js b/bootstrap/tests/test.camera.js index 297c5467..d7d31f15 100644 --- a/bootstrap/tests/test.camera.js +++ b/bootstrap/tests/test.camera.js @@ -23,7 +23,7 @@ const TJBot = require('tjbot'); var tj = new TJBot(['camera'], {}, {}); -tj._captureImage('picture.jpg', function(data) { +tj._captureImage('picture.jpg').then(function(data) { assert(fs.existsSync('picture.jpg'), "expected picture.jpg to have been created"); fs.unlink('picture.jpg'); assert(!fs.existsSync('picture.jpg'), "expected to have deleted picture.jpg"); diff --git a/bootstrap/tests/test.led.js b/bootstrap/tests/test.led.js index 886405c8..55780367 100644 --- a/bootstrap/tests/test.led.js +++ b/bootstrap/tests/test.led.js @@ -16,16 +16,11 @@ 'use strict'; -const readline = require('readline'); +const rl = require('readline-sync'); const assert = require('assert'); const TJBot = require('tjbot'); -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - var tj = new TJBot(['led'], {}, {}); var colors = ['red', 'green', 'blue', 'orange', 'off']; @@ -37,4 +32,3 @@ colors.forEach(function(color) { }); tj.shine('off'); -rl.close(); diff --git a/bootstrap/tests/test.servo.js b/bootstrap/tests/test.servo.js index d242025e..5e37d64f 100644 --- a/bootstrap/tests/test.servo.js +++ b/bootstrap/tests/test.servo.js @@ -16,16 +16,11 @@ 'use strict'; -const readline = require('readline'); +const rl = require('readline-sync'); const assert = require('assert'); const TJBot = require('tjbot'); -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - var tj = new TJBot(['servo'], {}, {}); tj.armBack(); @@ -47,5 +42,3 @@ tj.wave(); rl.question('Did TJBot wave? Y/N > ', (answer) => { assert(answer.toLowerCase() == 'y', 'expected tj to wave, please check servo wiring.'); }); - -rl.close(); diff --git a/bootstrap/tests/test.speaker.js b/bootstrap/tests/test.speaker.js index 1070a0b2..b2b5cad9 100644 --- a/bootstrap/tests/test.speaker.js +++ b/bootstrap/tests/test.speaker.js @@ -16,16 +16,11 @@ 'use strict'; -const readline = require('readline'); +const rl = require('readline-sync'); const assert = require('assert'); const TJBot = require('tjbot'); -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - var tj = new TJBot(['speaker'], {}, {}); var sound = '/usr/share/sounds/alsa/Front_Center.wav'; @@ -34,5 +29,3 @@ tj.play(sound).then(function() { assert(answer.toLowerCase() == 'y', 'expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); }); }); - -rl.close(); From c947c4cf2444a53208b4cdd251d05d586f3cf642 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 16:40:24 -0400 Subject: [PATCH 23/31] fixup --- bootstrap/tests/test.camera.js | 4 +++- bootstrap/tests/test.led.js | 2 -- bootstrap/tests/test.speaker.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bootstrap/tests/test.camera.js b/bootstrap/tests/test.camera.js index d7d31f15..7557235f 100644 --- a/bootstrap/tests/test.camera.js +++ b/bootstrap/tests/test.camera.js @@ -25,6 +25,8 @@ var tj = new TJBot(['camera'], {}, {}); tj._captureImage('picture.jpg').then(function(data) { assert(fs.existsSync('picture.jpg'), "expected picture.jpg to have been created"); - fs.unlink('picture.jpg'); + if (fs.existsSync('picture.jpg')) { + fs.unlink('picture.jpg'); + } assert(!fs.existsSync('picture.jpg'), "expected to have deleted picture.jpg"); }); diff --git a/bootstrap/tests/test.led.js b/bootstrap/tests/test.led.js index 55780367..910351a5 100644 --- a/bootstrap/tests/test.led.js +++ b/bootstrap/tests/test.led.js @@ -30,5 +30,3 @@ colors.forEach(function(color) { assert(answer.toLowerCase() == 'y', 'expected the LED to turn ' + color + ', please check your LED wiring.'); }); }); - -tj.shine('off'); diff --git a/bootstrap/tests/test.speaker.js b/bootstrap/tests/test.speaker.js index b2b5cad9..146fa19c 100644 --- a/bootstrap/tests/test.speaker.js +++ b/bootstrap/tests/test.speaker.js @@ -25,7 +25,7 @@ var tj = new TJBot(['speaker'], {}, {}); var sound = '/usr/share/sounds/alsa/Front_Center.wav'; tj.play(sound).then(function() { - rl.question('Did you hear the words "Front Center"? Y/N', (answer) => { + rl.question('Did you hear the words "Front Center"? Y/N > ', (answer) => { assert(answer.toLowerCase() == 'y', 'expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); }); }); From 7362d481777ff4d4a3daf8a7304d1e201f0b9339 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 16:53:48 -0400 Subject: [PATCH 24/31] fixing assert usage --- bootstrap/tests/test.camera.js | 4 ++-- bootstrap/tests/test.led.js | 2 +- bootstrap/tests/test.servo.js | 8 ++++---- bootstrap/tests/test.speaker.js | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bootstrap/tests/test.camera.js b/bootstrap/tests/test.camera.js index 7557235f..562cf6ca 100644 --- a/bootstrap/tests/test.camera.js +++ b/bootstrap/tests/test.camera.js @@ -24,9 +24,9 @@ const TJBot = require('tjbot'); var tj = new TJBot(['camera'], {}, {}); tj._captureImage('picture.jpg').then(function(data) { - assert(fs.existsSync('picture.jpg'), "expected picture.jpg to have been created"); + assert.ok(fs.existsSync('picture.jpg'), "expected picture.jpg to have been created"); if (fs.existsSync('picture.jpg')) { fs.unlink('picture.jpg'); } - assert(!fs.existsSync('picture.jpg'), "expected to have deleted picture.jpg"); + assert.equal(fs.existsSync('picture.jpg'), false, "expected to have deleted picture.jpg"); }); diff --git a/bootstrap/tests/test.led.js b/bootstrap/tests/test.led.js index 910351a5..1542afb3 100644 --- a/bootstrap/tests/test.led.js +++ b/bootstrap/tests/test.led.js @@ -27,6 +27,6 @@ var colors = ['red', 'green', 'blue', 'orange', 'off']; colors.forEach(function(color) { tj.shine(color); rl.question('Did the LED turn ' + color + '? Y/N > ', (answer) => { - assert(answer.toLowerCase() == 'y', 'expected the LED to turn ' + color + ', please check your LED wiring.'); + assert.equal(answer.toLowerCase(), 'y', 'expected the LED to turn ' + color + ', please check your LED wiring.'); }); }); diff --git a/bootstrap/tests/test.servo.js b/bootstrap/tests/test.servo.js index 5e37d64f..2dd74d0b 100644 --- a/bootstrap/tests/test.servo.js +++ b/bootstrap/tests/test.servo.js @@ -25,20 +25,20 @@ var tj = new TJBot(['servo'], {}, {}); tj.armBack(); rl.question('Is TJBot\'s arm in the BACKWARD position? Y/N > ', (answer) => { - assert(answer.toLowerCase() == 'y', 'expected arm to be in backward position, please check servo wiring.'); + assert.equal(answer.toLowerCase(), 'y', 'expected arm to be in backward position, please check servo wiring.'); }); tj.raiseArm(); rl.question('Is TJBot\'s arm in the RAISED position? Y/N > ', (answer) => { - assert(answer.toLowerCase() == 'y', 'expected arm to be in raised position, please check servo wiring.'); + assert.equal(answer.toLowerCase(), 'y', 'expected arm to be in raised position, please check servo wiring.'); }); tj.lowerArm(); rl.question('Is TJBot\'s arm in the LOWERED position? Y/N > ', (answer) => { - assert(answer.toLowerCase() == 'y', 'expected arm to be in lowered position, please check servo wiring.'); + assert.equal(answer.toLowerCase(), 'y', 'expected arm to be in lowered position, please check servo wiring.'); }); tj.wave(); rl.question('Did TJBot wave? Y/N > ', (answer) => { - assert(answer.toLowerCase() == 'y', 'expected tj to wave, please check servo wiring.'); + assert.equal(answer.toLowerCase(), 'y', 'expected tj to wave, please check servo wiring.'); }); diff --git a/bootstrap/tests/test.speaker.js b/bootstrap/tests/test.speaker.js index 146fa19c..6d38521d 100644 --- a/bootstrap/tests/test.speaker.js +++ b/bootstrap/tests/test.speaker.js @@ -26,6 +26,6 @@ var tj = new TJBot(['speaker'], {}, {}); var sound = '/usr/share/sounds/alsa/Front_Center.wav'; tj.play(sound).then(function() { rl.question('Did you hear the words "Front Center"? Y/N > ', (answer) => { - assert(answer.toLowerCase() == 'y', 'expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); + assert.equal(answer.toLowerCase(), 'y', 'expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); }); }); From ec1619292fe23054153fbcca88a553f21c3a3b5a Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 17:04:37 -0400 Subject: [PATCH 25/31] =?UTF-8?q?assert=20doesn=E2=80=99t=20seem=20to=20be?= =?UTF-8?q?=20asserting,=20so=20i=E2=80=99m=20going=20to=20throw=20the=20e?= =?UTF-8?q?rror=20myself?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bootstrap/tests/test.camera.js | 11 +++++++---- bootstrap/tests/test.led.js | 5 +++-- bootstrap/tests/test.servo.js | 17 ++++++++++++----- bootstrap/tests/test.speaker.js | 5 +++-- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/bootstrap/tests/test.camera.js b/bootstrap/tests/test.camera.js index 562cf6ca..d0c807e2 100644 --- a/bootstrap/tests/test.camera.js +++ b/bootstrap/tests/test.camera.js @@ -13,20 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + 'use strict'; const fs = require('fs'); -const assert = require('assert'); const TJBot = require('tjbot'); var tj = new TJBot(['camera'], {}, {}); tj._captureImage('picture.jpg').then(function(data) { - assert.ok(fs.existsSync('picture.jpg'), "expected picture.jpg to have been created"); + if (!fs.existsSync('picture.jpg')) { + throw new Error("expected picture.jpg to have been created"); + } if (fs.existsSync('picture.jpg')) { fs.unlink('picture.jpg'); } - assert.equal(fs.existsSync('picture.jpg'), false, "expected to have deleted picture.jpg"); + if (fs.existsSync('picture.jpg')) { + throw new Error("expected to have deleted picture.jpg"); + } }); diff --git a/bootstrap/tests/test.led.js b/bootstrap/tests/test.led.js index 1542afb3..9d5e48cf 100644 --- a/bootstrap/tests/test.led.js +++ b/bootstrap/tests/test.led.js @@ -17,7 +17,6 @@ 'use strict'; const rl = require('readline-sync'); -const assert = require('assert'); const TJBot = require('tjbot'); @@ -27,6 +26,8 @@ var colors = ['red', 'green', 'blue', 'orange', 'off']; colors.forEach(function(color) { tj.shine(color); rl.question('Did the LED turn ' + color + '? Y/N > ', (answer) => { - assert.equal(answer.toLowerCase(), 'y', 'expected the LED to turn ' + color + ', please check your LED wiring.'); + if (answer.toLowerCase() != 'y') { + throw new Error('expected the LED to turn ' + color + ', please check your LED wiring.'); + } }); }); diff --git a/bootstrap/tests/test.servo.js b/bootstrap/tests/test.servo.js index 2dd74d0b..9293826f 100644 --- a/bootstrap/tests/test.servo.js +++ b/bootstrap/tests/test.servo.js @@ -17,7 +17,6 @@ 'use strict'; const rl = require('readline-sync'); -const assert = require('assert'); const TJBot = require('tjbot'); @@ -25,20 +24,28 @@ var tj = new TJBot(['servo'], {}, {}); tj.armBack(); rl.question('Is TJBot\'s arm in the BACKWARD position? Y/N > ', (answer) => { - assert.equal(answer.toLowerCase(), 'y', 'expected arm to be in backward position, please check servo wiring.'); + if (answer.toLowerCase() != 'y') { + throw new Error('expected arm to be in backward position, please check servo wiring.'); + } }); tj.raiseArm(); rl.question('Is TJBot\'s arm in the RAISED position? Y/N > ', (answer) => { - assert.equal(answer.toLowerCase(), 'y', 'expected arm to be in raised position, please check servo wiring.'); + if (answer.toLowerCase() != 'y') { + throw new Error('expected arm to be in raised position, please check servo wiring.'); + } }); tj.lowerArm(); rl.question('Is TJBot\'s arm in the LOWERED position? Y/N > ', (answer) => { - assert.equal(answer.toLowerCase(), 'y', 'expected arm to be in lowered position, please check servo wiring.'); + if (answer.toLowerCase() != 'y') { + throw new Error('expected arm to be in lowered position, please check servo wiring.'); + } }); tj.wave(); rl.question('Did TJBot wave? Y/N > ', (answer) => { - assert.equal(answer.toLowerCase(), 'y', 'expected tj to wave, please check servo wiring.'); + if (answer.toLowerCase() != 'y') { + throw new Error('expected tj to wave, please check servo wiring.'); + } }); diff --git a/bootstrap/tests/test.speaker.js b/bootstrap/tests/test.speaker.js index 6d38521d..62ddf6c1 100644 --- a/bootstrap/tests/test.speaker.js +++ b/bootstrap/tests/test.speaker.js @@ -17,7 +17,6 @@ 'use strict'; const rl = require('readline-sync'); -const assert = require('assert'); const TJBot = require('tjbot'); @@ -26,6 +25,8 @@ var tj = new TJBot(['speaker'], {}, {}); var sound = '/usr/share/sounds/alsa/Front_Center.wav'; tj.play(sound).then(function() { rl.question('Did you hear the words "Front Center"? Y/N > ', (answer) => { - assert.equal(answer.toLowerCase(), 'y', 'expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); + if (answer.toLowerCase() != 'y') { + throw new Error('expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); + } }); }); From ef19e53ef028fcb448b65d2b7e17665b135b2603 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 17:11:09 -0400 Subject: [PATCH 26/31] using readline correctly --- bootstrap/tests/test.led.js | 9 ++++----- bootstrap/tests/test.servo.js | 36 +++++++++++++++------------------ bootstrap/tests/test.speaker.js | 9 ++++----- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/bootstrap/tests/test.led.js b/bootstrap/tests/test.led.js index 9d5e48cf..aec11969 100644 --- a/bootstrap/tests/test.led.js +++ b/bootstrap/tests/test.led.js @@ -25,9 +25,8 @@ var colors = ['red', 'green', 'blue', 'orange', 'off']; colors.forEach(function(color) { tj.shine(color); - rl.question('Did the LED turn ' + color + '? Y/N > ', (answer) => { - if (answer.toLowerCase() != 'y') { - throw new Error('expected the LED to turn ' + color + ', please check your LED wiring.'); - } - }); + var answer = rl.question('Did the LED turn ' + color + '? Y/N > '); + if (answer.toLowerCase() != 'y') { + throw new Error('expected the LED to turn ' + color + ', please check your LED wiring.'); + } }); diff --git a/bootstrap/tests/test.servo.js b/bootstrap/tests/test.servo.js index 9293826f..215fb361 100644 --- a/bootstrap/tests/test.servo.js +++ b/bootstrap/tests/test.servo.js @@ -23,29 +23,25 @@ const TJBot = require('tjbot'); var tj = new TJBot(['servo'], {}, {}); tj.armBack(); -rl.question('Is TJBot\'s arm in the BACKWARD position? Y/N > ', (answer) => { - if (answer.toLowerCase() != 'y') { - throw new Error('expected arm to be in backward position, please check servo wiring.'); - } -}); +var answer = rl.question('Is TJBot\'s arm in the BACKWARD position? Y/N > '); +if (answer.toLowerCase() != 'y') { + throw new Error('expected arm to be in backward position, please check servo wiring.'); +} tj.raiseArm(); -rl.question('Is TJBot\'s arm in the RAISED position? Y/N > ', (answer) => { - if (answer.toLowerCase() != 'y') { - throw new Error('expected arm to be in raised position, please check servo wiring.'); - } -}); +answer = rl.question('Is TJBot\'s arm in the RAISED position? Y/N > '); +if (answer.toLowerCase() != 'y') { + throw new Error('expected arm to be in raised position, please check servo wiring.'); +} tj.lowerArm(); -rl.question('Is TJBot\'s arm in the LOWERED position? Y/N > ', (answer) => { - if (answer.toLowerCase() != 'y') { - throw new Error('expected arm to be in lowered position, please check servo wiring.'); - } -}); +answer = rl.question('Is TJBot\'s arm in the LOWERED position? Y/N > '); +if (answer.toLowerCase() != 'y') { + throw new Error('expected arm to be in lowered position, please check servo wiring.'); +} tj.wave(); -rl.question('Did TJBot wave? Y/N > ', (answer) => { - if (answer.toLowerCase() != 'y') { - throw new Error('expected tj to wave, please check servo wiring.'); - } -}); +answer = rl.question('Did TJBot wave? Y/N > '); +if (answer.toLowerCase() != 'y') { + throw new Error('expected tj to wave, please check servo wiring.'); +} diff --git a/bootstrap/tests/test.speaker.js b/bootstrap/tests/test.speaker.js index 62ddf6c1..add7f87a 100644 --- a/bootstrap/tests/test.speaker.js +++ b/bootstrap/tests/test.speaker.js @@ -24,9 +24,8 @@ var tj = new TJBot(['speaker'], {}, {}); var sound = '/usr/share/sounds/alsa/Front_Center.wav'; tj.play(sound).then(function() { - rl.question('Did you hear the words "Front Center"? Y/N > ', (answer) => { - if (answer.toLowerCase() != 'y') { - throw new Error('expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); - } - }); + var answer = rl.question('Did you hear the words "Front Center"? Y/N > '); + if (answer.toLowerCase() != 'y') { + throw new Error('expected audio to play, please check that you speaker is plugged in, turned on, and set as the current audio output device.'); + } }); From 7ec983a995b173040923a9b3a8c729c246128f0c Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 17:36:32 -0400 Subject: [PATCH 27/31] updated to TJBot --- recipes/conversation/workspace-sample.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/conversation/workspace-sample.json b/recipes/conversation/workspace-sample.json index 25474e3b..7a2e51b9 100644 --- a/recipes/conversation/workspace-sample.json +++ b/recipes/conversation/workspace-sample.json @@ -1 +1 @@ -{"name":"TJBot Conversation","created":"2017-01-06T19:37:51.751Z","intents":[{"intent":"introduce-self","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z","examples":[{"text":"introduce yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"please introduce yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"tell me about yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"tell me who you are","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"what are you","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"who are you","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"}],"description":null},{"intent":"tell-joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z","examples":[{"text":"i want to hear a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"make me laugh","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"please tell me a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"tell me a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"tell me something funny","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"}],"description":null}],"updated":"2017-01-06T19:50:51.713Z","entities":[],"language":"en","metadata":null,"description":"Sample conversation for TJBot.","dialog_nodes":[{"go_to":null,"output":{},"parent":null,"context":null,"created":"2017-01-06T19:40:04.560Z","updated":"2017-01-06T19:43:11.206Z","metadata":null,"conditions":"#tell-joke","description":null,"dialog_node":"node_1_1483731604403","previous_sibling":null},{"go_to":null,"output":{"text":{"values":["Hi, I'm TJ Bot!","Hi, my name is TJ Bot!","I'm TJ Bot, it's nice to meet you!","My name is TJ Bot!"],"selection_policy":"random"}},"parent":null,"context":null,"created":"2017-01-06T19:41:56.120Z","updated":"2017-01-06T19:45:53.041Z","metadata":null,"conditions":"#introduce-self","description":null,"dialog_node":"node_2_1483731715954","previous_sibling":"node_1_1483731604403"},{"type":"response_condition","go_to":null,"output":{"text":{"values":["A robot walks into a bar. “What can I get you?” the bartender asks. “I need something to loosen up,” the robot replies. So the bartender serves him a screwdriver.","Why do robots have summer holidays? To recharge their batteries.","Why did the robot cross the road? Because he was programmed to do it.","Why did the robot marry his fiancée? He couldn’t resistor.","Why was the robot bankrupt? He had used all his cache.","I'm sorry, I've run out of jokes. How about you create some new ones for me?"],"selection_policy":"sequential"}},"parent":"node_1_1483731604403","context":null,"created":"2017-01-06T19:43:10.878Z","updated":"2017-01-06T19:50:51.713Z","metadata":null,"conditions":null,"description":null,"dialog_node":"node_4_1483731790477","previous_sibling":null}],"workspace_id":"311640d4-12dd-42e2-99a6-304794077daf","counterexamples":[]} \ No newline at end of file +{"name":"TJBot Conversation","created":"2017-01-06T19:37:51.751Z","intents":[{"intent":"introduce-self","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z","examples":[{"text":"introduce yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"please introduce yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"tell me about yourself","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"tell me who you are","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"what are you","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"},{"text":"who are you","created":"2017-01-06T19:38:41.749Z","updated":"2017-01-06T19:38:41.749Z"}],"description":null},{"intent":"tell-joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z","examples":[{"text":"i want to hear a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"make me laugh","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"please tell me a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"tell me a joke","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"},{"text":"tell me something funny","created":"2017-01-06T19:39:18.670Z","updated":"2017-01-06T19:39:18.670Z"}],"description":null}],"updated":"2017-01-06T19:50:51.713Z","entities":[],"language":"en","metadata":null,"description":"Sample conversation for TJBot.","dialog_nodes":[{"go_to":null,"output":{},"parent":null,"context":null,"created":"2017-01-06T19:40:04.560Z","updated":"2017-01-06T19:43:11.206Z","metadata":null,"conditions":"#tell-joke","description":null,"dialog_node":"node_1_1483731604403","previous_sibling":null},{"go_to":null,"output":{"text":{"values":["Hi, I'm TJBot!","Hi, my name is TJBot!","I'm TJBot, it's nice to meet you!","My name is TJBot!"],"selection_policy":"random"}},"parent":null,"context":null,"created":"2017-01-06T19:41:56.120Z","updated":"2017-01-06T19:45:53.041Z","metadata":null,"conditions":"#introduce-self","description":null,"dialog_node":"node_2_1483731715954","previous_sibling":"node_1_1483731604403"},{"type":"response_condition","go_to":null,"output":{"text":{"values":["A robot walks into a bar. “What can I get you?” the bartender asks. “I need something to loosen up,” the robot replies. So the bartender serves him a screwdriver.","Why do robots have summer holidays? To recharge their batteries.","Why did the robot cross the road? Because he was programmed to do it.","Why did the robot marry his fiancée? He couldn’t resistor.","Why was the robot bankrupt? He had used all his cache.","I'm sorry, I've run out of jokes. How about you create some new ones for me?"],"selection_policy":"sequential"}},"parent":"node_1_1483731604403","context":null,"created":"2017-01-06T19:43:10.878Z","updated":"2017-01-06T19:50:51.713Z","metadata":null,"conditions":null,"description":null,"dialog_node":"node_4_1483731790477","previous_sibling":null}],"workspace_id":"311640d4-12dd-42e2-99a6-304794077daf","counterexamples":[]} From fb88d30dcce7f60568907e36320089e193c315dd Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 17:38:51 -0400 Subject: [PATCH 28/31] removed random color change on script run --- recipes/sentiment_analysis/sentiment.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index 361eef74..fc634534 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -14,7 +14,8 @@ * limitations under the License. */ -var TJBot = require('tjbot'); +var TJBot = require('../../../tjbotlib/lib/tjbot'); +//var TJBot = require('tjbot'); var config = require('./config'); var Twitter = require('twitter'); @@ -46,11 +47,7 @@ var twitter = new Twitter({ console.log("I am monitoring twitter for " + SENTIMENT_KEYWORD); -// flash random colors -for (var i = 0; i < 10; i++) { - tj.shine('random'); - tj.sleep(150); -} +// turn the LED off tj.shine('off'); monitorTwitter(); From 2731be3d85f5d14f9f3d1ac6514648d622107bac Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 17:39:33 -0400 Subject: [PATCH 29/31] changed default keyword to education --- recipes/sentiment_analysis/config.default.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/sentiment_analysis/config.default.js b/recipes/sentiment_analysis/config.default.js index 294aa747..a1e420e8 100644 --- a/recipes/sentiment_analysis/config.default.js +++ b/recipes/sentiment_analysis/config.default.js @@ -1,5 +1,5 @@ // User-specific configuration -exports.sentiment_keyword = "happy"; // keyword to monitor in Twitter +exports.sentiment_keyword = "education"; // keyword to monitor in Twitter exports.sentiment_analysis_frequency_sec = 30; // analyze sentiment every N seconds // Create the credentials object for export From 04d070118dca8f51124fc049cbba1a7d527090ff Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 17:42:39 -0400 Subject: [PATCH 30/31] text to speech isn't needed for this recipe --- recipes/sentiment_analysis/config.default.js | 7 ------- recipes/sentiment_analysis/sentiment.js | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/recipes/sentiment_analysis/config.default.js b/recipes/sentiment_analysis/config.default.js index a1e420e8..b491bc04 100644 --- a/recipes/sentiment_analysis/config.default.js +++ b/recipes/sentiment_analysis/config.default.js @@ -5,13 +5,6 @@ exports.sentiment_analysis_frequency_sec = 30; // analyze sentiment every N seco // Create the credentials object for export exports.credentials = {}; -// Watson Text to Speech -// https://www.ibm.com/watson/developercloud/text-to-speech.html -exports.credentials.text_to_speech = { - password: '', - username: '' -}; - // Watson Tone Analyzer // https://www.ibm.com/watson/developercloud/tone-analyzer.html exports.credentials.tone_analyzer = { diff --git a/recipes/sentiment_analysis/sentiment.js b/recipes/sentiment_analysis/sentiment.js index fc634534..6bf3d773 100644 --- a/recipes/sentiment_analysis/sentiment.js +++ b/recipes/sentiment_analysis/sentiment.js @@ -45,7 +45,7 @@ var twitter = new Twitter({ access_token_secret: credentials.twitter.access_token_secret }); -console.log("I am monitoring twitter for " + SENTIMENT_KEYWORD); +console.log("I am monitoring twitter for " + SENTIMENT_KEYWORD + ". It may take a few moments to collect enough tweets to analyze."); // turn the LED off tj.shine('off'); From a3e75b840cb17527adcfb14ba3cfcacb759edd71 Mon Sep 17 00:00:00 2001 From: Justin Weisz Date: Thu, 23 Mar 2017 17:58:12 -0400 Subject: [PATCH 31/31] removed assert lib, not used --- bootstrap/tests/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/bootstrap/tests/package.json b/bootstrap/tests/package.json index 9d470534..05db1f6f 100644 --- a/bootstrap/tests/package.json +++ b/bootstrap/tests/package.json @@ -7,7 +7,6 @@ "url": "https://github.com/ibmtjbot/tjbot/issues" }, "dependencies": { - "assert": "^1.4.1", "readline-sync": "^1.4.7", "tjbot": "0.0.10" },