Bump version to 0.5.11 and enhance audio processing with timer-based transcription for Windows
Some checks failed
Build and Release / build (x64, ubuntu-latest, linux) (push) Has been skipped
Build and Release / build (arm64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, windows-latest, win32) (push) Has been cancelled
Build and Release / release (push) Has been cancelled

This commit is contained in:
Илья Глазунов 2026-01-15 21:30:21 +03:00
parent fb6c8e3fc0
commit 528dfe01a1
2 changed files with 60 additions and 2 deletions

View File

@ -1,7 +1,7 @@
{ {
"name": "cheating-daddy", "name": "cheating-daddy",
"productName": "cheating-daddy", "productName": "cheating-daddy",
"version": "0.5.10", "version": "0.5.11",
"description": "cheating daddy", "description": "cheating daddy",
"main": "src/index.js", "main": "src/index.js",
"scripts": { "scripts": {

View File

@ -277,11 +277,14 @@ async function sendImageMessage(base64Image, prompt) {
} }
// Process audio chunk and get response // Process audio chunk and get response
// This accumulates audio and transcribes when silence is detected // This accumulates audio and transcribes when silence is detected or timer expires
let audioChunks = []; let audioChunks = [];
let lastAudioTime = 0; let lastAudioTime = 0;
let firstChunkTime = 0;
const SILENCE_THRESHOLD_MS = 1500; // 1.5 seconds of silence const SILENCE_THRESHOLD_MS = 1500; // 1.5 seconds of silence
const MAX_BUFFER_DURATION_MS = 5000; // 5 seconds max buffering before forced transcription
let silenceCheckTimer = null; let silenceCheckTimer = null;
let windowsTranscriptionTimer = null;
async function processAudioChunk(base64Audio, mimeType) { async function processAudioChunk(base64Audio, mimeType) {
if (!openaiClient) { if (!openaiClient) {
@ -291,6 +294,25 @@ async function processAudioChunk(base64Audio, mimeType) {
const now = Date.now(); const now = Date.now();
const buffer = Buffer.from(base64Audio, 'base64'); const buffer = Buffer.from(base64Audio, 'base64');
// Track first chunk time for duration-based flushing
if (audioChunks.length === 0) {
firstChunkTime = now;
// Start periodic transcription timer (Windows needs this)
if (!windowsTranscriptionTimer && process.platform === 'win32') {
console.log('Starting Windows periodic transcription timer...');
windowsTranscriptionTimer = setInterval(async () => {
if (audioChunks.length > 0) {
const bufferDuration = Date.now() - firstChunkTime;
if (bufferDuration >= MAX_BUFFER_DURATION_MS) {
console.log(`Periodic flush: ${bufferDuration}ms of audio buffered`);
await flushAudioAndTranscribe();
}
}
}, 2000); // Check every 2 seconds
}
}
// Add to audio buffer // Add to audio buffer
audioChunks.push(buffer); audioChunks.push(buffer);
lastAudioTime = now; lastAudioTime = now;
@ -317,15 +339,30 @@ async function flushAudioAndTranscribe() {
return { success: true, text: '' }; return { success: true, text: '' };
} }
// Clear Windows transcription timer
if (windowsTranscriptionTimer) {
clearInterval(windowsTranscriptionTimer);
windowsTranscriptionTimer = null;
}
try { try {
// Combine all audio chunks // Combine all audio chunks
const combinedBuffer = Buffer.concat(audioChunks); const combinedBuffer = Buffer.concat(audioChunks);
const chunkCount = audioChunks.length;
audioChunks = []; audioChunks = [];
firstChunkTime = 0;
// Calculate audio duration
const bytesPerSample = 2;
const audioDurationMs = (combinedBuffer.length / bytesPerSample / SAMPLE_RATE) * 1000;
console.log(`Transcribing ${chunkCount} chunks (${audioDurationMs.toFixed(0)}ms of audio)...`);
// Transcribe // Transcribe
const transcription = await transcribeAudio(combinedBuffer); const transcription = await transcribeAudio(combinedBuffer);
if (transcription && transcription.trim()) { if (transcription && transcription.trim()) {
console.log('Transcription result:', transcription);
// Send to chat // Send to chat
const response = await sendTextMessage(transcription); const response = await sendTextMessage(transcription);
@ -347,6 +384,16 @@ function clearConversation() {
const systemMessage = conversationMessages.find(m => m.role === 'system'); const systemMessage = conversationMessages.find(m => m.role === 'system');
conversationMessages = systemMessage ? [systemMessage] : []; conversationMessages = systemMessage ? [systemMessage] : [];
audioChunks = []; audioChunks = [];
// Clear timers
if (silenceCheckTimer) {
clearTimeout(silenceCheckTimer);
silenceCheckTimer = null;
}
if (windowsTranscriptionTimer) {
clearInterval(windowsTranscriptionTimer);
windowsTranscriptionTimer = null;
}
} }
function closeOpenAISDK() { function closeOpenAISDK() {
@ -356,6 +403,17 @@ function closeOpenAISDK() {
conversationMessages = []; conversationMessages = [];
audioChunks = []; audioChunks = [];
isProcessing = false; isProcessing = false;
// Clear timers
if (silenceCheckTimer) {
clearTimeout(silenceCheckTimer);
silenceCheckTimer = null;
}
if (windowsTranscriptionTimer) {
clearInterval(windowsTranscriptionTimer);
windowsTranscriptionTimer = null;
}
sendToRenderer('update-status', 'Disconnected'); sendToRenderer('update-status', 'Disconnected');
} }