diff --git a/src/utils/tldraw/cc-base/cc-transcription/transcriptionService.tsx b/src/utils/tldraw/cc-base/cc-transcription/transcriptionService.tsx index 31a0403..7e27112 100644 --- a/src/utils/tldraw/cc-base/cc-transcription/transcriptionService.tsx +++ b/src/utils/tldraw/cc-base/cc-transcription/transcriptionService.tsx @@ -26,28 +26,19 @@ export class TranscriptionService { async startTranscription(config: TranscriptionConfig = {}) { console.log('🎙️ Starting transcription service...'); - + try { - // Get default audio device if none selected - if (!this.selectedDeviceId) { - console.log('No device selected, getting default device...'); - const devices = await navigator.mediaDevices.enumerateDevices(); - const audioDevice = devices.find(device => device.kind === 'audioinput'); - if (audioDevice) { - this.selectedDeviceId = audioDevice.deviceId; - console.log('Found default audio device:', audioDevice.label); - } - } + logger.info('transcription-service', '🔊 Requesting microphone access...'); - if (!this.selectedDeviceId) { - logger.error('transcription-service', '⚠️ No audio device available'); - return; - } + // Call getUserMedia directly — this triggers the browser permission prompt. + // The old code called enumerateDevices() first to find a device ID, but + // without microphone permission deviceId is always "" (empty string, falsy), + // causing an early return that never prompted the user for permission. + const audioConstraints: MediaTrackConstraints = this.selectedDeviceId + ? { deviceId: { exact: this.selectedDeviceId } } + : { echoCancellation: true, noiseSuppression: true }; - logger.info('transcription-service', '🔊 Accessing user media...'); - this.stream = await navigator.mediaDevices.getUserMedia({ - audio: { deviceId: this.selectedDeviceId }, - }); + this.stream = await navigator.mediaDevices.getUserMedia({ audio: audioConstraints }); console.log('Got audio stream'); const uuid = crypto.randomUUID();