"); //-->
玩具设计看似简单,但是其背后真实的技术背景并不简单,要综合考虑软件和硬件方面的技术设计以及语音处理技术,同时还要选择合适的微控制器及相关外围器件,从而实现低成本和低功耗设计。
Lewin A.R.W.Edwards
嵌入式系统设计工程师
Digi-Frame公司
Email: larwe@larwe.com
今天孩子们的玩具实际上属于一种嵌入式系统,本文跳过玩具产品设计项目中的“概念设计”阶段,直接从项目的工程设计开始讨论,并且假定项目的设计规格说明书(设计指标)已经完成。这些设计规格说明书通常是以游戏模式流程图的方式来详细地描述玩具的行为。我们设想的洋娃娃游戏模式如下:
A. 玩具是婴儿洋娃娃,其腰部配备一个常态为断开的开关(该开关用来检测拥抱洋娃娃的动作),还有一个重力开关(该开关用来检测洋娃娃是站立还是躺下姿势)。
B. 洋娃娃站立时重力开关断开。
C. 洋娃娃站立时,如果腰部开关被按下,洋娃娃将播放下列声音中的一种:哈哈地笑、长时间地大笑、或者以愉快的声调说话。每一次按下洋娃娃的腰部开关,洋娃娃都将循环地播放上述声音中的一种。
D. 洋娃娃躺下时,如果腰部开关被按下,那么洋娃娃会发出哭声,然后转为无声。E. 如果将洋娃娃的姿势由躺下转为站立,洋娃娃就会打哈欠。
F. 如果将洋娃娃的姿势由站立转为躺下,洋娃娃就会发出简短的鼾声,然后转为无声。
声音处理
工程设计的第一步是记录声音并且将声音信息传送给芯片开发系统。尽管以后还要进行下采样(downsapling),但是对声音信号进行高质量的采样仍然十分重要。从声学意义上讲,该记录过程通常都应该在绝对安静的录音棚环境下进行,要采用44KHz 16位采样方式录制,并直接将声音信号记录在计算机硬盘上。通常情况下应该聘请语音专业人员来从事录制工作,而不是由项目工程师或办公人员来录制。每一个字词或者短语最好录音几次,这样就有选择的余地。
对于那些需要从电子乐器中获取音乐的工程项目来说,更可取的方法是将艺术家的演奏效果记录成MIDI格式。MIDI格式可以修改演奏的乐器以及播放顺序,并且在必要的时候(如根据硬件进一步调整语音性能)去掉多调(polyphonic)成分。
有时,音频工程师还必须通过合并冗余的声音信号来实现被采样声音的分解以压缩ROM空间。一个典型实例就是从1到20之间计数的语音玩具。在这样的玩具设计中,并不需要为每一个数字都单独进行语音采样和录音,语音采样通常从数字1开始到12,然后是数字20,接下来是音节“thir-”(数字13)、“fif-”(数字15)和“eigh-”(数字18),除此之外,还有后缀“-teen”。请注意,“four”、“six”、“seven”和“nine”等语音信号既可以表示这些数字所代表的语音,也可作为音节跟语音后缀“teen”结合表示大于10的数字的语音。
对语音信号进行分解的程度取决于可用存储空间的大小。可以尝试将数字31分解成“thir-”(并且这个音节还可以用于数字13和30)、“-ty”(这个音节可以用于所有带“-ty”的数字中)以及“one”。语音的分解费时费力,要拆分和连接音节,增强爆破音,测试连接音的不同组合以确保连接音的声效像一个连贯字。有时为了得到仅仅几个词的比较理想的声效,可能需要几个星期时间,所以如果没有必要应该尽量避免更进一步的分解。
语音分解的一个极端例子是设计类似于SC-01或SPO256A-AL2这样的音位变体语音合成芯片。芯片中存储了(实际上是合成)一个语音片段库,通过这个语音库你可以组合出各种各样的词。举例来说,你可以从语音片段“d”、“ah”和“g”来构造出“dog”。然而,要保证这种合成的声效听起来非常接近于实际情况就十分困难。
微控制器的选择
在玩具的生产制造中,成本控制是一个重要的考虑因素,所以要尽量选用廉价的控制芯片。这样一来几乎所有带语音的玩具都用4位语音微控制器芯片设计,这些芯片都包括简单的控制器内核、输入和输出管脚、寄存器以及串行访问的ROM,在该ROM中存入一段小程序和大量语音采样信号。
早期芯片采用简单的4位PCM编码技术,能在很短的ROM空间内存储很长的语音编码信号。最新的芯片都采用4位或5位ADPCM技术,这是一种预测编码系统,它利用了模拟信号数字化过程中连续采样之间的相关性。从算法上来说,每一个采样值结合解码器当前的输出状态生成下一个输出状态。利用ADPCM技术,一个5位输入数据流可以驱动一个8位DAC,而且可以产生非常好的声效。尽管这种压缩系统并不产生原始信号的字节流,然而这对于语音和音乐播放来说已经足够了,同8位PCM编码方式相比,可以节省37.5%的ROM空间。
许多玩具采用的外部电路都非常简单,通常包括一个电池、一个用来设定芯片时基的外部电阻、一个小喇叭或一个用于驱动喇叭的晶体管。这些芯片的价格如何呢?一般来说,可以容纳两分钟音频信号的掩膜微控制器裸片,量产条件下成本大约为每片1.20美元。绝大多数的玩具都使用更小的芯片,价格大约在0.15美元到0.30美元。本文讨论的应用选择W583S10,在华邦公司推荐的6.4kHz采样频率下,该芯片仅能存储10秒的语音数据,如图1所示。注意,电阻R1的值取决于采样频率。通常情况下,设计工程师会使用一个电阻替换盒来试验其它阻值。
上述芯片的指令集并不丰富,其指令集通常包括对寄存器加载常量的指令、寄存器增/减指令、设置输出管脚状态指令、无条件跳转指令、寄存器无条件跳转指令以及根据输入管脚状态的条件跳转指令。芯片中实现子程序的唯一方法是在一个寄存器中存储一个返回地址。在对器件编程时,要大量使用GOTO语句,对于一些较大的项目来说,程序中会出现许多冗余代码。
降低功耗
功耗是设计中另一个非常重要的考虑因素。绝大多数配备语音功能的玩具从工厂邮寄出去之前都预先安装了电池,而且都希望摆放在货架上的玩具内的电池经久耐用。许多玩具都没有电源开关,并且绝大多数的玩具还提供一种“试用”模式,所以商店里所有的顾客都可能按一下某一个按钮来看一看或听一听玩具会做什么样的反应。因此,关闭芯片中所有不需要使用的电路就至关重要,而且必须确保玩具在演奏完所有的语音序列之后应该尽可能完全将其功耗降下来。
功耗方面一个非常重要的问题在于ADPCM编码的使用。如果在演奏完一段声音之后简单地停止该微控制器芯片,输出DAC会出现一个非零的输出电压(大约接近最大电压值的一半)。如果在每一个采样数据之后关闭DAC,那会发出非常讨厌的滴答声。考虑到这些原因,芯片制造厂商提供一段汇编程序来实现DAC输出电压值从0V到半峰值的线性变化,或者半峰值到0V线性变化。当一段采样数据播出之后,可以调用该宏来实现DAC输出逐渐减弱到0V;当重新开始演奏一段新的采样数据时,可以调用该宏将DAC输出数据逐渐增大到半峰值电压。通过这种方法可以有效地降低功耗。
为了达到延长电池寿命的目的,程序大量采用中断驱动的方式。一旦系统加电启动,如果程序允许输入管脚上的中断信号有效,对输入管脚上的每一个事件(对应一个中断),微控制器芯片都会在一个预先定义好的位置开始执行。而一旦遇到“STOP”指令时,微控制器的功耗就会完全降下来。
软件代码
一个实际玩具的行为通常可能比较复杂。例如,我们更喜欢在打鼾或者是打哈欠语音之前插入半秒钟的停顿,这样会使得声效的感觉更逼真。实际应用中,可能希望在播放声音信号时让中断信号无效,以便该玩具在识别进一步的输入时能够完成声音信号的播放。有关这些问题的最佳解决方案就是创建和测试这些代码,并且需要丰富经验以及个人的判断。另外,也可采用“试用”模式,在这种模式下洋娃娃仅仅会对按下腰部开关的动作做出响应(这样可以避免在产品邮寄过程中消耗电池)。通常是在洋娃娃的一对触点之间插入一根塑料抽条来隔离接触点,除非购买该产品的最终用户去掉了这根塑料条,重力开关将始终无效。
声效问题值得关注
如果这些代码的执行效果令人满意,就可以开始对这些声音文件进行压缩和优化。压缩过程包括低通和/或高通滤波,消除那些不需要的回声并且改进声效。细心的设计工程师可能会注意到爆破音或摩擦音的处理,以便将这些声音容易地区别开来,这对于拼写类游戏和教育类产品来说很有必要。而对于嘴唇运动与语音同步的玩具,嘴形控制信号会同时嵌入到声音文件中。
要对16位44.1kHz的WAV文件进行滤波和编辑,然后对这些文件进行下采样以达到最终芯片所要求的采样速率(通常情况下为6kHz到8kHz内)。利用芯片厂商的工具链可以将输入的文件转换为微控制器芯片所采用的ADPCM格式。选择精确的采样率可以最大限度地利用ROM空间。微控制器和ROM空间选择之后,在保证编译器能将全部的声音信号存入到芯片的条件下,要选用最高的采样频率。
就编译器而言,不要指望为价值10美分的芯片提供一个高品质的开发系统。开发系统很普通,绝大多数厂商提供的软件可能还非常糟糕,可能存在大量奇怪的问题和难以解释的行为。在编译过程中可能还会产生很多问题,例如:某个声音文件被拒绝处理,在对其长度作稍微的删减或增加后又能执行了;而代码间空格太多或太少会产生错误报表。
该阶段的测试最好用具备真实外形的玩具样品进行。在可能的情况下,最好使用设计所指定的喇叭来测量,因为喇叭的类型对于最终的声效有很大的影响。廉价的玩具语音芯片也可以驱动设计很好的优质喇叭并产生高保真度的声音。喇叭的类型、大小和安装位置对最终产品声效有很大影响,并直接影响到产品的销售。
至今为止,所有的开发都在芯片商提供的开发板上完成,并采用闪烁存储器来存储程序。最终的产品实际上都采用一个板上掩膜ROM,该裸片直接邦定在PCB上,然后由一小团树脂材料封装起来。
本文总结
新玩具产品要得到公司主管的欣赏并不容易,抱怨通常会很多,例如会笑的玩具听起来像“恶魔的声音”(实际上就存在这样的诉讼案例);诙谐的玩具又“太低级趣味”;有的玩具很容易引起惊慌,这是因为玩具突发大声或猛然动作的缘故;马达或齿轮噪声太大等。要解决这些问题,工程师还要进行一系列的调整。
[Embedded Systems Programming]
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。