Tongbiao Li
2004-Aug-06 15:01 UTC
[speex-dev] speex_denoise on non-microphone noise (static ?)
That's might be speex_denoise() is trying to do already, based on the fact that if noise is present in speech signal, the former gets suppressed to a certain extend. Also, I noticed after suppression, the short, noisy attack - speex_denoise() have to be doing some kind of profiling. I've looked at a few offline denoise() solutions. They all involve profile building. A real-time solution is needed for our particular domain. Somehow, during speech, we want to build the *profile*, and subtract it from the subsequent signals. My question is: anyone have any idea on the profile of the *profiles", or the dynamically building of it, assuming just the interaction from other internal organs of the PC, and no fans etc. around? Meanwhile, I guess the initial solution is force the customers run some kind of wizard, before the running stage of our software, while (secretly) building up the profile, hoping they do not adjust their gain level etc later. Any comments (experience) on this, from anyone ? <p>-----Original Message----- From: Tom Grandgent [mailto:tgrand@canvaslink.com] Sent: Thursday, September 18, 2003 11:25 AM To: speex-dev@xiph.org Subject: Re: [speex-dev] speex_denoise on non-microphone noise (static ?) Hi, I'm not sure how speex_denoise() works, but my solution to this problem is fairly straightforward and works well in practice (in a simple VoIP program.) Note that I am also an amateur and am making up some terminology here... but I've tested my approach on several noisy environments with low-quality mics and it does work well. Problem: There's usually annoying noise present in a recorded signal, which can be attributed to interference from the PC and background noise in the user's environment (fan noise is common.) Assumptions: The noise is regular with respect to time - that is, it's steady and ongoing. It tends not to change significantly in frequency or amplitude over a long period of time. Solution: Subtract it from the signal. In order to do this, there are two steps required: 1) Build an average profile of the noise. This is done infrequently and [currently] triggered by the user. 2) Subtract the profile from the signal. This is done before encoding the signal with Speex. 1) Building the profile: I build an "average profile" of the noise in the frequency domain. So the user is prompted to be quiet for a few seconds, the noise is recorded, and it's run through the FFT. The signal is averaged (in the frequency domain) over those few seconds to get a "general idea" of the noise characteristics. 2) Removing the noise: Before encoding some recorded sound with Speex, I run the sound through the FFT. Then it's a simple matter to loop over the frequency spectrum and subtract the noise profile. At this point it's also easy to do simple filtering, so I do a high-pass filter around 200Hz or so to get rid of unwanted bass. Then, I do the inverse FFT to get the sound back into the time domain, and I encode it with Speex. The noise is *greatly* reduced. The difference can really be dramatic. Drawbacks: Not all noise is regular over time, and this approach is a manual, non-adaptive process (for now anyway...) One person I talk to has a monitor which causes annoying noise only when the screen is mostly white. So sometimes I end up asking them to rebuild the profile. Well, I'm not sure if this is helpful or not, but it works for me.. :) Tom <p>Tongbiao Li (tli@viack.com) wrote:> > The problem started with speech detection. Speech sections aredetected> well. However, once in a while non-speech sections are also markedas> speech. The root was finally traced down to microphone static noise. > > Then I pulled the microphone out. Our system still records noise. To > isolate the problem, I wrote a small app just to open the device and > record raw samples, calls speex_denoise() and outputs both samplesets.> The noise is still there, with level fluctuating with gain level,unless> "All mute" is chosen. > > In the case when NO microphone is plugged in, speex_denoise() smoothes > the signal and produces smoother (and even amplifies the signal)speech> like signals. It seems that speex_denoise( ) is very sensitive to > static noise. > > For regular speech COMBINED with microphone static (or more precisely, > the static detected at the microphone plug, or noise from inside thePC> ... someone help me out here), the noise samples do get suppressed > compared to speech samples. > > One observation: many noise sequences seem to have a signature ofsharp> spikes. > > Anyone have a solution of supressing this type of static? > > Thank you.--- >8 ---- List archives: http://www.xiph.org/archives/ Ogg project homepage: http://www.xiph.org/ogg/ To unsubscribe from this list, send a message to 'speex-dev-request@xiph.org' containing only the word 'unsubscribe' in the body. No subject is needed. Unsubscribe messages sent to the list will be ignored/filtered. --- >8 ---- List archives: http://www.xiph.org/archives/ Ogg project homepage: http://www.xiph.org/ogg/ To unsubscribe from this list, send a message to 'speex-dev-request@xiph.org' containing only the word 'unsubscribe' in the body. No subject is needed. Unsubscribe messages sent to the list will be ignored/filtered.