原文地址
http://blog.csdn.net/dfman1978/article/details/78468318
前言
目前使用語(yǔ)音輸入越來(lái)越普遍驳阎。語(yǔ)音輸入不僅高效坐慰,而且更加自然,符合人類的輸入方式鲤孵。在這里開(kāi)發(fā)了一個(gè)匯率換算的 APP壶栋,展示了如何使用語(yǔ)音輸入和語(yǔ)音識(shí)別。
APP簡(jiǎn)介
這個(gè) APP可以識(shí)別用戶的輸入普监,然后返回結(jié)果贵试,并使用自然語(yǔ)言讀出來(lái)。
用戶可以點(diǎn)擊話筒圖標(biāo)凯正,進(jìn)行語(yǔ)音輸入:“1元人民幣兌換多少美元”毙玻。或者說(shuō)“350泰銖兌換多少人民幣”等等廊散。結(jié)果也會(huì)通過(guò)語(yǔ)音讀出來(lái)
功能實(shí)現(xiàn)
語(yǔ)音識(shí)別和語(yǔ)義理解都是通過(guò)Olami平臺(tái)來(lái)實(shí)現(xiàn)的桑滩。這個(gè)需要去Olami平臺(tái)進(jìn)行注冊(cè),然后就可以免費(fèi)試用了允睹。官網(wǎng)的地址https://olami.ai,網(wǎng)站上有豐富的教學(xué)資源具體的使用可以查看相關(guān)的文檔运准。OLAMI是由威盛電子(上海)有限公司人工智能軟件研發(fā)團(tuán)隊(duì)推出的一個(gè)人工智能軟件開(kāi)發(fā)平臺(tái),提供包括自然語(yǔ)音交互技術(shù)在內(nèi)的全方位人機(jī)交互解決方案缭受,覆蓋了眾多垂直領(lǐng)域的語(yǔ)義通用場(chǎng)景戳吝。
語(yǔ)音的讀取是使用了蘋果的AVSpeechSynthesis庫(kù)進(jìn)行的。這個(gè)庫(kù)的使用也很簡(jiǎn)單贯涎。這個(gè)庫(kù)是在AVFoundation中
由于 Olami平臺(tái)已經(jīng)對(duì)匯率的計(jì)算結(jié)果進(jìn)行了內(nèi)置計(jì)算,所以代碼里處理的就比較少了慢洋。代碼的主要是處理傳過(guò)來(lái)的json數(shù)據(jù)
- (void)onResult:(NSData *)result {
NSError *error;
__weak typeof(self) weakSelf = self;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:result
options:NSJSONReadingMutableContainers
error:&error];
if (error) {
NSSLog(@"error is %@",error.localizedDescription);
}else{
NSString *jsonStr=[[NSString alloc]initWithData:result
encoding:NSUTF8StringEncoding];
NSLog(@"jsonStr is %@",jsonStr);
NSString *ok = [dic objectForKey:@"status"];
if ([ok isEqualToString:@"ok"]) {
NSDictionary *dicData = [dic objectForKey:@"data"];
NSDictionary *asr = [dicData objectForKey:@"asr"];
if (asr) {//如果asr不為空塘雳,說(shuō)明目前是語(yǔ)音輸入
[weakSelf processASR:asr];
}
NSDictionary *nli = [[dicData objectForKey:@"nli"] objectAtIndex:0];
NSDictionary *desc = [nli objectForKey:@"desc_obj"];
int status = [[desc objectForKey:@"status"] intValue];
if (status != 0) {// 0 說(shuō)明狀態(tài)正常,非零為狀態(tài)不正常或者result為空
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"noresult" object:nil userInfo:nil]];
}else{
NSDictionary *semantic = [[nli objectForKey:@"semantic"]
objectAtIndex:0];
NSString *result = [desc objectForKey:@"result"];
[self.delegate onResult:result];
}
}else{
}
}
}
結(jié)果是放在 result字段中
{
"data": {
"asr": {
"result": "三百九十八港幣是多少人民幣",
"speech_status": 0,
"final": true,
"status": 0
},
"nli": [
{
"desc_obj": {
"result": "您要查找的信息:398港幣兌換338.22040人民幣",
"source_currency": "398港幣",
"status": 0
},
"data_obj": [
{
"target_currency": "338.22040人民幣"
}
],
"type": "exchangerate"
}
]
},
"status": "ok"
}
把這個(gè)字段中的值傳出來(lái)就行了
具體的代碼可以參考 GitHub