From 36a24f16460818071dd848638f94440419b82d51 Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Fri, 21 Nov 2025 00:58:47 -0500 Subject: task: sync database --- .tasks/tasks.jsonl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tasks/tasks.jsonl b/.tasks/tasks.jsonl index eef1eea..7d7b2de 100644 --- a/.tasks/tasks.jsonl +++ b/.tasks/tasks.jsonl @@ -130,7 +130,7 @@ {"taskCreatedAt":"2025-11-20T22:42:03.748273499Z","taskDependencies":[],"taskId":"t-1rcIwc8","taskNamespace":"Omni/Task.hs","taskParent":"t-PpXWsU","taskPriority":"P2","taskStatus":"Review","taskTitle":"Implement 'task stats --epic=' filtering","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:49:27.049349665Z"} {"taskCreatedAt":"2025-11-20T22:42:03.767665854Z","taskDependencies":[],"taskId":"t-1rcIBeU","taskNamespace":"Omni/Task.hs","taskParent":"t-PpXWsU","taskPriority":"P2","taskStatus":"Review","taskTitle":"Add colored output to 'task list' and 'task tree'","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:55:32.252270173Z"} {"taskCreatedAt":"2025-11-20T22:42:18.766787128Z","taskDependencies":[],"taskId":"t-1rdJxcd","taskNamespace":"Omni/Task.hs","taskParent":"t-PpXWsU","taskPriority":"P2","taskStatus":"Review","taskTitle":"Namespace normalization incorrect for Haskell files ending in .hs","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:57:50.196197695Z"} -{"taskCreatedAt":"2025-11-20T22:42:37.706495845Z","taskDependencies":[],"taskId":"t-1rf10ho","taskNamespace":"Biz/PodcastItLater/hs.hs","taskParent":"t-143KQl2","taskPriority":"P3","taskStatus":"InProgress","taskTitle":"Research and add intro/outro sound effects","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:58:02.938891258Z"} +{"taskCreatedAt":"2025-11-20T22:42:37.706495845Z","taskDependencies":[],"taskId":"t-1rf10ho","taskNamespace":"Biz/PodcastItLater/hs.hs","taskParent":"t-143KQl2","taskPriority":"P3","taskStatus":"Review","taskTitle":"Research and add intro/outro sound effects","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:58:46.725770278Z"} {"taskCreatedAt":"2025-11-20T22:42:37.725796962Z","taskDependencies":[],"taskId":"t-1rf15iH","taskNamespace":"Biz/PodcastItLater/hs.hs","taskParent":"t-143KQl2","taskPriority":"P3","taskStatus":"Open","taskTitle":"Implement audio crossfading for intro/outro","taskType":"WorkTask","taskUpdatedAt":"2025-11-20T22:42:37.725796962Z"} {"taskCreatedAt":"2025-11-20T23:17:30.579211649Z","taskDependencies":[],"taskId":"t-1twEu4W","taskNamespace":"Omni/Agent/hs.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Open","taskTitle":"Multi-Agent System 2.0","taskType":"Epic","taskUpdatedAt":"2025-11-20T23:17:30.579211649Z"} {"taskCreatedAt":"2025-11-20T23:17:39.613719647Z","taskDependencies":[],"taskId":"t-1txgomO","taskNamespace":"Omni/Agent/hs.hs","taskParent":"t-1twEu4W","taskPriority":"P2","taskStatus":"Open","taskTitle":"Design Omni/Agent.hs CLI and module structure","taskType":"WorkTask","taskUpdatedAt":"2025-11-20T23:26:49.948072617Z"} -- cgit v1.2.3 From 996e1b9e682c55b4d1c68f7df9b67e447c5dc71a Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Fri, 21 Nov 2025 00:58:59 -0500 Subject: task: sync database --- .tasks/tasks.jsonl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tasks/tasks.jsonl b/.tasks/tasks.jsonl index 7d7b2de..6415917 100644 --- a/.tasks/tasks.jsonl +++ b/.tasks/tasks.jsonl @@ -131,7 +131,7 @@ {"taskCreatedAt":"2025-11-20T22:42:03.767665854Z","taskDependencies":[],"taskId":"t-1rcIBeU","taskNamespace":"Omni/Task.hs","taskParent":"t-PpXWsU","taskPriority":"P2","taskStatus":"Review","taskTitle":"Add colored output to 'task list' and 'task tree'","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:55:32.252270173Z"} {"taskCreatedAt":"2025-11-20T22:42:18.766787128Z","taskDependencies":[],"taskId":"t-1rdJxcd","taskNamespace":"Omni/Task.hs","taskParent":"t-PpXWsU","taskPriority":"P2","taskStatus":"Review","taskTitle":"Namespace normalization incorrect for Haskell files ending in .hs","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:57:50.196197695Z"} {"taskCreatedAt":"2025-11-20T22:42:37.706495845Z","taskDependencies":[],"taskId":"t-1rf10ho","taskNamespace":"Biz/PodcastItLater/hs.hs","taskParent":"t-143KQl2","taskPriority":"P3","taskStatus":"Review","taskTitle":"Research and add intro/outro sound effects","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:58:46.725770278Z"} -{"taskCreatedAt":"2025-11-20T22:42:37.725796962Z","taskDependencies":[],"taskId":"t-1rf15iH","taskNamespace":"Biz/PodcastItLater/hs.hs","taskParent":"t-143KQl2","taskPriority":"P3","taskStatus":"Open","taskTitle":"Implement audio crossfading for intro/outro","taskType":"WorkTask","taskUpdatedAt":"2025-11-20T22:42:37.725796962Z"} +{"taskCreatedAt":"2025-11-20T22:42:37.725796962Z","taskDependencies":[],"taskId":"t-1rf15iH","taskNamespace":"Biz/PodcastItLater/hs.hs","taskParent":"t-143KQl2","taskPriority":"P3","taskStatus":"InProgress","taskTitle":"Implement audio crossfading for intro/outro","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:58:59.457389038Z"} {"taskCreatedAt":"2025-11-20T23:17:30.579211649Z","taskDependencies":[],"taskId":"t-1twEu4W","taskNamespace":"Omni/Agent/hs.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Open","taskTitle":"Multi-Agent System 2.0","taskType":"Epic","taskUpdatedAt":"2025-11-20T23:17:30.579211649Z"} {"taskCreatedAt":"2025-11-20T23:17:39.613719647Z","taskDependencies":[],"taskId":"t-1txgomO","taskNamespace":"Omni/Agent/hs.hs","taskParent":"t-1twEu4W","taskPriority":"P2","taskStatus":"Open","taskTitle":"Design Omni/Agent.hs CLI and module structure","taskType":"WorkTask","taskUpdatedAt":"2025-11-20T23:26:49.948072617Z"} {"taskCreatedAt":"2025-11-20T23:17:39.632912633Z","taskDependencies":[],"taskId":"t-1txgtmn","taskNamespace":"Omni/Agent/hs.hs","taskParent":"t-1twEu4W","taskPriority":"P2","taskStatus":"Open","taskTitle":"Implement worker process management (start/stop/pid)","taskType":"WorkTask","taskUpdatedAt":"2025-11-20T23:17:39.632912633Z"} -- cgit v1.2.3 From ff3b744a05924c13cfd7c268d87e72ee6bdd0538 Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Fri, 21 Nov 2025 01:04:09 -0500 Subject: feat: implement t-1rf15iH --- Biz/PodcastItLater/Worker.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/Biz/PodcastItLater/Worker.py b/Biz/PodcastItLater/Worker.py index 5203490..48793cd 100644 --- a/Biz/PodcastItLater/Worker.py +++ b/Biz/PodcastItLater/Worker.py @@ -60,6 +60,8 @@ MAX_RETRIES = 3 TTS_MODEL = "tts-1" TTS_VOICE = "alloy" MEMORY_THRESHOLD = 80 # Percentage threshold for memory usage +CROSSFADE_DURATION = 500 # ms for crossfading segments +PAUSE_DURATION = 1000 # ms for silence between segments class ShutdownHandler: @@ -358,7 +360,7 @@ class ArticleProcessor: content_audio: bytes, outro_audio: bytes, ) -> bytes: - """Combine intro, content, and outro with 1-second pauses. + """Combine intro, content, and outro with crossfades. Args: intro_audio: MP3 bytes for intro @@ -373,11 +375,27 @@ class ArticleProcessor: content = AudioSegment.from_mp3(io.BytesIO(content_audio)) outro = AudioSegment.from_mp3(io.BytesIO(outro_audio)) - # Create 1-second silence - pause = AudioSegment.silent(duration=1000) # milliseconds + # Create bridge silence (pause + 2 * crossfade to account for overlap) + bridge = AudioSegment.silent(duration=PAUSE_DURATION + 2 * CROSSFADE_DURATION) - # Combine segments with pauses - combined = intro + pause + content + pause + outro + def safe_append(seg1: AudioSegment, seg2: AudioSegment, crossfade: int) -> AudioSegment: + if len(seg1) < crossfade or len(seg2) < crossfade: + logger.warning( + "Segment too short for crossfade (%dms vs %dms/%dms), using concatenation", + crossfade, + len(seg1), + len(seg2), + ) + return seg1 + seg2 + return seg1.append(seg2, crossfade=crossfade) + + # Combine segments with crossfades + # Intro -> Bridge -> Content -> Bridge -> Outro + # This effectively fades out the previous segment and fades in the next one + combined = safe_append(intro, bridge, CROSSFADE_DURATION) + combined = safe_append(combined, content, CROSSFADE_DURATION) + combined = safe_append(combined, bridge, CROSSFADE_DURATION) + combined = safe_append(combined, outro, CROSSFADE_DURATION) # Export to bytes output = io.BytesIO() -- cgit v1.2.3