Monday, February 22, 2010

Linux Voice Recognition and Speech Home Automation

Here is a video I made for the Syno contest:



Please read more!!


I was able to successfully cross-compile and run Julius Voice Recognition Engine on my Synology DS209.
http://julius.sourceforge.jp/en_index.php
http://voxforge.org/home/downloads#QuickStart%20Anchor

I am working on trying to compile Festival w/ MBROLA engine in place of Flite for better TTS voices. I am also looking at Cepstral and AT&T Natural Voices.
http://www.cstr.ed.ac.uk/projects/festival/
http://tcts.fpms.ac.be/synthesis/mbrola.html
http://cepstral.com/
http://www.voiceforge.com/demo/
http://www2.research.att.com/~ttsweb/tts/demo.php


Another good program to look at would be DomotiGa + Gambas for linux HA.
http://www.domotiga.nl/

Flite TTS on a Synology NAS

I was able to successfully cross compile a text-to-speech engine called Flite which is very lightweight to run on my DS209j. This means you can use HEYU or Misterhouse to output speech upon an event.

http://www.speech.cs.cmu.edu/flite/

Here is my config file generated from running configure:


root@xubuntu-vm:/usr/local/flite-1.3-release# cat config/config
# -*- makefile -*-
#
# This file is automatically generated by configure.
# Do not hand edit.

TARGET_OS    = linux-gnu
TARGET_CPU   = powerpc
HOST_OS    = linux-gnu
HOST_CPU   = powerpc

CC       = /usr/local/powerpc-linux/bin/powerpc-linux-gcc
CFLAGS   = -I/usr/local/powerpc-linux/include -Wall
CPPFLAGS = 
DEFS     = -DWORDS_BIGENDIAN=1
#DEFS     = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DWORDS_BIGENDIAN=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1   # we don't use these anywhere
SHFLAGS  = 

AR       = /usr/local/powerpc-linux/bin/powerpc-linux-ar
RANLIB   = /usr/local/powerpc-linux/bin/powerpc-linux-ranlib
INSTALL  = /usr/bin/install -c

M68KCC   = 

AUDIODRIVER = oss
AUDIODEFS   = -DCST_AUDIO_LINUX
AUDIOLIBS   = 

LEXDEFS = 
VOXDEFS = 

OTHERLIBS = 

MMAPTYPE    = posix
STDIOTYPE   = stdio

FL_LANG  = usenglish
FL_VOX   = cmu_us_kal16
FL_LEX   = cmulex

prefix        = /usr/local
exec_prefix   = ${prefix}
EXEEXT       = 
INSTALLBINDIR = ${exec_prefix}/bin
INSTALLLIBDIR = ${exec_prefix}/lib
INSTALLINCDIR = ${prefix}/include/flite

Misterhouse on Synology NAS

Misterhouse:
http://misterhouse.sourceforge.net/

I've confirmed that misterhouse does work with /dev/usb/ttyUSB0.

I recommend unzipping Misterhouse in /usr/local

DiskStation> cd /usr/local
DiskStation> gunzip < /volume1/Downloads/misterhouse-2.105.tar.gz | tar xvf -
Make sure you run the configure which uses h2ph. h2ph is just a perl script, but you have to make sure you download the your systems GPL source from Synology and change one line in the Misterhouse configure script:
#cd /usr/include
cd /usr/local/powerpc-linux/include 
When you run the script it will remove all Windows files and will use the C header files to produce Perl header files ending in .ph Follow this: http://misterhouse.sourceforge.net/install.html#quick_install_instructions and this: http://misterhouse.sourceforge.net/install.html#unix_detailed_install_instructions In /usr/local/mh/bin create a file called mh.private.ini and add these basic entries:
sound_program=
latitude=12.345678
longitude=-123.456789
time_zone=-8
city=YourCity
zone=SomeMajorCityNearYou
state=YourStateAbbreviation
zip_code= 12345
dbi_user=mhuser
dbi_password=SomePassword
voice_text=
cm11_port=/dev/ttyUSB0
tk=0
Now when you start Misterhouse do something like this to run it in the background and have its output go to some logfile:
DiskStation> cd /usr/local/mh/bin
DiskStation> ./mhl & > /var/log/mh.out
Now you should be able to go to http://192.168.x.x:8080 and access Misterhouse. Please read the Misterhosue docs from here...

CM11a, Heyu, and domus.Link running on Synology NAS

I have an old HD11a which is just a re-branded CM11a, and I verified that it does work through the usb/serial converter I have.

Using optware ipkg (ipkg is a must!) I was able to install HEYU. They also have one called Ppower or Penguin Power, which I assume would also work:


DiskStation> ipkg list | grep "home automation"
heyu - 2.8.0-1 - X10 home automation control using the CM11A
ppower - 0.1.5-1 - Ppower, short for 'Penguin Power', is a piece of software for controlling x10 home automation equipment connected to the comput



domus.Link PHP frontend for HEYU


I wasn't too excited about cgi/perl scripts, but I found what I think is one of the only PHP front ends which runs perfectly on the Syno after slight tweaking of the php.ini file.

domus.Link
http://domus.link.co.pt/

I was even able to create a 3rd-Party applications node for it to run embedded in the web manager.
DiskStation> pwd
/usr/syno/synoman/webman/3rdparty
DiskStation> ls -laR domusLink/
domusLink/:
drwxr-xr-x    2 root     root         4096 Dec 23 00:53 .
drwxr-xr-x    3 root     root         4096 Dec 23 00:33 ..
-rw-r--r--    1 root     root          198 Dec 23 01:01 application.cfg
lrwxrwxrwx    1 root     root           44 Dec 23 00:53 images -> /volume1/web/domus.Link/theme/default/images

DiskStation> cat application.cfg 
text_enu = domus.Link
description_enu = domus.Link - Home Automation Interface
type = embedded
protocol = https
port = 443 
path = /domus.Link
icon_16 = images/menu_home_on.png
icon_32 = images/menu_home_on.png


Cross-Compiling Bottlerocket for CM17a Firecracker on Synology

Cross-Compiling Bottlerocket, which uses the Firecracker CM17a:
http://www.linuxha.com/bottlerocket/

Following the 3rd-party app integration guide; configure, make, make install. This puts it in your local machines /usr/local/bin. You then have to upload the program 'br' to your Synology in the same directory.

Set your cross-compiling environment variables to point to the toolchain you installed in /usr/local:
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export CC=/usr/local/powerpc-linux/bin/powerpc-linux-gcc
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export LD=/usr/local/powerpc-linux/bin/powerpc-linux-ld
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export RANLIB=/usr/local/powerpc-linux/bin/powerpc-linux-ranlib
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export CFLAGS="-I/usr/local/powerpc-linux/include"
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export LDFLAGS="-L/usr/local/powerpc-linux/lib"

Run the configure that came with the code giving it a few extra parameters as specified in the guide:
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# ./configure \
> --host=powerpc-unknown-linux \
> --target=powerpc-unknown-linux \
> --build=i686-pc-linux \
> --prefix=/usr/local
creating cache ./config.cache
checking for gcc... /usr/local/powerpc-linux/bin/powerpc-linux-gcc
checking whether the C compiler (/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -L/usr/local/powerpc-linux/lib) works... yes
checking whether the C compiler (/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -L/usr/local/powerpc-linux/lib) is a cross-compiler... yes
checking whether we are using GNU C... yes
checking whether /usr/local/powerpc-linux/bin/powerpc-linux-gcc accepts -g... yes
checking how to run the C preprocessor... /usr/local/powerpc-linux/bin/powerpc-linux-gcc -E
checking for a BSD compatible install... /usr/bin/install -c
checking for features.h... yes
checking for errno.h... yes
checking for sys/termios.h... yes
checking for termios.h... yes
guessing x10 port
using /dev/ttyS0 for x10 port
updating cache ./config.cache
creating ./config.status
creating Makefile
creating config.h

Run make:
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# make
/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -I. -Wall  -O2 -DX10_PORTNAME=\"/dev/ttyS0\" -DHAVE_CONFIG_H -c ./br_cmd.c
/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -I. -Wall  -O2 -DX10_PORTNAME=\"/dev/ttyS0\" -DHAVE_CONFIG_H -c ./br.c
/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -I. -Wall  -O2 -DX10_PORTNAME=\"/dev/ttyS0\" -DHAVE_CONFIG_H -o br br.o br_cmd.o

Run 'make install' which installs it in /usr/local/bin on your local machine:
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# make install
/usr/bin/install -c -d -m 755 /usr/local/bin
/usr/bin/install -c -m 555 br /usr/local/bin

Now copy the file /usr/local/bin/br to your synology in the same directory.


Once that is running, you issue commands as such:
DiskStation> cd /usr/local/bin/
DiskStation> ./br
BottleRocket version 0.04c

Usage: ./br [][()  ...]

  Options:
  -v, --verbose   add v's to increase verbosity
  -x, --port=PORT  set port to use
  -c, --house=[A-P]  use alternate house code (default "A")
  -n, --on=LIST   turn on devices in LIST
  -f, --off=LIST  turn off devices in LIST
  -N, --ON   turn on all devices in housecode
  -F, --OFF   turn off all devices in housecode
  -d, --dim=LEVEL[,LIST] dim devices in housecode to  relative LEVEL
  -B, --lamps_on  turn all lamps in housecode on
  -D, --lamps_off  turn all lamps in housecode off
  -r, --repeat=NUM  repeat commands NUM times (0 = ~ forever)
  -h, --help   this help

  is a comma separated list of devices (no spaces),
  each ranging from 1 to 16
 is an integer from -12 to 12 (0 means no change)
 is a letter between A and P
 is one of ON, OFF, DIM, BRIGHT, ALL_ON, ALL_OFF,
  LAMPS_ON or LAMPS_OFF

For native commands,  should only be specified for ON or OFF.

DiskStation> ./br -x /dev/ttyUSB0 -v M3 OFF
./br:  Turning off appliance M3
DiskStation> ./br -x /dev/ttyUSB0 -v M3 ON 
./br:  Turning on appliance M3
DiskStation> ./br -x /dev/ttyUSB0 -v M3 OFF
./br:  Turning off appliance M3
DiskStation> ./br -x /dev/ttyUSB0 -v C1 ON 
./br:  Turning on appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v C1 OFF
./br:  Turning off appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v C1 ON 
./br:  Turning on appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v C3 ON
./br:  Turning on appliance C3
DiskStation> ./br -x /dev/ttyUSB0 -v C3 OFF
./br:  Turning off appliance C3
DiskStation> ./br -x /dev/ttyUSB0 -v C3 ON 
./br:  Turning on appliance C3
DiskStation> ./br -x /dev/ttyUSB0 -v C1 OFF
./br:  Turning off appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v C3 OFF
./br:  Turning off appliance C3
DiskStation> ./br -x /dev/ttyUSB0 -v C LAMPS_ON
DiskStation> ./br -x /dev/ttyUSB0 -v C LAMPS_OFF
DiskStation> ./br -x /dev/ttyUSB0 -v C1 ON      
./br:  Turning on appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v -d25 C1   
./br:  For dimming either specify just a dim level or a comma
separated list containing the dim level and the devices to dim.
./br:  Valid dimlevels are numbers between -12 and 12.
DiskStation> ./br -x /dev/ttyUSB0 -v -d6 C1 
BottleRocket version 0.04c

Usage: ./br [][()  ...]

  Options:
  -v, --verbose   add v's to increase verbosity
  -x, --port=PORT  set port to use
  -c, --house=[A-P]  use alternate house code (default "A")
  -n, --on=LIST   turn on devices in LIST
  -f, --off=LIST  turn off devices in LIST
  -N, --ON   turn on all devices in housecode
  -F, --OFF   turn off all devices in housecode
  -d, --dim=LEVEL[,LIST] dim devices in housecode to  relative LEVEL
  -B, --lamps_on  turn all lamps in housecode on
  -D, --lamps_off  turn all lamps in housecode off
  -r, --repeat=NUM  repeat commands NUM times (0 = ~ forever)
  -h, --help   this help

  is a comma separated list of devices (no spaces),
  each ranging from 1 to 16
 is an integer from -12 to 12 (0 means no change)
 is a letter between A and P
 is one of ON, OFF, DIM, BRIGHT, ALL_ON, ALL_OFF,
  LAMPS_ON or LAMPS_OFF

