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?
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.