我正在尝试为我的计算器项目添加语音。我能够添加声音。但我面临一些问题。当我按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 = "";
}
这是相同的方法。
答案 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);
}
}