搜索
aardio官方社区 门户 查看主题

语音朗读的例子

发布者: 游戏 | 发布时间: 2010-12-24 22:32| 查看数: 26317| 评论数: 40|帖子模式

本帖最后由 游戏 于 2011-2-14 18:13 编辑

Snap1.jpg

做了一个语音朗读的例子
参考资料:Microsoft Speech SDK  SAPI 5.1 的文档

12/26晚 添加了打开文件按钮,更实用了一些,以后不更新了,有需要的朋友自己发挥吧

很感谢jacen 老大的指导

import win;
import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; right=349;text="语音朗读";bottom=296 )
winform.add(
btn_stop={ bottom=280;right=318;left=240;top=250;font=LOGFONT( name=
"宋体";h=-12 );z=7;text="停止";cls="button" };
edit={ bottom=130;right=341;left=6;multiline=1;top=5;font=LOGFONT( name=
"宋体";h=-12 );style=1539;z=12;text="";vscroll=1;edge=1;cls="edit" };
btn_start={ bottom=280;right=221;left=143;top=250;font=LOGFONT( name=
"宋体";h=-12 );z=1;text="开始";cls="button" };
static={ right=221;bottom=237;text=
"音量:";left=186;top=222;font=LOGFONT( name="宋体";h=-12 );transparent=1;z=8;cls="static" };
static2={ notify=1;right=268;left=15;top=139;font=LOGFONT( name=
"宋体";h=-12 );transparent=1;bottom=154;text="";z=3;cls="static" };
static4={ right=80;bottom=237;text=
"语速:";left=44;top=222;font=LOGFONT( name="宋体";h=-12 );transparent=1;z=5;cls="static" };
static3={ right=117;bottom=184;text=
"当前使用的引擎是:";left=15;top=167;font=LOGFONT( name="宋体";h=-12 );transparent=1;z=4;cls="static" };
combobox_rate={ bottom=237;right=158;left=85;
items={  };font=LOGFONT( name=
"宋体";h=-12 );text="combobox2";z=6;top=217;mode="dropdownlist";edge=1;cls="combobox" };
btn_openfile={ bottom=281;right=115;left=31;top=252;font=LOGFONT( name=
"宋体";h=-12 );z=10;text="打开文件...";cls="button" };
static5={ text=
"";bottom=208;right=237;left=14;top=191;font=LOGFONT( name="宋体";h=-12 );transparent=1;z=11;cls="static" };
combobox_volume={ bottom=237;right=292;left=220;
items={  };font=LOGFONT( name=
"宋体";h=-12 );text="combobox3";z=9;top=217;mode="dropdownlist";edge=1;cls="combobox" };
combobox_speaker={ bottom=183;right=334;left=129;
items={  };font=LOGFONT( name=
"宋体";h=-12 );text="combobox";z=2;top=163;mode="dropdownlist";edge=1;cls="combobox" }
)
/*}}*/

language =
function(){
   
select(VoiceObj.Voice.GetAttribute("Language")) {
        
case "804" {
            l =
"中文(中国)";
        }
        
case "404" {
            l =
"中文(台湾)";
        }
        
case "C04" {
            l =
"中文(香港特别行政区)";
        }
        
case "409;9" {
            l =
"英语";
        }
        
case "411" {
            l =
"日语";
        }
        
case "412" {
            l =
"韩语";
        }
        
else {
            l = VoiceObj.Voice.GetAttribute(
"Language");
        }
        
    }   
   
return l;
}

import com
VoiceObj = com.CreateObject(
"Sapi.SpVoice");
if(VoiceObj){
   
for(i=1;VoiceObj.GetVoices().Count;1){
        winform.combobox_speaker.add(VoiceObj.GetVoices().Item(i-1).GetDescription())
        winform.combobox_speaker.selIndex = 1
    }
    winform.static2.text =
"你的系统中一共安装了 "++VoiceObj.GetVoices().Count++" 个语音引擎."
    VoiceObj.Rate =
tonumber(winform.combobox_rate.selText)
    winform.static5.text = language()
}
else {
    winform.static2.text =
"你的电脑没有安装TTS语音引擎"
    winform.edit.disabled =
true
    winform.btn_openfile.disabled =
true
    winform.combobox_rate.disabled =
true
    winform.combobox_volume.disabled =
true
    winform.combobox_speaker.disabled =
true
}



