diff options
| author | Aditya Naik | 2016-07-11 12:59:40 -0400 |
|---|---|---|
| committer | Aditya Naik | 2016-07-11 12:59:40 -0400 |
| commit | a1283e03cdc44da6e1cd312c3ddc4db0dbdaf7a7 (patch) | |
| tree | 9fe5373177e473f56b02d3d4ba1a8a45c4be4275 | |
initial working build
| -rwxr-xr-x | greetings.sh | 3 | ||||
| -rw-r--r-- | language-dic/2195.dic | 26 | ||||
| -rw-r--r-- | language-dic/2195.lm | 117 | ||||
| -rw-r--r-- | language-dic/2195.log_pronounce | 24 | ||||
| -rw-r--r-- | language-dic/2195.sent | 12 | ||||
| -rw-r--r-- | language-dic/2195.vocab | 23 | ||||
| -rw-r--r-- | main.c | 477 | ||||
| -rwxr-xr-x | push.sh | 3 | ||||
| -rw-r--r-- | record.c | 231 | ||||
| -rw-r--r-- | record.h | 9 | ||||
| -rw-r--r-- | speech/TVnotConnectedError | 1 | ||||
| -rw-r--r-- | speech/TVnotConnectedError~ | 1 | ||||
| -rw-r--r-- | speech/greetings | 1 | ||||
| -rw-r--r-- | stt.c | 62 | ||||
| -rw-r--r-- | stt.h | 6 |
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 @@ -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; + } +} + + + @@ -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 @@ -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; +} @@ -0,0 +1,6 @@ +#ifndef STT_H +#define STT_H + +int speechToText(char []); + +#endif |
