I have an AVAudioRecorder which is recording the voice command, then Im converting it to nsdata using the following code -
NSData *data = [NSData dataWithContentsOfURL:recorder.url];
Now I do a speech recongizer request using the following code -
NSDictionary *headers = @{ @"Authorization": [NSString stringWithFormat:@"Bearer %@", authCode], @"Transfer-Encoding": @"chunked", @"Content-Type": @"multipart/form-data; boundary=someboundary" };
NSMutableData *postData = [[NSMutableData alloc] initWithData:[@"\r\n--someboundary\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"Content-Disposition: form-data; name=\"request\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"Content-Type: application/json; charset=UTF-8\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"{\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"messageHeader\": {\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"deviceContext\": [\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"{\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"name\": \"playbackState\",\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"namespace\": \"AudioPlayer\",\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"payload\": {\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"streamId\": \"\",\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // what is the streamid supposed to be?
[postData appendData:[@"\"offsetInMilliseconds\": \"\",\r\n" dataUsingEncoding:NSUTF8StringEncoding]];//Is this correct?
[postData appendData:[@"\"playerActivity\": \"IDLE\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"}\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"}\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"]\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"},\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"messageBody\": {\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"profile\": \"alexa-close-talk\",\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"locale\": \"en-us\",\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"\"format\": \"audio/L16; rate=16000; channels=1\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"}\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"}\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"--someboundary\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"Content-Disposition: form-data; name=\"audio\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"Content-Type: audio/L16; rate=16000; channels=1\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[NSData dataWithData:audioData]];
[postData appendData:[[NSString stringWithFormat:@"\r\n--someboundry--"] dataUsingEncoding:NSUTF8StringEncoding]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://access-alexa-na.amazon.com/v1/avs/speechrecognizer/recognize"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:20.0];
[request setHTTPMethod:@"POST"];
[request setAllHTTPHeaderFields:headers];
[request setHTTPBody:postData];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSLog(@"SpeechRecognition %@", httpResponse);
}
}];
[dataTask resume];
But the above code is giving me a 500 error. Any help is greatly appreciated
I figured out what was going wrong. Content type before audio data should be
[postData appendData:[@"Content-Type: audio/L16; rate=16000; channels=1\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
not
[postData appendData:[@"Content-Type: audio/L16; rate=16000; channels=1\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
it was missing an extra "\r\n"