Board logo

标题: [技术讨论] [已解决]VBS文字转语音如何才能更完美 [打印本页]

作者: locoman    时间: 2023-2-18 01:56     标题: [已解决]VBS文字转语音如何才能更完美

本帖最后由 locoman 于 2023-2-19 17:22 编辑
  1. Set sapiX = CreateObject("SAPI.SpVoice")
  2. sapiX.Volume =100 '音量
  3. sapiX.Rate = 0 '语音速率越大越快
  4. FlagsAsync=0 '同步或异步,1是异步
  5. set colVoice=sapiX.getVoices '安装有多少个语音集合可选
  6. set sapiX.Voice=colVoice(0) '选第1种语音
  7. strText="您好!欢迎致电好吃小面馆服务热线。我们会在2023-3-24 15:30回复您的问题。"
  8. sapiX.Speak strText,FlagsAsync
复制代码
----------------------------------------
上面代码是能实现文字转语音,但不够完美!

进一步向大神请教:
1. FlagsAsync=0 '同步或异步,1是异步
这是什么意思?设置怎么了没有啥效果变化?

2. set sapiX.Voice=colVoice(0) '选第1种语音
设置其它值,没有效果,怎么才能使用更多的语音效果呢?

3. 可以男声发音吗?
看了很多的类似VBS文字转语音的脚本,都是发的女声,VBS只能发女声吗?
可以使用其他更好听的语音库吗?

4. 代码还可以有更多的设置吗?
比如设置语调,或者其他的设置,令其语音听起来更象真人发声。

谢谢大神不吝指教!
作者: jyswjjgdwtdtj    时间: 2023-2-18 10:59

记得别人是用这个组件来测试电脑是男的还是女的所以男女声估计不能调吧
还有要用这干啥,这不就一玩具吗
作者: jyswjjgdwtdtj    时间: 2023-2-18 11:01

好像声音种类是要自己安装的,系统只带了一种
作者: locoman    时间: 2023-2-18 20:06

本帖最后由 locoman 于 2023-2-18 21:12 编辑

代码是可以正常运行的。
通过这个
set sapiX.Voice=colVoice(0) '选第1种语音
也是能选择不同的语音包的,比如:我的本机,set sapiX.Voice=colVoice(72),就能选择指定男声语音包而发男声了。


现在,问题是:
我是想直接设置语音包名字来完成指定语音包,而不是通过索引号选择指定语音包(因为,电脑不同和语音包安装或删除的时间不同,其语音包的索引号是不同的)。


比如:我现在的电脑72号语音包名称是“CN Microsoft Kangkang - Chinese (Simplified, PRC)”。
这个是在系统注册表中HKLM\SOFTWARE\Microsoft\Speech\Voices\Tokens,能查看到的。


还有一个重要奇怪的问题:
colVoice(72),其中的72,我是通过另外一个语音转文字的视窗APP中在其中的语音包选择下拉框中,用手工硬数出来“CN Microsoft Kangkang - Chinese (Simplified, PRC)”就排列在第72位,就将colVoice(0)修改位colVoice(72)就发男声了。
问题是问题是:我去到系统注册表中观看时,却发现“CN Microsoft Kangkang - Chinese (Simplified, PRC)”却是排列在第79位(注册表中的语音包比那个视窗APP选择框中多出来几个!!不知那个视窗APP是怎么过滤掉了几个但还是正确的呢!!
那么,简单直接的硬查注册表的排列位拿出来用,就肯定不行的了!!


望大神能帮助指导解决这个问题,谢谢!
作者: newswan    时间: 2023-2-18 21:35

vba 可以列出语音库
  1. Sub getvoice()
  2.     Dim s
  3.     Set sv = CreateObject("sapi.spvoice")
  4.     For Each token In sv.GetVoices
  5.         s = token.GetDescription
  6.     Next
  7. End Sub
复制代码

作者: newswan    时间: 2023-2-18 21:44

本帖最后由 newswan 于 2023-2-18 21:56 编辑

用powershel 列出语音库
  1. $sp = New-Object -COM Sapi.SpVoice
  2. $sv = $sp.GetVoices()
  3. $sv | ForEach-Object {
  4.     $_.id
  5. }
复制代码

作者: locoman    时间: 2023-2-18 22:02

本帖最后由 locoman 于 2023-2-18 22:15 编辑
用powershel 列出语音库
newswan 发表于 2023-2-18 21:44


谢谢您!!
我测试 powershell结果列出的是与注册表一样的。
我用其他方式也是列出了语音包情况的。
这是我需要用的语音包
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSTTS_V110_zhCN_HongyuM    System.__ComObject System.__ComObject
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSTTS_V110_zhCN_HuihuiM    System.__ComObject System.__ComObject
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSTTS_V110_zhCN_KangkangM  System.__ComObject System.__ComObject
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSTTS_V110_zhCN_YaoyaoM    System.__ComObject System.__ComObject

加粗的就是72。colVoice(72)
上面列出来的都是中文的,70,71,72,73都可以正常发声。


关键是我那个VBS文字转语音中是要用其索引号,语音包列出来了又怎么才能找出正确的索引号用呢??
作者: newswan    时间: 2023-2-18 22:14

  1. $sp = New-Object -COM Sapi.SpVoice
  2. $sv = $sp.GetVoices()
  3. $a = 'zhCN_KangkangM'
  4. $sv | ForEach-Object -begin {$i=-1} {
  5. $i++
  6. #$_.id
  7. if ( $_.id -like "*$a*" ) {
  8. $i
  9. $sp.voice =$_
  10. }
  11. }
  12. $sp.Speak("abc")
复制代码
$a 就是关键字
作者: locoman    时间: 2023-2-18 22:20

本帖最后由 locoman 于 2023-2-18 22:23 编辑

牛!!
确实是72,能发男声,能读出abc。

那么,powershell 是没有VBS或bat文件方便使用的!!
作者: newswan    时间: 2023-2-18 22:40

  1. $a = 'zhCN_KangkangM'
  2. $file ="1.txt"
  3. $sp = New-Object -COM Sapi.SpVoice
  4. $sv = $sp.GetVoices()
  5. $sv | ForEach-Object -begin {$i=-1} {
  6. $i++
  7. #$_.id
  8. if ( $_.id -like "*$a*" ) {
  9. $i
  10. $sp.voice =$_
  11. }
  12. }
  13. $text = Get-Content -Encoding 'UTF8' -path $file
  14. $sp.Speak($text)
复制代码
$file utf8 无bom
作者: locoman    时间: 2023-2-18 23:10

Set objVoice = CreateObject("SAPI.SpVoice")
Set objVoice.Voice = objVoice.GetVoices("Name=Microsoft Kangkang").Item(0)
objVoice.Rate = 0 '速度,自己修改试一下
objVoice.Volume = 100 '音量
FlagsAsync=0 '同步或异步,1是异步
objVoice.Speak "您好!欢迎致电好吃小面馆服务热线。我们会在2023-3-24 15:30左右回复您的问题,请保持通信畅通,谢谢!" ',FlagsAsync
'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SPEECH\Voices\Tokens
'Microsoft Hongyu
'Microsoft Huihui
'Microsoft Kangkang
'Microsoft Yaoyao
'VW Hui
'VW Liang
'VW Lily
完美!!
作者: locoman    时间: 2023-3-6 15:47

本帖最后由 locoman 于 2023-3-6 15:49 编辑

继续讨论这个问题:
11楼也算较完美可以使用了,但是,我拿到三方应用软件中去就极不方便了!!

——因为,这需要先根据不同需要的文字修改后,再保存为VBS文件后,再调用该VBS文件才能实现文字转语音。

====我的三方应用软件可以使用WINDOWS的CMD命令【但是的但是,它只能允许把所有命令写在一行内执行】


-----------下面这条命令只有一行,且能在我的三方应用软件的命令行中使用可以实现文字转语音发声:
mshta vbscript:createobject("sapi.spvoice").speak("您好!欢迎致电好吃小面馆服务热线。我们会在2023-3-24 15:30回复您的问题。")(window.close)

======但是,这行命令没有11楼的那些“语音包”、“语速”、“音量”、“”同步/异步”等参数,我也不知道怎么添加进去??


请大佬继续指导帮我完成,谢谢!!
作者: czjt1234    时间: 2023-3-6 17:05

非要执行 mshta 吗
执行 Wscript.exe d:\1.vbs不可以?
作者: locoman    时间: 2023-3-6 17:59

非要执行 mshta 吗
执行 Wscript.exe d:\1.vbs不可以?
czjt1234 发表于 2023-3-6 17:05


一是实测生成文件后再调用执行会有延迟!
二是实测第三方软件的命令行只有用mshta才能运行发声!
作者: newswan    时间: 2023-3-6 18:23

  1. mshta vbscript:"<script language=vbs>set sp=createobject(""sapi.spvoice""):Set sp.Voice = sp.GetVoices(""Name=Microsoft Kangkang"").Item(0):sp.rate=0:sp.Volume=100:FlagsAsync=0:sp.speak ""2023"":window.close</script>"
复制代码
试试




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2