summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgreetings.sh3
-rw-r--r--language-dic/2195.dic26
-rw-r--r--language-dic/2195.lm117
-rw-r--r--language-dic/2195.log_pronounce24
-rw-r--r--language-dic/2195.sent12
-rw-r--r--language-dic/2195.vocab23
-rw-r--r--main.c477
-rwxr-xr-xpush.sh3
-rw-r--r--record.c231
-rw-r--r--record.h9
-rw-r--r--speech/TVnotConnectedError1
-rw-r--r--speech/TVnotConnectedError~1
-rw-r--r--speech/greetings1
-rw-r--r--stt.c62
-rw-r--r--stt.h6
15 files changed, 996 insertions, 0 deletions
diff --git a/greetings.sh b/greetings.sh
new file mode 100755
index 0000000..533c2c7
--- /dev/null
+++ b/greetings.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+
+festival --tts greetings
diff --git a/language-dic/2195.dic b/language-dic/2195.dic
new file mode 100644
index 0000000..47a43b9
--- /dev/null
+++ b/language-dic/2195.dic
@@ -0,0 +1,26 @@
+BACH B AA K
+BEETHOVEN B EY T OW V AH N
+COMPUTER K AH M P Y UW T ER
+FLICKS F L IH K S
+HAL HH AE L
+HI HH AY
+LIGHTS L AY T S
+NET N EH T
+OFF AO F
+OKAY OW K EY
+ON AA N
+ON(2) AO N
+PAUSE P AO Z
+PIANO P IY AE N OW
+PIANO(2) P IY AE N AH
+PLAY P L EY
+RESPOND R IH S P AA N D
+RESPOND(2) R IY S P AA N D
+SKIP S K IH P
+SONATAS S AA N AA T AH Z
+STAR S T AA R
+SYMPHONIES S IH M F AH N IY Z
+THERE DH EH R
+TREK T R EH K
+TURN T ER N
+YOU Y UW
diff --git a/language-dic/2195.lm b/language-dic/2195.lm
new file mode 100644
index 0000000..f3d2782
--- /dev/null
+++ b/language-dic/2195.lm
@@ -0,0 +1,117 @@
+Language model created by QuickLM on Sat Jul 9 14:31:50 EDT 2016
+Copyright (c) 1996-2010 Carnegie Mellon University and Alexander I. Rudnicky
+
+The model is in standard ARPA format, designed by Doug Paul while he was at MITRE.
+
+The code that was used to produce this language model is available in Open Source.
+Please visit http://www.speech.cs.cmu.edu/tools/ for more information
+
+The (fixed) discount mass is 0.5. The backoffs are computed using the ratio method.
+This model based on a corpus of 12 sentences and 25 words
+
+\data\
+ngram 1=25
+ngram 2=37
+ngram 3=32
+
+\1-grams:
+-0.9853 </s> -0.3010
+-0.9853 <s> -0.2494
+-2.0645 BACH -0.2536
+-1.7634 BEETHOVEN -0.2935
+-2.0645 COMPUTER -0.2536
+-2.0645 FLICKS -0.2536
+-1.3655 HAL -0.2366
+-2.0645 HI -0.2973
+-1.7634 LIGHTS -0.2897
+-2.0645 NET -0.2973
+-2.0645 OFF -0.2536
+-2.0645 OKAY -0.2819
+-1.7634 ON -0.2494
+-2.0645 PAUSE -0.2536
+-2.0645 PIANO -0.2973
+-1.4624 PLAY -0.2858
+-2.0645 RESPOND -0.2536
+-2.0645 SKIP -0.2536
+-2.0645 SONATAS -0.2536
+-2.0645 STAR -0.2973
+-2.0645 SYMPHONIES -0.2536
+-2.0645 THERE -0.2536
+-2.0645 TREK -0.2935
+-1.7634 TURN -0.2935
+-2.0645 YOU -0.2973
+
+\2-grams:
+-0.7782 <s> HAL -0.0792
+-1.3802 <s> HI 0.0000
+-1.3802 <s> OKAY 0.0000
+-0.7782 <s> PLAY 0.0000
+-1.0792 <s> TURN 0.0000
+-0.3010 BACH </s> -0.3010
+-0.6021 BEETHOVEN PIANO 0.0000
+-0.6021 BEETHOVEN SYMPHONIES 0.0000
+-0.3010 COMPUTER </s> -0.3010
+-0.3010 FLICKS </s> -0.3010
+-1.0000 HAL </s> -0.3010
+-1.0000 HAL PAUSE 0.0000
+-1.0000 HAL RESPOND 0.0000
+-1.0000 HAL SKIP 0.0000
+-1.0000 HAL YOU 0.0000
+-0.3010 HI COMPUTER 0.0000
+-0.6021 LIGHTS OFF 0.0000
+-0.6021 LIGHTS ON -0.1761
+-0.3010 NET FLICKS 0.0000
+-0.3010 OFF </s> -0.3010
+-0.3010 OKAY HAL -0.2553
+-0.6021 ON </s> -0.3010
+-0.6021 ON NET 0.0000
+-0.3010 PAUSE </s> -0.3010
+-0.3010 PIANO SONATAS 0.0000
+-0.9031 PLAY BACH 0.0000
+-0.6021 PLAY BEETHOVEN 0.0000
+-0.9031 PLAY STAR 0.0000
+-0.3010 RESPOND </s> -0.3010
+-0.3010 SKIP </s> -0.3010
+-0.3010 SONATAS </s> -0.3010
+-0.3010 STAR TREK 0.0000
+-0.3010 SYMPHONIES </s> -0.3010
+-0.3010 THERE </s> -0.3010
+-0.3010 TREK ON -0.1761
+-0.3010 TURN LIGHTS 0.0000
+-0.3010 YOU THERE 0.0000
+
+\3-grams:
+-0.9031 <s> HAL PAUSE
+-0.9031 <s> HAL RESPOND
+-0.9031 <s> HAL SKIP
+-0.9031 <s> HAL YOU
+-0.3010 <s> HI COMPUTER
+-0.3010 <s> OKAY HAL
+-0.9031 <s> PLAY BACH
+-0.6021 <s> PLAY BEETHOVEN
+-0.9031 <s> PLAY STAR
+-0.3010 <s> TURN LIGHTS
+-0.3010 BEETHOVEN PIANO SONATAS
+-0.3010 BEETHOVEN SYMPHONIES </s>
+-0.3010 HAL PAUSE </s>
+-0.3010 HAL RESPOND </s>
+-0.3010 HAL SKIP </s>
+-0.3010 HAL YOU THERE
+-0.3010 HI COMPUTER </s>
+-0.3010 LIGHTS OFF </s>
+-0.3010 LIGHTS ON </s>
+-0.3010 NET FLICKS </s>
+-0.3010 OKAY HAL </s>
+-0.3010 ON NET FLICKS
+-0.3010 PIANO SONATAS </s>
+-0.3010 PLAY BACH </s>
+-0.6021 PLAY BEETHOVEN PIANO
+-0.6021 PLAY BEETHOVEN SYMPHONIES
+-0.3010 PLAY STAR TREK
+-0.3010 STAR TREK ON
+-0.3010 TREK ON NET
+-0.6021 TURN LIGHTS OFF
+-0.6021 TURN LIGHTS ON
+-0.3010 YOU THERE </s>
+
+\end\
diff --git a/language-dic/2195.log_pronounce b/language-dic/2195.log_pronounce
new file mode 100644
index 0000000..8b303af
--- /dev/null
+++ b/language-dic/2195.log_pronounce
@@ -0,0 +1,24 @@
+BACH - Main
+BEETHOVEN - Main
+COMPUTER - Main
+FLICKS - Main
+HAL - Main
+HI - Main
+LIGHTS - Main
+NET - Main
+OFF - Main
+OKAY - Main
+ON - Main
+PAUSE - Main
+PIANO - Main
+PLAY - Main
+RESPOND - Main
+SKIP - Main
+SONATAS - Main
+STAR - Main
+SYMPHONIES - Main
+THERE - Main
+TREK - Main
+TURN - Main
+YOU - Main
+
diff --git a/language-dic/2195.sent b/language-dic/2195.sent
new file mode 100644
index 0000000..2be577c
--- /dev/null
+++ b/language-dic/2195.sent
@@ -0,0 +1,12 @@
+<s> HI COMPUTER </s>
+<s> OKAY HAL </s>
+<s> HAL YOU THERE </s>
+<s> HAL RESPOND </s>
+<s> HAL PAUSE </s>
+<s> HAL SKIP </s>
+<s> TURN LIGHTS ON </s>
+<s> TURN LIGHTS OFF </s>
+<s> PLAY STAR TREK ON NET FLICKS </s>
+<s> PLAY BACH </s>
+<s> PLAY BEETHOVEN SYMPHONIES </s>
+<s> PLAY BEETHOVEN PIANO SONATAS </s>
diff --git a/language-dic/2195.vocab b/language-dic/2195.vocab
new file mode 100644
index 0000000..238521d
--- /dev/null
+++ b/language-dic/2195.vocab
@@ -0,0 +1,23 @@
+BACH
+BEETHOVEN
+COMPUTER
+FLICKS
+HAL
+HI
+LIGHTS
+NET
+OFF
+OKAY
+ON
+PAUSE
+PIANO
+PLAY
+RESPOND
+SKIP
+SONATAS
+STAR
+SYMPHONIES
+THERE
+TREK
+TURN
+YOU
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..fdb786c
--- /dev/null
+++ b/main.c
@@ -0,0 +1,477 @@
+
+/*
+ * This program uses the PortAudio Portable Audio Library.
+ * For more information see: http://www.portaudio.com
+ * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <time.h>
+
+#include "record.h"
+#include "stt.h"
+
+#define SSDP_MULTICAST "239.255.255.250"
+#define SSDP_PORT 1900
+
+#define BUTTON_HOME "Home"
+#define BUTTON_REW "Rew"
+#define BUTTON_FWD "Fwd"
+#define BUTTON_PLAY "Play"
+#define BUTTON_SELECT "Select"
+#define BUTTON_LEFT "Left"
+#define BUTTON_RIGHT "Right"
+#define BUTTON_DOWN "Down"
+#define BUTTON_UP "Up"
+#define BUTTON_BACK "Back"
+#define BUTTON_INSTANTREPLAY "InstantReplay"
+#define BUTTON_INFO "Info"
+#define BUTTON_BACKSPACE "Backspace"
+#define BUTTON_SEARCH "Search"
+#define BUTTON_ENTER "Enter"
+#define BUTTON_LIT "Lit_"
+
+#define NETFLIX_ID "12"
+#define SPOTIFY_ID "19977"
+
+#define RESPONSE_BUFFER_LEN 8192
+#define URL_BUFFER_LEN 1024
+char buffer[RESPONSE_BUFFER_LEN];
+unsigned int len = RESPONSE_BUFFER_LEN;
+
+char url[URL_BUFFER_LEN];
+char host[URL_BUFFER_LEN];
+
+
+int invocation();
+void speak(int);
+void getCommand();
+int tvCommands(int);
+int http_req_resp(char* host, int port, char* req, char** resp);
+int ssdp_get_roku_ecp_url(char* url);
+void rokuWrite(char *, int, char*);
+int sendTVcommand(int, char *, int);
+
+int main(void){
+ while(1){
+ if(invocation()){
+ speak(1);
+ getCommand();
+ }
+ }
+}
+
+int invocation(){
+ char text[100];
+ int invoked=0;
+ int res= 0;
+ record(2);
+ speechToText(text);
+ printf("\n\nTEXT: %s\n\n", text);
+ if(strstr(text, "HAL PAUSE") || strstr(text, "HAL PLAY"))
+ res = tvCommands(5);
+ else if(strstr(text, "HAL SKIP"))
+ res = tvCommands(6);
+ else if(strstr(text, "HAL RESPOND") || strstr(text, "HAL")){
+ invoked=1;
+ }
+ speak(res);
+ return invoked;
+}
+
+void speak(int num){
+ switch(num){
+ case 1:
+ system("festival --tts speech/greetings");
+ break;
+ case 2:
+ system("festival --tts speech/TVnotConnectedError");
+ break;
+ }
+}
+
+void getCommand(){
+ char text[100];
+ int res=0;
+ record(3);
+ speechToText(text);
+ printf("\n\nTEXT: %s\n\n", text);
+ if(strstr(text, "SKIP"))
+ res = tvCommands(6);
+ else if(strstr(text, "NET FLICKS")){
+ if(strstr(text, "STAR TREK"))
+ res = tvCommands(1);
+ }
+ else if(strstr(text, "BEETHOVEN SYMPHONIES"))
+ res = tvCommands(2);
+ else if(strstr(text, "BEETHOVEN PIANO SONATAS"))
+ res = tvCommands(3);
+ else if(strstr(text, "RANDOM BEETHOVEN"))
+ res = tvCommands(4);
+ else if(strstr(text, "PAUSE") || strstr(text, "PLAY"))
+ res = tvCommands(5);
+ speak(res);
+}
+
+/*
+ Return values:
+ 1 - successful execution
+ 2 - unable to reach TV
+ 3 - connection error
+*/
+int tvCommands(int command){
+ int i;
+ int ret = -1;
+ char* hostbegin;
+ char* hostend;
+ char* portbegin;
+ char* portend;
+ char portStr[10];
+ int port;
+
+ /* int netflix_id = 12, spotify_id = 19977; */
+
+ //check for broadcast every 20 mins
+ ret = ssdp_get_roku_ecp_url(url);
+ if(ret < 0)
+ return 2;
+
+ hostbegin = strstr(buffer, "http://") + 7;
+ hostend = strstr(hostbegin, ":");
+ strncpy(host, hostbegin, hostend-hostbegin);
+ host[hostend-hostbegin] = 0;
+
+ portbegin = hostend+1;
+ portend = strstr(portbegin, "/");
+ strncpy(portStr, portbegin, portend-portbegin);
+ portStr[portend-portbegin] = 0;
+ port = atoi(portStr);
+
+ sendTVcommand(command, host, port);
+}
+
+int ssdp_get_roku_ecp_url(char* url)
+{
+ int sock;
+ size_t ret;
+ unsigned int socklen;
+ struct sockaddr_in sockname;
+ struct sockaddr clientsock;
+ struct hostent *hostname = 0;
+ char ssdproku[] =
+ "M-SEARCH * HTTP/1.1\r\n"
+ "Host: 239.255.255.250:1900\r\n"
+ "Man: \"ssdp:discover\"\r\n"
+ "ST: roku:ecp\r\n"
+ "\r\n";
+ fd_set fds;
+ struct timeval timeout;
+ char* urlbegin;
+ char* urlend;
+
+ /* SSDP Request */
+ hostname = gethostbyname(SSDP_MULTICAST);
+ if (!hostname) {
+
+ printf("gethostbyname returns null for host %s", SSDP_MULTICAST);
+ }
+ hostname->h_addrtype = AF_INET;
+
+ if((sock = socket(PF_INET, SOCK_DGRAM, 0)) == -1){
+ printf("err: socket() failed");
+ return -1;
+ }
+
+ memset((char*)&sockname, 0, sizeof(sockname));
+ sockname.sin_family=AF_INET;
+ sockname.sin_port=htons(SSDP_PORT);
+ sockname.sin_addr.s_addr=*((unsigned long*)(hostname->h_addr_list[0]));
+
+ ret=sendto(sock, ssdproku, strlen(ssdproku), 0, (struct sockaddr*) &sockname, sizeof(sockname));
+ if(ret != strlen(ssdproku)){
+ printf("err:sendto");
+ return -1;
+ }
+
+ /* SSDP Response */
+ FD_ZERO(&fds);
+ FD_SET(sock, &fds);
+ timeout.tv_sec=10;
+ timeout.tv_usec=10;
+
+ if(select(sock+1, &fds, NULL, NULL, &timeout) < 0){
+ printf("err:select");
+ return -1;
+ }
+ if(FD_ISSET(sock, &fds)){
+ socklen=sizeof(clientsock);
+ if((len = recvfrom(sock, buffer, len, MSG_PEEK, &clientsock, &socklen)) == (size_t)-1){
+ printf("err: recvfrom");
+ return -1;
+ }
+ buffer[len]='\0';
+ // close(sock);
+
+ if(strncmp(buffer, "HTTP/1.1 200 OK", 12) != 0){
+ printf("err: ssdp parsing ");
+ return -1;
+ }
+
+ /* Parse out Location url */
+ urlbegin = strstr(buffer, "LOCATION: ") + 10;
+ urlend = strstr(urlbegin, "/\r\n");
+ strncpy(url, urlbegin, urlend-urlbegin);
+ url[urlend-urlbegin] = 0;
+ } else {
+ printf("err: no ssdp answer");
+ return -1;
+ }
+ return 0;
+}
+
+/*
+Command dir
+1 - Star Trek (Netflix)
+2 - Beethoven (Spotify)
+3 - Bach (Spotify)
+ */
+int sendTVcommand(int command, char* host, int port){
+ char *resp;
+
+ char enter[] =
+ "POST /keypress/" BUTTON_ENTER " HTTP/1.0\r\n"
+ "\r\n";
+
+ char homeKey[] =
+ "POST /keypress/" BUTTON_HOME " HTTP/1.0\r\n"
+ "\r\n";
+
+ char rightKey[] =
+ "POST /keypress/" BUTTON_RIGHT " HTTP/1.0\r\n"
+ "\r\n";
+
+ char upKey[] =
+ "POST /keypress/" BUTTON_UP " HTTP/1.0\r\n"
+ "\r\n";
+
+ char play_pause[] =
+ "POST /keypress/" BUTTON_PLAY " HTTP/1.0\r\n"
+ "\r\n";
+
+ char downKey[] =
+ "POST /keypress/" BUTTON_DOWN " HTTP/1.0\r\n"
+ "\r\n";
+
+ char launchNetflix[] =
+ "POST /launch/" NETFLIX_ID " HTTP/1.0\r\n"
+ "\r\n";
+
+ char launchSpotify[] =
+ "POST /launch/" SPOTIFY_ID " HTTP/1.0\r\n"
+ "\r\n";
+
+ char select[] =
+ "POST /keypress/" BUTTON_SELECT " HTTP/1.0\r\n"
+ "\r\n";
+
+ char fwd[] =
+ "POST /keypress/" BUTTON_FWD " HTTP/1.0\r\n"
+ "\r\n";
+ int randup, randdown;
+ switch(command){
+ case 1:
+ http_req_resp(host, port, launchNetflix, &resp);
+ sleep(10);
+ http_req_resp(host, port, upKey, &resp);
+ sleep(1);
+ http_req_resp(host, port, select, &resp);
+ sleep(1);
+ http_req_resp(host, port, upKey, &resp);
+ sleep(1);
+ http_req_resp(host, port, select, &resp);
+ sleep(1);
+ rokuWrite(host, port, "Star Trek The Next");
+ http_req_resp(host, port, enter, &resp);
+ sleep(7);
+ for(int i=0; i<5; i++)
+ http_req_resp(host, port, rightKey, &resp);
+ sleep(1);
+ http_req_resp(host, port, select, &resp);
+ sleep(4);
+ http_req_resp(host, port, select, &resp);
+ break;
+ case 2:
+ http_req_resp(host, port, launchSpotify, &resp);
+ sleep(10);
+ http_req_resp(host, port, select, &resp);
+ http_req_resp(host, port, select, &resp);
+ rokuWrite(host, port, "karajan symphony edition");
+ sleep(1);
+ for(int i=0; i<4; i++)
+ http_req_resp(host, port, rightKey, &resp);
+ http_req_resp(host, port, downKey, &resp);
+ http_req_resp(host, port, select, &resp);
+ srand(time(NULL));
+ randup = rand() % 30;
+ randdown = rand() % 30;
+ for(int i=0; i<randup; i++)
+ http_req_resp(host, port, upKey, &resp);
+ for(int i=0; i<randdown; i++)
+ http_req_resp(host, port, downKey, &resp);
+ http_req_resp(host, port, select, &resp);
+ break;
+ case 3:
+ http_req_resp(host, port, launchSpotify, &resp);
+ sleep(10);
+ http_req_resp(host, port, select, &resp);
+ http_req_resp(host, port, select, &resp);
+ rokuWrite(host, port, "brendel piano sonatas");
+ sleep(1);
+ for(int i=0; i<4; i++)
+ http_req_resp(host, port, rightKey, &resp);
+ http_req_resp(host, port, downKey, &resp);
+ http_req_resp(host, port, select, &resp);
+ srand(time(NULL));
+ randup = rand() % 30;
+ randdown = rand() % 30;
+ for(int i=0; i<randup; i++)
+ http_req_resp(host, port, upKey, &resp);
+ for(int i=0; i<randdown; i++)
+ http_req_resp(host, port, downKey, &resp);
+ http_req_resp(host, port, select, &resp);
+ break;
+ case 4:
+ http_req_resp(host, port, launchSpotify, &resp);
+ sleep(10);
+ http_req_resp(host, port, select, &resp);
+ http_req_resp(host, port, select, &resp);
+ rokuWrite(host, port, "beethoven");
+ sleep(1);
+ for(int i=0; i<4; i++)
+ http_req_resp(host, port, rightKey, &resp);
+ http_req_resp(host, port, downKey, &resp);
+ srand(time(NULL));
+ randup = rand() % 30;
+ randdown = rand() % 30;
+ for(int i=0; i<randdown; i++)
+ http_req_resp(host, port, downKey, &resp);
+ for(int i=0; i<randup; i++)
+ http_req_resp(host, port, upKey, &resp);
+ http_req_resp(host, port, select, &resp);
+ http_req_resp(host, port, select, &resp);
+ break;
+ case 5:
+ http_req_resp(host, port, play_pause, &resp);
+ break;
+ case 6:
+ http_req_resp(host, port, fwd, &resp);
+ break;
+ }
+}
+
+void rokuWrite(char *host, int port, char * text){
+ char *resp;
+ char select_start[] =
+ "POST /keypress/" BUTTON_LIT;
+ char select_end[] =
+ " HTTP/1.0\r\n"
+ "\r\n";
+
+ char send_text[50];
+ char curr_char[4];
+ for(int i = 0; i<strlen(text); i++){
+ if(text[i] == ' ')
+ strcpy(curr_char, "%20");
+
+ else
+ curr_char[0] = text[i];
+ strcat(send_text, select_start);
+ strcat(send_text, curr_char);
+ strcat(send_text, select_end);
+ http_req_resp(host, port, send_text, &resp);
+ send_text[0]=0;
+ }
+}
+
+
+#define DWORD int
+int http_req_resp(char* host, int port, char* req, char** resp)
+{
+ int sock;
+ size_t ret;
+ unsigned int socklen;
+ struct sockaddr_in sockname;
+ struct sockaddr clientsock;
+ struct hostent *hostname;
+ fd_set fds;
+ struct timeval timeout;
+
+ hostname = gethostbyname(host);
+ if (hostname == NULL) {
+ printf("gethostbyname returns null for host %s", host);
+ }
+ hostname->h_addrtype = AF_INET;
+
+ if((sock = socket(PF_INET, SOCK_STREAM, 0)) == -1){
+ printf("err: socket() failed");
+ return -1;
+ }
+
+ memset((char*)&sockname, 0, sizeof(sockname));
+ sockname.sin_family=AF_INET;
+ sockname.sin_port=htons(port);
+ sockname.sin_addr.s_addr=*((unsigned long*)(hostname->h_addr_list[0]));
+
+ ret=connect(sock, (struct sockaddr*) &sockname, sizeof(sockname));
+ ret=send(sock, req, strlen(req), 0);
+
+ //Send will not account for partial data writes -- for now
+ if(ret != strlen(req)){
+ printf("err:sendto");
+ return -1;
+ }
+
+ //Recv will not account for partial data reads -- for now
+ FD_ZERO(&fds);
+ FD_SET(sock, &fds);
+ timeout.tv_sec=10;
+ timeout.tv_usec=10;
+
+ if(select(sock+1, &fds, NULL, NULL, &timeout) < 0){
+ printf("err:select");
+ return -1;
+ }
+
+ if(FD_ISSET(sock, &fds)){
+ if((len = recv(sock, buffer, sizeof(buffer), 0)) == (size_t)-1){
+ printf("err: recvfrom");
+ return -1;
+ }
+ buffer[len]='\0';
+ // close(sock);
+
+ if(strncmp(buffer+9, "200 OK", 6) != 0){
+ printf("err: http req parsing ");
+ }
+
+ resp = (char **)&buffer;
+ return 0;
+
+ }else{
+
+ printf("err: no http answer");
+ return -1;
+ }
+}
+
+
+
diff --git a/push.sh b/push.sh
new file mode 100755
index 0000000..acc5889
--- /dev/null
+++ b/push.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+sudo scp -r /home/aditya/code/sphinx-stuff/build/ aditya@192.168.1.248:/home/aditya/project-voice/
diff --git a/record.c b/record.c
new file mode 100644
index 0000000..41b984d
--- /dev/null
+++ b/record.c
@@ -0,0 +1,231 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <portaudio.h>
+
+
+#define SAMPLE_RATE (8000)
+#define FRAMES_PER_BUFFER (512)
+#define NUM_CHANNELS (2)
+#define DITHER_FLAG (1)
+#define WRITE_TO_FILE (1)
+
+#define PA_SAMPLE_TYPE paInt16
+#define SAMPLE_SILENCE (0)
+#define PRINTF_S_FORMAT "%d"
+
+typedef short SAMPLE;
+
+typedef struct
+{
+ int frameIndex; /* Index into sample array. */
+ int maxFrameIndex;
+ SAMPLE *recordedSamples;
+}paTestData;
+
+
+static int recordCallback( const void *inputBuffer, void *outputBuffer,
+ unsigned long framesPerBuffer,
+ const PaStreamCallbackTimeInfo* timeInfo,
+ PaStreamCallbackFlags statusFlags,
+ void *userData ){
+ paTestData *data = (paTestData*)userData;
+ const SAMPLE *rptr = (const SAMPLE*)inputBuffer;
+ SAMPLE *wptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS];
+ long framesToCalc;
+ long i;
+ int finished;
+ unsigned long framesLeft = data->maxFrameIndex - data->frameIndex;
+
+ (void) outputBuffer; /* Prevent unused variable warnings. */
+ (void) timeInfo;
+ (void) statusFlags;
+ (void) userData;
+
+ if( framesLeft < framesPerBuffer )
+ {
+ framesToCalc = framesLeft;
+ finished = paComplete;
+ }
+ else
+ {
+ framesToCalc = framesPerBuffer;
+ finished = paContinue;
+ }
+
+ if( inputBuffer == NULL )
+ {
+ for( i=0; i<framesToCalc; i++ )
+ {
+ *wptr++ = SAMPLE_SILENCE; /* left */
+ if( NUM_CHANNELS == 2 ) *wptr++ = SAMPLE_SILENCE; /* right */
+ }
+ }
+ else
+ {
+ for( i=0; i<framesToCalc; i++ )
+ {
+ *wptr++ = *rptr++; /* left */
+ if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */
+ }
+ }
+ data->frameIndex += framesToCalc;
+ return finished;
+}
+static int playCallback( const void *inputBuffer, void *outputBuffer,
+ unsigned long framesPerBuffer,
+ const PaStreamCallbackTimeInfo* timeInfo,
+ PaStreamCallbackFlags statusFlags,
+ void *userData )
+ {
+ paTestData *data = (paTestData*)userData;
+ SAMPLE *rptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS];
+ SAMPLE *wptr = (SAMPLE*)outputBuffer;
+ unsigned int i;
+ int finished;
+ unsigned int framesLeft = data->maxFrameIndex - data->frameIndex;
+
+ (void) inputBuffer; /* Prevent unused variable warnings. */
+ (void) timeInfo;
+ (void) statusFlags;
+ (void) userData;
+
+ if( framesLeft < framesPerBuffer )
+ {
+ /* final buffer... */
+ for( i=0; i<framesLeft; i++ )
+ {
+ *wptr++ = *rptr++; /* left */
+ if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */
+ }
+ for( ; i<framesPerBuffer; i++ )
+ {
+ *wptr++ = 0; /* left */
+ if( NUM_CHANNELS == 2 ) *wptr++ = 0; /* right */
+ }
+ data->frameIndex += framesLeft;
+ finished = paComplete;
+ }
+ else
+ {
+ for( i=0; i<framesPerBuffer; i++ )
+ {
+ *wptr++ = *rptr++; /* left */
+ if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */
+ }
+ data->frameIndex += framesPerBuffer;
+ finished = paContinue;
+ }
+ return finished;
+ }
+
+int record(int NUM_SECONDS){
+ PaStream* stream;
+ PaError err = paNoError;
+ PaStreamParameters inputParameters, outputParameters;
+ paTestData data;
+ int numBytes;
+ int i;
+ SAMPLE max, val;
+ int totalFrames;
+ double average;
+ int numSamples;
+ data.maxFrameIndex = totalFrames = NUM_SECONDS * SAMPLE_RATE;
+ data.frameIndex = 0;
+ numSamples = totalFrames * NUM_CHANNELS;
+ numBytes = numSamples * sizeof(SAMPLE);
+ data.recordedSamples = (SAMPLE *) malloc( numBytes );
+ if( data.recordedSamples == NULL )
+ {
+ printf("Could not allocate record array.\n");
+ goto done;
+ }
+ for( i=0; i<numSamples; i++ ) data.recordedSamples[i] = 0;
+
+ err = Pa_Initialize();
+ if( err != paNoError ) goto done;
+
+ inputParameters.device = Pa_GetDefaultInputDevice();
+ if (inputParameters.device == paNoDevice) {
+ fprintf(stderr,"Error: No default input device.\n");
+ goto done;
+ }
+ inputParameters.channelCount = 2;
+ inputParameters.sampleFormat = PA_SAMPLE_TYPE;
+ inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
+ inputParameters.hostApiSpecificStreamInfo = NULL;
+
+ /* Record some audio. -------------------------------------------- */
+ err = Pa_OpenStream(
+ &stream,
+ &inputParameters,
+ NULL, /* &outputParameters, */
+ SAMPLE_RATE,
+ FRAMES_PER_BUFFER,
+ paClipOff, /* we won't output out of range samples so don't bother clipping them */
+ recordCallback,
+ &data );
+ if( err != paNoError ) goto done;
+
+ err = Pa_StartStream( stream );
+ if( err != paNoError ) goto done;
+ printf("=== NOW RECORDING ===\n"); fflush(stdout);
+
+ while( ( err = Pa_IsStreamActive( stream ) ) == 1 )
+ {
+ Pa_Sleep(1000);
+ printf("index = %d\n", data.frameIndex ); fflush(stdout);
+ }
+ if( err < 0 ) goto done;
+
+ err = Pa_CloseStream( stream );
+ if( err != paNoError ) goto done;
+
+ /* Measure maximum peak amplitude. */
+ max = 0;
+ average = 0.0;
+ for( i=0; i<numSamples; i++ )
+ {
+ val = data.recordedSamples[i];
+ if( val < 0 ) val = -val; /* ABS */
+ if( val > max )
+ {
+ max = val;
+ }
+ average += val;
+ }
+
+ average = average / (double)numSamples;
+
+ /* printf("sample max amplitude = "PRINTF_S_FORMAT"\n", max ); */
+ /* printf("sample average = %lf\n", average ); */
+
+ /* Write recorded data to a file. */
+#if WRITE_TO_FILE
+ {
+ FILE *fid;
+ fid = fopen("recorded.raw", "wb");
+ if( fid == NULL )
+ {
+ printf("Could not open file.");
+ }
+ else
+ {
+ fwrite( data.recordedSamples, NUM_CHANNELS * sizeof(SAMPLE), totalFrames, fid );
+ fclose( fid );
+ /* printf("Wrote data to 'recorded.raw'\n"); */
+ }
+ }
+#endif
+
+done:
+ Pa_Terminate();
+ if( data.recordedSamples ) /* Sure it is NULL or valid. */
+ free( data.recordedSamples );
+ if( err != paNoError )
+ {
+ fprintf( stderr, "An error occured while using the portaudio stream\n" );
+ fprintf( stderr, "Error number: %d\n", err );
+ fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
+ err = 1; /* Always return 0 or 1, but no other return codes. */
+ }
+}
diff --git a/record.h b/record.h
new file mode 100644
index 0000000..a5f12e4
--- /dev/null
+++ b/record.h
@@ -0,0 +1,9 @@
+#ifndef RECORD_H
+#define RECORD_H
+
+
+/* function that records stuff*/
+
+int record();
+
+#endif
diff --git a/speech/TVnotConnectedError b/speech/TVnotConnectedError
new file mode 100644
index 0000000..fc716aa
--- /dev/null
+++ b/speech/TVnotConnectedError
@@ -0,0 +1 @@
+I'm sorry Aditya, but the TV is not responding \ No newline at end of file
diff --git a/speech/TVnotConnectedError~ b/speech/TVnotConnectedError~
new file mode 100644
index 0000000..38483b8
--- /dev/null
+++ b/speech/TVnotConnectedError~
@@ -0,0 +1 @@
+I'm sorry Aditya, but the TV seems to be turned off \ No newline at end of file
diff --git a/speech/greetings b/speech/greetings
new file mode 100644
index 0000000..6bf999b
--- /dev/null
+++ b/speech/greetings
@@ -0,0 +1 @@
+Yes? \ No newline at end of file
diff --git a/stt.c b/stt.c
new file mode 100644
index 0000000..0c04ddc
--- /dev/null
+++ b/stt.c
@@ -0,0 +1,62 @@
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sphinxbase/err.h>
+#include <pocketsphinx.h>
+
+int speechToText(char text[])
+{
+ ps_decoder_t *ps;
+ cmd_ln_t *config;
+ FILE *fh;
+ char const *hyp, *uttid;
+ int16 buf[512];
+ int rv;
+ int32 score;
+
+ config = cmd_ln_init(NULL, ps_args(), TRUE,
+ "-hmm","./language-model/",
+ "-lm", "./language-dic/2195.lm",
+ "-dict", "./language-dic/2195.dic",
+ "-logfn", "/dev/null",
+ NULL);
+
+ /* err_set_logfile("/log/sphinx"); */
+
+
+ if (config == NULL) {
+ fprintf(stderr, "Failed to create config object, see log for details\n");
+ return -1;
+ }
+
+ ps = ps_init(config);
+ if (ps == NULL) {
+ fprintf(stderr, "Failed to create recognizer, see log for details\n");
+ return -1;
+ }
+
+ fh = fopen("recorded.raw", "rb");
+ if (fh == NULL) {
+ fprintf(stderr, "Unable to open input file\n");
+ return -1;
+ }
+
+ rv = ps_start_utt(ps);
+
+ while (!feof(fh)) {
+ size_t nsamp;
+ nsamp = fread(buf, 2, 512, fh);
+ rv = ps_process_raw(ps, buf, nsamp, FALSE, FALSE);
+ }
+
+ rv = ps_end_utt(ps);
+ hyp = ps_get_hyp(ps, &score);
+ strcpy(text, hyp);
+
+ fclose(fh);
+ ps_free(ps);
+ cmd_ln_free_r(config);
+
+ return 0;
+}
diff --git a/stt.h b/stt.h
new file mode 100644
index 0000000..6c9edeb
--- /dev/null
+++ b/stt.h
@@ -0,0 +1,6 @@
+#ifndef STT_H
+#define STT_H
+
+int speechToText(char []);
+
+#endif