为我的文字添加语音

时间:2014-04-11 20:24:00

标签: c#

我正在尝试为我的计算器项目添加语音。我能够添加声音。但我面临一些问题。当我按13时,它首先说" One"然后说"十三"。还有一件事我无法将声音添加到等号(=)。

private void NumberButtons(object sender, EventArgs e)
{
    Button b = sender as Button;
    if ((b == null) || (b.Text == "0" && buffer.Length == 0))
        return;
    buffer += b.Text;
    txtOutput.Text = buffer;
    if (txtOutput.Text != "")
    {
        SpVoice voice = new SpVoice();
        voice.Volume = 100;
        voice.Speak(txtOutput.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync);
    }
}

这是方法。

private void Equal(object sender, EventArgs e) 
{ 
    if (buffer.Length != 0) 
        operand[1] = Double.Parse(buffer); 
    switch (op) 
    { 
        case '+': result = operand[0] + operand[1]; break; 
        case '-': result = operand[0] - operand[1]; break; 
        case '*': result = operand[0] * operand[1]; break;
        case '/': result = operand[0] / operand[1]; break; 
    } 
    txtOutput.Text = result.ToString();
    if (txtOutput.Text != "")
    {
        SpVoice voice = new SpVoice();
        voice.Volume = 100;
        // voice.Speak("The Result Is"+ SpeechVoiceSpeakFlags.SVSFlagsAsync);
        voice.Speak(txtOutput.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync);
    }
    step = 1; 
    buffer = ""; 
}

这是相同的方法。

3 个答案:

答案 0 :(得分:1)

你必须将数字转换为单词,否则它会将13转换为三。 Here's一个帖子,告诉你如何做到这一点。

另外,为了达到同等水平,您需要手动将其添加到您想要说出的文本中。

基本上你需要像这样构建文本,其中operationText将是"加上"或"减去"等等:

  var textToBeSpoken =  input1ToWord + operationText + input2ToWord + "equals" + resultToWord

答案 1 :(得分:1)

我快速查看了http://msdn.microsoft.com/en-us/library/ms723609(v=vs.85).aspx,我看不到任何关于说话数字的信息。

正如我在评论中所读到的那样,您可以调整代码以用单词说出数字。

快速更改代码

在Visual Studio中安装Humanizer nuget http://www.nuget.org/packages/humanizer

然后将代码更改为

// using Humanizer;    
voice.Speak(result.ToWords(), SpeechVoiceSpeakFlags.SVSFlagsAsync);

ToWords()是一种扩展方法,可将您的数字转换为等效字词,例如13到“十三”

答案 2 :(得分:0)

我可以使用Tasks和Cancelation令牌解决它,代码如下:

我在课程中添加了一个列表:

List<CancellationTokenSource> toCancel = new List<CancellationTokenSource>();

还有NumbersButtons事件:

private void NumberButtons(object sender, EventArgs e)
{
    Button b = sender as Button;
    if ((b == null) || (b.Text == "0" && buffer.Length == 0))
        return;
    buffer += b.Text;
    txtOutput.Text = buffer;

    if (txtOutput.Text != "")
    {
        if (toCancel.Count > 0)
        {
            foreach (var tc in toCancel)
            {
                tc.Cancel();
            }
        }

        CancellationTokenSource ts = new CancellationTokenSource();
        CancellationToken ct;

        ct = ts.Token;

        toCancel.Add(ts);

        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(1000);

            if (ct.IsCancellationRequested == false)
            {
                SpVoice voice = new SpVoice();
                voice.Volume = 100;
                voice.Speak(txtOutput.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync);
            }
        }, ct);
    }
}