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
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:
parent
fb6c8e3fc0
commit
528dfe01a1
@ -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": {
|
||||||
|
|||||||
@ -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');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user