Войти
ПрограммированиеФорумОбщее

Не получается формантный синтезатор

Страницы: 1 2 3 4 Следующая »
#0
(Правка: 13:26) 13:20, 12 июня 2019

Попробовал по этой: статье, точнее по этой иллюстрации: Изображение


.Получился гул. Что я делаю не так? Код буквы а:

for (WaveTime=Start; (CurrentSample<=LastSample)&&(WaveTime<=End); ++CurrentSample, WaveTime+=1.0/((double)WaveFrequency))
{
  (*CurrentSample)=(int16_t)((sin(WaveTime*600.0*tau)+sin(WaveTime*700.0*tau)+sin(WaveTime*800.0*tau)+sin(WaveTime*1300.0*tau)+sin(WaveTime*1500.0*tau)+sin(WaveTime*1700.0*tau))*32000.0/6.0);
}
. Это заполнение подцепочки монофоничегоского wav глубиной 16 бит.


#1
(Правка: 21:25) 20:09, 12 июня 2019

Ты забыл про обертона. В статье описали только ключевые частоты характеризующие определенный звук, а не то как его воспроизвести. И ты просто взял ряд частот без акцентуации, и посчитал среднее.

Тарас-Прогер
> Код буквы а:
У "А" две акцентные частоты 700 и 1400, но еще существуют обертона, более глухие колебания от 100 до 4000 Гц их около 30. Они присутствуют независимо от гласной и только ряд из них являются более сильными - определяет звук (гласную).
Например для "А" это целый рад частот от 100 до 2700 наиболее яркие 700 и 1400. Да и надо не забывать что это два отдельных звука один из них гортанный 700, а другой создается ревербирацией ротовой полости и голосовыми связками более высокий 1400 (это то что называют шепотом).

#2
(Правка: 22 июня 2019, 11:19) 12:31, 13 июня 2019

foxes
> Ты забыл про обертона.
Нет. Я просто начал с основы.
foxes
> В статье описали только ключевые частоты характеризующие определенный звук
Вот. Форманты характеризуют звук. То есть их достаточно, чтоб понять, что за звук произнесён. Не для естественности звучания, а для идентификации звука отдельно от голоса. Да, без обертонов получится голос робота. И не просто голос робота, а каким этот голос представляли себе советские дети году так в 1980-м. У меня звуки получились разборчивые, но не имеющие вообще ничего общего с человеческим языком. С языком, а не с голосом. То есть это вообще другие звуки. И для того, чтоб понять, что именно говорит робот, придётся зубрить эти звуки как саунд-коды. Настоящий же русский вокодер без обертонов будет говорить странным голосом, но человеку для понимания произносимых им фраз не потребуется дополнительное обучение. С таким же успехом можно было разложить номера битов ASCII по частотам и назначать их присутствие/отсутствие в звуке по ASCII-коду. Или по коду KOI8-rus: 0-му биту соответствует 200 Гц, 1-му – 300 Гц, 2-му – 450, 3-му – 675Гц, 4-му – 1013 Гц, 5-му – 1519 Гц, 6-му – 2278 Гц, 7-му – 3417 Гц, если бит в коде буквы равен 1, то соответствующая частота в звуке есть, а если бит кода буквы равен 0, то соответствующей частоты в звуке нет. Или морзянку юзать. Или так: 0-му биту соответствуют частоты 200Гц и 250 Гц, 1-му – 300 Гц и 375 Гц, 2-му – 450 Гц и 563 Гц, 3-му – 675 Гц и 844 Гц, 4-му – 1013 Гц и  1266 Гц, 5-му – 1519 Гц и 1898 Гц, 6-му – 2278 Гц и 2848 Гц, 7-му – 3417 Гц и 4271 Гц, если бит кода буквы равен 1, то из пары частот выбирается большая, а если бит кода буквы равен 0, то из пары частот выбирается меньшая. Люк сможет общаться с роботом не хуже, чем в фильме с R2D2, а обычный пользователь не сможет совсем, так как для этого требуется дополнительное обучение. Вывод: что-то здесь не так. Какая-то важная для идентификации звука информация потеряна. При том, что в статье утверждается, что вся важная для идентификации звука информация передаётся только на этих частотах. Вместо голоса робота, говорящего по-русски получается голос робота, говорящего по-инопланетянски. А в статье говорится о формантах русских звуков. На неподготовленное же ухо это гул, хоть и разный.

#3
13:21, 13 июня 2019

Попробуй разные коэффициенты для разных частот, я думаю твоя проблема именно в этом. Ты их просто усредняешь, в то время как они должны сильно отличаться по громкости.

#4
14:47, 13 июня 2019

А какие?

#5
19:39, 13 июня 2019

Тарас-Прогер
> А какие?
Не знаю, экспериментируй. Вот foxes написал 700 и 1400, попробуй им побольше коэффициенты сделать. Или наверняка можно проанализировать существующий звук в спектроанализаторе и посмотреть, какие там пики. Я не пробовал сам, но по идее там можно найти ответы на все твои вопросы.

#6
(Правка: 20:41) 20:05, 13 июня 2019

