Gemischte Aufnahme - wie Echo unterdrücken?



  • Ich habe ein mp3 via text-to-speech erzeugt, das programmierbare Pausen zum Nachsprechen lässt. Wenn dieses mp3 nun abgespielt wird, kann der Nutzer das Gesagte nachsprechen oder darauf antworten. Zur Kontrolle kann das Gesamte, also mp3 und eigene Mikrofonaufnahme als gemischte Aufnahme (auch mp3) aufgezeichnet werden. Das klappt auch alles prächtig. Nur hört man beim Sprechen die eigene Sprache als Echo. Ich habe bisher keinen funktionierenden Weg gefunden dieses Echo (Monitoring) zu unterdrücken. In Windows ist es beim Mikrophon ausgeschaltet. Hier sind die beiden Funktionen zum Starten und Stoppen:

    private void StartRecording(string playbackFile, string repetitionFile)
    {
        try
        {
            StopRecording(); // Vorher aufräumen
    
            if (!File.Exists(playbackFile))
            {
                MessageBox.Show($"Playback file not found: {playbackFile}");
                return;
            }
    
            // --- TTS vorbereiten
            var reader = new AudioFileReader(playbackFile); // liest Output.mp3
            var ttsProvider = EnsureMono44100(reader);
    
            // --- Mikrofon vorbereiten
            micIn = new WaveInEvent
            {
                WaveFormat = new WaveFormat(44100, 16, 1),
                BufferMilliseconds = 50
            };
            micBuffer = new BufferedWaveProvider(micIn.WaveFormat)
            {
                DiscardOnBufferOverflow = true
            };
            micIn.DataAvailable += (s, a) => micBuffer.AddSamples(a.Buffer, 0, a.BytesRecorded);
            micIn.StartRecording();
    
            var micProvider = micBuffer.ToSampleProvider(); // Mono float 44.1k
    
            // --- Mixer aus TTS + Mikro
            var mixer = new MixingSampleProvider(new[] { ttsProvider, micProvider })
            {
                ReadFully = true
            };
    
            // --- WAV-Datei zum Schreiben
            repetitionWriter = new WaveFileWriter(repetitionFile, WaveFormat.CreateIeeeFloatWaveFormat(44100, 1));
    
            // --- Tap für gleichzeitiges Schreiben
            var tap = new TapSampleProvider(mixer, repetitionWriter);
    
            // --- TTS AUSGABE ohne Monitoring
            ttsOutput = new WasapiOut(AudioClientShareMode.Shared, false, 100); // false = kein Loopback
            ttsOutput.Init(tap);
            ttsOutput.Play();
    
            lblRecording.Visible = true;
            btnPause.Enabled = false;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error during recording: " + ex.Message);
            StopRecording();
        }
    }
    
    private void StopRecording()
    {
        try
        {
            micIn?.StopRecording();
            micIn?.Dispose();
            micIn = null;
    
            mixPlayer?.Stop();
            mixPlayer?.Dispose();
            mixPlayer = null;
    
            repetitionWriter?.Flush();
            repetitionWriter?.Dispose();
            repetitionWriter = null;
    
            micBuffer = null;
    
            lblRecording.Visible = false;
            btnPause.Enabled = true;
    
            // WAV → MP3
            string wavPath = "Output_Repetition.wav";
            string mp3Path = "Output_Repetition.mp3";
            if (File.Exists(wavPath))
            {
                using (var reader = new AudioFileReader(wavPath))
                using (var writer = new LameMP3FileWriter(mp3Path, reader.WaveFormat, LAMEPreset.VBR_90))
                {
                    reader.CopyTo(writer);
                }
    
                File.Delete(wavPath); // WAV löschen
            }
    
            lblFertig.Text = "Recording finished: Output_Repetition.mp3";
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error stopping recording:\n" + ex);
        }
    }
    

    Ich habe es sogar mit ChatGPT-4o und -5 versucht. Dabei wird jedoch die gemischte Aufnahme kaputt gemacht. Offenbar nicht ganz trivial.



  • Hört man dieses Echo nur bei der gemischten Aufnahme oder auch, wenn nur vom Mikrofon aufgenommen wird?

    Edit: Ansonsten mal nach "acoustic echo cancellation (AEC)" suchen - ich selber habe bisher keine direkten C#-Komponenten im Netz gefunden.


Anmelden zum Antworten