winform.btn_start.disabled =
true
winform.btn_stop.disabled =
true


for(i=-10;10;1){
    winform.combobox_rate.add(
tostring(i))
    winform.combobox_rate.selIndex = 17
}

for(i=10;100;10){
    winform.combobox_volume.add(
tostring(i))
    winform.combobox_volume.selIndex = 10
}

winform.combobox_speaker.oncommand =
function(id,event){
    VoiceObj.setVoice(VoiceObj.GetVoices().Item(winform.combobox_speaker.selIndex - 1))
    winform.static5.text = language()
}

winform.combobox_rate.oncommand =
function(id,event){
    VoiceObj.Rate =
tonumber(winform.combobox_rate.selText)
}

winform.combobox_volume.oncommand =
function(id,event){
    VoiceObj.Volume =
tonumber(winform.combobox_volume.selText)
}


winform.btn_openfile.oncommand =
function(id,event){
   
//win.msgbox( winform.btn_openfile.text );
    import fsys.dlg;
    filename = fsys.dlg.open(
"文本文件|*.txt||","打开文件",,winform.hwnd)
   
if(filename){
        str = string.load(filename)
        str = string.replace(str,
"\z","")
        winform.edit.text = str
        winform.btn_start.disabled =
false
    }
}


timerId =
null;
winform.btn_start.oncommand =
function(id,event){

   
select(winform.btn_start.text) {
        
case "开始" {
            VoiceObj.Speak(str,1 );
            winform.btn_stop.disabled =
false
            winform.btn_start.text =  
"暂停"
            
            winform.addtimer( 100,
function(id){
                timerId = id;
               
if(VoiceObj.Status.RunningState = "1"){
                    winform.btn_start.text =
"开始";
                    winform.btn_stop.disabled =
true
                    winform.killtimer(timerId);
                }   
               
else {
                    pos = VoiceObj.Status.InputWordPosition
                    lenth = VoiceObj.Status.InputWordLength
                    winform.edit.setsel(pos,lenth + pos)
                    winform.edit.scrollCaret()
                }
               
            } )
            
        }
        
case "暂停" {
            VoiceObj.Pause()
            winform.btn_start.text =  
"继续";
            winform.killtimer(timerId);
        }
        
case "继续" {
            VoiceObj.Resume()
            winform.btn_start.text =  
"暂停";
            winform.killtimer(timerId);
        }
    }
   
}

winform.btn_stop.oncommand =
function(id,event){

   
if(winform.btn_start.text =  "继续"){
        VoiceObj.Resume()
    }
    VoiceObj.Speak(
"",2 );  
    winform.btn_start.text =
"开始";
    winform.btn_stop.disabled =
true
    winform.killtimer(timerId);
}

winform.edit.oncommand =
function(id,event){
   
if(event==0x300/*_EN_CHANGE*/){
        
if(winform.edit.text == ""){
            winform.btn_start.disabled =
true
        }
        
else {
            winform.btn_start.disabled =
false
            str = winform.edit.text
        }
    }
}

winform.show()
win.loopMessage();
return winform;

最新评论

fantasynew 发表于 2010-12-24 22:53:21

谢谢你的这个例子,正是我想实现的功能。 你也用VW的TTS语音包{:P}

谢谢你的这个例子,正是我想实现的功能。
你也用VW的TTS语音包
游戏 发表于 2010-12-24 22:54:27

[b]回复 [url=forum.php?mod=redirect&goto=findpost&pid=3265&ptid=470][color=Olive]f

回复 fantasynew 的帖子

刚才少了设置音量的,现在加上了
Jacen.He 发表于 2010-12-24 23:04:56

