bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

利用OlamiSDK實(shí)現(xiàn)語(yǔ)音控制計(jì)算器(iOS)

博客鏈接:http://blog.csdn.net/scarlettzhao0602/article/details/76576836

十載的鶴壁網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整鶴壁建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“鶴壁網(wǎng)站設(shè)計(jì)”,“鶴壁網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。


一、簡(jiǎn)介: 
Olami Calculator是一款在鍵盤(pán)輸入算式的普通計(jì)算器的基礎(chǔ)上,增加了支持語(yǔ)音控制輸入算式輸出結(jié)果的人工智能計(jì)算器。此外還增加了多種動(dòng)畫(huà)效果,計(jì)算結(jié)果提示音功能,多元化主題換膚功能,以及保存計(jì)算公式,側(cè)滑欄查看收藏記錄等功能。網(wǎng)上也有許多語(yǔ)音計(jì)算器,但是打開(kāi)看,只是添加了按鈕提示音等,并不能識(shí)別我們對(duì)著計(jì)算器說(shuō)的內(nèi)容,而Olami Calculator可以實(shí)現(xiàn)不用手動(dòng)敲擊鍵盤(pán),只需要把想知道結(jié)果的算式對(duì)著語(yǔ)音計(jì)算器說(shuō)出來(lái),例如三加四乘五、清空等,然后Olami會(huì)根據(jù)自己的一套語(yǔ)音識(shí)別系統(tǒng)幫我們準(zhǔn)確識(shí)別出來(lái)。真正做到一款語(yǔ)音控制的計(jì)算器。 

二、界面直觀化展示 
  利用Olami SDK 實(shí)現(xiàn)語(yǔ)音控制計(jì)算器(iOS) 

四、代碼處實(shí)現(xiàn)

先來(lái)看下OlamiRecognizer.h為我提供了哪些接口

 *返回結(jié)果
 */
-(void)onResult:(NSData*)result;/*
 *取消本次會(huì)話
 */-(void)onCancel;/*
 *識(shí)別失敗
 */-(void)onError:(NSError *)error;/*
 *音量的大小 音頻強(qiáng)度范圍時(shí)0到100
 */-(void)onUpdateVolume:(float) volume;/***
 *開(kāi)始錄音
 */-(void)onBeginningOfSpeech;/**
 *結(jié)束錄音
 *
 */-(void)onEndOfSpeech;@endtypedef NS_ENUM(NSInteger, LanguageLocalization) {
    LANGUAGE_SIMPLIFIED_CHINESE = 0, //簡(jiǎn)體中文
    LANGUAGE_TRADITIONA_CHINESE = 1  //繁體中文};@interface OlamiRecognizer : NSObject@property (nonatomic,weak) id<OlamiRecognizerDelegate> delegate;@property (nonatomic, assign,readonly) BOOL isRecording;//是否正在錄音-(void)start;//開(kāi)始錄音-(void)stop;//結(jié)束錄音,開(kāi)始識(shí)別-(void)cancel;//取消本次回話/**
 *設(shè)置語(yǔ)系的選項(xiàng),目前只支持一種,簡(jiǎn)體中文
 */-(void)setLocalization:(LanguageLocalization) location;/**
 *CUSID;//終端用戶標(biāo)識(shí)id,用來(lái)區(qū)分各個(gè)最終用戶 例如:手機(jī)的IMEI
 *appKey;//創(chuàng)建應(yīng)用的appkey
 *api;//要調(diào)用的API類(lèi)型。現(xiàn)有3種:語(yǔ)義(nli)和分詞(seg)和語(yǔ)音(asr)
 *appSecret;//加密的秘鑰,由應(yīng)用管理自動(dòng)生成
 */-(void)setAuthorization:(NSString*)appKey api:(NSString*)api appSecret:(NSString*)appSecret cusid:(NSString*)CUSID;
-(void)setVADTimeoutFrontSIL:(unsigned int)value;//設(shè)置VAD前端點(diǎn)超時(shí)范圍 1000~~10000(ms) 默認(rèn)3000-(void)setVADTimeoutBackSIL:(unsigned int)value;//設(shè)置VAD后端點(diǎn)超時(shí)范圍  1000~~10000(ms) 默認(rèn)2000-(void)setInputType:(int) type;//設(shè)置是語(yǔ)音輸入還是文字輸入 0 為語(yǔ)音 1為文字輸入-(void)setLatitudeAndLongitude:(double) latitude longitude:(double)longit;//設(shè)置地理位置,參數(shù)為經(jīng)緯度-(void)sendText:(NSString*)text;//發(fā)送輸入的文字

項(xiàng)目中,首先 初始化Olami語(yǔ)音識(shí)別對(duì)象并設(shè)置代理

 /**
 *CUSID;//終端用戶標(biāo)識(shí)id,用來(lái)區(qū)分各個(gè)最終用戶 例如:手機(jī)的IMEI
 *appKey;//創(chuàng)建應(yīng)用的appkey
 *api;//要調(diào)用的API類(lèi)型。現(xiàn)有3種:語(yǔ)義(nli)和分詞(seg)和語(yǔ)音(asr)
 *appSecret;//加密的秘鑰,由應(yīng)用管理自動(dòng)生成
 */#define AppKey @""http://查看自己的#define AppSecret @""#define macID @""-(void)setupOLAMI{
    _olamiRecognizer= [[OlamiRecognizer alloc] init];
    _olamiRecognizer.delegate = self;//此處為OlamiRecognizerDelegate

    [_olamiRecognizer setAuthorization:AppKey api:@"asr" appSecret:AppSecret cusid:macID];    //設(shè)置語(yǔ)言,目前只支持中文
    [_olamiRecognizer setLocalization:LANGUAGE_SIMPLIFIED_CHINESE];

}12345678910111213141516171819201234567891011121314151617181920

