如何转换用户语音指令为文本输入
WatchKit最有趣的特性之一 ——将用户语音指令转换成文本输入——却是讨论最少的。让我们起个头。
对我说话
处理对话的是一个标准模态框,在你当前WKInterfaceController调用
presentTextInputControllerWithSuggestions:allowedInputMode:completion:
1 2 3 |
[self presentTextInputControllerWithSuggestions:nil allowedInputMode:WKTextInputModeAllowAnimatedEmoji completion:^(NSArray *results) { // Do whatever you like with the array of results. }]; |
控制器是异步运行的,等待用户按“完成”并确认他们的输入。确认之后,主线程执行完成模块,之后你可以随意使用提供的结果。
你总是应该在你WatchKit拓展的主线程中调用
建议
当语音输入控制器出现时,你也可以选择提供一个NSString对象的序列,给用户提供输入建议。例如在一个消息应用里,你也许想要给用户一些他们可以发给朋友的常见回复。
1 2 3 4 5 6 7 8 9 |
NSArray *suggestions = @[ @"Cool!", @"See you there!", @"On my way!" ]; [self presentTextInputControllerWithSuggestions:suggestions allowedInputMode:WKTextInputModeAllowAnimatedEmoji completion:^(NSArray *results) { // Do whatever you like with the array of results. }]; |
输入模式
你需要从三种WKTextInputMode中选择一个展现给用户。
- WKTextInputModePlain:只有语音/建议文字。没有emoji表情。emoji按钮会被隐藏。
- WKTextInputModeAllowEmoji:语音,建议文字,以及非动画的emoji
- WKTextInputModeAllowAnimatedEmoji:语音,建议文字和所有emoji
如果你跳过提供建议的步骤并且设置输入模式为WKTextInputModePlain,用户会直接进入语音输入界面。
输入处理
输入处理模块会从用户那儿收到一个包含输入的NSArray。如果没接到输入时模态框就被取消了,这个array序列为nil。一般情况下,这个array会包含一个表示文字输入的NSString对象。
但是,如果你允许用户输入emoji,它也可以包含一个NSData对象,对应一个emoji图片。你可以用这个NSData对象生成一个UIImage,或者直接在WKInterfaceImage里使用。
由于文本输入界面是弹出的模态框,WKInterfaceController会在完成模块被调用之前重新被激活。
模拟器
涉及到在模拟器中测试指令,还有几点需要提一下:
- 虽然你可以随意指定输入模式,模拟器只支持选择建议的字符串进行文字输入。你不可以用麦克风说话并将它转换成文本。类似地,模拟器不支持选择任何emoji。
- 指令屏幕会是空白的。要知道,用在真正的表上的时候,语音输入模块会立即启动。用户需要点击“完成”按钮来确认指令文字,之后指令才会传回你的应用。