用API和AVFoundation打造唱歌跳舞機器人

API 與 AVFoundation的應用實作

--

製作介紹

目標是讓機器人邊跳舞邊報數。BoogieBot的API提供以下function ,利用boogie bot編好的function來自定義新的跳舞part (function),跳舞的靈感則來自全聯的國民省錢運動體操。

讓機器人像做體操一樣,每跳一個part就報數1234 (一個part的舞搭配報數4個字)。報數的數字會持續變化(1234、5678、2234、5678…),所以設成變數,並且為了每次都以相同的音量、音高、語句停頓、語速、語言屬性們報數,所以把屬性們包起來定義成一個新的function,之後就可以方便簡潔的重複命令了!

另外以下為了方便閱讀,我把變數命名為“報數”,等同於Peter在例子中命名的speechUtterance。

什麼是API :讓機器人跳舞

API全名是:Application Programming Interface (應用程式介面)。
第三方寫好的程式,以協助開發者開發。
在BoogieBot 的例子中,會有數個已經寫好的functions可以讓BoogieBot啟動、活動,或換顏色。

以下控制BoogieBot的functions就是一個API的例子。API是特定的一組功能讓開發者可以完成一項任務,而這邊的BoogieBot API則會讓機器人跳舞。

*動手  leftArmUp(), leftArmDown(), rightArmUp(), rightArmDown()
*動腿 leftLegUp(), leftLegDown(), rightLegUp(), rightLegDown()
*擺臀 shakeItLeft(), shakeItRight(), shakeItCenter()
*跳 jumpUp(), jumpDown()
*變色 fabulize(), defabulize()
*設定主標題和副標題
setBotTitle(“國民省錢運動”), setBotSubtitle(“By Judy全連小姐Boogiemaster”)

介紹AVFoundation:讓機器人報數

1. 匯入影音系統函式庫

要先匯入聲音、影音的函式庫,之後才能使用相關的function。或是使用第三方的套件時也要先匯入。

import AVFoundation

2. 生出要講的話

生出要講的第一組數字1,2,3,4,把他儲存在變數【報數】中。儲存在變數的原因是為了方便之後修改報數的數字,如第二行。

var 報數 = AVSpeechUtterance(string:”1 2 3 4")
報數 = AVSpeechUtterance(string:"5 6 7 8")

3. 設定講話的屬性

Utterance的相關屬性:

  • volume:音量,min-max(0–1)
  • pitchMultiplier:音高,min-max(0.5–2.0)
  • postUtteranceDelay:結束講話後的停頓時間
  • preUtteranceDelay:開始講話前的停頓時間
  • rate:語速,min-max(0–1.0)
  • voice:說話語言 (可以指定不同語碼)
報數.volume = 1.0報數.pitchMultiplier = 0.8報數.postUtteranceDelay = 0.7報數.rate = 0.00001報數.voice = AVSpeechSynthesisVoice(language: “zh-TW”)
不同語言語碼

4. 生成合成器

生成會講話的合成器AVSpeechSynthesizer,把他存在名為synthesizer的常數中。

let synthesizer = AVSpeechSynthesizer()

5.命令合成器說話

speak()是method,是我們可以命令合成器執行說話的指令。

synthesizer.speak(報數)

合成器可以做的事情當中,除了speak()以外,還有以下指令,都可以在help>Developer Documentation裡找到

func continueSpeaking() → Bool:從暫停的點繼續說話
func pauseSpeaking(at: AVSpeechBoundary)→ Bool:從指定的boundary暫停說話
func stopSpeaking(at: AVSpeechBoundary) → Bool:從指定的boundary停止說話

跳舞成品

進階的BoogieBot

進階題來源
>3-Organizing Data>2-Play with Complex Data>A-Instances, Methods, and Properties>Exercise-The Return of BoogieBot

上一個例子是透過呼叫舞步的functions執行跳舞動作,在BoogieBot 的進階題中換了另一種方式讓BoogieBot跳舞 — BoogieBot變成一種型別(Type),
所以我們要先生成 BoogieBot的東西(Instance),來製作兩隻機器人

let leftBot = BoogieBot()
let rightBot = BoogieBot()

再生成一個讓BoogieBot跳舞的舞台,並且讓舞台可以錄下舞步

let stage = BoogieStage()
stage.startRecording()

幫兩個BoogieBot命名後放上舞台

leftBot.botName = “Lefty”
rightBot.botName = “Righty”
stage.leftBot = leftBot
stage.rightBot = rightBot

最後就是舞步的設計

//左邊機器人舞步
leftBot.fabulize()
leftBot.leftArmUp()
leftBot.leftArmDown()
leftBot.rightLegUp()
leftBot.rightLegDown()
//右邊機器人舞步
rightBot.fabulize()
rightBot.shakeItLeft()
rightBot.shakeItCenter()
rightBot.leftLegUp()
rightBot.leftLegDown()
//左邊機器人舞步
leftBot.jumpUp()
leftBot.jumpDown()
leftBot.rightLegUp()
leftBot.rightLegDown()
leftBot.fabulize()
//右邊機器人舞步
rightBot.jumpUp()
rightBot.jumpDown()
rightBot.leftLegUp()
rightBot.leftLegDown()
rightBot.fabulize()

另外即使我的程式讓兩隻機器人輪流跳舞,這邊的BoogieBot也不會照playground 程式依序跳舞(跟上一題不同),因為這題的BoogieBot API有特別設計讓兩隻機器人同時跳舞。
API的程式碼可以從Playground左側視窗的Exercise — The Return of BoogieBot下的Sources資料夾裡找到。

跳舞成品

--

--