使用OLAMISDK實現一個語音輸入數字進行24點計算的iOS程式

来源:http://www.cnblogs.com/yanminli/archive/2017/09/24/7588268.html
-Advertisement-
Play Games

在目前的軟體應用中,輸入方式還是以文字輸入方式為主,但是語音輸入的方式目前應用的越來越廣泛。這是一個利用 Olami SDK 編寫的一個24點iOS程式,是通過語音進行輸入。 Olami SDK的介紹在下麵這個網址 https://cn.olami.ai/wiki/?mp=sdk&content... ...


前言

在目前的軟體應用中,輸入方式還是以文字輸入方式為主,但是語音輸入的方式目前應用的越來越廣泛。這是一個利用 Olami SDK 編寫的一個24點iOS程式,是通過語音進行輸入。 
Olami SDK的介紹在下麵這個網址 
https://cn.olami.ai/wiki/?mp=sdk&content=sdk/ios/reference.html 
在這個網址中詳細的介紹了Olami SDK包含了那些函數和定義的委托。

App實現

下麵就通過24點這個程式來介紹一下如何使用這個SDK。 
這個APP可在 https://github.com/lym-ay/OlamiRecognizerMath24 下載

這裡寫圖片描述

  1. 去上面的網址下載Olami SDK.包括兩個文件,其中的一個是Olami的靜態函數庫,一個是其頭文件 
    第一步是初始化Olami的語音識別對象,並設置代理
olamiRecognizer= [[OlamiRecognizer alloc] init];
olamiRecognizer.delegate = self;

2.調用setAuthorization函數進行授權

[olamiRecognizer setAuthorization:@"d13bbcbef2a4460dbf19ced850eb5d83"
    api:@"asr" appSecret:@"3b08b349c0924a79869153bea334dd86" cusid:OLACUSID];

這個函數的參數的說明在OlamiRecognizer中有說明,也可以去線上API說明去查看 
https://cn.olami.ai/wiki/?mp=sdk&content=sdk/ios/reference.html 
有些參數必須去Olami的開發平臺上註冊才可以獲的,網址是https://olami.ai,註冊登陸以後創建應用才可以看到了 
這裡寫圖片描述

3.設置語系

[olamiRecognizer setLocalization:LANGUAGE_SIMPLIFIED_CHINESE];

在進行錄音之前必須要先進行設置,否則會得不到結果。目前只支持簡體中文(LANGUAGE_SIMPLIFIED_CHINESE)

4.開始錄音 
調用 start()介面開始進行錄音

[olamiRecognizer start];

5.得到錄音的文字和語義,並對其進行處理 
通過調用stop()函數或者自動停止,都會獲得錄音的文字和對其進行的語義分析的結果 
實現OlamiRecognizerDelegate onResult函數可以獲得結果,其結果以一個json字元串的形式回調過來,對這個字元串進行解析,就可以獲得想要的數字。例如對著話筒說”2345算24點”,得到的結果如下

{
    "data": {
        "asr": {
            "result": "二 三 四 五 算 二 十 四 點",
            "speech_status": 0,
            "final": true,
            "status": 0
        },
        "nli": [
            {
                "desc_obj": {
                    "status": 0
                },
                "semantic": [
                    {
                        "app": "math24",
                        "input": "二三四五算二十四點",
                        "slots": [
                            {
                                "num_detail": {
                                    "recommend_value": "",
                                    "type": "number"
                                },
                                "name": "number3",
                                "value": "4"
                            },
                            {
                                "num_detail": {
                                    "recommend_value": "",
                                    "type": "number"
                                },
                                "name": "number4",
                                "value": "5"
                            },
                            {
                                "num_detail": {
                                    "recommend_value": "",
                                    "type": "number"
                                },
                                "name": "number1",
                                "value": "2"
                            },
                            {
                                "num_detail": {
                                    "recommend_value": "",
                                    "type": "number"
                                },
                                "name": "number2",
                                "value": "3"
                            }
                        ],
                        "modifier": [
                            "play_calculate"
                        ],
                        "customer": "58df685e84ae11f0bb7b4893"
                    }
                ],
                "type": "math24"
            }
        ]
    },
    "status": "ok"
}

這個是根據OSL語法描述語言定義的一套規則,返回的結果。這個結果的說明在 https://cn.olami.ai/wiki/?mp=api_nlu&content=api_nlu3.html 這個網址上有說明。

看到這裡大家可能會有疑惑,APP怎麼知道我說的是什麼意思呢?這就涉及到了OSL語法描述語言,OLAMI 語法描述語言(OLAMI Syntax Language,簡稱:OSL)是 OLAMI 平臺針對自然語言處理所發展出的獨特語法標記語言,自然語言語義互動(Natural Language Interaction, 簡稱:NLI)管理系統採用 OSL 取代複雜的編碼編程,使用簡單、容易學習而且靈活有彈性。可以在這個網址查看詳細的說明 
https://cn.olami.ai/wiki/?mp=osl&content=osl1.html 
在編寫這個APP之前,會按照OSL的要求編寫好一套語法,這套語法可以被Olami的伺服器所理解,併進行語義分析然後給出結果,就是上面的json字元串。在Olami官網上有寫好的一些領域的模塊,可以直接使用。在 https://cn.olami.ai/wiki/?mp=nli&content=nli1.html 網址可以看到介紹如何使用以後的模塊。這個24點就是利用已有的模塊來編寫代碼的。

