Я мобильное приложение, noobie, в настоящее время пытаюсь отправить 3 образца голоса wav с Swift3 на сервер Snowboy API.Согласно их документации Ссылка здесь , запрос должен содержать следующие элементы:
- Конечная точка: https://snowboy.kitt.ai/api/v1/train/
- Тип: POST
- Content-Type: application / json
- Обязательный параметр - token: токен секретного пользователя
- Обязательный параметр - name: имя записанного горячего слова, которое упоминается в голосовых примерах
- ОбязательныйПараметр - voice_samples: список из 3 сэмплов голоса в формате .wav, закодированных в виде строк base64
Пример ожидаемого json будет выглядеть следующим образом:
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()
}
Я думаю, что это список voice_samples, который плохо вставлен в сына.Кто-нибудь знает, как я могу построить запрос, чтобы сервер Snowboy принял его?Спасибо!