初探koodoo语言和蓝星际语音平台
bluesen / 文
蓝星际语音平台综述
使用蓝星际语音平台的好处
蓝星际语音平台的结构和功能
使用蓝星际语音平台开发CTI应用的过程
蓝星际语音平台是一个完整的CTI解决方案,使用该平台可以方便地开发IVR, 呼叫中心等各种应用。
蓝星际语音平台的核心是一种高效灵活, 而且适合CTI特点的语言Koodoo, Koodoo是一种南非条纹羚羊, 象征着这种语言可以在多条线路上独立运行。蓝星际语音平台提供了一套完善的系统库,包括变量运算、数据库操作类、线路语音操作类、外呼、录音放音、收码、发码、合成放音(TTS)、传真收发、接收主被叫号码、线路连接、TCP/IP通讯类、测试及信息显示类、文件操作等上百个系统函数。
系统也提供了动态连接库的外部扩展,用户可以自行编制面向特定应用的动态库,由Koodoo语言进行调用。蓝星际公司也提供诸如邮件收发、短信收发、TCP/IP消息处理等经过充分测试的外部库。
系统也在语言层面提供了消息队列和共享内存变量等线路间通讯的机制,可以实现复杂的、层次分明的CTI应用。
蓝星际语音平台包括开发平台和运行平台,开发平台提供了快速开发和调试Koodoo语言脚本的图形操作界面。运行平台本质上就是CTI虚拟机,面向实际的硬件线路和虚拟线路,而Koodoo语言脚本就是运行在这些线路上。蓝星际语音运行平台有很高的稳定性,它的设计目标是7x24的不间断CTI服务。
Koodoo语言的目标用户是面向实际CTI应用的开发者,它屏蔽了硬件层,简化了原本复杂多变的CTI业务流程开发,并提供了简单一致的运行配置和管理界面。
蓝星际公司对蓝星际语音平台和Koodoo语言的使用者提供充分的技术支持,并持续地投入资源对系统进行不断的完善和改进。
- 简化CTI应用的开发和部署过程
在语法上Koodoo语言十分简单,类似C语言,并在很多方面进行了简化和优化,比如采用隐含的变量类型,不必考虑内存的分配和释放,不使用指针,在语法上支持灵活的字符串操作,支持复杂表达式等等。
蓝星际语音平台采用"虚拟机+语言"的简单方式来解决CTI问题,所以部署十分简单,只需要安装虚拟机(运行平台),并在配置文件上指定每条线路运行的脚本文件就可以了。
这样一来,CTI应用开发的重点就集中在实际的业务内容上。 - 帮助开发者开发复杂的IVR应用
因为Koodoo语言是一种结构化的高级语言,提供了灵活的变量运算、流程控制、函数调用等现代高级语言的机制,使其足以面对复杂事务的挑战。而且从语言架构到系统函数都针对CTI应用进行了特别的设计,十分适合复杂的语音人机交互,是IVR开发的利器。 - 更容易调试
测试是保证应用软件质量的重要手段。
使用蓝星际语音开发平台,使开发和调试变得非常方便。首先可以在没有任何语音硬件的情况下进行调试,其次也可以使用PC本身的声卡播放语音文件,用键盘模拟电话按键输入。此外,还提供了可视化语法树显示,在语法树上可以设置并运行到断点,单步执行,查看变量,跟踪到用户自定义函数内部等等,这些过程完全是图形化、可视化的。
在Koodoo语言层面也提供了很灵活的调试手段,如状态信息显示函数、日志记录函数等等,可以方便地进行多线路并发的测试。 - 更容易随业务的变化而改变
在实际应用当中,企业的业务需求经常随外部市场环境发生变化,即使在政府服务便民热线等应用中,也需要所谓的“与时俱进”。这些不断变化的需求是开发人员最感头痛的事情。
Koodoo语言有简明的语法,良好的架构,可以将业务层进行抽象,并封装成函数,随着业务的发展,只需要增加或修改这些业务层函数就可以了。 - 更容易实现大型应用
蓝星际语音平台有很好的扩展性,可以实现分布的、大型的CTI应用。
蓝星际内嵌的数据库连接接口,可以用多种方式连接几乎所有类型的数据库,而且能保持一致的界面。
应用开发者采用外部动态库扩展的方式,可以实现任何复杂的应用,并连接任何类型的业务系统。
大型的脚本文件可以由多个文件包含而成,从而在结构上更为清晰。 - 更好的可读性
因为Koodoo是一种结构化的高级语言,有清晰的流程化的程序结构。变量、函数的名字长度不受限制,因此可以取描述性的更容易理解的名字。
此外,蓝星际语音平台从结构上抛弃了难以理解的事件处理、状态机的概念,并独创性地将脚本语言限制在独立的线路(线程)上运行。 - 更容易重用
重用是提高开发效率的重要手段。
Koodoo语言专门为重用提供了机制,函数级别的重用是最基本的,文件包含语句则提供了文件级别的重用方式。 - 更好的稳定性和效率
蓝星际语音平台完全采用C++语言设计开发完成,因而有很高的效率。
运行平台采用启动时预先编译脚本文件的方式,相对于解释型的实现方式在运行速度上有明显优势。
内部有一套精心设计的C++框架,有很好的弹性。
Koodoo语言的设计则始终保持了概念的完整性,一切以使用者为中心。 - 全面的硬件支持
目前蓝星际语音平台支持市面上流行的语音板卡,包括:
- 东进全系列模拟和数字板卡, 包括: D161, D321, D327等;
- 三汇全系列模拟和数字板卡, 包括: SH-8B/PCI, SHD-30A-CT/SS1/PCI,SHD-30A-CT/SS7/PCI等;
- Dialogic系列模拟和数字板卡, 如: D/300sc-E1, VFX/40ESC等;
- 语音Modem卡, 或其它支持TAPI接口的板卡.
- 支持各种TTS(文本转语音)接口
- 商品化的TTS,如捷通、科大讯飞等
- 板卡厂商提供的TTS,如东进卡TTS3.0等
- 免费的TTS, 如微软TTS, 蓝星际内嵌TTS等
- 为各种数据库类型提供一致的接口
- MySql数据库, 内部调用MySql的客户端访问库, 有最好的效率
- MS SqlServer或Sybase数据库, 内部调用DB-Lib API方式访问SQL, 有最好的效率
- DBF数据库文件, 内部使用文件方式操作DBF, 有最好的效率
- ADO, 可以访问Acces, Ms SqlServer, Sybase, Oracle, Infomix, DB2等数据库, Windows2000以上操作系统已经有ADO驱动, 不必额外安装驱动软件
结构:
系统库:语音|数据库|线路通讯|..., 用户自定义函数库, 外部动态库 |
Koodoo脚本语言 |
语音平台(虚拟机):硬件线路|虚拟线路|语言编译器 |
硬件: 东进|三汇|Dialogic|NMS|交换机|TAPI接口|... |
从上图中可以看到,Koodoo语言是独立于硬件的语言,是系统的核心部分,是真正的CTI中间件。
蓝星际语音平台内部包括:
- 语法分析器(编译器)
- 虚拟的设备接口
- 虚拟的线路接口
- 虚拟的数据库接口
- 线路间通讯机制接口
- 界面显示与控制接口
系统库函数功能列表:
- 系统事件响应
- 响应挂断事件
- 响应系统退出事件
- 动态执行一个脚本
- 得到系统信息
- 动态执行一行包含在字符串中的语句
- 断言
- 变量运算类
- 基本运算
- 得到变量的类型
- 运算成整型
- 运算成浮点型
- 运算成字符串
- 字符串去空格
- 求字符串Asc值
- 得到某个Asc值的字符
- 求串长度
- 求子串
- 重复串
- 求串或数组的长度
- 得到数组成员
- 返回一个整型的随机数
- 串内表达式求值
- 将Koodoo变量转换成Unicode的字符串
- 将Unicode串转换成普通字符串
- 运算成16进制串
- 转换成大写字符串
- 转换成小写字符串
- 日期和时间
- 系统日期时间
- 得到若干天后的日期
- 得到当前时刻
- 得到当前的基准秒数时间
- 得到格式化的日期或时间串
- 生成基准秒数时间
- 串的查找和替换
- 判断是否包含子串
- 替换子串
- 分解串到数组
- 正则表达式匹配测试
- 正则表达式串替换
- 正则表达式将字符串分解到数组
- 数据库操作类
- 打开数据库
- 执行一个SQL命令
- 得到总记录数
- 读取字段值
- 改变字段值
- 关闭数据库
- 关闭所有打开的数据库
- 输出调试信息级别
- 执行一个SQL命令并将结果集映射到数组
- 线路语音操作类
- 线路操作
- 等待振铃
- 有来电(振铃)吗?
- 挂断
- 设置记费
- 判断是否有来电并接收号码
- 应答IsRinging()函数检测到的来电
- 外呼和转移
- 设置外呼忙音参数
- 设置外呼回铃音参数
- 设置信号音的频率参数
- 外呼之前设置主叫号码
- 外拨
- 设置信号音
- 清除信号音
- 设置拨号结果总为接通
- 开始拨号,非堵塞性外拨
- 检查拨号结果
- 拨号如果不成功,设置返回的方向
- 外呼之前设置第一被叫号码和转移原因
- 将当前会话转移到目标号码
- 外呼之前设置子地址号码
- 录音放音
- 设置语言路径
- 设置语音缺省扩展名
- 选择语言
- 设置打断
- 设置线路的音量
- 放音
- 录音
- 循环放音
- 停止放音或录音
- 扬声器播放语音
- 扬声器播放语音完了吗?
- 打开或关闭线路(Modem)的耳机和麦克风
- 非堵塞性开始录音
- 得到当前的语音基础路径和语种
- 设置放音到文件
- 装载语音文件到内存
- 卸载内存中的语音文件
- 重新开始上次中断的循环放音
- 收码、发码
- 设置结束键
- 设置两个按键之间的最大间隔
- 设置按键超时后的提示语音
- 是否显示用户按键
- 收码
- 清除用户按键
- 当前已经收到码的个数
- 发码
- 将接收的星号转换为小数点
- 合成放音类
- 组合播放数字
- 设置TTS参数
- 合成声音(TTS)
- 扬声器播放合成声音(TTS)
- 合成声音(TTS)到文件
- 传真类
- 设置本机传真ID
- 得到传真资源的使用情况
- 发送传真
- 接收传真
- 文本文件转换为传真文件
- 接收主被叫号码
- 得到主叫号码
- 得到被叫号码
- 得到第一被叫号码
- 线路连接
- 连接到某条线路
- 将已经连接的线路断开
- 断开所有的连接
- 以监听方式连接到某条线路
- 得到和本线路有关的所有连接成员
- 产生内线振铃
- 得到线路的摘挂机状态
- 网络通讯类
- TCP客户端打开连接
- TCP客户端关闭连接
- 关闭所有的TCP连接
- TCP发送数据
- TCP检查读取缓冲长度
- TCP读取数据
- HTTP请求
- 初始化Web服务器
- 接收Web请求
- 响应Web请求
- 关闭Web服务器
- 初始化一个TCP服务器
- TCP服务器接受一个远端的连接
- 将嵌入web页面的Ksp脚本转换成标准的Bss脚本
- 将整型变量转换成网络字节串
- 将网络字节串转换成整型变量
- 测试及信息显示类
- 模拟按键
- 扬声器组合播放数字
- 显示用户信息
- 设置用户信息颜色
- 文件及外部扩展
- 文本文件追加
- 文件换名或删除或创建
- 得到文件长度和文件时间
- 目录是否存在
- 创建一个新目录
- 删除目录
- 执行一个外部命令
- 装载外部动态连接库
- 动态库函数的说明
- 卸载外部动态连接库
- 卸载所有的外部动态连接库
- 休眠(延时)
- 打开文件
- 关闭打开的文件
- 关闭所有打开的文件
- 读文件内容
- 读文件当前行内容
- 读文件多行内容到数组
- 移动文件指针到指定的位置
- 将内容写入文件
- 得到磁盘空间
- 得到文件列表
- 文件复制
- 将变量打印到标准输出
- 设置并打开标准输出文件名
- 消息队列
- 发送消息, 将缓冲区的内容发送到消息队列
- 接收消息放置到缓冲区中, 同时队列里的该条消息将被删除
- 清空消息队列
- 得到消息数
- 设置消息缓冲区的某个字段
- 读取消息缓冲区的某个字段
- 清除队列中来自某条线路的所有消息
- 清除队列中指定类型的所有消息
- 清除队列中指定字段值的所有消息
- 共享内存变量
- 得到某条线路上的某个共享变量值
- 改变某条线路上的某个共享变量值
- 清空某条线路上的全部共享变量
- 将共享变量的值增加
- 将共享变量的值减少
- 线路间函数调用
- 发起线路间函数调用
- 响应线路间函数调用
- 外部扩展库
- GSM-Modem手机短信: GsmModem.dll
- 打开短信设备
- 关闭短信设备
- 发送短信
- 长信息自动拆分多条发送
- 查询接收的短信条数
- 接收短信
- 查询天线信号质量
- Email发送: BsEmail.dll
- 设置参数
- 设置是否需要显示调试信息
- 清除地址列表
- 添加地址(姓名, 地址)
- 生成邮件文件
- 发送邮件
- 判断某个地址是否发送成功
- 格式化的TCP消息传递: BsTcpMsg.dll
- (基于短连接的消息包, 互为Client/Server)
- 初始化
- 退出
- 发送消息
- 判断是否有消息到达
- 接收消息
- 取字段数
- 取某个字段名
- 取某个字段值
- 追加一个字段
- 增加消息头
- 格式化的TCP消息传递: BsTcpLong.dll
- (基于长连接的消息包)
- 初始化
- 客户端初始化, 连接到服务器
- 退出
- 发送消息
- 判断是否有消息到达
- 接收消息
- 判断是否在线(有没有断线)
简单应用
- 编写Koodoo语言脚本
可以使用任何文本编辑器编写Koodoo语言脚本。 - 使用开发平台调试脚本
开发平台将会编译脚本,并报告错误--如果有的话,也可能报告警告,系统会指出详细的信息以及文件名和行数,便于开发者定位错误。
如果顺利通过编译,系统将显示完整的可视化的语法树,可以进行各种操作,如设置、取消断点,运行,单步运行,查看变量等等。 - 配置运行环境,启动运行平台
主要是将脚本绑定到线路,并启动运行平台程序。运行平台有一个直观简单的监控界面。
复杂应用
复杂应用除了包含上述步骤外,还应:
- 分析业务需求
这是开发任何复杂系统的必经之路。
一般应先定义按键操作流程,画出草图,并定义详细的功能模块。 - 分析CTI与业务系统的接口
可能是数据库也可能是TCP/IP接口或其它接口, 如果使用外部接口, 则需要开发外部动态连接库。 - 分解语音物理线路和虚拟线路的功能
比如将数据库访问集中在虚拟线路,构成数据库访问网关,而物理线路和虚拟线路之间一般通过消息队列进行通讯。 - 编写功能函数
一般将重复的功能抽象成函数,为保持主流程的清晰,也应当将控制流程封装成函数。
此外,业务接口封装成函数是非常必要的,便于集中的管理,也便于修改升级。 - 编写语音物理线路的主流程
主要使用系统语音操作函数,如等待振铃,放音,收码等;
也要根据按键或数据来控制流程。 - 编写虚拟线路的服务流程
复杂系统通常要编写数据库网关、短信收发网关、人工座席网关(ACD)等等。
2004.01.06-2008.04.11 深圳