演讲¶
会说话的计算机和机器人感觉更“人性化”。
我们经常通过图形用户界面 (GUI) 了解计算机的功能。在 BBC micro:bit 的情况下,GUI 是一个 5x5 LED 矩阵,这还有很多不足之处。
让 micro:bit 与您交谈是一种以有趣、高效和有用的方式表达信息的方式。为此,我们基于 1980 年代早期合成器的逆向工程版本集成了一个简单的语音合成器。这听起来很可爱,有点像“所有人都必须死”。
考虑到这一点,我们将使用语音合成器来创建……
大乐诗¶
DALEKs 喜欢诗歌,尤其是打油诗,这是一个鲜为人知的事实。他们疯狂地追求严格的 AABBA 形式的 anapestic meter。谁会想到?
(实际上,正如我们将在下面了解到的,这是医生的错,DALEK 喜欢打油诗,这让 Davros 很烦恼。)
无论如何,我们将根据需要创建 DALEK 诗歌朗诵会。
说些什么¶
如果您拥有最新的 micro:bitV2 设备,您可以使用内置扬声器以及或代替连接扬声器或耳机组,如下所示:
让设备说话的最简单方法是导入speech
模块并使用如下say
函数:
import speech
speech.say("Hello, World")
虽然这很可爱,但 DALEK 肯定不足以满足我们的口味,因此我们需要更改语音合成器用来生成语音的一些参数。我们的语音合成器在这方面非常强大,因为我们可以更改四个参数:
pitch
- 声音听起来有多高或多低(0 = 高,255 = 低)speed
- 设备说话的速度(0 = 快,255 = 慢)mouth
- 口齿不清或公开表达声音的程度(0 = 闭嘴,255 = 张嘴)throat
- 语气的放松或紧张程度(0 = 紧张,255 = 放松)
总的来说,这些参数控制着声音的质量——也就是音色。老实说,获得您想要的语气的最佳方法是尝试、使用您的判断并进行调整。
要调整设置,您将它们作为参数传递给say
函数。更多细节可以在speech
模块的 API 文档中找到。
经过一些实验,我们发现这听起来很 DALEK 式:
speech.say("I am a DALEK - EXTERMINATE", speed=120, pitch=100, throat=100, mouth=200)
诗歌点播¶
作为半机械人 DALEK 使用他们的机器人能力来创作诗歌,事实证明他们使用的算法是用 Python 编写的,如下所示:
# DALEK poetry generator, by The Doctor
import speech
import random
from microbit import sleep
# Randomly select fragments to interpolate into the template.
location = random.choice(["brent", "trent", "kent", "tashkent"])
action = random.choice(["wrapped up", "covered", "sang to", "played games with"])
obj = random.choice(["head", "hand", "dog", "foot"])
prop = random.choice(["in a tent", "with cement", "with some scent",
"that was bent"])
result = random.choice(["it ran off", "it glowed", "it blew up",
"it turned blue"])
attitude = random.choice(["in the park", "like a shark", "for a lark",
"with a bark"])
conclusion = random.choice(["where it went", "its intent", "why it went",
"what it meant"])
# A template of the poem. The {} are replaced by the named fragments.
poem = [
"there was a young man from {}".format(location),
"who {} his {} {}".format(action, obj, prop),
"one night after dark",
"{} {}".format(result, attitude),
"and he never worked out {}".format(conclusion),
"EXTERMINATE",
]
# Loop over each line in the poem and use the speech module to recite it.
for line in poem:
speech.say(line, speed=120, pitch=100, throat=100, mouth=200)
sleep(500)
正如评论所示,它的设计非常简单:
- 命名为片段(
location
,prop
,attitude
等等)随机从可能值的预定义列表中生成。请注意用于random.choice
从列表中选择单个项目。 - 一首诗的模板被定义为一个带有“洞”的节列表(用 表示
{}
),命名片段将使用该format
方法放入其中。 - 最后,Python 循环遍历已填写的诗歌节列表中的每个项目,并使用
speech.say
DALEK 语音的设置来背诵这首诗。每行之间插入 500 毫秒的停顿,因为即使是 DALEK 也需要喘口气。
有趣的是,与诗歌相关的原始例程是由 Davros 用 FORTRAN(一种适合 DALEKS 的语言,因为你全部用大写字母输入) 编写的。然而,医生及时回到了 Davros 单元测试 通过和 部署管道启动之间的时间点 。此时他能够将 MicroPython 解释器插入 DALEK 操作系统,并将您在上面看到的代码插入 DALEK 内存银行作为一种长期隐藏的时间领主 复活节彩蛋 或 瑞克罗尔。
音素¶
您会注意到,有时,该say
功能无法准确地将英语单词翻译成正确的发音。要对输出进行细粒度控制,请使用音素:语言的构建块声音。
使用音素的好处是您不必知道如何拼写!相反,您只需要知道如何说出这个词,就可以按语音拼写。
语音合成器理解的音素的完整列表可以在语音的 API 文档中找到。或者,通过将英文单词传递给translate
函数来节省大量时间。它将返回用于生成音频的音素的第一个近似值。可以手动编辑此结果以提高准确性、变化和强调(因此听起来更自然)。
该 pronounce
函数用于音素输出,如下所示:
speech.pronounce("/HEH5EH4EH3EH2EH2EH3EH4EH5EHLP.”)
您如何改进 The Doctor 的代码以使其使用音素?
唱一首歌 Micro:bit¶
通过更改 pitch
设置和调用sing
函数,可以让设备唱歌(尽管它不会很快赢得欧洲电视网)。
从音高数字到音符的映射如下所示:
该 sing
函数必须将音素和音高作为输入,如下所示:
speech.sing("#115DOWWWW")
注意要唱的音高是如何用散列 (#
)附加到音素的。在注释新的音高之前,后续音素的音高将保持不变。
以下示例演示了如何使用所有三个生成函数 (say
,
pronounce
和 sing
) 来生成类似语音的输出:
"""
speech.py
~~~~~~~~
Simple speech example to make the micro:bit say, pronounce and sing
something. This example requires a speaker/buzzer/headphones connected
to P0 and GND,or the latest micro:bit device with built-in speaker.
"""
import speech
from microbit import sleep
# The say method attempts to convert English into phonemes.
speech.say("I can sing!")
sleep(1000)
speech.say("Listen to me!")
sleep(1000)
# Clearing the throat requires the use of phonemes. Changing
# the pitch and speed also helps create the right effect.
speech.pronounce("AEAE/HAEMM", pitch=200, speed=100) # Ahem
sleep(1000)
# Singing requires a phoneme with an annotated pitch for each syllable.
solfa = [
"#115DOWWWWWW", # Doh
"#103REYYYYYY", # Re
"#94MIYYYYYY", # Mi
"#88FAOAOAOAOR", # Fa
"#78SOHWWWWW", # Soh
"#70LAOAOAOAOR", # La
"#62TIYYYYYY", # Ti
"#58DOWWWWWW", # Doh
]
# Sing the scale ascending in pitch.
song = ''.join(solfa)
speech.sing(song, speed=100)
# Reverse the list of syllables.
solfa.reverse()
song = ''.join(solfa)
# Sing the scale descending in pitch.
speech.sing(song, speed=100)