設(shè)置一個(gè)錄音鍵

#pragma mark --錄音鍵- (IBAction)recordButton:(UIButton *)sender {    //設(shè)置為語(yǔ)音模式(代理方法:0為語(yǔ)音)
    [_olamiRecognizer setInputType:0];    //開(kāi)始錄音
    if (_olamiRecognizer.isRecording) {//isRecording = YES 即為錄音模式
        [_olamiRecognizer stop];//代理方法
        [_recordButton setImage:[UIImage p_w_picpathNamed:@"話筒4.png"] forState:UIControlStateNormal];

    }else{
        [_olamiRecognizer start];//代理方法

        [_recordButton setImage:[UIImage p_w_picpathNamed:@"話筒7.png"] forState:UIControlStateNormal];
        [_recordButton.layer addAnimation:[self shine] forKey:@"shine"];//添加一個(gè)動(dòng)畫(huà)
    }
}//發(fā)光動(dòng)畫(huà)- (CABasicAnimation *)shine{
    CABasicAnimation *animation =[CABasicAnimation animationWithKeyPath:@"shine"];
    animation.fromValue = [NSNumber numberWithFloat:1.0f];
    animation.toValue = [NSNumber numberWithFloat:0.0f];
    animation.autoreverses = YES;
    animation.duration = 0.5;
    animation.repeatCount = MAXFLOAT;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];    return animation;
}#pragma mark -- 錄音結(jié)束(代理方法)- (void)onEndOfSpeech {
    [_recordButton setImage:[UIImage p_w_picpathNamed:@"話筒4.png"] forState:UIControlStateNormal];
    [_recordButton.layer removeAnimationForKey:@"shine"];
}

識(shí)別音量

#pragma mark--NLU delegate
- (void)onUpdateVolume:(float)volume {    if (_olamiRecognizer.isRecording) {
        _waveView.present = volume/100;
    }
}

waveview: 根據(jù)sin函數(shù) y=Asin(ωx+φ)+b    //e.g.:1.
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGMutablePathRef path = CGPathCreateMutable();

    CGContextSetLineWidth(context, 3);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetAllowsAntialiasing(context, true);
    CGContextSetRGBStrokeColor(context, 124 / 255.0, 145 / 255.0, 155 / 255.0, 1.0);  
    CGContextBeginPath(context);    float y= (1 - _present) * rect.size.height;

    CGPathMoveToPoint(path, NULL, -10, y);    for(float x=0;x<=rect.size.width;x++){
        y=  sin( 3*x/rect.size.width * M_PI + moveX/rect.size.width *M_PI ) *maxA + _currentLinePointY;
        CGPathAddLineToPoint(path, nil, x, y);
    }

    CGContextAddPath(context, path);

    CGContextDrawPath(context, kCGPathStroke);
    CGPathRelease(path);

界面差不多就這些,主要是看返回來(lái)的result 
調(diào)用代理這個(gè)方法-(void)onResult:(NSData*)result; 其語(yǔ)義分析后的結(jié)果以一個(gè)json字符串的形式回調(diào)過(guò)來(lái),對(duì)這個(gè)字符串進(jìn)行解析,就可以獲得想要的變量。

