語音應用程式開發過程中,除了功能實作,更需關注使用者經驗。本文深入探討如何運用 SSML 增強語音互動的自然度和表現力,並以 Python 和 Node.js 為例,示範如何在開發階段加入除錯程式碼,有效追蹤程式碼執行流程,快速識別並解決潛在問題。同時,文章也介紹瞭如何利用 CloudWatch 日誌監控應用程式執行狀態,以及透過 AWS S3 presigned URL 機制,在保障安全性的前提下,提供外部使用者對 S3 儲存的臨時存取許可權,這對於語音應用程式處理音訊資源等場景至關重要。

3.4.3 語音合成標記語言(SSML)

SSML是一種用於控制語音輸出的標記語言。透過在輸出中使用“type”: “SSML”,開發者可以使用SSML標籤來定製語音助手的回應。例如:

"outputSpeech": {
  "type": "SSML",
  "ssml": "<speak>This speech uses SSML</speak>"
}

SSML標籤有很多種,包括:

  • audio:播放音訊檔案
  • break:提供暫停
  • emphasis:強調某些文字
  • voice:使用特定的語音來說話

以下是一些例子:

<audio src="soundbank://soundlibrary/bell/chimes/chimes_01"/>
<break time="2s"/>
<emphasis level="strong">I really like</emphasis> you
<voice name="Brian">I am a robot</voice>

使用SSML標籤可以使語音助手的回應更加自然和友好。

3.5 程式碼編輯

在編輯程式碼時,開發者需要修改HelloWorldIntent處理程式並新增一些除錯程式碼。例如,在Python中,可以修改以下程式碼:

#.ask (“add a reprompt if you want to keep the session open for the user to respond”)
.ask(Say Hello again)

在Node.js中,可以修改以下程式碼:

//.reprompt.
.remove the comment and add the following code:
.ask("Say Hello again")

這些修改可以使語音助手的回應更加自然和友好。

3.5.2 新增除錯程式碼

為了方便除錯,我們將新增幾行程式碼,以便觀察日誌訊息和除錯程式碼。除錯訊息會出現在 Cloudwatch 日誌中,詳見第 3.8 章。

使用 Python,在每個 speak_output 程式碼行之前新增以下兩行:

logger.info("In launch request")

logger.info("In hello world intent handler")

確保這兩行程式碼的縮排與 speak_output 程式碼相同。

Node.js 的修改請參考第 3.9 和 3.10 章,使用 console.log() 命令。

您的程式碼應該如下所示:

#...
logger.info("In launch request")
speak_output = "Hello, how can I help you today?"

#...
logger.info("In hello world intent handler")
speak_output = "Hello, World!"

您可以看到程式碼如何根據 JSON 訊息導向正確的程式。啟動請求包含了一個 "type": "LaunchRequest",這被 ask_utils.is_request_type("LaunchRequest")(handler_input) 捕捉到。

而 HelloWorldIntent 則被 ask_utils.is_intent_name("HelloWorldIntent")(handler_input) 捕捉到。

Node.js 的程式碼使用以下命令導向正確的程式:

return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';

return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
    && Alexa.getIntentName(handlerInput.requestEnvelope) === 'HelloWorldIntent';

我們將在下一章更詳細地介紹 Intents 和 handler_input

儲存並佈署您的程式碼。

3.6 測試您的程式碼

這次您可以說 “Hello” 多次。注意 Alexa 模擬器不會像真實裝置一樣超時。嘗試在裝置上測試。如果不工作,請確保開發者登入(和地區)與 Alexa 裝置上的登入(和地區)相同。

3.7 公用程式碼

在您的程式碼佈署期間,檢視其他兩個 Lambda Python 程式碼:requirements.txtutils.py(Node.js 函式在結尾描述):

requirements.txt 此檔案匯入我們需要的函式庫:

boto3==1.9.216
ask-sdk-core==1.11.0

我們將在後面的章節看到,boto3 用於建立、組態和管理 AWS 服務,例如 Amazon Simple Storage Service (Amazon S3)。另外,您可以搜尋 “Why is it called Boto3?"。

ask-sdk-core 提供了開發 Alexa 技能的 “boiler plate” 程式碼。我們將在後面的章節新增到 requirements.txt 中。

utils.py 此檔案中的 create_presigned_url 程式碼提供了暫時存取 S3 儲存(“buckets”)給沒有 AWS 認證或許可權的使用者的功能。我們將在後面章節中使用它。

3.8 除錯

當您測試過程式碼後,點選「程式碼」標籤,然後點選「CloudWatch 日誌」標籤。您可能需要使用下拉式選單來選擇您的區域,視您的位置而定。如果您選擇了錯誤的區域,您將會得到一個錯誤訊息:您也可能會被提示完成您的設定(語言和區域)以便CloudWatch 日誌正常運作。

最終,您應該會被導到CloudWatch 日誌頁面:從那裡,您可以從日誌串流中選擇您的日誌。這將顯示時間戳記和訊息。您可以看到我們新增的「啟動請求」和「Hello World」日誌。

3.9 Node.js 差異

主要的Node.js程式碼是index.js。它呼叫ask-sdk-core函式庫,並具有相同的意圖請求和處理常式。utils.js包含提供S3服務存取權的getS3PreSignedUrlpackage.json提供相依套件,而local-debugger.js指令碼已經棄用。

從使用者經驗視角來看,語音合成標記語言(SSML)和除錯程式碼的應用,顯著提升了語音助手回應的自然度和友好度。SSML標籤的多樣性,例如<audio><break><emphasis><voice>,賦予了開發者更精細的語音控制能力,能創造更豐富的互動體驗。然而,SSML標籤的學習曲線和不同平臺的相容性仍需考量,開發者需要根據實際情況選擇合適的標籤和應用策略。

分析程式碼的結構,可以看到清晰的邏輯流程,透過 ask_utils 函式庫有效地捕捉使用者請求,並導向對應的處理程式。Python 和 Node.js 版本的程式碼都展現了良好的模組化設計,易於理解和維護。新增除錯程式碼,例如 Python 的 logger.info() 和 Node.js 的 console.log(),能有效協助開發者追蹤程式碼執行狀態,提升開發效率。但需注意日誌訊息的安全性,避免敏感資訊洩露。

展望未來,隨著語音互動技術的持續發展,SSML的功能和應用場景將更加豐富。預期會有更多更具表現力的標籤出現,例如更精細的情緒控制和更自然的語音轉換。同時,除錯工具也將更加智慧化,提供更全面的程式碼分析和錯誤診斷功能。對於開發者而言,持續學習和掌握新的技術和工具至關重要,才能在競爭激烈的語音應用市場中保持領先地位。綜合評估,SSML 和除錯程式碼的應用,對於打造高品質的語音互動體驗至關重要,值得開發者深入研究和應用。