iOS 上的语音合成在加载时出现奇怪的错误,并且没有并发
Speech Synthesis on iOS weird errors on loading, and no concurrency
我正在使用 AVFoundation 中的语音合成器,创建这样的语音实例:
import AVFoundation
class CanSpeak {
let voices = AVSpeechSynthesisVoice.speechVoices()
let voiceSynth = AVSpeechSynthesizer()
var voiceToUse: AVSpeechSynthesisVoice?
init(){
for voice in voices {
if voice.name == "Arthur"
{
voiceToUse = voice
}
}
}
func sayThis(_ phrase: String){
let utterance = AVSpeechUtterance(string: phrase)
utterance.voice = voiceToUse
utterance.rate = 0.5
voiceSynth.speak(utterance)
}
}
我有两个问题。
- 没有并发。多次调用此函数会导致要说话的字符串排队。我不想要那个。如果多次调用此函数,并靠近在一起,我希望声音立即开始说话,即使这意味着自己说话。我该如何做到这一点?
2 - 加载时我不明白的一些奇怪错误:
2016-11-18 03:03:07.103349 mySKtest[687:87489] 0x17415ee50 Copy
matching assets reply: XPC_TYPE_DICTIONARY
{ count = 2, transaction: 0, voucher = 0x0, contents = "Assets" =>
: { length = 3620 bytes, contents =
0x62706c6973743030d4000100020003000400050006012d01... } "Result" =>
: 0 } 2016-11-18 03:03:07.109254
mySKtest[687:87489] 0x17015e610 Copy assets attributes reply:
XPC_TYPE_DICTIONARY { count = 1,
transaction: 0, voucher = 0x0, contents = "Result" => : 1 } 2016-11-18 03:03:07.109547 mySKtest[687:87489]
[MobileAssetError:1] Unable to copy asset attributes 2016-11-18
03:03:07.110080 mySKtest[687:87489] Could not get attribute
'LocalURL': Error Domain=MobileAssetError Code=1 "Unable to copy asset
attributes" UserInfo={NSDescription=Unable to copy asset attributes}
2016-11-18 03:03:07.112341 mySKtest[687:87489] 0x17015e610 Copy assets
attributes reply: XPC_TYPE_DICTIONARY {
count = 1, transaction: 0, voucher = 0x0, contents = "Result" =>
: 1 } 2016-11-18 03:03:07.112416
mySKtest[687:87489] [MobileAssetError:1] Unable to copy asset
attributes 2016-11-18 03:03:07.112523 mySKtest[687:87489] Could not
get attribute 'LocalURL': Error Domain=MobileAssetError Code=1 "Unable
to copy asset attributes" UserInfo={NSDescription=Unable to copy asset
attributes} 2016-11-18 03:03:07.145658 mySKtest[687:87489] 0x174341c30
Copy matching assets reply: XPC_TYPE_DICTIONARY { count = 2, transaction: 0, voucher = 0x0, contents =
"Assets" => : { length = 4198 bytes, contents =
0x62706c6973743030d4000100020003000400050006016f01... } "Result" =>
: 0 } 2016-11-18 03:03:07.148403
mySKtest[687:87489] 0x17015e610 Copy assets attributes reply:
XPC_TYPE_DICTIONARY { count = 3,
transaction: 0, voucher = 0x0, contents = "Attributes" => : { length = 526 bytes, contents =
0x62706c6973743030d4010203040506232458247665727369... } "Result" =>
: 0 "SandboxExtension" => {
length = 269, contents =
"b72954a376beb759be03a6411c3e2649f9845fd1;00000000;00000000;0000000000000015;com.apple.assets.read;00000001;01000003;00000000000ca4fc;/private/var/MobileAsset/Assets/com_apple_MobileAsset_VoiceServices_CustomVoice/54ffb86ce0ecd2c5bf871303b5690d327a571428.asset/AssetData" } } 2016-11-18 03:03:07.149858 mySKtest[687:87489] 0x1743414a0 Copy
assets attributes reply: XPC_TYPE_DICTIONARY { count = 2, transaction: 0, voucher = 0x0, contents =
"Attributes" => : { length = 526 bytes, contents =
0x62706c6973743030d4010203040506232458247665727369... } "Result" =>
: 0 }
至于#1,它可能不会发生。语音合成器是系统共享资源,因此作为 API 的客户端,系统如何处理调度多个请求是我们无法控制的。 (请注意,如果您重复使用同一个合成器,它会将额外的话语排队,但如果您创建多个合成器,它就无法在另一个合成器说话时说出请求的话语。)
不知道#2,抱歉。看起来像诊断文本,不一定是错误。可能值得 filing a bug,因为他们可能不想在没有实际问题时记录诊断。
奖励答案:您可以使用函数式编程让语音选择更短一些:
let voice = AVSpeechSynthesisVoice.speechVoices().first(where: { [=10=].name == "Arthur" })
我正在使用 AVFoundation 中的语音合成器,创建这样的语音实例:
import AVFoundation
class CanSpeak {
let voices = AVSpeechSynthesisVoice.speechVoices()
let voiceSynth = AVSpeechSynthesizer()
var voiceToUse: AVSpeechSynthesisVoice?
init(){
for voice in voices {
if voice.name == "Arthur"
{
voiceToUse = voice
}
}
}
func sayThis(_ phrase: String){
let utterance = AVSpeechUtterance(string: phrase)
utterance.voice = voiceToUse
utterance.rate = 0.5
voiceSynth.speak(utterance)
}
}
我有两个问题。
- 没有并发。多次调用此函数会导致要说话的字符串排队。我不想要那个。如果多次调用此函数,并靠近在一起,我希望声音立即开始说话,即使这意味着自己说话。我该如何做到这一点?
2 - 加载时我不明白的一些奇怪错误:
2016-11-18 03:03:07.103349 mySKtest[687:87489] 0x17415ee50 Copy matching assets reply: XPC_TYPE_DICTIONARY { count = 2, transaction: 0, voucher = 0x0, contents = "Assets" => : { length = 3620 bytes, contents = 0x62706c6973743030d4000100020003000400050006012d01... } "Result" => : 0 } 2016-11-18 03:03:07.109254 mySKtest[687:87489] 0x17015e610 Copy assets attributes reply: XPC_TYPE_DICTIONARY { count = 1, transaction: 0, voucher = 0x0, contents = "Result" => : 1 } 2016-11-18 03:03:07.109547 mySKtest[687:87489] [MobileAssetError:1] Unable to copy asset attributes 2016-11-18 03:03:07.110080 mySKtest[687:87489] Could not get attribute 'LocalURL': Error Domain=MobileAssetError Code=1 "Unable to copy asset attributes" UserInfo={NSDescription=Unable to copy asset attributes} 2016-11-18 03:03:07.112341 mySKtest[687:87489] 0x17015e610 Copy assets attributes reply: XPC_TYPE_DICTIONARY { count = 1, transaction: 0, voucher = 0x0, contents = "Result" => : 1 } 2016-11-18 03:03:07.112416 mySKtest[687:87489] [MobileAssetError:1] Unable to copy asset attributes 2016-11-18 03:03:07.112523 mySKtest[687:87489] Could not get attribute 'LocalURL': Error Domain=MobileAssetError Code=1 "Unable to copy asset attributes" UserInfo={NSDescription=Unable to copy asset attributes} 2016-11-18 03:03:07.145658 mySKtest[687:87489] 0x174341c30 Copy matching assets reply: XPC_TYPE_DICTIONARY { count = 2, transaction: 0, voucher = 0x0, contents = "Assets" => : { length = 4198 bytes, contents = 0x62706c6973743030d4000100020003000400050006016f01... } "Result" => : 0 } 2016-11-18 03:03:07.148403 mySKtest[687:87489] 0x17015e610 Copy assets attributes reply: XPC_TYPE_DICTIONARY { count = 3, transaction: 0, voucher = 0x0, contents = "Attributes" => : { length = 526 bytes, contents = 0x62706c6973743030d4010203040506232458247665727369... } "Result" => : 0 "SandboxExtension" => { length = 269, contents = "b72954a376beb759be03a6411c3e2649f9845fd1;00000000;00000000;0000000000000015;com.apple.assets.read;00000001;01000003;00000000000ca4fc;/private/var/MobileAsset/Assets/com_apple_MobileAsset_VoiceServices_CustomVoice/54ffb86ce0ecd2c5bf871303b5690d327a571428.asset/AssetData" } } 2016-11-18 03:03:07.149858 mySKtest[687:87489] 0x1743414a0 Copy assets attributes reply: XPC_TYPE_DICTIONARY { count = 2, transaction: 0, voucher = 0x0, contents = "Attributes" => : { length = 526 bytes, contents = 0x62706c6973743030d4010203040506232458247665727369... } "Result" => : 0 }
至于#1,它可能不会发生。语音合成器是系统共享资源,因此作为 API 的客户端,系统如何处理调度多个请求是我们无法控制的。 (请注意,如果您重复使用同一个合成器,它会将额外的话语排队,但如果您创建多个合成器,它就无法在另一个合成器说话时说出请求的话语。)
不知道#2,抱歉。看起来像诊断文本,不一定是错误。可能值得 filing a bug,因为他们可能不想在没有实际问题时记录诊断。
奖励答案:您可以使用函数式编程让语音选择更短一些:
let voice = AVSpeechSynthesisVoice.speechVoices().first(where: { [=10=].name == "Arthur" })