spokestack-tray-ios
为任何 iOS 应用添加 Spokestack 的本机 iOS 库。
安装
编辑 Podfile
CocoaPods 是 Cocoa 项目的依赖项管理器。有关使用和安装说明,请访问其网站。要使用 CocoaPods 将 Spokestack 集成到您的 Xcode 项目中,请在 Podfile 中指定它
pod 'SpokestackTray-iOS'
编辑 Info.plist
将以下内容添加到您的 Info.plist 中以启用权限。同时确保您的 iOS 部署目标设置为 13.0。
如果没有这些,您的应用将崩溃
<key>NSMicrophoneUsageDescription</key>
<string>For making voice requests</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>For understanding your voice requests</string>
设置音频会话分类
对于大多数应用程序,这应该放在AppDelegate.application中
do {
let session = AVAudioSession.sharedInstance()
try? session.setCategory(.playAndRecord, options: [.defaultToSpeaker, .allowAirPlay, .allowBluetoothA2DP, .allowBluetooth])
try? session.setActive(true, options: [])
}
用法
import SpokestackTray
import Spokestack
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .green
/// Child view controller
self.addHostingController()
let configuration: TrayConfiguration = TrayConfiguration()
/// When the tray is opened for the first time this is the synthesized
/// greeting that will be "said" to the user
configuration.greeting = """
Welcome! This example uses models for Minecraft. Try saying, \"How do I make a castle?\"
"""
/// When the tray is listening or processing speech there is a animated gradient that
/// sits on top of the tray. The default values are red, white and blue
configuration.gradientColors = [
"#61fae9".spstk_color,
"#2F5BEA".spstk_color,
UIColor.systemRed
]
/// Apart of the initialization of the tray is to download the nlu and wakeword models.
/// These are the default Spokestack models, but you can replace with your own
configuration.nluModelURLs = [
NLUModelURLMetaDataKey: "https://d3dmqd7cy685il.cloudfront.net/nlu/production/shared/XtASJqxkO6UwefOzia-he2gnIMcBnR2UCF-VyaIy-OI/nlu.tflite",
NLUModelURLNLUKey: "https://d3dmqd7cy685il.cloudfront.net/nlu/production/shared/XtASJqxkO6UwefOzia-he2gnIMcBnR2UCF-VyaIy-OI/vocab.txt",
NLUModelURLVocabKey: "https://d3dmqd7cy685il.cloudfront.net/nlu/production/shared/XtASJqxkO6UwefOzia-he2gnIMcBnR2UCF-VyaIy-OI/metadata.json"
]
configuration.wakewordModelURLs = [
WakeWordModelDetectKey: "https://d3dmqd7cy685il.cloudfront.net/model/wake/spokestack/detect.tflite",
WakeWordModelEncodeKey: "https://d3dmqd7cy685il.cloudfront.net/model/wake/spokestack/encode.tflite",
WakeWordModelFilterKey: "https://d3dmqd7cy685il.cloudfront.net/model/wake/spokestack/filter.tflite"
]
configuration.cliendId = "YOUR_CLIENT_ID"
configuration.clientSecret = "YOUR_CLIENT_SECRET"
/// The handleIntent callback is how the SpeechController and the TrayViewModel know if
/// NLUResult should be processed and what text should be added to the tableView.
let greeting: IntentResult = IntentResult(node: InterntResultNode.greeting.rawValue, prompt: configuration.greeting)
var lastNode: IntentResult = greeting
configuration.handleIntent = {intent, slots, utterance in
switch intent {
case IntentResultAmazonType.repeat.rawValue:
return lastNode
case IntentResultAmazonType.yes.rawValue:
lastNode = IntentResult(node: InterntResultNode.search.rawValue, prompt: "I heard you say yes! What would you like to make?")
case IntentResultAmazonType.no.rawValue:
lastNode = IntentResult(node: InterntResultNode.exit.rawValue, prompt: "I heard you say no. Goodbye")
case IntentResultAmazonType.stop.rawValue,
IntentResultAmazonType.cancel.rawValue,
IntentResultAmazonType.fallback.rawValue:
lastNode = IntentResult(node: InterntResultNode.exit.rawValue, prompt: "Goodbye!")
case IntentResultAmazonType.recipe.rawValue:
if let whatToMakeSlot: Dictionary<String, Slot> = slots,
let slot: Slot = whatToMakeSlot["Item"],
let item: String = slot.value as? String {
lastNode = IntentResult(node: InterntResultNode.recipe.rawValue,
prompt: """
If I were a real app, I would show a screen now on how to make a \(item). Want to continue?
"""
)
}
case IntentResultAmazonType.help.rawValue:
lastNode = greeting
default:
lastNode = greeting
}
return lastNode
}
/// Which NLUNodes should trigger the tray to close automatically
configuration.exitNodes = [
InterntResultNode.exit.rawValue
]
/// Callback when the tray is opened. The call back is called _after_ the animation has finished
configuration.onOpen = {
LogController.shared.log("isOpen")
}
/// Callback when the tray is closed. The call back is called _after_ the animation has finished
configuration.onClose = {
LogController.shared.log("onClose")
}
/// Callback when a `TrayListenerType` has occured
configuration.onEvent = {event in
LogController.shared.log("onEvent \(event)")
}
let tray: SpokestackTrayViewController = SpokestackTrayViewController(self, configuration: configuration)
tray.addToParentView()
tray.listen()
}
贡献
查看贡献指南,了解如何为存储库和发展工作流程做出贡献。
文档
Spokestack 函数
来自SpokestackTray库的公共方法
listen
让Spokestack开始监听。
这通过首先检查确保NLU / 觉醒词模型已被下载以及已授予必要的权限,然后激活流程来启动语音管道。
停止监听
告诉 Spokestack 停止监听
添加到父视图中
将 SpokestackTrayViewController
添加到父视图控制器的视图中
从父视图中移除
停止语音流水线和从父视图控制器视图中移除 SpokestackTrayViewController