Функциональность Espeak

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

  `#include<string.h>
#include<malloc.h>
#include</usr/local/include/espeak/speak_lib.h>
int main(int argc, char* argv[] )
{
char text[] = {"الله لطيف "};
espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 0, NULL, 0 );
espeak_SetVoiceByName("ar");
unsigned int size = 0;
while(text[size]!='\0') size++;
unsigned int flags=espeakCHARS_AUTO | espeakENDPAUSE;
espeak_Synth( text, size+1, 0,POS_CHARACTER,0, flags, NULL, NULL );
espeak_Synchronize( );
return 0;
}`

Теперь вы могли бы помочь нам найти эти параметры из Espeak
1.Fuction, которые возвращают сгенерированную волну, чтобы сохранить ее в переменной

2.Frequency

3. количество каналов

4. Размер образца

5. буфер, в котором мы храним образцы

6. количество образцов

1

Решение

Если вы не можете найти подходящий пример, вам придется прочитать документацию в заголовочном файле. Не использовал это, но это выглядит довольно понятным:

http://espeak.sourceforge.net/speak_lib.h

Когда ты звонил espeak_Initialize Вы прошли в AUDIO_OUTPUT_PLAYBACK. Вместо этого вам нужно будет передать AUDIO_OUTPUT_RETRIEVAL, и тогда, похоже, вы должны позвонить espeak_SetSynthCallback с функцией вашего собственного создания, чтобы принять образцы.

Ваш адаптированный код будет выглядеть примерно так (Непроверенные):

#include <string.h>
#include <vector>
#include </usr/local/include/espeak/speak_lib.h>

int samplerate; // determined by espeak, will be in Hertz (Hz)
const int buflength = 200; // passed to espeak, in milliseconds (ms)

std::vector<short> sounddata;

int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) {
if (wav == NULL)
return 1; // NULL means done.

/* process your samples here, let's just gather them */
sounddata.insert(sounddata.end(), wav, wav + numsamples);
return 0; // 0 continues synthesis, 1 aborts
}

int main(int argc, char* argv[] ) {
char text[] = {"الله لطيف "};
samplerate = espeak_Initialize(AUDIO_OUTPUT_RETRIEVAL, buflength, NULL, 0);
espeak_SetSynthCallback(&SynthCallback);
espeak_SetVoiceByName("ar");
unsigned int flags=espeakCHARS_AUTO | espeakENDPAUSE;
size_t size = strlen(text);
espeak_Synth(text, size + 1, 0, POS_CHARACTER, 0, flags, NULL, NULL);
espeak_Synchronize();

/* in theory sounddata holds your samples now... */

return 0;
}

Итак, на ваши вопросы:

  1. Функция, которая возвращает сгенерированную волну, чтобы сохранить ее в переменной — Вы пишете функцию обратного вызова, и эта функция получает мало buflengthдлинные кусочки WAV для обработки. Если вы собираетесь накапливать данные в больший буфер, я показал, как вы можете сделать это самостоятельно.

  2. частота — С помощью этого API это не похоже на то, как вы выбираете его, espeak. Это в Гц и вернулся как samplerate выше.

  3. Количество каналов — Там нет упоминания об этом, и синтез голоса, как правило, моно, можно подумать. (Вокалы по умолчанию смешаны по центру в большинстве стерео миксов … так что вы возьмете моноданные, которые вы вернули, и воспроизведете те же самые синтезированные данные на левом и правом каналах.)

  4. Размер образца — Ты получаешь shorts. Это целые числа со знаком, 2 байта, диапазон от -32 768 до 32 767. Вероятно, он использует весь диапазон, кажется, не настраивается, но вы можете проверить и посмотреть, что вы получите.

  5. Буфер, в котором мы храним образцы — Буфер синтеза, по-видимому, принадлежит espeak, который обрабатывает его выделение и освобождение. Я показал пример использования std :: vector для сбора фрагментов из нескольких вызовов.

  6. Количество образцов — Каждый звонок на ваш SynthCallback получит потенциально другое количество образцов. Вы можете получить 0 за это число, и это может не означать, что это в конце.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]