For native commands,  should only be specified for ON or OFF.

DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d6,1
./br:  Brightening lamp C1 by 6.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d-6,1
./br:  Dimming lamp C1 by 6.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d6,3 
./br:  Brightening lamp C3 by 6.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d-3,3
./br:  Dimming lamp C3 by 3.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d-3,3
./br:  Dimming lamp C3 by 3.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d-3,2
./br:  Dimming lamp C2 by 3.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d3,2 
./br:  Brightening lamp C2 by 3.
DiskStation> ./br -x /dev/ttyUSB0 -v C LAMPS_OFF

Home Automation on Synology NAS

I am the proud owner of a Synology DS209j NAS. This NAS has firmware that allows much more than just storage. While I only wanted one computer on 2/47 in the house. I also wanted a home automation server. Unfortunately, the Synology NAS devices weren't intended to be home automation servers. Therefore, a lot of modification has been required to get it to act as a home automation server. These next few posts have been up in the Synology forum for a while now, but I wanted to add my work to my own blog so please click 'read more' to expand this post...


http://forum.synology.com/enu/viewtopic.php?f=27&t=19788#p81040

I have a Synology DS209j, and I'll always run the latest firmware.

I've installed Xubuntu 9.04 in a virtual machine on my mac.

Following this page:
http://www.synology.com/us/support/3rd-party_application_integration.php

There is a document:
http://download.synology.com/download/ds/userguide/Synology%20NAS%20Server%203rd-Party%20Apps%20Integration%20Guide.pdf

Following the document I've downloaded the latest toolchain from Synology as well as the latest GPL source:
http://www.synology.com/us/gpl/index.php

As far as usb to serial hardware goes, I am using this product from Parallax as it give you proper RS232 levels and is very affordable:
http://www.parallax.com/tabid/768/ProductID/378/Default.aspx

From that page I followed the link to the external FTDI drivers for linux.

I renamed the ftdi_sio header and c file to .orig and placed these new files in their location in the synology source. From their I followed the document and made the modules.



Now i've got usbserial.ko and ftdi_sio.ko somewhere on my DS209j

Now you have to load the modules into the kernel and create the devices:
insmod usbserial.ko
insmod ftdi.ko
mknod /dev/usb/ttyUSB0 c 188 0
mknod /dev/usb/ttyUSB1 c 188 1

Also, add some lines like these to /etc/rc.local to make it persistent over reboot:
insmod /volume1/archive/usbserial.ko
insmod /volume1/archive/ftdi_sio.ko
mknod /dev/usb/ttyUSB0 c 188 0
mknod /dev/usb/ttyUSB1 c 188 1

run the command 'dmesg' and you should see something like this:
usb 1-2.1: new full speed USB device using ehci_hcd and address 15
usb 1-2.1: configuration #1 chosen from 1 choice
ftdi_sio 1-2.1:1.0: FTDI USB Serial Device converter detected
drivers/usb/serial/ftdi_sio.c: Detected FT232RL
drivers/usb/serial/ftdi_sio.c: Number of endpoints 2
drivers/usb/serial/ftdi_sio.c: Endpoint 1 MaxPacketSize 16384
drivers/usb/serial/ftdi_sio.c: Endpoint 2 MaxPacketSize 16384
drivers/usb/serial/ftdi_sio.c: Setting MaxPacketSize 16384
usb 1-2.1: FTDI USB Serial Device converter now attached to ttyUSB0

The X-10 device I got working for now is known as the Firecracker CM17a, and the HD11A/CM11A 2-way computer interface