使用Swift 3对Snowboy API的RESTful API调用
我是一个移动应用程序noobie,目前正在尝试使用Swift3向Snowboy API服务器发送3个wav语音样本。 根据他们的文档,请求需要包含以下元素:使用Swift 3对Snowboy API的RESTful API调用,swift,rest,api,swift3,voice-recognition,Swift,Rest,Api,Swift3,Voice Recognition,我是一个移动应用程序noobie,目前正在尝试使用Swift3向Snowboy API服务器发送3个wav语音样本。 根据他们的文档,请求需要包含以下元素: 终点: 类型:邮政 内容类型:application/json 必需参数-令牌:秘密用户令牌 必需参数-名称:语音样本中提到的录制的热字的名称 所需参数-voice_samples:以.wav格式编码为base64字符串的3个语音样本列表 他们期望的json示例如下所示: data = { "name": "nameOfSamp
- 终点:
- 类型:邮政
- 内容类型:application/json
- 必需参数-令牌:秘密用户令牌
- 必需参数-名称:语音样本中提到的录制的热字的名称
- 所需参数-voice_samples:以.wav格式编码为base64字符串的3个语音样本列表
data = {
"name": "nameOfSample",
"language": "en",
"token": "token",
"voice_samples": [
{"wave": voicesample1asBase64String},
{"wave": voicesample2asBase64String},
{"wave": voicesample3asBase64String}
]
}
使用下面的代码,我得到一个400状态代码。这意味着它识别了令牌参数并对我的请求进行了身份验证,但后者的格式不正确:
lazy var session: URLSession = URLSession(configuration: self.conf)
let url: URL
init(url: URL){
self.url = url
}
func sendDataToURL (completion: @escaping JSONDictionaryHandler)
{
var request = URLRequest(url: self.url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let path1 = Bundle.main.path(forResource: "voicesample1", ofType: "wav")!
let path2 = Bundle.main.path(forResource: "voicesample2", ofType: "wav")!
let path3 = Bundle.main.path(forResource: "voicesample3", ofType: "wav")!
let paths = [path1, path2, path3]
let audioFileStrings = paths.map { (path: String) -> [String:String] in
let audioURL = URL(fileURLWithPath: path)
let filename = audioURL.lastPathComponent
if let base64String = try? Data(contentsOf: audioURL).base64EncodedString(){
//print(base64String)
return ["wave":base64String]
}else{return ["":""]}
}
let parameters = ["token": "XXXXXXXXXXXXXXX",
"name": "nameOfSample",
"language": "en",
"voice_samples": audioFileStrings
] as [String : Any]
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else {return}
print("sending\(parameters)")
request.httpBody = httpBody
let uploadTask = session.dataTask(with: request) { (data, response, error) in
if error == nil {
if let httpResponse = response as? HTTPURLResponse{
print(httpResponse)
switch httpResponse.statusCode{
case 200: //successful
if let receiveddata = data{
print("YAAAY! DATA! \(receiveddata)")
do{
let json = try JSONSerialization.jsonObject(with: receiveddata, options: [])
print(json)
}
catch{
print(error)
}
}
default:
print("Bad HTTP response code: \(httpResponse.statusCode)")
}
}
if let receivedData = data{
}
}
else {
print("Error \(error?.localizedDescription)")
}
}
uploadTask.resume()
}
我认为是声音样本列表没有很好地插入到儿子身上。有人知道我如何构造请求以便Snowboy服务器接受它吗?谢谢 您需要一个完整的参数列表。添加以下内容:
- 年龄组
- 性别
- 传声器
let parameters = ["token": "XXXXXXXX",
"name": "nameOfSample123123123",
"language": "en",
"voice_samples": audioFileStrings,
"age_group": "0_9",
"gender": "M",
"microphone": "test"
这是一个众所周知的错误。你找过了吗?调试的第一步,也是最重要的一步:找到导致崩溃的位置/哪一行。是不是
让path1=Bundle.main.path(forResource:“voicesample1”,类型为:“wav”)代码>(或路径2?路径3)?如果是这样,您的捆绑包中就没有这些具有这些名称的文件。打印(base64String)
(此处注释)每次都有效。我删除了第二个代码,这确实是需要检查的请求构造。毕竟代码有N个错误。他们应该根据需要标记所有其他参数,而不仅仅是我使用的参数。谢谢@llkenny!