Where does the bug appear (feature/product)?
Cursor IDE
Describe the Bug
Cursor voice input is broken in the main editor/composer on Windows 11.
When I click the microphone button in the normal editor/composer, the microphone UI activates and appears to listen, but no text is transcribed into the prompt.
The same microphone works in other apps.
The same microphone also works inside Cursor’s Agents Window.
In the Agents Window, Cursor records the audio and transcribes it after I stop speaking.
In the main editor/composer, voice input previously transcribed live while speaking. Now it silently fails.
Developer Tools initially showed:
voice-processor.js
Status: failed
Error: net::ERR_FILE_NOT_FOUND
After manually creating a temporary voice-processor.js file, the file loaded with status 200, but live transcription still did not work. Further debugging showed that audio chunks were being received, but the streaming STT path returned no transcript.
Steps to Reproduce
- Open Cursor on Windows 11.
- Open the normal editor/composer prompt.
- Click the microphone button.
- Speak normally.
- Stop recording.
Result: the microphone/listening UI appears, but no text is inserted into the prompt.
Optional confirmation:
- Open Help → Toggle Developer Tools.
- Go to Network.
- Click the editor/composer microphone.
- Observe that voice-processor.js may fail with ERR_FILE_NOT_FOUND.
Expected Behavior
The editor/composer microphone should transcribe speech into the prompt.
Ideally it should behave like it did before: live transcription while speaking, with corrections as the user continues speaking.
At minimum, it should not silently do nothing. If voice input fails, Cursor should show an error instead of showing the microphone UI while producing no text.
Operating System
Windows 10/11
Version Information
Cursor version: 3.2.21
Channel: stable
Platform: win32 x64
Additional Information
This is not a proper fix. It is only a temporary local workaround.
The issue seems to involve two parts:
- Cursor tries to load voice-processor.js in the editor/composer voice path, but that file may be missing, producing ERR_FILE_NOT_FOUND.
- Even after creating a local voice-processor.js so it loads with status 200, the live streaming STT path still does not return text.
A temporary workaround is to:
- Create the missing voice-processor.js file.
- Patch workbench.desktop.main.js so editor/composer voice input is forced into batch mode.
This does not restore live transcription. It only makes the editor/composer behave more like the Agents Window: it records first, then transcribes after stopping.
Paste the following code into PowerShell and press Enter. It creates a script file, saves it, and runs it automatically, giving us a clanky but working speech-to-text until Cursor fixes this.
@’
$main = “$env:LOCALAPPDATA\Programs\Cursor\resources\app\out\vs\workbench\workbench.desktop.main.js”
$voiceDir = “$env:LOCALAPPDATA\Programs\Cursor\resources\app\out\vs\workbench\contrib\composer\browser\voice”
$voiceFile = Join-Path $voiceDir “voice-processor.js”
Write-Host “Stopping Cursor…”
Get-Process Cursor -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Sleep -Seconds 1
if (!(Test-Path $main)) {
Write-Host “Main Cursor file not found:”
Write-Host $main
exit 1
}
$backup = “$main.before-voice-temp-workaround-backup”
if (!(Test-Path $backup)) {
Copy-Item $main $backup
Write-Host “Backup created:”
Write-Host $backup
} else {
Write-Host “Backup already exists:”
Write-Host $backup
}
Write-Host “Creating missing voice-processor.js…”
New-Item -ItemType Directory -Path $voiceDir -Force | Out-Null
$voiceProcessor = @"
class CursorVoiceProcessor extends AudioWorkletProcessor {
process(inputs) {
const input = inputs && inputs[0];
if (input && input.length > 0 && input[0]) {
const channel = input[0];
const pcm16 = new Int16Array(channel.length);
for (let i = 0; i < channel.length; i++) {
const s = Math.max(-1, Math.min(1, channel[i]));
pcm16[i] = s < 0 ? s * 32768 : s * 32767;
}
this.port.postMessage(pcm16.buffer, [pcm16.buffer]);
}
return true;
}
}
registerProcessor(“voice-processor”, CursorVoiceProcessor);
"@
Set-Content -Path $voiceFile -Value $voiceProcessor -Encoding UTF8
Write-Host “Created:”
Write-Host $voiceFile
Write-Host “Patching Cursor editor voice mode to batch mode…”
$text = Get-Content $main -Raw
$replacements = 0
$old = ‘const t=++this.startRequestId,i=e??{mode:“batch”},r=i.mode;this.currentMode=r,’
$new = ‘const t=++this.startRequestId;let i=e??{mode:“batch”};i={…i,mode:“batch”};const r=i.mode;this.currentMode=r,’
if ($text.Contains($old)) {
$text = $text.Replace($old, $new)
$replacements++
}
Set-Content $main $text -Encoding UTF8
Write-Host “Batch voice patch replacements:” $replacements
if ($replacements -eq 1) {
Write-Host “Temporary workaround applied.”
Write-Host “Reopen Cursor and test:”
Write-Host “Click mic → speak → click stop → text appears → manually submit.”
} else {
Write-Host “Patch did not apply. Cursor’s internal code may have changed.”
Write-Host “The voice-processor.js file was still created, but batch mode was not patched.”
}
'@ | Set-Content .\Fix-CursorVoiceTemporaryWorkaround.ps1 -Encoding UTF8
.\Fix-CursorVoiceTemporaryWorkaround.ps1
Does this stop you from using Cursor
Yes - Cursor is unusable