6.創建應用,設置和導入grammar 
首先去olami的主頁去登陸和註冊。登陸以後轉到這頁面 
這裡寫圖片描述
在這個頁面可以看到我的應用 math24,還可以查看key

當然這個頁面必須創建應用以後才有,點擊“創建新應用”,轉到下麵這個頁面 
這裡寫圖片描述

填寫 應用名稱,應用描述,應用介紹以後,就可以創建了。回到上一個頁面,就可以看到創建的應用了。

點擊”進入NLI系統”就可以進入模塊頁面 
這裡寫圖片描述

在官網已經內置了很多領域的grammar.在模塊頁面大家點擊“導入”按鈕,查看已有領域的模塊 
這裡寫圖片描述

選擇一個要使用的,例如我要導入”math24”這個模塊,先選擇它,點擊“導入” 按鈕 
這裡寫圖片描述 
這裡寫圖片描述

然後進入 math24模塊,就可以看到例句

這裡寫圖片描述

但是這個時候還是不能使用,需要先進行發佈。點擊頁面上方的”發佈”按鈕,進入發佈頁面

這裡寫圖片描述

點擊“發佈”按鈕

這裡寫圖片描述

發佈成功,現在就可以使用24模塊了。

Olami還提供了測試grammar的功能,點擊“測試”按鈕,可以在頁面進行測試,而不必要先開發APP 
這裡寫圖片描述

最後還要回到“我的應用”界面,點擊”配置NLI模塊”按鈕,讓自己創建的應用和模塊關聯起來 
這裡寫圖片描述

7.onResult 函數的說明 
在整個程式中,最主要的一個函數就是onResult函數

- (void)onResult:(NSData *)result {
    NSError *error;
    __weak typeof(self) weakSelf = self;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:result
                        options:NSJSONReadingMutableContainers
                        error:&error];
    if (error) {
        NSLog(@"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不為空,說明目前是語音輸入
                [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 說明狀態正常,非零為狀態不正常
                NSString *result  = [desc objectForKey:@"result"];
                dispatch_async(dispatch_get_main_queue(), ^{
                    _resultTextView.text = result;
                });

            }else{
                NSDictionary *semantic = [[nli objectForKey:@"semantic"]
                                         objectAtIndex:0];
                [weakSelf processSemantic:semantic];

            }

        }else{
            dispatch_async(dispatch_get_main_queue(), ^{
                _resultTextView.text = @"請說出10以內的4個數";
            });
        }
    }



}

這個函數就是對傳過來的結果進行處理

在這個函數中,調用了三個函數,分別來處理josn格式中的三個比較重要的節點

- (void)processASR:(NSDictionary*)asrDic {
    NSString *result  = [asrDic objectForKey:@"result"];
    if (result.length == 0) { //如果結果為空,則彈出警告框
        UIAlertController *alertController = [UIAlertController
                                              alertControllerWithTitle:@"沒有接受到語音,請重新輸入!"
                                              message:nil
                                              preferredStyle:UIAlertControllerStyleAlert];
        [self presentViewController:alertController animated:YES completion:^{
            dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, 1*NSEC_PER_SEC);
            dispatch_after(time, dispatch_get_main_queue(), ^{
                [alertController dismissViewControllerAnimated:YES completion:nil];

            });

        }];

    }else{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSString *str = [result stringByReplacingOccurrencesOfString:@" " withString:@""];//去掉字元中間的空格
            _inputTextView.text = str;
        });
    }

}

這個用來處理ASR節點,獲得語音識別的結果,如果沒有結果,則彈出一個對話框進行提示。ASR識別的文字顯示在第一個TextView中

- (void)processSemantic:(NSDictionary*)semanticDic {
    NSArray *slot = [semanticDic objectForKey:@"slots"];
    [_slotValue removeAllObjects];
    if (slot.count != 0) {
        for (NSDictionary *dic in slot) {
            NSString* val = [dic objectForKey:@"value"];
            [_slotValue addObject:val];
        }

    }

    NSArray *modify = [semanticDic objectForKey:@"modifier"];
    if (modify.count != 0) {
        for (NSString *s in modify) {
            [self processModify:s];

        }

    }

}

這個用來處理Semantic節點,這個節點中包含了slot的值和modifier的值。OSL 語法描述語言中的 slot 可理解為語義中的變數,用於傳遞、提取信息,是代碼處理的數據的來源。對於24點這個程式來說,就是進行計算的4的數的來源。關於slot的值可以參考 https://cn.olami.ai/wiki/?mp=osl&content=osl_slot.html,這裡有詳細說明。在24點程式中我們的要計算的數字就是從這裡獲得的。

