Я пытаюсь создать языковой переводчик (доказательство концепции), используя сеть кодировщика декодера LSTM и спектрограммы речи в качестве обучающих данных. Идея заключается в прямом преобразовании речи в речь без использования основных речевых переводов (простой обходной путь для https://arxiv.org/pdf/1904.06037.pdf). Я обучил модель, используя 500 речевых пар звуков Swedi sh Engli sh (подлинного звука человеческой речи), и казалось, что она чему-то научилась (скорее, запомнила, переобучила) из-за ограниченных данных и простого алгоритма. Но после того, как я изменил данные на Google Text to Speech API (поскольку и целевые, и исходные данные находятся в Google Voice, а не в человеческом голосе, как раньше), алгоритм больше не работает даже удаленно. Мне пришлось перейти на голос Google, потому что у меня для него много данных, но не для пар человеческого голоса.
#Original s2sII
#Normalizing data
v_min = e.min(axis=(0, 1), keepdims=True)
v_max = e.max(axis=(0, 1), keepdims=True)
e = (e - v_min)/(v_max - v_min)
v_min = s.min(axis=(0, 1), keepdims=True)
v_max = s.max(axis=(0, 1), keepdims=True)
s = (s - v_min)/(v_max - v_min)
#Model
inputs = Input(shape=(timesteps, features))
#Encoder
masked_encoder_inputs = layers.Masking(mask_value=0.0)(inputs)
#BNinput1 = BatchNormalization(name='Encoder-Batchnorm-1')(masked_encoder_inputs)
encoder_lstm = (LSTM(latent_dimE, dropout = 0.2, return_state=True))
encoder_outputs, state_h, state_c = encoder_lstm(masked_encoder_inputs)
encoder_states = [state_h, state_c]
#Decoder
decoder_inputs = RepeatVector(timesteps)(encoder_outputs)
decoder_lstm = LSTM(latent_dimD,dropout = 0.3,return_state=True,return_sequences=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state = encoder_states)
decoder_outputs = TimeDistributed(Dense(features))(decoder_outputs)
decoder_outputs = PReLU()(decoder_outputs)
model = Model(inputs, decoder_outputs)
encoder = Model(inputs, encoder_outputs)
#Compile and fit:
model.compile(optimizer= 'adam', loss='mean_squared_error',
metrics=['accuracy'])
history = model.fit(s, e,
batch_size=128,
epochs=100,
validation_split=0.2)
Здесь следует отметить: -
1. Это регресс проблема, поэтому точность теоретически не имеет смысла. Но при обучении модели с использованием человеческого голоса точность повысилась до 80% для 1500 эпох вышеупомянутой модели.
2. В задачах регрессии потеря имеет большее значение, а потеря для голоса Google (после нормализации обучения data) намного меньше человеческого голоса. Но точность на максимуме достигает 30% (что не имеет значения, поскольку я упомянул проблему регрессии).
Что я сделал для улучшения модели: -
1. Введена пакетная нормализация
2. Пробовал все функции активации, применимые к проблемам регрессии: Linear, дырявый Relu, PReLU
3. Пробовал Clipnorm и clipvalue, чтобы устранить проблемы взрывающегося градиента relu (если они есть, потому что потери достигли пика очень быстро примерно через 30 эпох)
4. Попытался уменьшить скорость обучения и скорость затухания.
5. Улучшено модель с использованием BiDirectional LSTMS, многоголового ч / б кодировщика и декодера.
Что мне нужно: -
1. Я знал, что изменение данных вызовет проблемы, но это было неожиданно очень плохо. Потому что оба данных (голос Google и человеческий голос) - это спектрограммы речи, которые в конечном итоге составляют go внутри алгоритма. Есть ли какие-либо предложения относительно того, как я могу сделать это лучше, кроме шагов, которые я уже сделал?
2. Имеет ли значение точность в регрессии, теоретически не должно, но, что интересно, тренировка человеческого голоса достигает 80% в 1500 эпох?
3. Любой источник данных параллельной речи (на двух языках, один из которых английский sh)? Одной стороны человеческого голоса тоже будет достаточно. Пока я нашел только German-Engli sh (https://www.cl.uni-heidelberg.de/statnlpgroup/librivoxdeen/), в котором есть немецкий язык (человеческий голос).
4. Есть ли другие подсказки или подсказки?