Problem using pitch shifting with TD-PSOLA and formant preservation
I believe you're correct, it's an issue with the overlap-add process. The code doesn't correctly calculate the triangular windows for lower pitches.
In short, the windows are too big.
It produces incorrect results for any pitch ratio below 1, such as 0.5 (one octave down).
The diagram below explains the issue as I understand it:

The big windows introduce so many artifacts (additional peaks) that the result sounds almost exactly the same, apart from the &quot;speaking into fan&quot; effect.
To get around this, it would be easiest to add an if statement which would use the existing windows only when the pitch ratio is equal or greater than 1, otherwise it should use the 'ideal windows'.
However, I'm not sure to implement the 'ideal windows' in Python. The existing algorithm uses newPeaks to calculate windows. For lower pitches it must use the old peaks array. However, this requires new math which I'm not sure how to implement exactly.