swift - AWS Polly - 突出显示特殊字符
问题描述
我正在使用 AWS Polly 服务进行文本转语音。但是如果文本包含一些特殊字符,它会返回错误的开始和结束数字。
例如,如果文本是:“Böylelikle”,则返回:{“time”:6,“type”:“word”,“start”:0,“end”:11,“value”:“Böylelikle”}
但它应该从 0 开始,到 10 结束。
我搜索了 AWS 文档,他们说的是开始值和结束值,字节偏移量不是字符。
我的问题是如何将此字节值转换为字符。
我的代码是:
builder.continueOnSuccessWith { (awsTask: AWSTask<NSURL>) -> Any? in
if builder.error == nil {
if let url = awsTask.result {
do {
let txtData = try Data(contentsOf: url as URL)
if let txtString = String(data: txtData, encoding: .utf8) {
let lines = txtString.components(separatedBy: .newlines)
for line in lines {
let jsonData = Data(line.utf8)
let pollyVoiceSentence = try JSONDecoder().decode(PollyVoiceSentence.self, from: jsonData)
voiceSentences.append(pollyVoiceSentence)
}
}
} catch {
print("Could not parse TXT file")
}
}
} else {
print("ParseJSON: \(builder.error!)")
}
completionHandler(voiceSentences)
return nil
}
并突出显示单词:
let start = pollyVoiceSentence.start
var end = pollyVoiceSentence.end
let voiceRange = NSRange(location: start, length: end - start)
print("RANGE: \(voiceRange) - Word: \(pollyVoiceSentence.value)")
谢谢。
解决方案
看起来他们正在为您String.utf8.count
提供这个词。Swift 支持 Unicode,并非所有字符都可以在 UTF8 中表示。
您可以在此处阅读官方文档 - 字符串和字符
在你的情况下你可以做的是 -
PollyVoiceSentence
以今天的方式解码。- 创建一个扩展
PollyVoiceSentence
来解决这个字符计数问题。 - 迭代/考虑句子中的所有单词,因为每个先前单词的字符数现在影响所有后续单词的开始。
- 而且你不能相信 json 提供的
start
&end
,因为它显然不适合 Swift 的 String API。
推荐阅读
- html - 为什么在这段代码中放置一个空格会影响 CSS 中的输出?
- c# - 如何检查 null 并在 linq 匿名类型中分配新值以选择预期的 sql 结果
- go - 是否需要调用 db.Close()?
- c# - 使用 JSON.NET 反序列化时出错
- c - C中未声明的宏
- javascript - Discord.js 的欢迎消息 - “无法读取未定义的属性 'get'”
- java - 调用 Object.getClass() 本身是否使用反射?
- android - 我的应用程序在启动时崩溃(java.lang.RuntimeException:无法获取提供程序)
- r - Rmongo查询函数给出错误
- c# - WPF - 在调整纵横比时缩放以保持水平填充