自动语音朗读软件的实现原理

boomni 2012-06-12 03:40:05
识别出来之后就要发声,发声部分的实现思路是怎么样的,不可能把6000多常用汉字一个个录成文件吧,英文朗读呢,单词有好几十万吧,求指教!
...全文
1737 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
blueink_200451 2012-06-19
  • 打赏
  • 举报
回复
Microsoft Speech SDK
baoyz 2012-06-18
  • 打赏
  • 举报
回复
6000多个字用得着录6000多个音吗?
都要疯了。重音字录一个音不就够了。
查Uincode表,把每个音的首位字和末位字标记住,判断待读字的位置,调用对应的读音文件就够了。
zdcju 2012-06-18
  • 打赏
  • 举报
回复
有好多现成的声音引擎 如果没什么特殊需要就可以直接用
boomni 2012-06-18
  • 打赏
  • 举报
回复
原来从拼音下手啊,学习了,
6000多常用汉字,用400多拼音对应,不错啊
schlafenhamster 2012-06-18
  • 打赏
  • 举报
回复
汉字拼音有400个左右,代表所有汉字。
mabaoyes 2012-06-15
  • 打赏
  • 举报
回复
mark!
faremn000 2012-06-15
  • 打赏
  • 举报
回复
0.0
zdleek 2012-06-15
  • 打赏
  • 举报
回复
这个技术一直在进步,若干年后应该会达到很好的一种程度
boomni 2012-06-14
  • 打赏
  • 举报
回复
一个会说话的电脑有那么难吗,哎,
fronz 2012-06-14
  • 打赏
  • 举报
回复
说到汉语的,我比较认同wm上的讯飞语音电子书,虽然和真人播音还有差距,但已经很接近了。
感觉它的处理方法是每个字的录音加入语句的语法分析。
用户 昵称 2012-06-12
  • 打赏
  • 举报
回复
估这个首先要精通英文如何发音,其次才是如何用电脑发音。
llyyttzj 2012-06-12
  • 打赏
  • 举报
回复
Microsoft Speech SDK
罗平 2012-06-12
  • 打赏
  • 举报
回复
分析所有声母,韵母,语调,最后再做句子拆分,词汇分析。不是一般人能做的。一般都调用第三方的。
langshanglibie 2012-06-12
  • 打赏
  • 举报
回复
Microsoft Speech SDK
langshanglibie 2012-06-12
  • 打赏
  • 举报
回复
TTS
Android应用源码安卓源码(172个合集),可以做为你的学习参考。 365MobileSecretary v1.0.6(365手机助手AIDL) 888个经典 Logo.rar AdXmpp(Openfire+asmack+spark) .zip AidlDemo(简单aidl的例子) aidl跨进程调用.rar andbatdog电池监控.rar andbatdog监视电池.rar andricoFacebook客户端.rar Android Gamex分析报告.rar Android 英语单词记忆程序源码 AndroidPdfViewerPDF查看器.zip AndroidPlayer(仿酷狗播放器).tar androidtalk_2010_11_17【Sundy系列】全看懂了-加两年经验-语音朗读-语音识别-语音.rar Android下的信息客户端 WhisperSystems-TextSecure.zip Android与js交互.rar Android中监听电话状态.rar Android之Wifi学习教程.rar Android之用PopupWindow实现弹出菜单.rar android在wifi下手机与电脑的socket通信.rar android多线程断点下载.rar Android手机一键Root原理分析.zip Android手机的VoIP客户端 Sipdroid.rar Android有未接来电后处理(判断未接来电).rar Android模仿乐淘的应用程序分析源码.zip Android游戏源码——忍者快跑.rar Android自动发送短信.rar Android自动开关机实现.rar Android视频采集+RTSP完整代码(可用) Android远程登录含有loading登录效.zip Angle v1.0_2D游戏引擎.ZIP BOOK看遍所有UI控件.7z BrewClock闹钟.zip BTAndroidWebViewSelection(webview选择文字) cellmap v2.0 基站查询定位导航系统 .rar DialogShow.rar dialog去除边框代码.rar DocumentViewer(PDF阅读器) douBanList(滚动到底部加载新的,软缓存,懒加载) Droid Wall 手机防火墙.zip FBReader修改epub快速加载.rar FiveChess五子棋.zip Flashlight灯光.zip GetSDTree(简单SD卡文件浏览器) hotel宾馆系统.zip ImageView 图片循环跑马灯的效果.rar ipcamera-for-android 手机变成IP Camera.rar jamendo-开源在线音乐.rar jchat4android手机聊天程序.rar LoginXml.rar MineSweeper由java实现.zip miniTwitter登录界面.rar MyAppWeixin(仿微信界面) MyBrowser(简单网页浏览器) Myjob3(图片剪辑功能).rar OPENG开发的示例代码.rar OpenSudoku一个简单的九宫格数独游戏.zip OssSystem(OA系统图书管理简单版).rar Phonegap+HTML5+CSS3+jQuer简单界面模板示例及源码.rar ProgressBar 几乎全部的用法.rar QQ_UI之分类菜单DEMO.zip QQ的登录界面 源代码 .zip quitesleep手机电话功能软件.rar rokon_src_2-0-3_游戏引擎.zip scientific-calculator-for-android( 功能强大的科学计算器).zip SeeJoPlayer(播放器).7z SipDroid客户端源码.rar sipdroid语音及视频通话.rar tablelogin(登陆界面).rar TankWar坦克大战.zip telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器) TorProxy应用实现了Android手机无线电电传通讯(TOR).rar UI设计之 仿做蘑菇街UI设计 源码.zip ViewPager-实现左右两个屏幕的切换.rar VIEW双缓冲与SurfaceView比较.zip weibo4andriod-2011-01-14.zip WordPress for Android zirco-browser浏览器源码.rar Zirco-browser:超越海豚的开源浏览器.rar zz-doctor中医大夫助
Microsoft Agent技术应用
--AgentShell的实现原理介绍

