From 610f64c762653abb8fa40a34e438eb9ec263ffae Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Sat, 31 Jan 2026 07:44:28 -0800 Subject: [PATCH 1/6] fix linux compile --- tauri/src-tauri/src/audio_capture/linux.rs | 16 ++++++++++++++++ tauri/src-tauri/src/audio_capture/mod.rs | 4 ++++ 2 files changed, 20 insertions(+) create mode 100644 tauri/src-tauri/src/audio_capture/linux.rs diff --git a/tauri/src-tauri/src/audio_capture/linux.rs b/tauri/src-tauri/src/audio_capture/linux.rs new file mode 100644 index 00000000..8af26e97 --- /dev/null +++ b/tauri/src-tauri/src/audio_capture/linux.rs @@ -0,0 +1,16 @@ +use crate::audio_capture::AudioCaptureState; + +pub async fn start_capture( + state: &AudioCaptureState, + max_duration_secs: u32, +) -> Result<(), String> { + todo!("implement Linux audio capture") +} + +pub async fn stop_capture(state: &AudioCaptureState) -> Result { + todo!("implement Linux audio capture stop") +} + +pub fn is_supported() -> bool { + false +} diff --git a/tauri/src-tauri/src/audio_capture/mod.rs b/tauri/src-tauri/src/audio_capture/mod.rs index 7a55c334..a67bf795 100644 --- a/tauri/src-tauri/src/audio_capture/mod.rs +++ b/tauri/src-tauri/src/audio_capture/mod.rs @@ -2,11 +2,15 @@ mod macos; #[cfg(target_os = "windows")] mod windows; +#[cfg(target_os = "linux")] +mod linux; #[cfg(target_os = "macos")] pub use macos::*; #[cfg(target_os = "windows")] pub use windows::*; +#[cfg(target_os = "linux")] +pub use linux::*; use std::sync::{Arc, Mutex}; From b9c858295db5a3f5b39c8236a8de04eb305516bf Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Sun, 1 Feb 2026 00:45:47 -0800 Subject: [PATCH 2/6] Update Voicebox description as an alternative to ElevenLabs, rather than Ollama --- README.md | 2 +- docs/overview/introduction.mdx | 2 +- landing/src/app/page.tsx | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0b67840b..575918cf 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ ## What is Voicebox? -Voicebox is a **local-first voice cloning studio** with DAW-like features for professional voice synthesis. Think of it as the **Ollama for voice** — download models, clone voices, and generate speech entirely on your machine. +Voicebox is a **local-first voice cloning studio** with DAW-like features for professional voice synthesis. Think of it as a **local, free and open-source alternative to ElevenLabs** — download models, clone voices, and generate speech entirely on your machine. Unlike cloud services that lock your voice data behind subscriptions, Voicebox gives you: diff --git a/docs/overview/introduction.mdx b/docs/overview/introduction.mdx index 99569a73..21edd4fc 100644 --- a/docs/overview/introduction.mdx +++ b/docs/overview/introduction.mdx @@ -5,7 +5,7 @@ description: "Welcome to Voicebox - the open-source voice synthesis studio" ## What is Voicebox? -Voicebox is a **local-first voice cloning studio** with DAW-like features for professional voice synthesis. Think of it as the **Ollama for voice** — download models, clone voices, and generate speech entirely on your machine. +Voicebox is a **local-first voice cloning studio** with DAW-like features for professional voice synthesis. Think of it as a **local, free and open-source alternative to ElevenLabs** — download models, clone voices, and generate speech entirely on your machine. Voicebox App Screenshot diff --git a/landing/src/app/page.tsx b/landing/src/app/page.tsx index 46cf3556..4ba9d8c4 100644 --- a/landing/src/app/page.tsx +++ b/landing/src/app/page.tsx @@ -239,8 +239,9 @@ export default function Home() {

Voicebox is a local-first voice cloning studio with DAW-like features - for professional voice synthesis. Think of it as the Ollama for voice{' '} - — download models, clone voices, and generate speech entirely on your machine. + for professional voice synthesis. Think of it as a{' '} + local, free and open-source alternative to ElevenLabs — download + models, clone voices, and generate speech entirely on your machine.