Тарас-Прогер
> А какие?
Звук без правильных обертонов, даже по минимуму, это не звук вообще, и не звук робота. Поскольку абсолютно одинаковый обертональный ряд частот (как и ряд твоих синусоид), с разными амплитудами, могут давать гитару, колокол или скрипку и тот же голос. Даже у металлического голоса множество сложных обертонов.

Проще будет взять разные базисы: пилообразный, квадратный, синусоидальный и тд и использовать их к близким по звучанию гласным. Чем подбирать амплитуды.

#7
4:54, 14 июня 2019

Чёрта с два. Обертона – это тэмбр. Голоса разных людей, или разных музыкальных инструментов. Но 440 Гц – это всё равно Ля с любыми обертонами или вообще без них. Гитара из одной частоты не получится, получится пищалка, но узнать ноту можно будет всё равно. Здесь частот 5-6 в одном звуке. И звуки можно отличить друг от друга. Но звуки именно русских букв не получились.
foxes
> с разными амплитудами, могут давать гитару, колокол или скрипку и тот же голос.
Во-первых, гитара из человеческого голоса не получится. Во-вторых, обертона дают не голос вообще, а конкретный голос. А в-третьих, у каждого обертона одни и те же, независимо от того, что он говорит, а у разных людей обертона разные, но разные фразы, произнесённые одним человеком, легко различимы, а если разные люди будут повторять один и тот же монолог Гамлета, то можно будет выделить одни и те же звуки.

#8
4:54, 14 июня 2019

gammaker
> в спектроанализаторе и посмотреть, какие там пики.
У меня нет анализатора.

#9
(Правка: 4:58) 4:56, 14 июня 2019

foxes
> Проще будет взять разные базисы: пилообразный, квадратный, синусоидальный и тд
> и использовать их к близким по звучанию гласным.
Бред. Во-первых, сложнее. А во-вторых, это ж не кабель, форма кривой всё равно не может быть передана. И задача не сделать звуки не похожими на друг друга, а сделать их идентифицируемыми без зубрёжки.

#10
8:23, 14 июня 2019

Ощущение, что идет какая-то путаница обертонов с формантами.

Обертоны - это всего лишь синусоиды с частотами, кратными частоте основного тона (музыкального или воспроизводимого голосовыми связками). Фактически "частокол" в спектре, ровный по частотной оси, но произвольный по амплитуде (обычно спадающий с некоторыми "горбами")

Форманты - это "горбы" в спектре. В случае строго тонального звука - это "горбы" в огибающей обертонного "часотокола". В случае шумового сигнала - "горбы" в спектре шума. В случае человеческой речи это "горбы" в спектре смеси шума и тонального звука (чем слабее голос, тем больше в нем доля шума).

Мозг различает гласные звуки именно по расположению "горбов" спектра. Причем положение не абсолютное, а в некотором приблизительном отношении с тональным диапазоном говорящего. То есть, у детей те же форманты звука "а" будут гораздо выше формант "а" взрослого мужчины, но мозг воспринимает их именно как "а" за счет того, что усредненная высота голоса у детей тоже выше, и отношение приблизительно сохраняется.

Но если еще более точно, то при различении речи мозг ориентируется не только на расположение формант, но и на их динамику. То есть для мозга важно не только положение горбов, но и моменты их возникновения в спекте во времени, синхронность (гласные после согласных) или скольжение (дифтонги, переходы й-а, а-й). Небольшой рассинхрон по времени возникновения формант - и они уже совсем по другому воспринимаются, иногда даже не как цельный звук, а как два разных звука.

#11
8:40, 14 июня 2019

Тарас-Прогер
> Получился гул. Что я делаю не так?

А ты добавь к ним с гораздо меньшими амплитудами синусоиды, кратные частоте 100 (ведь фактически ты взял обертоны частоты 100Гц).

Это ведь на картинке просто подписи на частотных осях, а не прямое указание, что строго 600, 700 и 800. То есть, картинка говорит, что для буквы "а" в спектре должны быть "горбы" в районе 700Гц и 1500Гц (причем еще непонятно, для какого именно это голоса, для мужского, женского или детского), а из каких именно обертонов будут эти "горбы" - здесь не указывается, это зависит от тона голоса.

#12
(Правка: 10:01) 10:00, 14 июня 2019

Тарас-Прогер
> Бред. Во-первых, сложнее. А во-вторых, это ж не кабель, форма кривой всё равно
> не может быть передана. И задача не сделать звуки не похожими на друг друга, а
> сделать их идентифицируемыми без зубрёжки.
Я только хотел сказать, что тот бред который ты пытаешься сделать не чуть не лучше. И если кто то объяснит тебе тоже самое другими словами и ты это наконец то поймешь, мне только останется развести руками.

#13
10:00, 14 июня 2019

Dmitry_Milk
> Форманты - это "горбы" в спектре.
Нет. Форманты – это те волны, которые важны для идентификации звука. Чтоб отличит а от у. А горб может быть и на посторонней волне, получится, что на речь наложен свист на волне 8 кГц, но отличить а от у он не помешает, а при его отсутствии звук станет не грубее, а чище.

#14
10:01, 14 июня 2019

foxes
> Я только хотел сказать, что тот бред который ты пытаешься сделать не чуть не
> лучше.
Пожалей бедного ирокеза, сходи в школу. Я ведь даже разлексить твой бред не могу.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее