語音應用程式開發過程中,除了功能實作,更需關注使用者經驗。本文深入探討如何運用 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.txt 和 utils.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服務存取權的getS3PreSignedUrl,package.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 和除錯程式碼的應用,對於打造高品質的語音互動體驗至關重要,值得開發者深入研究和應用。