filtro rumore vocale umano


17

Qualcuno sa di un filtro per attenuare il non discorso? Sto scrivendo un software di riconoscimento vocale e vorrei filtrare tutto tranne il linguaggio umano. Ciò includerebbe rumore di sottofondo, rumore prodotto da un microfono schifoso o persino musica di sottofondo. Ho già implementato un filtro del primo ordine che compensa il roll-off di 6 dB dello spettro di potenza, ma sto ancora ascoltando il rumore (anche se il discorso sembra molto più chiaro). Ho pensato di utilizzare un filtro passa-basso, ma sono incerto sul farlo per due motivi:

  1. Non so se un pre-filtro passa-basso interferirà con il resto dell'elaborazione vocale. Anche se l'orecchio umano può rilevare solo suoni inferiori a 20 kHz, non voglio rischiare di eliminare eventuali armoniche di ordine superiore che potrebbero essere necessarie per elaborare il discorso (anche se non so se questo è il caso o no. Ma Non voglio correre rischi).

  2. Capisco che l'eccitazione di alcune consonanti (come f, h e s) sia quasi interamente un rumore bianco. Non voglio implementare un filtro antirumore che eliminerà il buon rumore, per così dire.

Idealmente, vorrei essere lasciato solo con il discorso della persona che parla al microfono. Se hai qualche idea o c'è qualcosa che mi manca, per favore fammi sapere. Molto apprezzato!


Credo. Lascio comunque aperto, semplicemente perché ho visto domande simili (filtri ed elaborazione acustica) qui a cui è stata data una buona risposta.
Zetta Suro,


Regola empirica: se vuoi sapere come implementare un determinato algoritmo DSP, ad esempio in un linguaggio particolare o su una piattaforma particolare, allora è in argomento per SO. Se è una domanda sugli algoritmi / tecniche DSP senza un angolo di programmazione specifico, quasi sicuramente appartiene a DSP.SE (dove tenderà anche a ottenere risposte di qualità migliore).
Paul R

Gotcha. L'hai migrato qui? Se è così grazie. Non sono riuscito a capire come migrarlo, quindi ho finito per chiedere nuovamente qui.
Zetta Suro,

Non io - l'ho contrassegnato e ho chiesto se un moderatore potesse spostarlo, quindi immagino che uno dei TPTB l'abbia fatto (grazie a chiunque fosse!).
Paul R

Risposte:


8

Un canale di comunicazione vocale utilizzato nella telefonia in genere ha una risposta in frequenza da 300 Hz a 3 kHz. Anche se questo rifiuta molta energia nel linguaggio normale, l'intelligibilità è ancora abbastanza buona - il problema principale sembra essere che alcune consonanti plastiche , ad esempio "p" e "t", possano essere un po 'difficili da discriminare senza i componenti di frequenza più alta .

Quindi probabilmente stai cercando un "punto debole" tra l'uso dell'intera larghezza di banda da 20 Hz a 20 kHz che si trova in genere nell'audio di consumo e il filtro più aggressivo utilizzato per le comunicazioni vocali (vedi sopra). Suggerirei di iniziare con un filtro passa-banda da 50 Hz a 8 kHz. Probabilmente migliorerà SNR al massimo solo di pochi dB, ma può essere d'aiuto, soprattutto se si ha molto rumore di fondo ad alta frequenza.


Grazie! Un mio amico in realtà ha suggerito il canale vocale, ma sospettavo che avrebbe attenuato troppa energia in alcune delle consonanti. Proverò da 50 Hz a 8 kHz e vedrò come funziona!
Zetta Suro,

2
Scegliere questa risposta semplicemente perché è la soluzione "rapida" che stavo cercando. Il resto delle risposte richiederà molte più ricerche che esaminerò sicuramente, in quanto saranno utili a lungo termine, ma questa è una semplice soluzione di filtro che stavo inizialmente cercando.
Zetta Suro,

5