#pragma mark --返回結(jié)果- (void)onResult:(NSData *)result {    NSError *error;
    __weak typeof(self) weakSelf = self;    if (error) {        NSLog(@"error is %@",error.localizedDescription);
    }else{        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:result
                                                            options:NSJSONReadingMutableContainers
                                                              error:&error];        NSLog(@"json=%@",json);        if ([json[@"status"] isEqualToString:@"ok"]) {            NSDictionary *asr = [json[@"data"] objectForKey:@"asr"];            //如果asr不為空,說(shuō)明目前是語(yǔ)音輸入
            if (asr) {
                [weakSelf processASR:asr];
            }            NSDictionary *nli = [[json[@"data"] 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)不正常
                NSString *result  = [desc objectForKey:@"result"];                dispatch_async(dispatch_get_main_queue(), ^{
                    _resultLabel.text = result;//輸出不正常提示
                    _resultLabel.font = [UIFont systemFontOfSize:20];
                    [_resultLabel startAnimation];

                    _showTextView.text = asr[@"result"];
                    AudioServicesPlaySystemSound (soundID);
                });

            }else{                NSDictionary *semantic = [[nli objectForKey:@"semantic"]
                                          objectAtIndex:0];                //對(duì)slot和算式的處理結(jié)果
                [weakSelf processSemantic:semantic asr:asr];                //處理modifier
                NSArray *modifierArr = [semantic objectForKey:@"modifier"];

                [weakSelf processModifier:modifierArr result:desc[@"result"]];
            }


        }else{
            _showTextView.text = @"請(qǐng)說(shuō)出要計(jì)算的公式";
        }
    }

}#pragma mark --處理ASR語(yǔ)音對(duì)話節(jié)點(diǎn)- (void)processASR:(NSDictionary*)asrDic {    NSString *result  = [asrDic objectForKey:@"result"];    if (result.length == 0) { //如果結(jié)果為空,則彈出警告框
        [self showAlert:@"沒(méi)有接受到語(yǔ)音,請(qǐng)重新輸入!"];        return;
    }else{        dispatch_async(dispatch_get_main_queue(), ^{            NSString *str = [result stringByReplacingOccurrencesOfString:@" " withString:@""];//去掉字符中間的空格
            NSLog(@"answer result = %@",str);
        });
    }
}//處理semantic節(jié)點(diǎn)返回的slot - (void)processSemantic:(NSDictionary*)semanticDic asr:(NSDictionary *)asr {    NSMutableArray *sumArr = [NSMutableArray array];    for (NSDictionary *dic in semanticDic[@"slots"]) {        NSString *nameStr = dic[@"name"];    //遍歷,然后把slot添加到數(shù)組里
    NSString *textStr = [[sumArr componentsJoinedByString:@","] stringByReplacingOccurrencesOfString:@"," withString:@""];    NSLog(@"textstr=%@",textStr);    if (![textStr isEqualToString:@""]) {
        _passString = [self replaceInputStrWithPassStr:textStr];        if (asr) {
            _lastAnswer = _resultLabel.text;//語(yǔ)音記錄上一次記錄
        }else{
            _lastAnswer = @"";
        }        //第一次運(yùn)算或者不再加
        if ([_lastAnswer isEqualToString:@"error"]||[_lastAnswer isEqualToString:@""]) {            if (asr) {                dispatch_async(dispatch_get_main_queue(), ^{
                    _showTextView.text = [[textStr stringByReplacingOccurrencesOfString:@"2√" withString:@"√"] stringByAppendingString:@"="];//計(jì)算公式
                });
                textStr = [_calcultor calculatingWithString:_passString andAnswerString:@"0"];
            }else{
                textStr = [_calcultor calculatingWithString:_passString andAnswerString:@"0"];
            }        //有結(jié)果考慮再運(yùn)算的步驟
        }else{            //有結(jié)果再運(yùn)算的情況
            UniChar c = [_passString characterAtIndex:0];            if (c =='-'|| c == '+'||c == 'x'||c =='/')
            {                dispatch_async(dispatch_get_main_queue(), ^{
                    _showTextView.text = [[_lastAnswer stringByAppendingString:[textStr stringByReplacingOccurrencesOfString:@"2√" withString:@"√"]] stringByAppendingString:@"="];//計(jì)算公式
                });

                textStr = [_calcultor calculatingWithString:[_lastAnswer stringByAppendingString:_passString] andAnswerString:@"0"];//
            }            //有結(jié)果但是不想再運(yùn)算
            else{                dispatch_async(dispatch_get_main_queue(), ^{
                    _showTextView.text = [[textStr stringByReplacingOccurrencesOfString:@"2√" withString:@"√"] stringByAppendingString:@"="];//計(jì)算公式
                });
                textStr = [_calcultor calculatingWithString:_passString andAnswerString:@"0"];
            }

        }        dispatch_async(dispatch_get_main_queue(), ^{
                AudioServicesPlaySystemSound (soundID1);

                _resultLabel.font = [UIFont systemFontOfSize:50.0];
                _resultLabel.text = textStr;
        });

        [_resultLabel startAnimation];
    }
}

