搜索
查看: 25712|回复: 40

[游戏] 语音朗读的例子

  [复制链接]

23

主题

311

帖子

1854

积分

荣誉会员

Rank: 8Rank: 8

积分
1854
发表于 2010-12-24 22:32:19 | 显示全部楼层 |阅读模式
本帖最后由 游戏 于 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;

回复

使用道具 举报

40

主题

566

帖子

3258

积分

五级会员

超级初学者

Rank: 8Rank: 8

积分
3258
发表于 2010-12-24 22:53:21 | 显示全部楼层

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

谢谢你的这个例子,正是我想实现的功能。
你也用VW的TTS语音包
http://echong.taobao.com 各类话费充值,请多支持!
回复

使用道具 举报

23

主题

311

帖子

1854

积分

荣誉会员

Rank: 8Rank: 8

积分
1854
 楼主| 发表于 2010-12-24 22:54:27 | 显示全部楼层

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

回复 fantasynew 的帖子

刚才少了设置音量的,现在加上了
回复

使用道具 举报

110

主题

1278

帖子

7346

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7346
发表于 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
回复

使用道具 举报

40

主题

566

帖子

3258

积分

五级会员

超级初学者

Rank: 8Rank: 8

积分
3258
发表于 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呢?
http://echong.taobao.com 各类话费充值,请多支持!
回复

使用道具 举报

65

主题

954

帖子

5336

积分

荣誉会员

Rank: 8Rank: 8

积分
5336
发表于 2010-12-24 23:19:41 | 显示全部楼层

越来越牛叉....

越来越牛叉....
aaa
回复

使用道具 举报

23

主题

311

帖子

1854

积分

荣誉会员

Rank: 8Rank: 8

积分
1854
 楼主| 发表于 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,遇到中文的时候,只能取一半的中文,应该怎么解决呢??
回复

使用道具 举报

23

主题

311

帖子

1854

积分

荣誉会员

Rank: 8Rank: 8

积分
1854
 楼主| 发表于 2010-12-25 13:14:46 | 显示全部楼层

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

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

使用道具 举报

7

主题

303

帖子

1897

积分

四级会员

Rank: 6Rank: 6

积分
1897
QQ
发表于 2010-12-25 15:45:09 | 显示全部楼层

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

好东东,可以用这个听书了。
每天进步一点点......
回复

使用道具 举报

23

主题

311

帖子

1854

积分

荣誉会员

Rank: 8Rank: 8

积分
1854
 楼主| 发表于 2010-12-26 23:41:27 | 显示全部楼层

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

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

很感谢jacen 老大的指导

回复

使用道具 举报

40

主题

566

帖子

3258

积分

五级会员

超级初学者

Rank: 8Rank: 8

积分
3258
发表于 2010-12-27 00:00:05 | 显示全部楼层

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

谢谢分享,你的代码很有参考学习价值
http://echong.taobao.com 各类话费充值,请多支持!
回复

使用道具 举报

23

主题

311

帖子

1854

积分

荣誉会员

Rank: 8Rank: 8

积分
1854
 楼主| 发表于 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 的文档(也是那天去下载的),应该还可以实现很多功能,不过我英语差,看不懂.

我只是扔了块砖头出来,以后你应该知道要怎么做了吧
回复

使用道具 举报

23

主题

311

帖子

1854

积分

荣誉会员

Rank: 8Rank: 8

积分
1854
 楼主| 发表于 2010-12-27 23:40:16 | 显示全部楼层

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

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

使用道具 举报

0

主题

2

帖子

4

积分

新手入门

Rank: 1

积分
4
发表于 2010-12-29 02:22:14 | 显示全部楼层

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

谢谢开源,谢谢分享
回复

使用道具 举报

1

主题

19

帖子

158

积分

培训班

积分
158
发表于 2010-12-29 12:14:55 | 显示全部楼层

高手{:victory:}

高手
回复

使用道具 举报

0

主题

14

帖子

176

积分

一级会员

Rank: 2

积分
176
发表于 2011-1-18 10:36:47 | 显示全部楼层

好东西{:3_46:}

好东西
回复

使用道具 举报

2

主题

10

帖子

81

积分

一级会员

Rank: 2

积分
81
发表于 2011-2-13 08:49:31 | 显示全部楼层

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

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

使用道具 举报

75

主题

851

帖子

4957

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
4957
发表于 2011-2-13 14:05:07 | 显示全部楼层

好东西慢慢消化!

好东西慢慢消化!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

23

主题

311

帖子

1854

积分

荣誉会员

Rank: 8Rank: 8

积分
1854
 楼主| 发表于 2011-2-14 18:17:03 | 显示全部楼层

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

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

点评

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2017-9-25 19:32 , Processed in 0.078125 second(s), 32 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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