
Hoe achtergrondgeluid te verwijderen voor STT: Complete gids voor ruisonderdrukking bij spraak-naar-tekst
Eric King
Author
Hoe achtergrondgeluid te verwijderen voor STT: Complete gids voor ruisonderdrukking bij spraak-naar-tekst
Achtergrondgeluid is een van de meest voorkomende uitdagingen bij het transcriberen van audio-opnames. Of het nu verkeersgeluiden, toetsenbordgetik, airconditioning of menigteruis is, achtergrondgeluid verwijderen voordat je spraak-naar-tekst verwerkt, kan de transcriptienauwkeurigheid aanzienlijk verbeteren.
Deze uitgebreide gids behandelt praktische methoden voor achtergrondgeluid verwijderen voor STT, van eenvoudige software-oplossingen tot geavanceerde audiobewerkingstechnieken.
Waarom achtergrondgeluid verwijderen voor STT?
Achtergrondgeluid heeft op verschillende manieren een negatieve invloed op de nauwkeurigheid van spraak-naar-tekst:
- Lagere signaal-ruisverhouding (SNR) maakt het moeilijker voor modellen om spraak te onderscheiden
- Frequentiemasking waarbij ruis overlap heeft met spraakfrequenties
- Modelverwarring wanneer ruispatronen op spraak lijken
- Lagere confidence scores wat leidt tot meer transcriptiefouten
- Langere verwerkingstijd omdat modellen moeite hebben met ruisende input
Voordelen van ruisverwijdering:
- ✅ Verbeterde transcriptienauwkeurigheid (vaak 10-30% beter)
- ✅ Betere woordherkenning, vooral bij technische termen
- ✅ Snellere verwerking met schonere audio
- ✅ Betrouwbaardere tijdstempels en segmentatie
- ✅ Betere verwerking van zachte spraak
Achtergrondgeluidstypen begrijpen
Verschillende ruissoorten vereisen verschillende verwijderingsstrategieën:
1. Constante ruis (stationair)
- Voorbeelden: Airconditioning, ventilatorgebrom, elektrische brom, witte ruis
- Kenmerken: Consistente frequentie en amplitude
- Verwijdering: Makkelijker te verwijderen met spectrale subtractie of filtering
2. Variabele ruis (niet-stationair)
- Voorbeelden: Verkeer, geroezemoes, toetsenbordgetik, geritsel van papier
- Kenmerken: Verandert over tijd, onvoorspelbare patronen
- Verwijdering: Vereist geavanceerdere technieken zoals deep-learningmodellen
3. Impulsruis
- Voorbeelden: Klikken, ploppen, dichtslaande deuren, telefoongerinkel
- Kenmerken: Korte, plotselinge pieken
- Verwijdering: Vereist detectie en vervanging/interpolatie
4. Periodieke ruis
- Voorbeelden: Pieptonen, alarmen, repetitieve geluiden
- Kenmerken: Regelmatige patronen op specifieke frequenties
- Verwijdering: Kan gefilterd worden met notch-filters
Methode 1: Audio-editingsoftware gebruiken
Audacity (Gratis, Open Source)
Audacity is een krachtige, gratis audio-editor met ingebouwde ruisonderdrukking:
Stappen:
- Open je audiobestand in Audacity
- Selecteer een gedeelte met alleen ruis (geen spraak)
- Ga naar Effect → Noise Reduction
- Klik op Get Noise Profile
- Selecteer de volledige audiotrack
- Ga opnieuw naar Effect → Noise Reduction
- Pas instellingen aan:
- Noise reduction (dB): 12-24 dB (begin met 15)
- Sensitivity: 6.0 (standaard)
- Frequency smoothing (bands): 3 (standaard)
- Klik op OK om toe te passen
Best practices:
- Gebruik een ruisvoorbeeld van 0.5-2 seconden
- Kies een gedeelte met representatieve ruis
- Begin met gematigde instellingen en verhoog indien nodig
- Bekijk een preview voordat je op de hele track toepast
Adobe Audition
Adobe Audition biedt professionele ruisonderdrukking:
- Open audiobestand
- Selecteer gedeelte met alleen ruis
- Ga naar Effects → Noise Reduction/Restoration → Capture Noise Print
- Selecteer volledige track
- Ga naar Effects → Noise Reduction/Restoration → Noise Reduction (process)
- Pas aan:
- Noise Reduction: 40-80% (begin met 60%)
- Reduce by: 6-12 dB
- High Frequency Transition: 4000-8000 Hz
- Klik op Apply
Methode 2: Python-audiobewerkingslibraries
De noisereduce-library gebruiken
De
noisereduce-library biedt eenvoudig te gebruiken ruisonderdrukking:import noisereduce as nr
import soundfile as sf
# Load audio file
audio_data, sample_rate = sf.read("noisy_audio.wav")
# Method 1: Stationary noise reduction (for constant noise)
reduced_noise = nr.reduce_noise(
y=audio_data,
sr=sample_rate,
stationary=True,
prop_decrease=0.8 # Reduce noise by 80%
)
# Method 2: Non-stationary noise reduction (for variable noise)
reduced_noise = nr.reduce_noise(
y=audio_data,
sr=sample_rate,
stationary=False,
prop_decrease=0.8
)
# Save cleaned audio
sf.write("cleaned_audio.wav", reduced_noise, sample_rate)
Installatie:
pip install noisereduce soundfile
librosa gebruiken voor spectral gating
import librosa
import numpy as np
import soundfile as sf
def spectral_gate(audio_path, threshold_db=-40):
"""Remove noise using spectral gating."""
# Load audio
y, sr = librosa.load(audio_path, sr=None)
# Compute short-time Fourier transform (STFT)
stft = librosa.stft(y)
magnitude = np.abs(stft)
phase = np.angle(stft)
# Convert to dB
magnitude_db = librosa.amplitude_to_db(magnitude)
# Apply threshold (remove frequencies below threshold)
magnitude_db_cleaned = np.where(
magnitude_db > threshold_db,
magnitude_db,
-80 # Silence very quiet parts
)
# Convert back to linear scale
magnitude_cleaned = librosa.db_to_amplitude(magnitude_db_cleaned)
# Reconstruct audio
stft_cleaned = magnitude_cleaned * np.exp(1j * phase)
y_cleaned = librosa.istft(stft_cleaned)
return y_cleaned, sr
# Usage
cleaned_audio, sample_rate = spectral_gate("noisy_audio.wav", threshold_db=-35)
sf.write("cleaned_audio.wav", cleaned_audio, sample_rate)
scipy gebruiken voor high-pass filtering
Verwijder laagfrequente ruis (zoals gerommel, wind):
from scipy import signal
import soundfile as sf
def high_pass_filter(audio_path, cutoff_freq=80):
"""Remove low-frequency noise with high-pass filter."""
# Load audio
audio_data, sample_rate = sf.read(audio_path)
# Design high-pass filter
nyquist = sample_rate / 2
normalized_cutoff = cutoff_freq / nyquist
b, a = signal.butter(4, normalized_cutoff, btype='high')
# Apply filter
filtered_audio = signal.filtfilt(b, a, audio_data)
return filtered_audio, sample_rate
# Usage
cleaned_audio, sr = high_pass_filter("noisy_audio.wav", cutoff_freq=100)
sf.write("cleaned_audio.wav", cleaned_audio, sr)
Methode 3: Deep-learning-gebaseerde ruisonderdrukking
RNNoise gebruiken
RNNoise is een deep-learningmodel dat specifiek is ontworpen voor ruisonderdrukking:
import rnnoise
import numpy as np
import soundfile as sf
def rnnoise_denoise(audio_path):
"""Remove noise using RNNoise model."""
# Load audio
audio_data, sample_rate = sf.read(audio_path)
# RNNoise expects 16kHz mono audio
if sample_rate != 16000:
import librosa
audio_data = librosa.resample(audio_data, orig_sr=sample_rate, target_sr=16000)
sample_rate = 16000
# Convert to mono if stereo
if len(audio_data.shape) > 1:
audio_data = np.mean(audio_data, axis=1)
# Process in chunks (RNNoise processes 480 samples at a time)
chunk_size = 480
denoised_audio = []
denoiser = rnnoise.RNNoise()
for i in range(0, len(audio_data), chunk_size):
chunk = audio_data[i:i+chunk_size]
if len(chunk) < chunk_size:
chunk = np.pad(chunk, (0, chunk_size - len(chunk)))
denoised_chunk = denoiser.process(chunk)
denoised_audio.extend(denoised_chunk)
return np.array(denoised_audio), sample_rate
# Usage
cleaned_audio, sr = rnnoise_denoise("noisy_audio.wav")
sf.write("cleaned_audio.wav", cleaned_audio, sr)
Installatie:
pip install rnnoise
Facebook's Demucs gebruiken
Demucs kan spraak scheiden van achtergrondgeluid:
from demucs.pretrained import get_model
from demucs.audio import AudioFile
import torch
def demucs_separation(audio_path):
"""Separate speech from noise using Demucs."""
# Load pre-trained model
model = get_model('htdemucs')
model.eval()
# Load audio
wav = AudioFile(audio_path).read(streams=0, samplerate=model.sample_rate, channels=model.audio_channels)
ref = wav.mean(0)
wav = (wav - ref.mean()) / ref.std()
wav = torch.from_numpy(wav).float()
# Separate sources
with torch.no_grad():
sources = model(wav[None])
sources = sources * ref.std() + ref.mean()
# Extract vocals (speech) - usually index 0 or 3
speech = sources[0, 0].cpu().numpy()
return speech, model.sample_rate
# Usage
speech_audio, sr = demucs_separation("noisy_audio.wav")
sf.write("speech_only.wav", speech_audio, sr)
Methode 4: Online tools voor ruisonderdrukking
1. Audacity Online (Cloud-versie)
- Gratis, browsergebaseerd
- Goed voor snelle verwerking
- Beperkte bestandsgrootte
2. Adobe Podcast Enhance
- AI-gestuurde ruisonderdrukking
- Gratis voor beperkt gebruik
- Uitstekende resultaten voor spraak
3. Krisp.ai
- Real-time ruisonderdrukking
- API beschikbaar voor integratie
- Goed voor live audio
4. Cleanvoice.ai
- Automatische ruisverwijdering
- Kan meerdere ruissoorten aan
- Batchverwerking beschikbaar
Complete workflow: audio voorbewerken voor STT
Hier is een compleet Python-script dat meerdere technieken combineert:
import librosa
import noisereduce as nr
import soundfile as sf
from scipy import signal
import numpy as np
def preprocess_audio_for_stt(audio_path, output_path):
"""Complete audio preprocessing pipeline for STT."""
# Step 1: Load audio
print("Loading audio...")
y, sr = librosa.load(audio_path, sr=16000, mono=True)
# Step 2: Remove DC offset
print("Removing DC offset...")
y = y - np.mean(y)
# Step 3: High-pass filter (remove low-frequency noise)
print("Applying high-pass filter...")
nyquist = sr / 2
normalized_cutoff = 80 / nyquist
b, a = signal.butter(4, normalized_cutoff, btype='high')
y = signal.filtfilt(b, a, y)
# Step 4: Normalize volume
print("Normalizing volume...")
max_val = np.max(np.abs(y))
if max_val > 0:
y = y / max_val * 0.95 # Normalize to 95% to avoid clipping
# Step 5: Noise reduction
print("Reducing noise...")
y = nr.reduce_noise(
y=y,
sr=sr,
stationary=False, # Use non-stationary for variable noise
prop_decrease=0.8 # Reduce noise by 80%
)
# Step 6: Final normalization
print("Final normalization...")
max_val = np.max(np.abs(y))
if max_val > 0:
y = y / max_val * 0.95
# Step 7: Save processed audio
print(f"Saving to {output_path}...")
sf.write(output_path, y, sr)
print("Preprocessing complete!")
return y, sr
# Usage
preprocess_audio_for_stt("noisy_recording.wav", "cleaned_for_stt.wav")
Best practices voor ruisverwijdering
1. Kies de juiste methode
- Constante ruis: Gebruik spectrale subtractie of stationaire ruisonderdrukking
- Variabele ruis: Gebruik niet-stationaire reductie of deep-learningmodellen
- Impulsruis: Gebruik klikverwijdering of interpolatie
- Meerdere ruissoorten: Combineer meerdere technieken
2. Behoud spraakkwaliteit
- Verwerk niet te agressief (kan artefacten introduceren)
- Gebruik gematigde instellingen voor ruisonderdrukking (60-80%)
- Behoud het frequentiebereik van menselijke spraak (80-8000 Hz)
- Behoud natuurlijke spraakeigenschappen
3. Test en herhaal
- Bekijk altijd een preview voordat je op de hele track toepast
- Vergelijk originele vs. verwerkte audio
- Test transcriptienauwkeurigheid met beide versies
- Pas instellingen aan op basis van resultaten
4. Houd rekening met je STT-model
- Sommige modellen (zoals Whisper) gaan goed om met ruis
- Voorbewerking is niet altijd nodig
- Test met en zonder voorbewerking
- Grotere modellen zijn robuuster tegen ruis
Veelgemaakte fouten om te vermijden
❌ Te agressieve ruisonderdrukking
- Kan spraakfrequenties verwijderen
- Veroorzaakt artefacten en vervorming
- Laat spraak robotachtig klinken
❌ Te veel lage frequentie verwijderen
- Kan belangrijke spraakcomponenten verwijderen
- Laat spraak dun of blikkerig klinken
- Beinvloedt natuurlijkheid
❌ Niet testen met je STT-model
- Voorbewerking verbetert de nauwkeurigheid mogelijk niet
- Sommige modellen werken beter met originele audio
- Doe altijd A/B-tests
❌ Audioformaat negeren
- Zorg voor een juiste sample rate (16kHz aanbevolen)
- Gebruik waar mogelijk lossless formaten
- Vermijd dubbele compressie
Integratie met spraak-naar-tekst
Gebruik met OpenAI Whisper
import whisper
import noisereduce as nr
import soundfile as sf
def transcribe_with_noise_reduction(audio_path):
"""Transcribe audio with noise reduction preprocessing."""
# Step 1: Reduce noise
audio_data, sr = sf.read(audio_path)
cleaned_audio = nr.reduce_noise(
y=audio_data,
sr=sr,
stationary=False,
prop_decrease=0.75
)
# Save temporary cleaned file
temp_path = "temp_cleaned.wav"
sf.write(temp_path, cleaned_audio, sr)
# Step 2: Transcribe with Whisper
model = whisper.load_model("base")
result = model.transcribe(temp_path)
# Clean up
import os
os.remove(temp_path)
return result["text"]
# Usage
transcription = transcribe_with_noise_reduction("noisy_audio.wav")
print(transcription)
Gebruik met SayToWords API
import requests
import noisereduce as nr
import soundfile as sf
def transcribe_with_saytowords(audio_path):
"""Preprocess and transcribe with SayToWords."""
# Preprocess audio
audio_data, sr = sf.read(audio_path)
cleaned_audio = nr.reduce_noise(
y=audio_data,
sr=sr,
stationary=False,
prop_decrease=0.8
)
# Save cleaned audio
cleaned_path = "cleaned_for_api.wav"
sf.write(cleaned_path, cleaned_audio, sr)
# Upload and transcribe
with open(cleaned_path, 'rb') as f:
files = {'file': f}
response = requests.post(
'https://api.saytowords.com/transcribe',
files=files,
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
return response.json()
Effectiviteit van ruisonderdrukking meten
Vergelijking voor/na
import librosa
import numpy as np
def measure_snr(audio_path):
"""Estimate signal-to-noise ratio."""
y, sr = librosa.load(audio_path, sr=None)
# Simple SNR estimation
signal_power = np.mean(y ** 2)
noise_floor = np.percentile(np.abs(y), 10) ** 2
snr_db = 10 * np.log10(signal_power / noise_floor) if noise_floor > 0 else 0
return snr_db
# Compare before and after
original_snr = measure_snr("noisy_audio.wav")
cleaned_snr = measure_snr("cleaned_audio.wav")
print(f"Original SNR: {original_snr:.2f} dB")
print(f"Cleaned SNR: {cleaned_snr:.2f} dB")
print(f"Improvement: {cleaned_snr - original_snr:.2f} dB")
Conclusie
Achtergrondgeluid verwijderen voordat je spraak-naar-tekst verwerkt, kan de transcriptienauwkeurigheid aanzienlijk verbeteren. De beste aanpak hangt af van:
- Ruissoort (constant vs. variabel)
- Audiokwaliteit (sample rate, bit depth)
- Beschikbare tools (software vs. programmeren)
- STT-model (sommige gaan beter om met ruis dan andere)
Snelle aanbevelingen:
- Voor snelle verwerking: Gebruik Audacity of online tools
- Voor automatisering: Gebruik Python-libraries zoals
noisereduce - Voor beste resultaten: Combineer meerdere technieken
- Voor productie: Test met je specifieke STT-model
Onthoud: Niet alle audio heeft voorbewerking nodig. Sommige moderne STT-modellen zoals Whisper zijn behoorlijk robuust tegen ruis. Test altijd zowel originele als verwerkte audio om te zien wat betere resultaten geeft voor jouw specifieke use case.
Aanvullende bronnen
Hulp nodig bij ruisonderdrukking voor je specifieke audio? Probeer SayToWords Speech-to-Text, met ingebouwde ruisverwerking en voorbewerkingsopties.