From f8d0a80f17b09e0909327e58fea2753dc55ac92f Mon Sep 17 00:00:00 2001 From: kutesir Date: Wed, 24 Jun 2026 21:13:26 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20log=20KC-38=20(voice=20input=20?= =?UTF-8?q?=E2=80=94=20speech-to-task=20via=20mic=20button)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- KisaniCal/ISSUES.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/KisaniCal/ISSUES.md b/KisaniCal/ISSUES.md index 083a835..40fce71 100644 --- a/KisaniCal/ISSUES.md +++ b/KisaniCal/ISSUES.md @@ -1163,3 +1163,33 @@ Files: `TodayView.swift` (`NLTaskParser`). 6 parser tests added. ### Pending (follow-up) - **Hourly / sub-day recurrence** is unsupported by the day-granular occurrence engine. Would need an engine + repeating-notification extension. **Pending.** + +--- + +## KC-38 — Voice input: add tasks by speaking + +**Status:** Implemented (committed `eb7d563`) +**Area:** Tasks / Quick-add + +### Description +The quick-add mic button is now wired to live, on-device speech recognition so a +task can be dictated instead of typed. + +### Implementation +- New `SpeechRecognizer` (`Speech` + `AVFoundation`): `SFSpeechRecognizer` driven + by `AVAudioEngine`, publishing `transcript` / `isRecording` / `error`. Requests + speech + microphone authorization, then streams partial results. +- `TodayView` quick-add: mic button calls `speech.toggle()` (mic → mic.fill, + accent + pulse while recording); `onChange(of: speech.transcript)` binds the + text into the task field, so dictation flows through the **same `NLTaskParser`** + — spoken dates/recurrence (e.g. "remind me to pray everyday") parse exactly like + typed input (see KC-37). Permission errors surface inline. +- Usage strings added: `NSMicrophoneUsageDescription`, + `NSSpeechRecognitionUsageDescription`. + +Files: `SpeechRecognizer.swift` (new), `TodayView.swift`, `project.yml`. + +### Notes / follow-up +- Recognition locale is `.current`; no manual language picker. +- Contains `print("[VOICE] …")` debug logging — harmless, could be removed before + release. **Minor.**