0

我调用以下函数以使用 google api 将语音转换为文本。我在最新版本的 xcode 中执行此操作,并为 mac 制作此应用程序。问题是下面的功能似乎中断了,NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:nil];所以我无法检查语音。我尝试过异步调度,但似乎没有帮助。我也尝试了 @autoreleasepool {} 但它似乎也没有帮助。任何帮助表示赞赏!

-(void)processSpeech {
    NSURL *url = [NSURL fileURLWithPath:@"/Users/marcus/Documents/testvoices/okSpeak.query.flac"];

    NSData *flacFile = [NSData dataWithContentsOfURL:url];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com/speech-api/v1/recognize?lang=en-US"]];
    [request setHTTPMethod:@"POST"];
    [request addValue:@"Content-Type" forHTTPHeaderField:@"audio/x-flac; rate=16000"];
    [request addValue:@"audio/x-flac; rate=16000" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:flacFile];
    [request setValue:[NSString stringWithFormat:@"%ld",[flacFile length]] forHTTPHeaderField:@"Content-length"];
    NSHTTPURLResponse *urlResponse = nil;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:nil];
    NSString *rawData = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"Raw: %@",rawData);

    return rawData;
}
4

1 回答 1

2

如果您怀疑您的 .com 存在问题sendSynchronousRequest,您应该至少考虑三件事:

  • NSHTTPURLResponse物体。它报告了什么?值得注意的是,对于 HTTP 请求,您会看到一个statusCode,它可以提供信息。

  • 您也应该将NSError地址指针传递给它,并确保错误nil也是:

    NSError *error = nil;
    NSHTTPURLResponse *urlResponse = nil;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
    
    if (!responseData) 
        NSLog(@"sendSynchronousRequest error: %@", error);
    else {
        NSLog(@"sendSynchronousRequest response = %@", urlResponse);
        NSString *rawData = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
        NSLog(@"responseData = %@", rawData);
    }
    
  • 你得到了什么作为你的rawData字符串?

顺便说一句,如果您想知道,您希望将其Content-Type作为标题字段,而不是作为值。

// [request addValue:@"Content-Type" forHTTPHeaderField:@"audio/x-flac; rate=16000"];
[request addValue:@"audio/x-flac; rate=16000" forHTTPHeaderField:@"Content-Type"];
于 2014-01-11T04:30:32.110 回答