Как повысить тон голоса без увеличения скорости (например, как в приложении Talking Tom Cat)?
Наткнулся на приложение Talking Tom Cat — кот на экране Android'а слушает микрофон и, если что-нибудь сказать, то он повторяет эту фразу, но повышает тон голоса. Получается забавный «мультяшный» голос, как у бурундучков. Очевидный способ добиться такого — воспроизвести звук немного быстрее, но тогда увеличится темп, чего не хотелось бы.
Вопрос: как добиться такого же эффекта? Интересуют алгоритм(ы), но и готовая библиотека для такого рода фигни будет полезна. Буду рад, если посоветуете литературу/статьи/сайт, где можно подсмотреть решение этой задачи.
Что-то слышал про применимость преобразования Фурье. Попытался сделать следующее: применяю прямое преобразование ко всему куску звука, «сдвигаю» результат (data[i — off] = data[i]), заполняя пустоты нулями, делаю обратное преобразование и воспроизвожу вещественную часть (округлив). Получилось что-то похожее, но с кучей искажений. Если применять не к куску, а разделить на несколько непересекающихся и применить по отдельности, результат не лучше.
А вообще, для голоса — теория такая: там есть тон, а есть форманты. При смещении тона форманты смещаться не должны. Они отрезаются формантным фильтром, остаток смещается, потом старые (несмещённые) форманты накладываются. Если хотите поменять «пол» голоса, то форманты тоже придётся преобразовать — у мужчин и женщин они чуть разные.
По-моему, в rubberband это встроено. Если нет, могу назвать gvst, в котором есть gsnap, который умеет правильно.