后臺(tái)返回:語(yǔ)音內(nèi)容是顯示在asr字段里,大家可能會(huì)有疑問(wèn)后臺(tái)怎么識(shí)別的我們語(yǔ)音的內(nèi)容,這是由于我們之前在olami平臺(tái)創(chuàng)建新應(yīng)用后導(dǎo)入了一套識(shí)別相應(yīng)內(nèi)容的grammar,這樣olami的語(yǔ)義解析功能會(huì)為我們自動(dòng)識(shí)別出想要得到的變量?jī)?nèi)容。

比如我說(shuō):3+6乘九等于幾? 
對(duì)應(yīng)grammar語(yǔ)法:[<再>][<數(shù)字一>]<符號(hào)一><數(shù)字二><符號(hào)二><數(shù)字三>[<結(jié)果>|<等于>] 
返回結(jié)果:

json={    data =     {        asr =         {            final = 1;            result = "\U4e09\U52a0\U516d\U4e58\U4e5d\U7b49\U4e8e\U51e0";
            "speech_status" = 0;            status = 0;
        };
        nli =         (
                        {                "desc_obj" =                 {
                    status = 0;
                };
                semantic =                 (
                                        {
                        app = calculator;
                        customer = 59530feb84aea6f385319c65;
                        input = "\U4e09\U52a0\U516d\U4e58\U4e5d\U7b49\U4e8e\U51e0";
                        modifier =                         (
                        );
                        slots =                         (
                                                        {
                                name = number3;                                "num_detail" =                                 {                                    "recommend_value" = 9;                                    type = float;
                                };
                                value = "\U4e5d";
                            },
                                                        {
                                name = number1;                                "num_detail" =                                 {                                    "recommend_value" = 3;                                    type = float;
                                };
                                value = "\U4e09";
                            },
                                                        {
                                name = number2;                                "num_detail" =                                 {                                    "recommend_value" = 6;                                    type = float;
                                };
                                value = "\U516d";
                            },
                                                        {
                                name = symbol1;
                                value = "+";
                            },
                                                        {
                                name = symbol2;
                                value = x;
                            }
                        );
                    }
                );                type = calculator;
            }
        );
    };
    status = ok;
}

再加三等于幾? 
對(duì)應(yīng)grammar:[<再>][<數(shù)字一>][<符號(hào)一>][<數(shù)字二>][<結(jié)果>|<等于>] 、 
后臺(tái)返回json字段:

json={    data =     {        asr =         {            final = 1;            result = "\U518d\U52a0\U4e09\U7b49\U4e8e\U51e0";
            "speech_status" = 0;            status = 0;
        };
        nli =         (
                        {                "desc_obj" =                 {
                    status = 0;
                };
                semantic =                 (
                                        {
                        app = calculator;
                        customer = 59530feb84aea6f385319c65;
                        input = "\U518d\U52a0\U4e09\U7b49\U4e8e\U51e0";
                        modifier =                         (
                        );
                        slots =                         (
                                                        {
                                name = again;
                                value = a;
                            },
                                                        {
                                name = number2;                                "num_detail" =                                 {                                    "recommend_value" = 3;                                    type = float;
                                };
                                value = "\U4e09";
                            },
                                                        {
                                name = symbol1;
                                value = "+";
                            }
                        );
                    }
                );                type = calculator;
            }
        );
    };
    status = ok;
}

計(jì)算過(guò)程:涉及到算法,數(shù)據(jù)結(jié)構(gòu)堆棧問(wèn)題,大概思路設(shè)置優(yōu)先級(jí),設(shè)置兩個(gè)棧,一個(gè)數(shù)據(jù)棧,一個(gè)運(yùn)算符棧,在運(yùn)算符棧底添加#方便處理。獲取表達(dá)式第一個(gè)元素如果是數(shù)據(jù)添加到數(shù)據(jù)棧中,元素如果是運(yùn)算符,那么每次都要跟運(yùn)算符棧定元素比較優(yōu)先級(jí),如果取得的運(yùn)算符的優(yōu)先級(jí)大于棧頂元素優(yōu)先級(jí)時(shí),該運(yùn)算符直接進(jìn)棧,優(yōu)先級(jí)不大的話,就要取棧頂運(yùn)算符優(yōu)先運(yùn)算,最后碰到#停止。如果有記憶上一輪結(jié)果的話,結(jié)果需要放到數(shù)據(jù)棧棧進(jìn)行下一次處理

代碼下載地址:https://github.com/zhaoshihui/calculator_olami_ios.git

標(biāo)題名稱:利用OlamiSDK實(shí)現(xiàn)語(yǔ)音控制計(jì)算器(iOS)
文章網(wǎng)址:http://vcdvsql.cn/article10/pejjdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站網(wǎng)站導(dǎo)航網(wǎng)站內(nèi)鏈軟件開(kāi)發(fā)搜索引擎優(yōu)化網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)