recognizing frames as voiced/unvoiced/silence
I think that when you said "zero processing rate" you meant  "zero crossing rate", are a lot of way to find the pitch frequency, autocorrelation based methods is one choice, if your signal is always monophonic you can try AMDF (Average Magnitude Difference Function), AMDF is calculated  by the difference between the waveform summing a lagged version of itself, I like to use AMDF, work fine in monophonic signals, this can be defined as:

$$AMDF(m)=\sum_{i=0}^{n-1-m}|x(i) - x(i+m)|$$

Where:

x=your signal
n=length(x)-1
i = 0 ... n
m = time lag block size


Together Pitch Frequency + Zero Crossing Rate + Energy, can track if your frame is voiced/unvoiced/silenced


The pitch Frequency say if exist periodicity in your frame 
Zero Crossing Rate say the times that amplitude of the signal changes
(crosses the x-axis)
Energy says how high or low is your frame


now you need to make decisions based in some threshold, and based in this decisions you can label your frames