some cleanup
This commit is contained in:
parent
d4ac035b65
commit
b5eb5b0431
4 changed files with 28 additions and 46 deletions
|
|
@ -6,27 +6,13 @@ mod utils;
|
||||||
|
|
||||||
use managers::audio::AudioRecordingManager;
|
use managers::audio::AudioRecordingManager;
|
||||||
use managers::transcription::TranscriptionManager;
|
use managers::transcription::TranscriptionManager;
|
||||||
use std::collections::HashMap;
|
use std::sync::Arc;
|
||||||
use std::sync::{Arc, Mutex};
|
|
||||||
use tauri::image::Image;
|
use tauri::image::Image;
|
||||||
use tauri::menu::{Menu, MenuItem};
|
use tauri::menu::{Menu, MenuItem};
|
||||||
use tauri::tray::TrayIconBuilder;
|
use tauri::tray::TrayIconBuilder;
|
||||||
use tauri::Manager;
|
use tauri::Manager;
|
||||||
use tauri_plugin_autostart::MacosLauncher;
|
use tauri_plugin_autostart::MacosLauncher;
|
||||||
|
|
||||||
pub struct AppState {
|
|
||||||
pub active_bindings: Mutex<HashMap<String, String>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AppState {
|
|
||||||
// Convenience method to create a new AppState
|
|
||||||
fn new() -> Self {
|
|
||||||
AppState {
|
|
||||||
active_bindings: Mutex::new(HashMap::new()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||||
pub fn run() {
|
pub fn run() {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
|
|
@ -41,7 +27,6 @@ pub fn run() {
|
||||||
.plugin(tauri_plugin_opener::init())
|
.plugin(tauri_plugin_opener::init())
|
||||||
.plugin(tauri_plugin_store::Builder::default().build())
|
.plugin(tauri_plugin_store::Builder::default().build())
|
||||||
.plugin(tauri_plugin_global_shortcut::Builder::new().build())
|
.plugin(tauri_plugin_global_shortcut::Builder::new().build())
|
||||||
.manage(AppState::new())
|
|
||||||
.setup(move |app| {
|
.setup(move |app| {
|
||||||
let settings_i = MenuItem::with_id(app, "settings", "Settings", true, None::<&str>)?;
|
let settings_i = MenuItem::with_id(app, "settings", "Settings", true, None::<&str>)?;
|
||||||
let quit_i = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?;
|
let quit_i = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?;
|
||||||
|
|
@ -66,27 +51,12 @@ pub fn run() {
|
||||||
.build(app)?;
|
.build(app)?;
|
||||||
app.manage(tray);
|
app.manage(tray);
|
||||||
|
|
||||||
let vad_path = app.path().resolve(
|
|
||||||
"resources/models/silero_vad_v4.onnx",
|
|
||||||
tauri::path::BaseDirectory::Resource,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
let whisper_path = app.path().resolve(
|
|
||||||
"resources/models/ggml-small.bin",
|
|
||||||
tauri::path::BaseDirectory::Resource,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
let recording_manager = Arc::new(
|
let recording_manager = Arc::new(
|
||||||
AudioRecordingManager::new(&vad_path)
|
AudioRecordingManager::new(app).expect("Failed to initialize recording manager"),
|
||||||
.expect("Failed to initialize recording manager"),
|
|
||||||
);
|
);
|
||||||
let transcription_manager = Arc::new(
|
let transcription_manager = Arc::new(
|
||||||
TranscriptionManager::new(
|
TranscriptionManager::new(&app)
|
||||||
whisper_path
|
.expect("Failed to initialize transcription manager"),
|
||||||
.to_str()
|
|
||||||
.expect("Path contains invalid UTF-8 Chars"),
|
|
||||||
)
|
|
||||||
.expect("Failed to initialize transcription manager"),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Add managers to Tauri's managed state
|
// Add managers to Tauri's managed state
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
||||||
use rubato::{FftFixedIn, Resampler};
|
use rubato::{FftFixedIn, Resampler};
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
use tauri::{App, Manager};
|
||||||
use vad_rs::Vad;
|
use vad_rs::Vad;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
|
@ -17,7 +17,11 @@ pub struct AudioRecordingManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AudioRecordingManager {
|
impl AudioRecordingManager {
|
||||||
pub fn new(vad_path: &PathBuf) -> Result<Self, anyhow::Error> {
|
pub fn new(app: &App) -> Result<Self, anyhow::Error> {
|
||||||
|
let vad_path = app.path().resolve(
|
||||||
|
"resources/models/silero_vad_v4.onnx",
|
||||||
|
tauri::path::BaseDirectory::Resource,
|
||||||
|
)?;
|
||||||
let host = cpal::default_host();
|
let host = cpal::default_host();
|
||||||
let device = host
|
let device = host
|
||||||
.default_input_device()
|
.default_input_device()
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
use tauri::{App, Manager};
|
||||||
use whisper_rs::install_whisper_log_trampoline;
|
use whisper_rs::install_whisper_log_trampoline;
|
||||||
use whisper_rs::{
|
use whisper_rs::{
|
||||||
FullParams, SamplingStrategy, WhisperContext, WhisperContextParameters, WhisperState,
|
FullParams, SamplingStrategy, WhisperContext, WhisperContextParameters, WhisperState,
|
||||||
|
|
@ -11,12 +12,19 @@ pub struct TranscriptionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TranscriptionManager {
|
impl TranscriptionManager {
|
||||||
pub fn new(whisper_path: &str) -> Result<Self> {
|
pub fn new(app: &App) -> Result<Self> {
|
||||||
|
let whisper_path = app.path().resolve(
|
||||||
|
"resources/models/ggml-small.bin",
|
||||||
|
tauri::path::BaseDirectory::Resource,
|
||||||
|
)?;
|
||||||
|
let path = whisper_path
|
||||||
|
.to_str()
|
||||||
|
.expect("Path contains invalid UTF-8 Chars");
|
||||||
|
|
||||||
install_whisper_log_trampoline();
|
install_whisper_log_trampoline();
|
||||||
// Load the model
|
// Load the model
|
||||||
let context =
|
let context = WhisperContext::new_with_params(path, WhisperContextParameters::default())
|
||||||
WhisperContext::new_with_params(whisper_path, WhisperContextParameters::default())
|
.map_err(|e| anyhow::anyhow!("Failed to load whisper model: {}", e))?;
|
||||||
.map_err(|e| anyhow::anyhow!("Failed to load whisper model: {}", e))?;
|
|
||||||
|
|
||||||
// Create state
|
// Create state
|
||||||
let state = context.create_state().expect("failed to create state");
|
let state = context.create_state().expect("failed to create state");
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@ fn try_send_event(event: &EventType) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send(event: EventType) {
|
fn send_with_delay(event: EventType, delay_ms: u64) {
|
||||||
try_send_event(&event);
|
try_send_event(&event);
|
||||||
thread::sleep(time::Duration::from_millis(60));
|
thread::sleep(time::Duration::from_millis(delay_ms));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_paste() {
|
fn send_paste() {
|
||||||
|
|
@ -23,12 +23,12 @@ fn send_paste() {
|
||||||
let modifier_key = Key::ControlLeft; // Control key on other systems
|
let modifier_key = Key::ControlLeft; // Control key on other systems
|
||||||
|
|
||||||
// Press both keys
|
// Press both keys
|
||||||
send(EventType::KeyPress(modifier_key));
|
send_with_delay(EventType::KeyPress(modifier_key), 100);
|
||||||
send(EventType::KeyPress(Key::KeyV));
|
send_with_delay(EventType::KeyPress(Key::KeyV), 100);
|
||||||
|
|
||||||
// Release both keys
|
// Release both keys
|
||||||
send(EventType::KeyRelease(Key::KeyV));
|
send_with_delay(EventType::KeyRelease(Key::KeyV), 0);
|
||||||
send(EventType::KeyRelease(modifier_key));
|
send_with_delay(EventType::KeyRelease(modifier_key), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn paste(text: String, app_handle: AppHandle) {
|
pub fn paste(text: String, app_handle: AppHandle) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue