# Removing breaths using python

My wife is trying her hand at making audio books and spends a lot of time cleaning up some voice actors breaths in their "finished" audio. We have tried some filters in Adobe Audition and it helps but not completely.

This is what I need help with specifically: I would like to make a python (it's the only language I'm comfortable with) program that will look through an audio file and remove all the breaths and replace them with just background room noise. I've never done anything in the audio field and I'm completely overwhelmed by all the different packages and concepts. Could someone please point me in the right direction?

• This kind of audio is not just finished with removing breaths. Actually, this should not be in your audio in the first place, ie: it is better to invest in good equipment there. A service that has come to quite some attention for podcats (ie similar audio type) is auphonic.com - they do a lot of postprocessing and it is probably a good solution for you. (Disclaimer: I have no conflict of interest to disclose - I just used to listen quite a lot of podcasts and the quality differences are remakable) – M529 Jul 28 '19 at 12:16

I was going to post this as a comment, but then it became so long that I thought, this constitutes really as an answer in fact.

Your question reminds me of the lab-work in my MSc course on Adaptive Filters. We used "Wiener filter" to remove some unwanted background noise (wind and tire noise) from the recorded input to make the speech clearer. The Wiener filter is quite simple to begin with.

You can look at the wiener filter from the scipy package of python - scipy.signal.wiener.

Another advantage of Wiener filter could be that you don't have to do any additional computational step of taking the Fourier transform of the input. That is, Wiener filter can be applied to the time domain signal directly.

A short example of how to use Wiener would be:

from scipy.signal import wiener
import matplotlib.pylab as plt
plt.plot(t,signal,'k')
plt.plot(t,wiener(signal,mysize=55),'r',linewidth=3)
plt.show()


Going by the assumption that the "breathing sound" in your audio inputs would be quite uncorrelated to the actually speech signal, just like the wind and tire noise that we removed to make the speech clear in our audio data, I expect the filter to provided a reasonable output.

(Note: There were then additional processing steps added sometimes to improve the audio output like making the parameters of the filter adaptive. You have to play around with the parameters a bit, as in one case, I remember the Wiener filter produced an output like it was coming from a hollow pipe, if you chose/modified the parameters in a particularly wrong way. But as a start, just applying the Wiener filter to your signal in Python would be a good first step. And you can improve from their onward, step by step.)

And if you are curious as to how this filter works then you catch up more on the math here.