0
$\begingroup$

I am to classify few recorded phone calls as either containing speech or not by sampling lets say first 10 seconds.

The files contain either silence, dialtone or ringtones, or real human voice.

I have tried implementing butter-worth filter 100hz-400hz, then calculating Short time energy, Zero crossing rate, then calculating variance of the resultant array. But the results aren't good, calls with ringtones are confused with human voice.

I am implementing this in matlab or python (scipy & numpy)

$\endgroup$
1
$\begingroup$

Based on the highest frequency you expect in your signal define the sampling rate. Accumulate samples for 10 seconds and carry on an FFT, in groups to allow for enough energy in bins based on expected frequencies.

  • silence will have a typical low power with noise structure.
  • Dial tones and ringtones will have distinctive, pre specified bins.
  • Voice will have higher power than noise with some similarities to noise. You might fine tune your analysis but I do not think you will need it.
$\endgroup$
1
$\begingroup$

As mentioned in question, the algorithm is needed for pre-recorded calls(not real time), So one can determine the frequency bins that represents the Dialtone/Ringtone by spectrum analysis(short time spectrogram). Once the Dialtone/Ringtone bins are known energy based VAD could be used, where energy calculation should be done excluding Dialtone/Ringtone bins for each frame.

Two average energies could be used, one short term energy with high updation factor per frame and other long term energy with small updation factor per frame. every time short term energy is high for particular frame declare it as speech, otherwise non-speech. Tuning of the updation factor's is needed based on your recorded data.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.