2016-05-16 3 views
1

я пытаюсь сделать некоторые функциональные возможности с озвучки, но отсутствуют некоторые параметры (я не знаю это) и работает на блоках кода на 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; 
}` 

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

2.Frequency

3.number каналов

размер 4.sample

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

6.number образцов

+1

Добро пожаловать в SO, пожалуйста, будьте немного более конкретными, задавая вопрос: что вы пробовали, чего вы ожидаете и т. Д. См. [Как спросить] (http://stackoverflow.com/help/how -to-ask) – Nehal

ответ

2

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

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. Sample Size - Вы получаете short s. Это целые числа со знаком, 2 байта, диапазон от -32,768 до 32,767. Вероятно, он использует весь диапазон, кажется, не настраивается, но вы можете проверить и посмотреть, что вы выберете.

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

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

+0

Я добавил следующий код: 'cout <<" Freqency: "<< samplerate << endl; cout << "Размер выборки:" << sounddata.size() << endl; cout << "Number of Samples:" << (& SynthCallback) << endl; 'но число выборок всегда возвращается 1 даже при попытке разного предложения с разной длиной –

+0

@HamdyFouad Ну, возможно, вам стоит опубликовать новый вопрос, который показывает, что полный код, который вы сделали, используя мои догадки. Код, который вы здесь указываете, заставит вас напечатать «Number of Samples» как указатель на функцию, поэтому я предполагаю, что вы имеете в виду, что «Размер выборки» возвращается как 1. Без полной программы трудно сказать, если вы сделали все, что угодно, как позвонить синхронизировать, и если вы не поместите в обратном вызове сообщение печати, чтобы узнать, вызвано ли это еще одной проблемой. В любом случае, задайте новый вопрос с помощью [MCVE] (http://stackoverflow.com/help/mcve) – HostileFork

Смежные вопросы