必须安装TTS5.1及中文语言包才能使朗读中文。 1、打开Microsoft Speech SDK 5.1主页 [url=http://www.micr

必须安装TTS5.1及中文语言包才能使朗读中文。

1、打开Microsoft Speech SDK 5.1主页
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5e86ec97-40a7-453f-b0ee-6583171b4530&displaylang=en

2、下载安装SpeechSDK51.exe

3、下载安装SpeechSDK51LangPack.exe
fantasynew 发表于 2010-12-24 23:05:43

[i=s] 本帖最后由 fantasynew 于 2010-12-24 23:12 编辑 [/i] [b]回复 [url=http://bbs.aardio.

本帖最后由 fantasynew 于 2010-12-24 23:12 编辑

回复 游戏 的帖子

你的这个例子很好,还有个问题想请教你。
我知道TTS的名字   VW Misaki
能否不遍历TTS名称直接用名字来设定TTS呢?
低调点 发表于 2010-12-24 23:19:41

越来越牛叉....

越来越牛叉....

点评

啥时见你牛叉作品,(*^__^*)  发表于 2010-12-24 23:26
游戏 发表于 2010-12-25 10:35:48

[i=s] 本帖最后由 游戏 于 2010-12-25 10:36 编辑 [/i] 今天添加了右键菜单, 发现使用winform.richedit.sel

本帖最后由 游戏 于 2010-12-25 10:36 编辑

今天添加了右键菜单,
发现使用winform.richedit.selText,遇到中文的时候,只能取一半的中文,应该怎么解决呢??

点评

已修正,重新下载即可  发表于 2010-12-25 12:12
游戏 发表于 2010-12-25 13:14:46

最后一次更新了,好像没什么大问题了

最后一次更新了,好像没什么大问题了
nvt303 发表于 2010-12-25 15:45:09

好东东,可以用这个听书了。

好东东,可以用这个听书了。
游戏 发表于 2010-12-26 23:41:27

12/26 添加了打开文件按钮,更实用了一些,以后不更新了,有需要的朋友自己发挥吧 很感谢jacen 老大的指导

12/26 添加了打开文件按钮,更实用了一些,以后不更新了,有需要的朋友自己发挥吧

很感谢jacen 老大的指导

fantasynew 发表于 2010-12-27 00:00:05

谢谢分享,你的代码很有参考学习价值

谢谢分享,你的代码很有参考学习价值
游戏 发表于 2010-12-27 09:52:57

[b]回复 [url=forum.php?mod=redirect&goto=findpost&pid=3432&ptid=470][color=Olive]f

回复 fantasynew 的帖子

这个例子,是我从看到你的提问开始去做的,以前也没接触过,主要是参考Microsoft Speech SDK  SAPI 5.1 的文档(也是那天去下载的),应该还可以实现很多功能,不过我英语差,看不懂.

我只是扔了块砖头出来,以后你应该知道要怎么做了吧
游戏 发表于 2010-12-27 23:40:16

又更新了一下,发现有些文件包含了多个文本终结符'\0'时,文件读取不完整

又更新了一下,发现有些文件包含了多个文本终结符'\0'时,文件读取不完整
月光疾风 发表于 2010-12-29 02:22:14

谢谢开源,谢谢分享{:3_54:}

谢谢开源,谢谢分享
doublew 发表于 2010-12-29 12:14:55

高手{:victory:}

高手
qwaq001 发表于 2011-1-18 10:36:47

好东西{:3_46:}

好东西
shinykers 发表于 2011-2-13 08:49:31

一直一直想搞这个东西!佩服了!

一直一直想搞这个东西!佩服了!
look 发表于 2011-2-13 14:05:07

好东西慢慢消化!

好东西慢慢消化!
游戏 发表于 2011-2-14 18:17:03

更新了一下,把richedit控件换成edit控件

更新了一下,把richedit控件换成edit控件

点评

为什么改呢?换了 edit控件有什么不同  发表于 2011-2-15 00:58
123下一页

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-1-24 05:18 , Processed in 0.078125 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表