2014-02-11 5 views
11

Я работаю с модулем распознавания голоса SDK Intel Perceptual Computing. Используя Microsoft Visual Studio 2012 Professional, образец SDK воспринимает диктовку, и после обработки голосовой ввод печатает ее в окне консоли. Все, что я хочу сделать, это скопировать вывод, напечатанный на окне консоли, и записать его в файл .txt. Я следую общему пути, но как-то текст, написанный в файле, - это просто некоторые числа.Запись или копирование вывода Visual C++ в текстовый файл

// Callback for recognized commands and alerts 
class MyHandler: public PXCVoiceRecognition::Recognition::Handler, public PXCVoiceRecognition::Alert::Handler 

{ общественности: MyHandler (станд :: вектор & команд) {этом-> Команды = команды; }

virtual void PXCAPI OnRecognized(PXCVoiceRecognition::Recognition *cmd) 
{ 
    wprintf_s(L"\nRecognized: <%s>\n", (cmd->label>=0)?commands[cmd->label]:cmd- >dictation); //this line prints the dictated statement// 
    // writing to a text file 
    printf("Writing to the txt file..."); 
    std::ofstream out("c:\\MyVoice.txt"); 
    out<<cmd->dictation; 
} 

protected: 
std::vector<pxcCHAR*> commands; 

};

int wmain(int argc, wchar_t* argv[]) { 
// Create session 
PXCSmartPtr<PXCSession> session; 
pxcStatus sts = PXCSession_Create(&session); 
if (sts < PXC_STATUS_NO_ERROR) { 
wprintf_s(L"Failed to create the PXCSession\n"); 
return 3; 
} 
// Parse command line 
UtilCmdLine cmdl(session); 
if (!cmdl.Parse(L"-file-iuid-grammar-sdname-realtime-eos",argc, argv)) return 1; 

// Create PXCVoiceRecognition instance 
PXCSmartPtr<PXCVoiceRecognition> vc; 
sts=session->CreateImpl(cmdl.m_iuid, PXCVoiceRecognition::CUID, (void **)&vc); 
if (sts<PXC_STATUS_NO_ERROR) 
{ 
wprintf_s(L"Failed to create PXCVoiceRecognition\n"); 
return 3; 
} 

// Find and initilize capture module 
UtilCaptureFile capture(session,cmdl.m_recordedFile,false); 
if (cmdl.m_sdname) capture.SetFilter(cmdl.m_sdname); 

// Query PXCVoiceRecognition profile 
PXCVoiceRecognition::ProfileInfo profile; 
for (int i=0;;i++) 
{ 
    sts=vc->QueryProfile(i, &profile); 
    sts=capture.LocateStreams(&profile.inputs); 
    return 3; 
} 
if (cmdl.m_realtime >= 0) capture.SetRealtime(cmdl.m_realtime); 
// Set PXCVoiceRecognition profile 
if (cmdl.m_eos) profile.endOfSentence = cmdl.m_eos; 
sts=vc->SetProfile(&profile); 

// Grammar intialization 
pxcUID grammar = 0; 
if (cmdl.m_grammar.size()<0) 
{ 
    wprintf_s(L"Dictation Mode\n"); 
} 

vc->SetGrammar(grammar); 
// SubscribeRecognition 
MyHandler handler(cmdl.m_grammar); 
vc->SubscribeRecognition(80, &handler); 
vc->SubscribeAlert(&handler); 

// Processing loop 
PXCSmartPtr<PXCAudio> audio; 
PXCSmartSPArray sps(3); 
wprintf_s(L"Press any key to exit\n"); 

while (!_kbhit()) 
{ 
    sts = capture.ReadStreamAsync(audio.ReleaseRef(),sps.ReleaseRef(0)); 
    sts=vc->ProcessAudioAsync(audio,sps.ReleaseRef(1)); 
    sps.SynchronizeEx(); 
} 

}

+0

Не могли бы вы правильно отформатировать код – Sean

+0

@Sean У меня были большие проблемы с форматированием его таким образом. Это не позволяет мне публиковать изменения. –

ответ

1

Вообще говоря, если бы вы могли правильно произвести вывод в окне консоли, то вы можете просто запустить исполняемый файл с аргументом командной строки, как > c:\result.txt перенаправить стандартный вывод в файл (Я предполагаю, что вы находитесь на Windows, так как у вас есть тег visual-C++), поэтому вам вообще не нужно менять код (все, что вы помещаете в cout, будет записано в файл, указанный в аргументе). Если вы используете графический интерфейс Visual Studio, аргументы командной строки можно указать на странице свойств проекта, иначе вы можете просто ввести команду в окне консоли вручную.

+0

Да, я использую окна 7. Не могли бы вы дать мне ссылку, в которой подробно описывается метод, который вы только что описали? –

18

Вы можете использовать > для перенаправления вывода команды, выполняемой Visual Studio. Добавьте его в аргументы команды, выбрав проект в проводнике решений и нажав PROJECT-> Properties-> Configuration Properties-> Debugging. Затем введите > output.txt в командные аргументы. После запуска приложения файл появится в рабочем каталоге, который по умолчанию является тем же каталогом, что и ваши .sln-файлы.

+0

Спасибо. Это работает для обычного приложения. Как-то, когда я делаю то же самое для этого кода распознавания голоса, выше, консоль ничего не выдаёт. Без этих изменений он отлично работает и дает мне результаты. Но ничего не делает для> output.txt, кроме создания пустого txt-файла. –

+1

Возможно, ваш выход будет в stderr вместо stdout? Для захвата stderr вы используете '2> output.txt' вместо'> '. Вы также можете комбинировать оба в один файл с '> output.txt 2> & 1' – Rastaban

+0

Хорошо. Но есть поворот. Программа отлично работает и создает файл txt. Но он не записывает вывод консоли в txt-файл. –

2

Я думаю, что он просто предлагаю запустить исполняемый файл и направить его в файл:
C: \ ехе> C:. \ Output.txt

Вот ссылка о redirection.

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