要发言的文本到语音传递字符串

时间:2016-08-08 02:23:22

标签: c++ visual-studio-2015 text-to-speech sapi speech-synthesis

我是编程新手,所以需要你的帮助,只需尝试使用CLR控制台应用程序中的Speech Synthesizer对象在Windows 10上的Visual Studio 2015中使用Text to Speech C ++编写程序。但是我无法弄明白,如何通过变量“t”来说不仅仅是合成 - >说话(“保存线”);和synth->说话(“线存在”); ,但是像这样的“t”:“行(文本行)存在”。那么如何将字符串传递给Speak函数呢? 你能帮我解决一下:

#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>

using namespace std;
using namespace System;
using namespace System::Speech::Synthesis;
using namespace System::IO;

const string FILE_NAME = "lines.txt";

vector<string> getFileLines(string file) {
    ifstream in(FILE_NAME);
    vector<string> lines;
    for (string line; getline(in, line); ) {
        lines.push_back(line);
    }
    return lines;
}

string getUserInput() {
    string str;
    getline(cin, str);
    return str;
}

int main() 

{

    vector<string> lines = getFileLines(FILE_NAME);

    ofstream fileOut(FILE_NAME, ios::app);

    for (int n = 0; n < 10; n++)

    {

    cout << "Write: > ";
    std::string t = getUserInput();

    auto it = std::find(lines.begin(), lines.end(), t);

    if (it == lines.end()) {

        fileOut << t << endl;
        lines.push_back(t);

        cout << "Line \"" << t << "\" saved.\n";

        SpeechSynthesizer^ synth = gcnew SpeechSynthesizer();
        synth->Speak("Text saved");

    }

    else 

    {

        cout << "LIne \"" << t << "\" exist.\n";

        SpeechSynthesizer^ synth = gcnew SpeechSynthesizer();
        synth->Speak("Line exist");


    }
} 

    cout << endl;
    getUserInput();
    return 0;
}

和marshal的这种方式:

#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <msclr\marshal_cppstd.h>

using namespace msclr::interop;  
using namespace std;
using namespace System;
using namespace System::Speech::Synthesis;
using namespace System::IO;

const string FILE_NAME = "lines.txt";

vector<string> getFileLines(string file) {
    ifstream in(FILE_NAME);
    vector<string> lines;
    for (string line; getline(in, line); ) {
        lines.push_back(line);
    }
    return lines;
}

string getUserInput() {
    string str;
    getline(cin, str);
    return str;
}

int main() 

{

    vector<string> lines = getFileLines(FILE_NAME);

    ofstream fileOut(FILE_NAME, ios::app);

    for (int n = 0; n < 10; n++)

    {

    cout << "Write: > ";
    std::string t = getUserInput();

    auto it = std::find(lines.begin(), lines.end(), t);

    if (it == lines.end()) {

        fileOut << t << endl;
        lines.push_back(t);

        cout << "Line \"" << t << "\" saved.\n";

        String^ str = marshal_as<String^>(str);
        std::string line = "Line " + t + " exists!"; 
        synth->Speak(marshal_as<String^>(line));

    }

    else 

    {

        cout << "LIne \"" << t << "\" exist.\n";

        String^ str = marshal_as<String^>(str);
        std::string line = "Line " + t + " exists!"; 
        synth->Speak(marshal_as<String^>(line));

    }
} 

    cout << endl;
    getUserInput();
    return 0;
}

我收到了这个错误:

  

错误C4996   'msclr ::互操作:: error_reporting_helper&LT; _To_Type,_From_Type,假&gt;::marshal_as':   库或头文件不支持此转换   不包括此转换所需的内容。

     

错误C2065'_This_conversion_is_not_supported':未声明的标识符   X_TTS2 c:\ program files(x86)\ microsoft visual studio   14.0 \ vc \ include \ msclr \ marshal.h 219

1 个答案:

答案 0 :(得分:1)

根据文件:

marshal_as

  

如果您尝试编组一对不受支持的数据类型,marshal_as将在编译时生成错误C4996。有关详细信息,请阅读此错误提供的消息。可以生成C4996错误,而不仅仅是已弃用的函数。其中一个例子是尝试编组一组不受支持的数据类型

记录支持的转化:

Overview of Marshaling in C++

如果您使用marshal_as(),则std::string功能支持将System::String^封送到marshal_cppstd.h,您的示例就是这样做:

#include <msclr\marshal_cppstd.h>

std::string line = "Line " + t + " exists!"; 
synth->Speak(marshal_as<String^>(line));

因此,您显示的错误没有意义,除非它引用此声明:

String^ str = marshal_as<String^>(str);

您正在尝试将String^编组为String^,这不是支持的编组转换。此外,在声明它的同一语句中使用变量仍然是未定义的行为,因此您需要完全删除该语句,因为它是无用的。

或者,如果您使用marshal_as(),则const char*支持封送marshal.h

#include <msclr\marshal.h>

std::string line = "Line " + t + " exists!";
synth->Speak(marshal_as<String^>(line.c_str()));