2011-05-07 84 views
5

我正在开发支持多种语言的文本到语音的iPhone应用程序。iPhone SDK - Google TTS和编码

这是我的请求的URL

requestUrlStr = @"http://www.translate.google.com/translate_tts?tl=en&q=hello"; 

英语上面的网址有没有问题

但对中国

requestUrlStr = @"http://www.translate.google.com/translate_tts?tl=zh-TW&q=你好"; 

我知道上面的网址会给 '坏URL',所以我用follow方法将字符串编码成UTF-8

requestUrlStr = [requestUrlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

它将成为

http://www.translate.google.com/translate_tts?tl=zh-CN&q=%E4%BD%A0%E5%A5%BD 

然后谷歌TTS不能认识到这一点中国的文字。

+0

似乎有一些引用限制...可能是这个问题..而不是URL:http://jalam1001.posterous.com/google-text-to-speech-tts-weston-ruter- sent-u – govi 2011-05-08 01:42:10

回答

10

您必须假装为NSURLRequest中的默认(appName等)之外的用户代理。试试这个(我用希腊语)...

NSString* userAgent = @"Mozilla/5.0"; 

NSURL *url = [NSURL URLWithString:[@"http://www.translate.google.com/translate_tts?tl=el&q=Καλημέρα" 
            stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 


NSMutableURLRequest* request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease]; 

[request setValue:userAgent forHTTPHeaderField:@"User-Agent"]; 


NSURLResponse* response = nil; 
NSError* error = nil; 
NSData* data = [NSURLConnection sendSynchronousRequest:request 
            returningResponse:&response 
               error:&error]; 



[data writeToFile:@"/var/tmp/tts.mp3" atomically:YES]; 

UPDATE 2017年

因为我们喜欢的公司享受的更新和贬低的东西,这里是理所应当的,现在上面的例子...

NSString* text = @"καλημέρα"; 
NSString* lang = @"el"; 

NSString* sUrl = [NSString stringWithFormat:@"https://translate.google.com/translate_tts?q=%@&tl=%@&client=tw-ob", text, lang]; 
sUrl = [sUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]; 
NSURL* url = [NSURL URLWithString:sUrl]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setHTTPMethod:@"GET"]; 
[request setValue:@"Mozilla/5.0" forHTTPHeaderField:@"User-Agent"]; 

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] 
                 delegate:nil 
               delegateQueue:[NSOperationQueue mainQueue]]; 

[[session dataTaskWithRequest:request 
      completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
       [data writeToFile:@"/var/tmp/tts.mp3" atomically:YES]; 
      } 
    ] resume]; 

...delegate:nil delegateQueue:[NSOperationQueue mainQueue]可以省略。

+0

它完美地工作。我知道我有多少次要对你说谢谢。你真的帮助我的问题很多。你是摇滚乐队! – a380 2011-05-17 06:19:44

+0

我在android上有类似的问题,并没有得到任何答案。你到底在做什么? – Amanni 2012-04-20 12:11:01

+0

您是否试图通过浏览器提出请求?谷歌回来的MP3? – Vassilis 2012-04-21 17:48:22