【问题标题】:Why does Application.Speech.Speak read some numbers individually rather than put them together?为什么 Application.Speech.Speak 单独读取一些数字而不是将它们放在一起?
【发布时间】:2018-02-14 15:07:37
【问题描述】:

假设现在是 11 小时 11 分。它读作“ONE ONE”小时和“十一”分钟,如下所示:

Sub TEST1() 
  Application.Speech.Speak "It is " & Hour(Now()) & " hours and " & Minute(Now()) & " minutes"
End Sub

但是,下面的内容是“十一”小时和“十一”分钟

Sub TEST2() 
  Application.Speech.Speak "It is 11 hours and 11 minutes"
End Sub

相反,它读作“ONE ONE”小时和“十一”分钟,如:

Sub TEST3() 
  Application.Speech.Speak "It is " & "11" & " hours and " & "11" & " minutes"
End Sub

我怎样才能让它把这些数字读成文字?

【问题讨论】:

  • 如果在变量中创建字符串然后使用它会发生什么?
  • 这看起来像一个奇怪的错误,所有 3 应该是相同的结果。试试Application.Speech.Speak CStr("It is " & "11" & " hours and " & "11" & " minutes")
  • @Pᴇʜ 它说的是一样的:“ONE ONE”小时和“11”分钟
  • @LuizVaughan 这很奇怪,我不能做任何进一步的测试,因为我的声音是德语并且正确。如果您先将其写入变量MyText = "It is " & "11" & " hours and " & "11" & " minutes" 然后Application.Speech.Speak MyText 会怎样?您使用的是哪个本地(语言)版本的 Office 和 Windows?

标签: excel speech vba


【解决方案1】:

您需要创建/修改字符串以产生您想要的结果。

Sub dural()
    Application.Speech.Speak "11"
    Application.Speech.Speak "eleven"
End Sub

会重复同样的事情。

Sub dural()
    Application.Speech.Speak "1 1"
    Application.Speech.Speak "one one"
End Sub

也会这样做。一旦你决定了你想让计算机说什么,你就可以格式化/重新格式化字符串以产生结果。

编辑#1:

在我的电脑上:

Sub dmral()
    Dim s As String
    s = "It is " & "11" & " hours and " & "11" & " minutes"
    MsgBox s
    Application.Speech.Speak s
End Sub

也可以按预期工作。

看来需要先进行串联。

【讨论】:

  • 如果 OP 说 Application.Speech.Speak "It is " & "11" & " hours and " & "11" & " minutes" 的输出是“一小时十一分钟”这个答案没有帮助,对吧?你所说的听起来很合乎逻辑,我们会期待这一点(这正是我的德语声音所做的)。但与OP描述的效果完全相反。
  • @Pᴇʜ 查看我的 EDIT#1
  • 只是出于我个人的兴趣,如果您直接说它而不先通过变量连接,您是否得到了 OP 的同样奇怪的效果?
  • @Gary's-Student 您的回答在葡萄牙语习语中没有按预期工作。在英语中,它工作正常。不过,您给了我一些见解,感谢您抽出宝贵时间评估这个问题。
  • @T.M.我今天试试
【解决方案2】:

通过 SpeakXML 参数的方法

语法

.Speak(文本,SpeakAsync,SpeakXML,清除)

如果将第三个参数 SpeakXML 设置为 True,则可以在文本字符串中使用 XML 标记。

XML <spell> 标签强制语音拼出所有文本,而不是使用其默认的单词和句子中断规则。所有字符都应扩展为相应的单词(包括标点符号、数字等)。 注意<spell>标签不能为空,也不要忘记结束标签</spell>

尝试将以下内容与11 的两种变体一起使用:

代码

Sub TEST()
  Application.Speech.Speak "It is " & "<spell>11</spell>" & " hours and " & "11" & " minutes", False, SpeakXML:=True
End Sub

注意/警告

我使用的是中欧语言版本,而您的示例在我的情况下并没有说出一个人,所以可能还有另一个本地设置问题。

【讨论】:

  • 有关使用SpeakXML 设置的任何链接或更多信息? (还有其他标签吗?)
  • 其实我找到了我需要的东西here...我没有意识到内置的 TTS 如此灵活...
  • @ashleedawg - 因为要找到有关 MS Speech API 的内容并不容易,所以这个 SO 链接可能也会让您感兴趣 Save SAPI speech to a given file type - BTW 永远感谢您出色的有用提示和答案:- )
【解决方案3】:

葡萄牙语有一些有趣的发音挑战。除其他外,我们在 São Paulo 中的单词有鼻音“-ão”结尾。 -ão 的发音几乎与“sow”中的 -ow 发音相似,这意味着当您发音元音时,空气应该部分从您的鼻子中流出。话虽这么说......

Application.Speech.Speak "Já são" &amp; Hour(Now()) &amp; "horas e 11 minutos" --> 读作“现在是一小时十一分钟”

Application.Speech.Speak "11" --> 读作“十一”

Application.Speech.Speak "Já são" &amp; "11" &amp; "horas" --> 读作“现在是一小时”

Application.Speech.Speak "Já sao" &amp; Hour(Now()) --> 读作“现在是十一小时”。请注意,在这种情况下,鼻音 -“ão”已被删除。所以,数字发音是单词

Application.Speech.Speak "Já são^" &amp; Hour(Now()) --> 读作“现在是十一小时”。请注意,鼻音 -“ão”现在出现了,并且后面还有一个“^”符号

我不知道 Excel 为什么会这样。 但是,问题解决了 :)

【讨论】:

  • 如果您可以通过 SpeakXML 参数尝试我的方法并且它显示 2 个不同的拼写,我个人会很感兴趣。顺便说一句,我也提到了可能的本地设置问题。
  • @T.M.如您所料,通过使用 via SpeakXML 方法,单词的拼写方式有所不同。首先是“ONE ONE”,然后是“ELEVEN”。
  • 感谢您的快速回复,因为它证实了我的替代方法。
猜你喜欢
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
相关资源
最近更新 更多