I implemented the phase vocoder algorithm in Python to time-stretch speech signals by following this paper and referring to this MATLAB tutorial. I can distinguish words in the original signal from the resynthesis result, and the pitch, as expected, doesn't get altered even though the time axis has been stretched(which is the goal of using phase vocoder). However, there exist noticeable artifacts. Specifically, the output contains more noise resembling Gaussian noise compared to the input, and the words somewhat sound like being spoken a robot. I have tried some improvements such as identity phase locking suggested by this paper, but the result remained unchanged. Has anyone encountered similar issues? How can I improve the result?
-
2$\begingroup$ yes, you want to apply the same phase shift to all of the FFT bins that correspond to a single sinusoid. so, in the frequency domain, you want to identify a bunch of adjacent bins (we might call that a main lobe) as being associated with the same sinusoid. then apply whatever phase adjustment on those bins to make that sinusoid share the same phase angle as the corresponding sinusoid of the previous frame. that way when the previous frame's sinusoid fades out and the current frame fades in, the two sinusoids have the same phase and there will be no cancellation when they add. $\endgroup$– robert bristow-johnsonCommented Feb 21, 2019 at 8:12
-
1$\begingroup$ are you getting a phasey sound from the sinusoidal components of a single pitch (a periodic signal) drifting out of phase with each other? $\endgroup$– robert bristow-johnsonCommented Feb 21, 2019 at 8:13
-
$\begingroup$ When I implemented the phase vocoder, the phase of each frequency bin depends on the corresponding bin in the previous frame. That being, the phase of a bin in the current frame is equal to that of the corresponding bin plus the change of phase. Is it what you mean by "make that sinusoid share the same phase angle as the corresponding sinusoid of the previous frame"? $\endgroup$– Steven ChanCommented Feb 21, 2019 at 9:39
-
$\begingroup$ Per RBJ, it might be better to change the phase angle of any nearby sidebands of frequency peaks to correspond to the change in phase angle of that nearest frequency peak, rather than the phase angle of the same side-band in the previous frame. This will cause more frame-to-frame phase discontinuities, but likely less distortion of periodic waveform shape. $\endgroup$– hotpaw2Commented Feb 21, 2019 at 20:39
-
$\begingroup$ "sidebands"? maybe i might call them "sidelobes", and if we could be certain that the sidelobes were not disguising other legitimate frequency components, i might agree with @hotpaw2 . for me, to do the phase vocoder really right, i used a Gaussian window which leaves almost no sidelobes . any bump of sufficient size would be treated as a separate frequency component. $\endgroup$– robert bristow-johnsonCommented Feb 21, 2019 at 21:50
1 Answer
The second artifact can be caused by the fact that phase vocoder slow-down resynthesis can reduce the frequency of any natural tremolo and vibrato in the human speaking voice, as well as any tiny period-to-period jitter in glottal closures.
One possible solution might be to measure the frequencies of tremolo and vibrato, and the jitter statistics, of voiced windows, and re-add those artifacts to (or modulate) the result of the PV resynthesis, if they are absent or too small.