配置 MRCPv2 語音辨識器服務

除了使用 IBM® Speech to Text,另一種替代作法是配置 Voice Gateway部署,以便透過 MRCPv2 連線來連接協力廠商的語音辨識器服務。

連接至 MRCPv2 辨識器

  1. 複製或下載 GitHub 上的 sample.voice.gateway 儲存庫

  2. 在您的機器上,移至您所複製之 sample.voice.gateway 儲存庫所在的目錄,並開啟 mrcp/ 目錄,其中含有下列檔案:

    • docker-compose.yml - 具有 MRCPv2 之 Voice Gateway 的基本配置
    • tenantConfiguration.json - JSON 配置檔
  3. 開啟 unimrcpConfig/unimrcpclient.xml 配置檔。在 <server-ip> 欄位中,指定 MRCPv2 伺服器的 IP 位址。在 <ext-ip> 欄位中,指定 Media Relay 儲存器執行所在之機器的外部 IP 位址。

  4. docker-compose.yml 檔中,將 unimrcpclient.xml 檔裝載到 Media Relay 儲存器。

  5. tenantConfiguration.json 檔中,您可以指定將 MRCPv2 提供者用於語音辨識,作法是將 stt 配置 providerType 參數值設為 mrcpv2。您可以包含更多的配置欄位(例如:辨識器文法、MRCPv2 訊息標頭欄位),以進一步自訂您的部署。請參閱 MRCPv2 辨識器配置和程式設計模型

    "stt": {
    ...
     "providerType": "mrcpv2"
     ...
    }
    

    請謹記:如果您沒有指定 providerType,依預設,Voice Gateway 會使用 watson 參數。

  6. 若要快速著手進行,可以從您複製的 sample.voice.gateway GitHub 儲存庫,匯入 mrcp/sample-mrcp-conversation.json 檔。匯入之後,在 tenantConfiguration.json 檔中,指定您的 Watson Assistant 認證和工作區 ID。若想進一步瞭解如何匯入 JSON 檔案,請參閱配置 {{site.data.keyword.conversation}} 工作區

  7. 在您完成配置之後,請執行下列指令,以建立並啟動儲存器。

    docker-compose up
    

範例:使用 MRCPv2 的單一提供者配置

在下列範例中,配置了單一提供者,以使用 MRCPv2 連線來連接語音辨識器,而不使用 Speech to Text 服務實例。同樣地,會將單一和多重提供者配置的配置內容格式化,但是它們會使用不同的根層次內容。例如,單租戶提供者格式只需要 providerType,而多重提供者配置在根層次還包含了 providerSelectionPolicyproviders

  {
      "stt": {
  "providerType": "mrcpv2",
          "config": {
              "mrcpv2ProfileID": "MRCP #1",
              "recognizeHeaders": {
                  "Speech-Language": "en-US",
                  "Confidence-Threshold": 0.9
              },
              "recognizeBody": {
                  "contentType": "text/uri",
                  "body": "builtin:grammar/digits?language=en-us\nbuiltin:grammar/boolean?language=en-us"
              }
          },
    "bargeInResume": true
  }
  }

範例:使用 MRCPv2 的多重提供者配置

在下列範例中,多重提供者的格式化 JSON 配置檔中顯示了一個提供者。不像單一提供者配置,多重提供者配置在根層次還有 providerSelectionPolicyproviders

{
 "stt": {
  "providerSelectionPolicy" : "sequential",
    "providers": [
        {
        "name" : "mrcp-primary",
          "providerType": "mrcpv2",
          "config": {
            "mrcpv2ProfileID": "MRCP #1",
            "recognizeHeaders": {
              "Speech-Language": "en-US",
              "Confidence-Threshold": 0.9,
            },
            "recognizeBody": {
              "contentType": "text/uri",
              "body": "builtin:grammar/digits?language=en-us\nbuiltin:grammar/boolean?language=en-us"
            }
          },
    "bargeInResume": true
  }
  ]
  }
}

|

使用 MRCPv2 辨識器配置和文法來設計程式

您可以在 Voice Gateway 配置中使用配置變數和參數,來充分控制 MRCPv2 RECOGNIZE 要求的標頭和內文。

Speech to Text MRCPv2 配置變數的變更