[摘要]
本文介绍了如何应用Agent的以及AgentShell的实现原理和几个重要的技术处理。

[关键词]
Agent,COM,角色,语音识别,语音合成。

对Agent编程的方法主要有使用VB,VC等语言进行ActiveX调用,除此之外还有直接通过VC进行COM
编程调用。在VB中调用Agent是最简单不过了,但由于VB程序本身存在诸多缺陷,很难在实际中应用。
而在VC中,由于Agent内部完全采用了UNICODE编码,同时还要处理各种繁杂的COM接口,从而也存在一
定的问题。AgentShell是建立在Agent和应用程序之间的一个外壳程序,通过它可将Agent复杂的COM接
口封装起来,转变为简单的函数调用,很好的实现对Agent的控制。同时AgentShell也作为一个独立的程
序,可处理英文自动朗读等功能,本文将详细介绍其实现原理
(一) 原理介绍
AgentShell和Agent Server的连接是通过COM调用来实现的,对于与应用程序的通信是通过WM_COPYDATA
消息来实现的, 下图表示出AgentShell与其它程序的关系:
[ Agent Server ]
¦
[ COM调用 ]
¦
[ AgentShell ]
¦
[ 消息 ]
¦
[ 应用程序 ]

将一个Agent控制加载相应的动画和语音码我们称之为“角色”,一般使用COM调用创建一个Agent角色,
要经过以下几个过程:
[ 初始化COM ]
¦
[ 连接Agent COM Sever,创建Agent控制 ]
¦
[ 注册Agent控制的消息反应器(Notify Sink) ]
¦
[ 加载角色数据文件,创建一个角色(Character) ]
¦
[ 设置角色的语言、初始位置以及其它属性 ]
¦
[ 显示角色 ]

AgentShell中定义以下全局变量来控制角色的属性和动作:
角色的消息ID: long g_lNotifySinkID。
角色ID: long g_lMyAgentID。
Agent控制指针: IAgentEx *g_pAgentEx。
角色指针: IAgentCharacterEx *g_pMyAgent。
角色消息反应器指针: AgentNotifySink *g_pSink。

使用以上变量可很容易的调用Agent的功能,如显示角色:
BOOL agentShow()
{
HRESULT hRes;
long lRequestID;

if( !g_pMyAgent)
return FALSE;
hRes = g_pMyAgent->Show(FALSE, &lRequestID);
if (FAILED(hRes))
return FALSE;
return TRUE;
}

(二) 角色的语言处理
目前Agent支持很多种语言,不仅是显示,还有语音合成和语音识辨(对于中文,目前仅支持显示)。
语言又分为主语言和子语言(或为副语言),如中文的主语言为中文(LANG_CHINESE),子语言则可为
简体(SUBLANG_CHINESE_SIMPLIFIED)和繁体等。AgentShell中定义两个全局变量表达角色的语种:

主语言:DWORD g_nMainLang。
子语言:DWORD g_nSubLang。
这样程序内必须根据当前语言的不同来显示不同的信息,如程序退出时的问候信:
首先定义不同的语言信息,可以为宏定义或资源数据:
#define MES_GOODBYEL"Goodbye!"
#define MES_GOODBYE_CH L"再见!"
#define MES_GOODNIGHTL"Good night!"
#define MES_GOODNIGHT_CH L"祝您晚安!"
以下为实现退出提示代码:
void Goodbye()
{
if( g_bAgentOK)
{
SYSTEMTIME time;
agentStop();
agentShow();
agentPlay(L"Wave");
GetLocalTime(&time);
// 根据时间不同提示不同信息
if( g_nMainLang == LANG_ENGLISH)
{
// 提示英文信息
if( time.wHour < 19)
agentSpeak(MES_GOODBYE);
else
agentSpeak(MES_GOODNIGHT);
}
else
{
// 提示中文信息
if( time.wHour < 19)
agentSpeak(MES_GOODBYE_CH);
else
agentSpeak(MES_GOODNIGHT_CH);
}
agentHide();
// 等待若干时间
Sleep(MAX_QUIT_TIME);
}
}
当然以上介绍的只是一种较为简单的方法,仅在于描述这种原理。