- (void)processModify:(NSString*) str {
    if ([str isEqualToString:@"play_want"]
        || [str isEqualToString:@"play_want_ask"]
        || [str isEqualToString:@"needmore"]
        || [str isEqualToString:@"needmore_ask"]) {//要求用戶輸入值
        dispatch_async(dispatch_get_main_queue(), ^{
            _resultTextView.text = @"請說出10以內的4個數";
        });
    }else if ([str isEqualToString:@"rules"]){
        dispatch_async(dispatch_get_main_queue(), ^{
            _resultTextView.text = @"四個數字運算結果等於二十四";
        });

    }else if ([str isEqualToString:@"play_calculate"]){
        NSString* str = [[Math24 shareInstance] calculate:_slotValue];
        dispatch_async(dispatch_get_main_queue(), ^{
            _resultTextView.text = str;
        });

    }else if ([str isEqualToString:@"attention"]){
        dispatch_async(dispatch_get_main_queue(), ^{
            _resultTextView.text = @"四個數字必須是10以內的,不能超過10";
        });
    }

}

這個用來處理語音和語義的結果。這個函數主要是處理json字元串中的modifier節點。modifier 語法描述規則是 OSL 語法描述語言中,除了 slot 以外的另一種內置的信息傳遞機制,一般用來表示語義目的,也可以理解為對於語義的一種註釋方式,以便讓應用程式的開發者得知 grammar 所代表的相應意圖。詳細說明參考 
https://cn.olami.ai/wiki/?mp=osl&content=osl_regex.html#11,通過modifier,我們才能知道程式的意圖是什麼?例如是想發問,還是計算結果。

如上代碼所示,在24點鐘我們定義了7個modifier,根據字面意思大家也可以猜出來。這些都可以在OSL語法中自定義,然後通過Josn字元串獲得,在程式中進行處理。這個是我們程式進行處理的一個判斷機制。

下載資源

可以在csdn下載頻道下載 
http://download.csdn.net/detail/dfman1978/9840447

github 
https://github.com/lym-ay/OlamiRecognizerMath24

另外這裡還有幾篇使用Olami SDK開發程式的文章

這個是一個聽書的程式 
http://blog.csdn.net/ls0609/article/details/71519203

這個是一個關於天氣的程式 
http://blog.csdn.net/zhangxy0605/article/details/71601604

這是一個根據OLAMI平臺開發的日曆demo 
http://blog.csdn.net/xinfinityx/article/details/72840977


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近很久沒有更新博客了,因為一直在學習前端h5 手機app的開發。曾經一度覺得自己css和js學得不錯,進入到前端領域後才發現水很深~,寫代碼時HBuilder和VS混用,HBuilder的快捷鍵和代碼提示以及真機調試方便,但是錯誤提示和代碼格式化是硬傷,VS的前端報錯提示很智能,代碼格式化很順暢, ...
  • 9月份蘋果發佈了IOS11和Iphone X,這一操作系統一硬體對於開發者適配上面還是造作了不少蛋疼的地方。先來看看IOS 11,這些蛋疼的需要適配的地方: 1、UIScrollView及其子類在IOS 11之前的版本UI顯示完全正常,但是在IOS 11上面會顯示奇葩的界面。 (1)先看一下UITa ...
  • 前提 眾所周知,開發iOS應用必須要有iOS證書(Certificates)和配置文件(Provisioning Profiles),那麼問題來了: 1.什麼是iOS證書,它是如何與app應用關聯的?2.iOS開發證書和生產證書有何區別,如何使用的?3.證書與配置文件(Provisioning Pr ...
  • 在該項目包名時遇到的一個android打包問題,如下 改包名步驟 1. 修改android/app/build.gradle里的applicationId,為新包名,如:com.xxx.yyy.myProject 2. 修改android/app/src/main/AndroidManifest.x ...
  • Android 8.0 為用戶和開發者引入多種新功能。本文重點介紹面向開發者的新功能。 用戶體驗 通知 在 Android 8.0 中,我們已重新設計通知,以便為管理通知行為和設置提供更輕鬆和更統一的方式。這些變更包括: 通知渠道:Android 8.0 引入了通知渠道,其允許您為要顯示的每種通知類 ...
  • 1. UIStackView相關屬性理解 UIStackView是iOS9之後推出的,我也是第一次接觸,在學習的過程中對於其中的相關屬性,尤其是對其中的distribution幾個屬性值,一知半解的,所以特寫此文通過代碼實例理解它們每個屬性的區別。 UIStackView主要包括了四大屬性:axis ...
  • 多渠道打包: 可以理解為:同時發佈多個渠道的apk。分別上架不同的應用商店。這些apk帶有各自渠道的標簽,用於統計分析各個商店的下載次數等數據。 實現步驟 一、添加友盟渠道標簽 添加位置:app目錄下的 AndroidManifest.xml文件 添加語句: 示例: 二、添加渠道 添加幾個,打包的時 ...
  • Https系列會在下麵幾篇文章中分別作介紹: 一:https的簡單介紹及SSL證書的生成二:https的SSL證書在伺服器端的部署,基於tomcat,spring boot三:讓伺服器同時支持http、https,基於spring boot四:https的SSL證書在Android端基於okhttp ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...