在您配置 MRCPv2 語音辨識器時,Voice Gateway 最上層的 Speech to Text 配置會具有同等的值。

表 1. 可同時用於 MRCPv2 語音辨識器服務和 Speech to Text 服務的參數。
參數 說明
providerType 字串 定義語音提供者的類型,可以是 mrcpv2watson。預設值為 watson
credentials 認證 如果您使用 Speech to Text,且混合使用數個提供者,就必須指定。若為 MRCPv2 辨識器服務,則不需指定。
config WatsonSpeechToTextConfig/MrcpRecognizerConfig 必要。針對指定的文字轉語音提供者,定義配置。
connectionTimeout 浮點 選用。Voice Gateway 在與 Speech to Text 或辨識器服務建立 Socket 連線時,要等待的秒數。如果超過時間,Voice Gateway 會重新嘗試連接 Speech to Text 或辨識器服務。如果仍無法連到服務,則通話失敗。1.0.0.5 版及更新版本。
requestTimeout 浮點 選用。Voice Gateway 在與 Speech to Text 或辨識器服務建立語音辨識階段作業時,要等待的秒數。如果超過時間,Voice Gateway 會重新嘗試連接 Speech to Text 或辨識器服務。如果仍無法連到服務,則通話失敗。1.0.0.5 版及更新版本。
providers[] 字串 選用。語音提供者清單。

MRCPv2 辨識器的配置參數

以下是 mrcpv2 提供者配置專用的配置參數。

表 2. MRCPv2 語音辨識器專用的配置參數。
參數 說明
mrcpv2ProfileID 字串 MRCPv2 用戶端的設定檔 ID。原始 XML 配置文件可在 MRCPv2 用戶端配置手冊中找到。
recognizeHeaders JSON 物件 作為 MRCPv2 RECOGNIZE 要求標頭的名稱/值配對集合。
recognizeBody JSON 物件 指定辨識要求的內容內文。
  • contentType:要求內文的內容類型。例如:text/uriapplication/srgs+xml
  • body:放在要求中傳送的內文。

文法

針對 MRCPv2 進行程式設計時,通常意味著會使用文法。MRCPv2 語音辨識器會使用文法,來指定它要接聽的單字和型樣。一般而言,您可以使用行內文法外部文法內建文法,來指定用於語音辨識的文法。

行內文法

行內文法會明確定義在 Voice Gateway 的 vgwActSetSTTConfig 動作標籤中。若為發話端的簡短回應,就適合使用這些文法。例如,從 Watson Assistant 對話中,您可以透過 vgwActSetSTTConfig 動作標籤,來指定行內文法。

下列範例顯示一個方法,以使用 XML 格式(而非 JSON 格式)來指定文法。body 參數的值以單行出現,引號 " 則用來跳出,以符合配置的 JSON 格式。此外,在這個範例中,會指定 mergeOnce,以指示 Voice Gateway 使用指定給某一回交談的配置。

{
    "vgwAction": {
        "command": "vgwActSetSTTConfig",
        "parameters": {
            "updateMethod": "mergeOnce",
            "config": {
                "recognizeHeaders": {
                    "No-Input-Timeout": 10000
                },
                "recognizeBody": {
                    "contentType": "application/srgs+xml",
                    "body": "<grammar version=\"1.0\" xml:lang=\"en-US\" root=\"digits\"> <rule id=\"confirmations\"> <one-of> <item> affirmative </item> <item> nah </item> <item> no </item> <item> nope </item> <item> yeah </item> <item> yep </item> <item> yes </item> <item> yup </item> <item> fine </item> <item> negative </item> <item> OK </item> <item> sure </item> </one-of> </rule> </grammar>"
                }
            }
        }
    }
 }

外部文法

外部文法是指指定於外部檔案中的文法,並可利用外部 URI 參照來參照。您可以採清單形式將外部文法包含在 Watson Assistant 對話中。

在下列範例中,recognizeBody 將內容類型指定為 text/uri-list。此內容類型會指示MRCPv2 辨識器從所提供的 URI 清單(定義於 body 欄位中)提取文法。