(三) 实现自动朗读英文
实现自动朗读实际上是响应剪贴板消息的过程,当复制选种的文本信息时,系统自动发送WM_DRAWCLIPBOARD
消息给所有剪贴板监视队列中的窗口,相应的窗口只要读取当前剪贴板内的信息进行朗读即可,具体实现如下:

安装剪贴板监视:
void InstallClipSpy()
{
g_hNextWnd = SetClipboardViewer(g_hMainWnd);
}

主窗口的回调函数中相应剪贴板消息:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// 剪贴板窗口队列发生变化
case WM_CHANGECBCHAIN:
hwndRemove = (HWND)wParam; // handle of window being removed
hwndNext = (HWND) lParam;
if( hwndRemove == g_hNextWnd)
{
g_hNextWnd = hwndNext;
}
if( g_hNextWnd)
{
SendMessage(hwndNext, WM_CHANGECBCHAIN, wParam, lParam);
}
// 剪贴数据发生变化
case WM_DRAWCLIPBOARD:
// 是否自动阅读
if( g_bEnableRead)
{
// 阅读剪贴板信息
ReadClipText();
}
if( g_hNextWnd)
{
SendMessage(g_hNextWnd,WM_DRAWCLIPBOARD,wParam, lParam);
}
获取剪贴板信息并且朗读
void ReadClipText()
{
if( g_bAgentOK)
{
// 只有文本文件才朗读
if( IsClipboardFormatAvailable(CF_TEXT))
{
if (OpenClipboard(g_hMainWnd))
{
LPWSTR pwsz;
UINT cch;
HGLOBAL hglb;
LPSTR lpstr;

hglb = GetClipboardData(CF_TEXT);
lpstr = (LPSTR)GlobalLock(hglb);
cch = lstrlen(lpstr);
if( cch > 0)
{
pwsz = new WCHAR[cch + 1];
MultiByteToWideChar(CP_ACP, 0, lpstr, -1, pwsz, cch);
pwsz[cch] = '';
agentSaveState();
agentPlay(L"Read");
agentSpeak(pwsz);
agentPlay(L"ReadReturn");
agentRestoreState();
delete pwsz;
}
GlobalUnlock(hglb);
CloseClipboard();
}
}
}
}
最后还须在程序退出时将当前窗口句柄从剪贴板监视队列移走:
void RemoveClipSpy()
{
ChangeClipboardChain(g_hMainWnd, g_hNextWnd);
}