Unlike cloud services that lock your voice data behind subscriptions, Voicebox gives From 04f9880c9ab3f83495c51eda59d1b3fc1447361a Mon Sep 17 00:00:00 2001 From: Reese Wright Date: Mon, 2 Feb 2026 14:26:34 +0000 Subject: [PATCH 3/6] fix audio export path resolution --- tauri/src/platform/filesystem.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tauri/src/platform/filesystem.ts b/tauri/src/platform/filesystem.ts index e37b4d18..fc5083b9 100644 --- a/tauri/src/platform/filesystem.ts +++ b/tauri/src/platform/filesystem.ts @@ -10,9 +10,20 @@ export const tauriFilesystem: PlatformFilesystem = { }); if (filePath) { - const { writeBinaryFile } = await import('@tauri-apps/plugin-fs'); + const resolvedPath = + typeof filePath === 'string' + ? filePath + : filePath && typeof filePath === 'object' && 'path' in filePath + ? (filePath as { path: string }).path + : ''; + + if (!resolvedPath) { + throw new Error('Failed to resolve save path'); + } + + const { writeFile } = await import('@tauri-apps/plugin-fs'); const arrayBuffer = await blob.arrayBuffer(); - await writeBinaryFile(filePath, new Uint8Array(arrayBuffer)); + await writeFile(resolvedPath, new Uint8Array(arrayBuffer)); } } catch (error) { console.error('Failed to use Tauri dialog, falling back to browser download:', error); From 99fbcca7f495c3759aa8c9b1b18bee4c814ad28a Mon Sep 17 00:00:00 2001 From: Reese Wright Date: Mon, 2 Feb 2026 14:34:39 +0000 Subject: [PATCH 4/6] update CHANGELOG for audio export fix --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47e1dfd0..b7116d39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- Audio export failing when Tauri save dialog returns object instead of string path + ### Added - **Makefile** - Comprehensive development workflow automation with commands for setup, development, building, testing, and code quality checks - Includes Python version detection and compatibility warnings From d40f7d2676b8558de14e6997d564328a10108e07 Mon Sep 17 00:00:00 2001 From: Reese Wright Date: Mon, 2 Feb 2026 14:54:05 +0000 Subject: [PATCH 5/6] refactor: improve path resolution readability --- tauri/src/platform/filesystem.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tauri/src/platform/filesystem.ts b/tauri/src/platform/filesystem.ts index fc5083b9..2292a99a 100644 --- a/tauri/src/platform/filesystem.ts +++ b/tauri/src/platform/filesystem.ts @@ -10,12 +10,12 @@ export const tauriFilesystem: PlatformFilesystem = { }); if (filePath) { - const resolvedPath = - typeof filePath === 'string' - ? filePath - : filePath && typeof filePath === 'object' && 'path' in filePath - ? (filePath as { path: string }).path - : ''; + let resolvedPath = ''; + if (typeof filePath === 'string') { + resolvedPath = filePath; + } else if (filePath && typeof filePath === 'object' && 'path' in filePath) { + resolvedPath = (filePath as { path: string }).path; + } if (!resolvedPath) { throw new Error('Failed to resolve save path'); From 6f4503b5212a31f3ef453904382ad5ff66867414 Mon Sep 17 00:00:00 2001 From: Sergej Lopatkin Date: Mon, 2 Feb 2026 22:11:04 +0100 Subject: [PATCH 6/6] Enhances floating generate box UX - Adds tooltips on hover for buttons of the generate box - Replaces the message square icon with a sliders icon for the instruction mode toggle. - Adds a tooltip to the instruction mode toggle button. - Updates the placeholder text for the input field. --- .../Generation/FloatingGenerateBox.tsx | 72 +++++++++++-------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/app/src/components/Generation/FloatingGenerateBox.tsx b/app/src/components/Generation/FloatingGenerateBox.tsx index b020a81f..a8d556a6 100644 --- a/app/src/components/Generation/FloatingGenerateBox.tsx +++ b/app/src/components/Generation/FloatingGenerateBox.tsx @@ -1,6 +1,6 @@ import { useMatchRoute } from '@tanstack/react-router'; import { AnimatePresence, motion } from 'framer-motion'; -import { Loader2, MessageSquare, Sparkles } from 'lucide-react'; +import { Loader2, SlidersHorizontal, Sparkles } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; import { Button } from '@/components/ui/button'; import { Form, FormControl, FormField, FormItem, FormMessage } from '@/components/ui/form'; @@ -187,7 +187,7 @@ export function FloatingGenerateBox({ }} >

@@ -274,7 +274,7 @@ export function FloatingGenerateBox({ field.ref(node); } }} - placeholder="Add delivery instructions..." + placeholder="e.g. very happy and excited" className="resize-none bg-transparent border-none focus-visible:ring-0 focus-visible:ring-offset-0 focus:outline-none focus:ring-0 outline-none ring-0 rounded-2xl text-sm placeholder:text-muted-foreground/60 w-full" style={{ minHeight: isExpanded ? '100px' : '32px', @@ -294,18 +294,27 @@ export function FloatingGenerateBox({
- +
+ + + {isPending + ? 'Generating...' + : !selectedProfileId + ? 'Select a voice profile first' + : 'Generate speech'} + +
{isExpanded && ( - +
+ + + Fine tune instructions + +
)}