Zurück zur Startseite

C# Spracherkennung VK Cloud mit Hooks

Der Artikel beschreibt die Implementierung eines Tools für Spracherkennung in C# mit VK Cloud API, NAudio und globalen Tastatur-Hooks. Die Anwendung nimmt Audio bei Hotkeys auf, sendet es an den Server und fügt Text über die Zwischenablage ein. Vollständiger Code mit Fehlerbehandlung.

Stimmeneingabe in C#: Hooks + VK Cloud ASR
Advertisement 728x90

Spracherkennung in C# mit VK Cloud: Low-Level-Hooks und NAudio

Ein Entwickler erstellte eine Konsolenanwendung in C#, die Sprache über Mikrofon aufnimmt, Audio an die VK Cloud Speech-API sendet und erkannten Text in die Zwischenablage einfügt. Die Aktivierung erfolgt über globale Tastaturhooks: Halten der rechten Strg-Taste startet die Aufnahme, Loslassen löst die Verarbeitung aus. NAudio verwaltet die WAV-Aufnahme (16 kHz, 16-Bit, mono), während HttpClient API-Anfragen mit einer Timeout-Verzögerung von 15 Sekunden verarbeitet.

Der Code ist Windows-spezifisch und erfordert Administratorrechte aufgrund von SetWindowsHookEx. Der VK Cloud-Token ist als Konstante fest codiert – dies ist ein Service-Schlüssel aus Ihrem persönlichen Dashboard.

Globale Hooks zur Aufnahmeaktivierung

Der Low-Level-Tastaturhook (WH_KEYBOARD_LL) greift auf WM_KEYDOWN/WM_KEYUP-Ereignisse zu. Das Drücken der rechten Strg-Taste (0xA3) startet oder stoppt asynchron die Aufnahme. Das Drücken von ESC beendet die Anwendung.

Google AdInline article slot

Wichtige P/Invoke-Deklarationen:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);

In HookCallback wird vkCode aus lParam überprüft. Wenn !isRecording && !isProcessing, wird ein Task.Run(() => StartRecordingAsync()) gestartet.

Audioaufnahme und -verarbeitung

WaveInEvent wird auf 16.000 Hz konfiguriert. DataAvailable schreibt Daten in eine temporäre voice_temp.wav-Datei mittels WaveFileWriter. Nach dem Stoppen wird die Dateigröße (>1.000 Bytes) geprüft, danach erfolgt die Erkennung.

Google AdInline article slot
var waveFormat = new WaveFormat(16000, 16, 1);
waveIn = new WaveInEvent { WaveFormat = waveFormat };
writer = new WaveFileWriter(OutputFileName, waveIn.WaveFormat);
waveIn.DataAvailable += (s, e) => writer?.Write(e.Buffer, 0, e.BytesRecorded);

In StopRecordingAndProcessAsync werden Ressourcen freigegeben, eine 200 ms Pause eingehalten, dann wird RecognizeSpeechAsync mit einem Bearer-Token aufgerufen.

Integration mit der VK Cloud Speech-API

POST-Anfrage an https://voice.mcs.mail.ru/asr mit Inhaltstyp audio/wave. Die Antwort wird mit Newtonsoft.Json.Linq analysiert: result.texts[0].punctuated_text.

var request = new HttpRequestMessage(HttpMethod.Post, "https://voice.mcs.mail.ru/asr");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = content;
var response = await httpClient.SendAsync(request);

Fehlerbehandlung umfasst Unauthorized (abgelaufener Token), Timeouts und HTTP-Statuscodes. Logs erscheinen in der Konsole mit Emojis für visuelle Rückmeldung.

Google AdInline article slot
  • Erfolg: Text wird in die Zwischenablage eingefügt, Log zeigt "✅ Erkannt".
  • Kleine Datei: Übersprungen, wenn unter 1.000 Bytes.
  • API-Fehler: Piep-Ton + Details angezeigt.

Einfügen von Text über STA-Thread

Clipboard.SetText benötigt einen STA-(Single-Threaded Apartment)-Kontext. Ein separater Thread wird mit SetApartmentState(STA) erstellt, dann wartet Join() auf Abschluss.

Thread staThread = new Thread(() => {
    Clipboard.SetText(text, TextDataFormat.Text);
});
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();

Alternative Ansätze sind SendKeys oder UI-Automation, aber diese Methode funktioniert zuverlässig per Strg+V.

Wichtige Punkte

  • Globale Hooks: WH_KEYBOARD_LL erfordert Admin-Rechte und injiziert in jedes Prozess.
  • Audioformat: 16 kHz / 16-Bit / mono – optimal für VK Cloud ASR.
  • Asynchronität: Task.Run verhindert Blockierung des Hocks.
  • Sicherheit: Token im Code eingebettet – nur für persönliche Nutzung gedacht; niemals in Repositories committen.
  • Einschränkungen: Ausgabe über Zwischenablage statt direkte Eingabe; Speicherkosten ~3 Rubel pro Artikel.

— Editorial Team

Advertisement 728x90

Weiterlesen