Sarà utile utilizzare un filtro passa banda che corrisponda alla larghezza di banda del parlato.

Se hai diversi microfoni (come è ora il caso sui cellulari), ci sono molti metodi simili all'ICA che possono trarne vantaggio - ma la tua domanda mi suggerisce che hai un solo input.

Quello che vuoi fare è la "separazione della sorgente a un microfono" (nome preso dalla rivoluzionaria carta di Roweis), chiamato anche "sensore singolo". Attenzione: questo è ben lungi dall'essere un problema risolto e tutte le ricerche in questo campo sono molto recenti, senza algoritmi o approcci che sono un "chiaro vincitore" (diversamente dai modelli di miscele gaussiane + FST sono stati per il riconoscimento vocale).

Un buon framework per farlo è attraverso il filtro Wiener. Vedi Benaroya et al. "Separazione della sorgente a sensore singolo basata sul filtro Wiener e STFT a più finestre" (Leggi le sezioni 1 e 2, non preoccuparti della cosa multiresoluzione a meno che tu non ne abbia davvero bisogno). In breve, calcoli lo STFT del tuo segnale e, per ogni frame STFT, provi a ottenere stime dello spettro della voce e dello spettro del rumore e usi il filtro Wiener per recuperare la migliore stima dello spettro della voce da questo (questo è simile a "mascherare" lo spettro).

Il problema è ora il seguente: dato un frame STFT, stimare il parlato e il componente del rumore da esso. L'approccio più semplice descritto nell'articolo di Benaroya è attraverso la quantizzazione vettoriale: prendi diverse ore di discorso da molti oratori, calcola la STFT, esegui LBG su di esso per trovare un libro di codici di 512 o 1024 cornici vocali tipiche; fare la stessa cosa per il rumore. Ora, dato un frame del tuo segnale di input, proiettalo non negativamente (una procedura di aggiornamento del gradiente moltiplicativo è descritta nel documento) sulle basi del parlato e del rumore, e ottieni le tue stime del parlato e del rumore. Se non vuoi occuparti della cosa della proiezione non negativa, usa solo il vicino più vicino. Questa è davvero la cosa più semplice che potrebbe funzionare nel reparto "separazione della sorgente a sensore singolo".

Si noti che un sistema di riconoscimento vocale potrebbe effettivamente fornire alcuni input per un sistema di separazione. Fai un primo passaggio di decodifica usando il tuo sistema di riconoscimento vocale. Per ciascun fotogramma, prendi il vettore MFCC medio dal gaussiano che ha ottenuto il punteggio migliore. Invertire ciò in uno spettro. Boom, hai una maschera che ti dà la posizione spettrale più probabile dei bit simili al parlato e puoi usarla come input per il filtro di Wiener. Questo suona un po 'come un cenno della mano, ma il geista è che per separare una fonte è necessario un buon modello per essa, e un sistema di riconoscimento vocale portato all'indietro è un inferno di un buon modello generativo per i segnali vocali.


1

Probabilmente dovresti considerare l'analisi indipendente dei componenti (ICA) poiché il tuo problema è molto simile al problema del "cocktail party" che viene spesso utilizzato per descrivere l'ICA. In breve, ICA trova i componenti del segnale indipendenti l'uno dall'altro. Ciò presume che altri rumori nell'ambiente (lavastoviglie, rumore bianco, ronzio della ventola) saranno indipendenti dalla sorgente del segnale della voce e possano essere separati.

L'ICA è simile alla PCA (analisi dei componenti principali) ma invece di massimizzare la varianza sugli assi principali, massimizza l'indipendenza. Esistono molte implementazioni di ICA che dovrebbero essere inserite in qualsiasi ambiente di codifica che stai utilizzando.


4
L'ICA richiede tanti segnali di ingresso quante sono le fonti da separare. Nel denoising del parlato, ci rimane solo un segnale e l'ICA non è quindi di alcun aiuto.
Pichenettes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.