Simple VAD (Voice activity Detector) implementation 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 &amp; numpy)
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.