Browse Source

修改iOS讯飞语音识别

weicu
tanlongsheng 10 months ago
parent
commit
a86586708e
  1. 52
      local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift

52
local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift

@ -145,13 +145,29 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate {
}
private func processResult(_ json: [String: Any]) {
guard let dataStr = json["data"] as? String,
let dataData = dataStr.data(using: .utf8),
let data = try? JSONSerialization.jsonObject(with: dataData, options: []) as? [String: Any] else {
var data: [String: Any]? = nil
if let dataDict = json["data"] as? [String: Any] {
data = dataDict
} else if let dataStr = json["data"] as? String,
let dataData = dataStr.data(using: .utf8) {
data = try? JSONSerialization.jsonObject(with: dataData, options: []) as? [String: Any]
}
guard let data = data else {
print("\(tag): Failed to parse data field from result")
return
}
let ls = data["ls"] as? Bool ?? false
var ls = false
if let lsBool = data["ls"] as? Bool {
ls = lsBool
} else if let lsInt = data["ls"] as? Int {
ls = (lsInt != 0)
} else if let lsStr = data["ls"] as? String {
ls = (lsStr == "true" || lsStr == "1")
}
guard let cn = data["cn"] as? [String: Any],
let st = cn["st"] as? [String: Any],
let rt = st["rt"] as? [[String: Any]] else {
@ -229,10 +245,25 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate {
let signature = calculateSignature(params: params)
params["signature"] = signature
var urlComponents = URLComponents(string: baseWsUrl)
urlComponents?.queryItems = params.map { URLQueryItem(name: $0.key, value: $0.value) }
// 手动构建 URL 查询字符串,确保编码一致性
var queryString = ""
let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~")
// 按照参数名的字母顺序排序,虽然 HTTP 协议不强制,但通常是个好习惯,也方便调试
let sortedParams = params.sorted { $0.key < $1.key }
return urlComponents?.url?.absoluteString ?? baseWsUrl
for (index, (key, value)) in sortedParams.enumerated() {
if index > 0 {
queryString += "&"
}
let encodedKey = key.addingPercentEncoding(withAllowedCharacters: allowed) ?? key
let encodedValue = value.addingPercentEncoding(withAllowedCharacters: allowed) ?? value
queryString += "\(encodedKey)=\(encodedValue)"
}
return "\(baseWsUrl)?\(queryString)"
}
private func getUtcTime() -> String {
@ -247,6 +278,8 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate {
var baseStr = ""
var first = true
let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~")
for key in sortedKeys {
if key == "signature" { continue }
guard let value = params[key], !value.isEmpty else { continue }
@ -255,8 +288,9 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate {
baseStr += "&"
}
let encodedKey = key.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? key
let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? value
// 使用严格的编码规则
let encodedKey = key.addingPercentEncoding(withAllowedCharacters: allowed) ?? key
let encodedValue = value.addingPercentEncoding(withAllowedCharacters: allowed) ?? value
baseStr += "\(encodedKey)=\(encodedValue)"
first = false

Loading…
Cancel
Save