Войти
ПрограммированиеФорумЗвук

Изменение голоса

#0
18:22, 7 мар. 2013

Есть массив байт, содержащий звуковую волну (pcm).
Подскажите, что с ним можно делать такого, чтобы менялся записанный голос?

Помимо ускорения и замедления воспроизведения, конечно. Куда копать, что читать?

#1
19:17, 7 мар. 2013

Sound Forge ?

#2
19:19, 7 мар. 2013

Полагаю, то, что ты ищешь, называется Pitch Shift.

#3
19:23, 7 мар. 2013

Formant

#4
20:57, 7 мар. 2013

Alprog
Какова цель? Нужно ли, чтобы голос оставался естественным, или достаточно сохранить понятность текста?

#5
21:21, 7 мар. 2013

2First
> Sound Forge?
Мне нужны алгоритмы, а не программы.

ALPINE
> Полагаю, то, что ты ищешь, называется Pitch Shift.
При первом гуглении решил, что эта штука просто добавляет эхо. Но хорошо, изучим подробнее.

jabberx
> Formant
Эм… а что с ними делать? Мне нужен сдвиг формант или что?
Не хочется тратить время на эффект, который делает что-то не то :)

Mikle
> Какова цель? Нужно ли, чтобы голос оставался естественным, или достаточно сохранить понятность текста?
Достаточно сохранить понятность текста.

***

Извиняюсь за слабую гугл-подготовку. Активным изучением темы займусь завтра.
Просто в музыкальной терминологии легко заблудиться и в итоге пойти не по той дорожке.

#6
10:56, 8 мар. 2013

Pitch Shift действительно может дать то, что требуется, но это довольно тяжёлый, и, в данном случае, избыточный фильтр.

Простейший пример: [file=86320]
Можно ещё компрессором прогнать, станет выразительнее.

#7
18:12, 8 мар. 2013

Сделал лучше, перезалил: Scrambler

#8
19:30, 8 мар. 2013

да перегони в спектральную область через FFT и делай там что захочешь - произвольный частотный фильтр

#9
20:02, 8 мар. 2013

thevlad
Даже очень сильная эквализация не делает голос неузнаваемым.

#10
20:22, 8 мар. 2013

Mikle
помоему ТС как раз неузнаваемый не надо а надо лишь его изменить

#11
0:46, 9 мар. 2013

Mikle
Спасибо. То, что надо.

Первый вариант, что ты скинул — это неведомое преобразование (разница между квадратами соседних семплов; это взято из головы или есть какая-то логика?) + нормализация.
В первом варианте, я так понял, уровни громкости в одни и те же моменты сильно отличались от исходной дорожки и во втором примере нормализация сделана более хитро: она применяется не на всём интервале, а смотрит разницу с оригиналом на конкретном участке и пропорционально масштабирует график. А текущей громкостью участка считается последний громкий звук, который постепенно затухает, если дальше тишина (как следы от столбиков частот при визуализации: сначала быстро, потом медленно).
Но во втором примере сама функция искажения усложнилась настолько, что понять ничего невозможно. Надеюсь, она выведена просто экспериментальным путём?

  For i = 0 To ArSize - 1
    V = 1& * ArI(i) * ArI(i)
    F1 = F1 \ 2 + (V - OldV)
    F2 = F2 \ 2 + F1
    OldV = V
    ArS(i) = F2
  Next i

Или есть какие-то общие соображения о том, как менять эту функцию?

thevlad
> помоему ТС как раз неузнаваемый не надо а надо лишь его изменить
Нет, голос должен отличаться. Может быть комичным, неправдоподобным, но обязательно другим.

#12
9:34, 9 мар. 2013

Alprog
> разница между квадратами соседних семплов; это взято из головы или есть какая-то логика?
Логика есть, экспериментальным путём подбирались только конкретные значения конкретных констант.
Возведение в квадрат даёт удвоение частоты (не совсем, с искажениями, но так даже лучше), некий аналог питч шифта на октаву, только проще.
Разница между текущим и следующим - дифференцирующая цепочка, аналогично пропусканию сигнала через конденсатор в электротехнике, помогает избавиться от постоянной составляющей, возникающей при возведении в квадрат, и вообще от низких частот, которые только понижают разборчивость.
Во втором варианте добавился фильтр среза ВЧ второго порядка (F1 и F2) и примерный аналог двухвходового компрессора (когда громкость одного сигнала управляется громкостью второго) вместо нормализации. Работу компрессора ты и сам хорошо разобрал.
Фильтры среза ВЧ работают, как аналог RC цепочки в сигнале, в статик переменной накапливается суммарный уровень, и он постоянно "разряжается" по экспоненте. Я применил целочисленное деление на 2 из соображений быстродействия (можно вообще сдвигать биты). Более общая формула такая:

    F1 = F1 * k + (V - OldV)
    F2 = F2 * k + F1
k определяет частоту среза, чем k ближе к единице, тем ниже частота.
ПрограммированиеФорумЗвук

Тема в архиве.