演讲

警告

警告!这是阿尔法代码。

随着开发的继续,我们保留更改此 API 的权利。

演讲的质量不是很好,只是“足够好”。鉴于设备的限制,您可能会在播放过程中遇到内存错误和/或意外的额外声音。现在还为时尚早,我们一直在改进语音合成器的代码。错误报告和拉取请求是最受欢迎的。

会说话的计算机和机器人感觉更“人性化”。

我们经常通过图形用户界面 (GUI) 了解计算机的功能。在 BBC micro:bit 的情况下,GUI 是一个 5x5 LED 矩阵,这还有很多不足之处。

让 micro:bit 与您交谈是一种以有趣、高效和有用的方式表达信息的方式。为此,我们基于 1980 年代早期合成器的逆向工程版本集成了一个简单的语音合成器。这听起来很可爱,有点像“所有人都必须死”。

考虑到这一点,我们将使用语音合成器来创建……

达莱克诗歌

../_images/dalek.jpg

DALEKs 喜欢诗歌,尤其是打油诗,这是一个鲜为人知的事实。他们疯狂地追求严格的 AABBA 形式的 anapestic meter。谁会想到?

(实际上,正如我们将在下面了解到的,这是医生的错,DALEK 喜欢打油诗,这让 Davros 很烦恼。)

无论如何,我们将根据需要创建 DALEK 诗歌朗诵会。

说些什么

在设备可以说话之前,您需要像这样插入扬声器:

../_images/speech1.png

让设备说话的最简单方法是导入speech 模块并使用如下say 函数:

import speech

speech.say("Hello, World")

虽然这很可爱,但 DALEK 肯定不足以满足我们的口味,因此我们需要更改语音合成器用于生成语音的一些参数。我们的语音合成器在这方面非常强大,因为我们可以更改四个参数:

  • pitch - 声音听起来有多高或多低(0 = 高,255 = Barry White)
  • speed - 设备说话的速度(0 = 不可能,255 = 睡前故事)
  • mouth - 说话时的声音是多么的守口如瓶(0 = 口技表演者的假人,255 = Foghorn Leghorn)
  • 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.sayDALEK 语音的设置来背诵这首诗。每行之间插入 500 毫秒的停顿,因为即使是 DALEK 也需要喘口气。

有趣的是,与诗歌相关的原始例程是由 Davros 用 FORTRAN(一种适合 DALEKS 的语言,因为你全部用大写字母输入) 编写的。然而,The Doctor 及时回到了 Davros 的 单元测试 通过和 部署管道开始之间的点 。此时他能够将 MicroPython 解释器插入 DALEK 操作系统,并将您在上面看到的代码插入 DALEK 内存银行作为一种长期隐藏的时间领主 复活节彩蛋瑞克罗尔

音素

您会注意到,有时该say功能无法准确地将英语单词翻译成正确的发音。要对输出进行细粒度控制,请使用音素:语言的构建块声音。

使用音素的好处是您不必知道如何拼写!相反,您只需要知道如何说出这个词,就可以按语音拼写。

语音合成器理解的音素的完整列表可以在语音的 API 文档中找到。或者,通过将英文单词传递给translate函数来节省大量时间。它将返回用于生成音频的音素的第一个近似值。可以手动编辑此结果以提高准确性、变化和强调(因此听起来更自然)。

pronounce 函数用于音素输出,如下所示:

speech.pronounce("/HEH5EH4EH3EH2EH2EH3EH4EH5EHLP.”)

您如何改进 The Doctor 的代码以使其使用音素?

唱一首歌 Micro:bit

通过更改pitch设置并调用该 sing 函数,可以使设备唱歌(尽管它不会很快赢得欧洲电视网)。

从音高数字到音符的映射如下所示:

../_images/speech-pitch1.png

sing函数必须将音素和音高作为输入,如下所示:

speech.sing("#115DOWWWW")

注意要唱的音高是如何用散列 (#)附加到音素的。后续音素的音高将保持不变,直到注释新的音高。

以下示例演示了如何使用所有三个生成函数 ( say, pronouncesing) 来生成类似语音的输出:

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)