iT邦幫忙

2025 iThome 鐵人賽

DAY 22
1

昨天為App搭建了筆記區的UI骨架,今天將為這個骨架注入與實作整個App最核心、也最有趣的功能之一:語音轉文字筆記。

這個功能旨在解決靈感閃現時,打字記錄過於緩慢的痛點。使用者只需點擊麥克風,說出想法,App就會自動將語音轉換為文字並填入筆記區,這不僅提升了效率,也讓記錄靈感的操作變得更加直覺與流暢。

今天的任務涵蓋從引入套件、請求權限、實現功能,到最後的資料儲存與使用者提示,一個完整的功能開發流程 。

一、引入speech_to_text與請求麥克風權限

要在Flutter中實現語音轉文字,社群中已經有相當成熟的套件可供使用。選擇了speech_to_text,它封裝了 iOS (Speech) 和 Android (SpeechRecognizer) 的原生 API,讓我們可以輕鬆調用。

實作步驟:
Step1. 添加依賴:先在pubspec.yaml檔案中加入speech_to_text套件。
Step2. 平台權限設定:語音辨識需要使用到裝置的麥克風,這屬於敏感權限,必須由使用者明確授權。

  • iOS:在Info.plist中加入NSSpeechRecognitionUsageDescription(語音辨識使用說明)和 NSMicrophoneUsageDescription(麥克風使用說明)兩個金鑰,並附上會向使用者顯示的說明文字。
  • Android:在AndroidManifest.xml中加入 和 權限。

在App首次嘗試啟動語音辨識時,作業系統會自動彈出對話框,向使用者請求授權。

二、實現錄音、轉換與填入筆記區

權限搞定後,接下來就是將昨天建立的麥克風按鈕與speech_to_text的功能綁定起來。

核心邏輯如下:

  • 初始化:在Widget的initState中初始化speechtotext服務。
  • 開始監聽:當使用者點擊麥克風圖示時,呼叫speechToText.listen()方法。同時更新UI狀態,例如讓麥克風圖示呈現「正在錄音」的動態效果,並在下方顯示提示文字,如「請開始說話...」。
  • 即時轉換:listen方法會提供一個onResult回調,當使用者的語音被辨識時,這個回調會被觸發,並返回辨識出的文字。我們將這些文字即時更新到筆記區的TextEditingController中,讓使用者可以立刻看到結果。
  • 停止監聽:使用者可以再次點擊按鈕,或在一段時間沒有說話後,呼叫speechToText.stop()來結束錄音。

以上流程實現了從觸發到完成,將語音無縫轉換為文字筆記。

三、關聯insight_id並儲存至Firestore

語音轉換成文字後,還需要將它與對應的靈感卡片關聯起來,並永久儲存。根據Day 19的規劃,我們會將筆記資料存放在Firestore中。

儲存流程:
Step1. 資料模型:我們在NoteProvider中定義一個addNote方法。這個方法會接收兩個參數:筆記內容(String)和當前靈感的insight_id(String)。
Step2. 觸發儲存:當使用者點擊筆記區的「儲存」按鈕時,我們就從TextEditingController中獲取文字內容,並從當前卡片的資料模型中取得insight_id。
Step3. 寫入Firestore:呼叫addNote方法,該方法會在Firestore的notes集合中建立一個新文件。這個文件至少會包含三個欄位:note_content(筆記內容)、insight_id(關聯的靈感 ID)、以及 user_id(確保筆記只對當前使用者可見)。

透過insight_id的關聯,我們確保了每則筆記都能準確地附屬於它所屬的靈感之下 。

四、實作成功/失敗提示

為了提升使用者體驗,明確的即時反饋是不可或缺的,而使用者需要知道他們的操作是否成功。

我們將實作兩種主要的提示:

  • 筆記儲存成功:當筆記成功寫入Firestore後,我們會在畫面底部彈出一個簡短的SnackBar或Toast,顯示「筆記儲存成功」的訊息 。
  • 語音轉文字失敗:在語音辨識過程中,可能會因為網路不穩、權限被拒或服務異常而失敗。在這種情況下,我們同樣會彈出提示,告知使用者「語音轉文字失敗,請稍後再試」,避免使用者在沒有得到任何反饋的情況下感到困惑 。

明日預告:單元測試

從請求權限到語音辨識,再到雲端儲存與UX反饋,完整地走完了一個核心功能的開發週期。現在使用者不僅可以滑動卡片,更可以用最自然的方式——語音——來記錄下fleeting的想法。

功能開發完成後,下一步是確保它的穩定性。明天將進入Day 23,開始為我們今天建立的NoteProvider和 FavoriteProvider等核心邏輯撰寫單元測試(Unit Test),為App的品質把關。


【哈囉你好:)感謝你的閱讀!其他我會常出沒的地方:Threads


上一篇
【30 天做一個極簡App】UI 實作:筆記區&設定頁
系列文
Mobile Dev|日更靈感來源 App:Flutter × LLM × n8n,每天只推 3 則!22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言