(四) 与外部程序的接口
应用程序和AgentShell之间传递数据主要通过WM_COPYDATA消息实现,由于传递的数据类型各
有不同,所以需要定义一个数据结构来描述:
struct AgentActionSTRUCT
{
WORD nAction;
DWORD nD1;
DWORD nD2;
WCHAR sData[MAX_DATA_LEN];
};
nAction用来表示Agent应该执行的操作,如显示、表演等。nD1,nD2,sData用来记录传递的数据。
传递消息必须获取AgentShell主窗口的句柄,实现如下:
HWND GetAgentMainWnd()
{
return FindWindow(AGENT_CLASS_NAME, NULL);
}
由于Agent采用了UNICODE, 必须将ANSI字符转化为UNICODE字符:
BOOL SendMesToAgent(WORD nAction, DWORD nD1, DWORD nD2, LPCSTR sData)
{
UINT nSize;
HWND hWnd = GetAgentMainWnd();
if( hWnd)
{
action.nAction = nAction;
action.nD1 = (DWORD)nD1;
action.nD2 = (DWORD)nD2;
// 将ANSI符转换为UNICODE的字符
nSize = MultiByteToWideChar(CP_ACP, 0, sData, lstrlen(sData) + 1,
action.sData, MAX_DATA_LEN);
action.sData[nSize] = '';
//
COPYDATASTRUCT cds;
cds.dwData = (DWORD)0;
cds.cbData = (DWORD)sizeof(action);
cds.lpData = (VOID *)&action;
// 通过WM_COPYDATA消息与AgentShell交换数据
SendMessage(hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds);
return TRUE;
}
return FALSE;
}
目前AgentShell提供的函数主要有:
// 启动角色外壳程序(AgentShell) bRun是否执行
BOOL agentAPIRun(BOOL bRun = TRUE);
// 退出角色外壳程序(AgentShell)
BOOL agentAPIExit();
// 创建一个新角色(sPath角色数据文件路径, nLang主语言, nSubLang子语言)
BOOL agentAPICreate(LPCSTR sPath, UINT nLang, UINT nSubLang);
// 设置角色名字(sName角色名字)
BOOL agentAPISetName(LPCSTR sName);
// 将角色卸载
BOOL agentAPIUnload();
// 显示角色
BOOL agentAPIShow();
// 隐藏角色
BOOL agentAPIHide();
// 显示或隐藏角色
BOOL agentAPIShowORHide();
// 停止角色表演
BOOL agentAPIStop();
// 角色表演(sAction动作名称)
BOOL agentAPIPlay(LPCSTR sAction);
// 角色讲话(sText句子)
BOOL agentAPISpeak(LPCSTR sText);
// 角色鞠躬(x,y 指方向)
BOOL agentAPIGesAt(WORD x, WORD y);
// 移动角色到指定的位置(x,y移动的坐标)
BOOL agentAPIMoveTo(WORD x, WORD y);
// 保存当前角色显示状态
BOOL agentAPISaveState();
// 恢复角色的状态
BOOL agentAPIRestoreState();
// 允许自动阅读
BOOL agentAPIEnableAutoRead();
// 禁止自动阅读
BOOL agentAPIDisableAutoRead();
注意传递给AgentShell的数据长度不要超过1K(实际上一般不会大于1K)。
2) 使用接口
有了以上介绍的接口函数,对Agent的控制变的很简单,以下是一个简单的问候示例:
// 启动AgentShell
if( agentAPIRun(TRUE))
{
// 保存当前Agent的状态
agentAPISaveState();
// 开始表演
agentAPIPlay(_T("Greet"));
// 讲话
agentAPISpeak(_T("hello, my friend."));
// 表演结束
agentAPIPlay(_T("GreetReturn"));
// 恢复原来状态
agentAPIRestoreState();
// 退出
agentAPIExit();
}

AgentShell在笔者的免费软件"我的助手"中得到很好的利用,当然目前其仅涉及了Agent的一小部分内容,还有如语音识辨等,未做处理,还有待一步改进。以上程序在Visual C++ 6.0编译通过,源代码可到助手之家(http://www.helperHome.com)下载

新概念英语学习机是一款基于(新概念英语)教材的英语学习软件,它融合了“逆向学习法”和“疯狂英语”这两种英语学习方法的精髓,并加以创新,集英语的“听、说、读、写”等功能于一身,帮助您迅速提高英语口语和听力水平。软件全程采用高清真人语音(英音 美音)朗读,通过全文朗读、句子即点即读、跟读对比、听写测试等实用的软件功能,使用户在经过短暂的学习过程后就能够真正的快速提高英语的听说能力、阅读能力、翻译能力、以及用词造句能力。 新概念英语学习机主要功能: 1、课文初记: 以句子为单位去学习和理解整篇课文,每条句子都配有译文和真人读音,可自由设置每句的朗读次数和间隔时间。课文中的重点和难点句配有详细的注释,您也可以自行为句子添加注释。点击句中单词即可查看词义和音标,并有标准纯正的真人发音。通过鼠标点击还可将句中的任意单词设为生词,用于以后集中进行学习。 2、生词浏览: 自动播放课文中的默认生词和用户自行添加的生词,每个生词都配有释义,音标和真人读音,并与带有当前生词的句子同步显示。 3、填空练习: 以句子填空的方式拼写生词,并配以释义、音标、读音等多种详尽提示,帮助您高效地、彻底地掌握课文中的所有生词。 4、全文模式: 通过“全文模式”或“英汉对照”两种方式显示整篇课文,所有句子均可即指即读,同时具有查看和添加注释、取词翻译、设置生词、全文朗读等功能。 5、英汉互译: 隐藏课文中的英文或中文,再通过“点出中文”,“点出英文”等方式进行英汉互译练习。 6、听写测试: 通过听写或默写来检验您所学句子的掌握情况,当遇到不熟悉的单词时,可以进行“词长-解释-音标-读音-字母-单词-整句”提示,句子拼写完成后,系统会根据您的提示和错误次数进行评分,分数排行榜还能记录您每次测试的详细结果。 7、迷你模式: 以悬浮小窗口显示英文句子,可以让您在工作或娱乐之余不知不觉地学习英语,充分利用您使用电脑的时间提高英语阅读和听力水平。 8、课程复习: 根据着名的“艾宾浩斯遗忘曲线”原理,安排您在适当的时间进行7次复习,经过这7次复习之后,所学内容基本上就能牢记不忘。 新概念英语学习机 v3.85更新: 1.“全文模式”中增加全屏显示功能。 2.迷你模式中增加字体放大功能。 3.修正部分电脑上界面错位的问题。

1,650

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