{
    "vgwAction": {
        "command": "vgwActSetSTTConfig",
      "parameters": {
              "updateMethod": "mergeOnce",
      "config": {
        "recognizeBody": {
          "body": ["http://example-grammar-server.com/grammars/basic_grammar.xml", "file://grammars/example_file_system_grammar.xml"],
          "contentType": "text/uri-list"
        }
      }
    }
  }
}

內建文法

有些 MRCPv2 辨識器支援 built-in 文法,通常是指支援各種一般使用者輸入(例如:確認或數字)的文法。如果要使用 built-in 文法,您可以指定它們(如同外部文法一樣)。例如,您可以指定 MRCPv2 辨識器對於數字,是否要有內建文法。

在下列範例中,指定的文法 builtin:grammar/digits?language=en-US;length=9 指出發話端輸入了數字,且口述數字的長度必須符合 9

{
    "vgwAction": {
        "command": "vgwActSetSTTConfig",
      "parameters": {
              "updateMethod": "mergeOnce",
      "config": {
        "recognizeBody": {
          "body": ["builtin:grammar/digits?language=en-US;length=9"],
          "contentType": "text/uri-list"
        }
      }
    }
  }
}

處理辨識器結果

如果辨識順利完成,會以信任度最高的結果作為 Watson Assistant 各回交談的輸入。此外,會將 Voice Gateway 的 vgwSTTResponse 狀態變數設為產生的 JSON,這會包含其他替代方案清單,以及來自伺服器的原始回應。下列範例顯示,將 MRCPv2 辨識器的原始回應設為 vgwSTTResponse 環境定義狀態變數的 mrcpv2RecognizerResult 欄位。

{
  "vgwSTTResponse": {
    "warnings": "",
    "error": "",
    "mrcpv2RecognizerResult": "<?xml version='1.0'?><result><interpretation grammar=\"https:\/\/raw.githubusercontent.com\/WASdev\/sample.voice.gateway\/54e662f18e67c6935e8c8b815b89b57014a37494\/mrcp\/grammar-samples\/store-hours_query.xml\" confidence=\"0.76\"><input mode=\"speech\">Are you open on Sunday<\/input><instance><SWI_literal>Are you open on Sunday<\/SWI_literal><SWI_grammarName>https:\/\/raw.githubusercontent.com\/WASdev\/sample.voice.gateway\/54e662f18e67c6935e8c8b815b89b57014a37494\/mrcp\/grammar-samples\/store-hours_query.xml<\/SWI_grammarName><SWI_meaning>{SWI_literal:Are you open on Sunday}<\/SWI_meaning><\/instance><\/interpretation><interpretation grammar=\"https:\/\/raw.githubusercontent.com\/WASdev\/sample.voice.gateway\/54e662f18e67c6935e8c8b815b89b57014a37494\/mrcp\/grammar-samples\/store-hours_query.xml\" confidence=\"0.29\"><input mode=\"speech\">Are you open on Monday<\/input><instance><SWI_literal>Are you open on Monday<\/SWI_literal><SWI_grammarName>https:\/\/raw.githubusercontent.com\/WASdev\/sample.voice.gateway\/54e662f18e67c6935e8c8b815b89b57014a37494\/mrcp\/grammar-samples\/store-hours_query.xml<\/SWI_grammarName><SWI_meaning>{SWI_literal:Are you open on Monday}<\/SWI_meaning><\/instance><\/interpretation><\/result>",
    "results": [{
      "final": true,
      "alternatives": [{
        "transcript": "Are you open on Sunday",
        "confidence": "0.76"
      }, {
        "transcript": "Are you open on Monday",
        "confidence": "0.29"
      }]
    }]
  }
}

在不成功的辨識結果中,Voice Gateway 會將關鍵字當成使用者輸入 (vgwMrcpRecognitionUnsuccessful) 來傳送,以通知 Watson Assistant 辨識不成功。在範例中,是將 vgwMrcpRecognizerResponse 狀態變數設為 MRCPv2 辨識器的回應。

{
   "context": {
      "vgwMrcpRecognizerResponse": {
           "headers": {
                "Completion-Cause": "001 no-input-timeout"
            },
            "body": "<body of the recognition result>"
      }
   }

}

交談開發人員可以檢查 MRCPv2 辨識器的回應 vgwMrcpRecognizerResponse,以洞察辨識要求所發生的情況。如需完整的辨識完成原因清單,您可以探究 MRCPv2 RFC