swift - 使用 Swift 3 对 Snowboy API 的 RESTful API 调用

标签 swift rest api swift3 voice-recognition

我是一名移动应用新手,目前正尝试使用 Swift3 将 3 wav 语音样本发送到 Snowboy API 服务器。 根据他们的文档 Link Here ,请求需要包含以下元素:

  • 端点:https://snowboy.kitt.ai/api/v1/train/
  • 类型:POST
  • 内容类型:application/json
  • 必填参数-token: secret 用户 token
  • 必填参数 - name:语音样本中提到的录制热词的名称
  • 必需参数 - voice_samples:编码为 base64 字符串的 .wav 格式的 3 个语音样本列表

他们期望的 json 示例如下所示:

data = {
    "name": "nameOfSample",
    "language": "en",
    "token": "token",
    "voice_samples": [
        {"wave": voicesample1asBase64String},
        {"wave": voicesample2asBase64String},
        {"wave": voicesample3asBase64String}
    ]
}

使用以下代码,我获得了 400 状态代码。这意味着它识别了 token 参数并验证了我的请求,但后者格式不正确:

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 列表没有很好地插入到 son 中。有人知道我如何构造请求以便 Snowboy 服务器接受它吗?谢谢!

最佳答案

您需要一个完整的参数列表。添加这些:

  • 年龄段
  • 性别
  • 麦克风

这些参数我得到了 201 错误。但是我使用了错误的 wav 文件。

let parameters = ["token": "XXXXXXXX",
                      "name": "nameOfSample123123123",
                      "language": "en",
                      "voice_samples": audioFileStrings,
                      "age_group": "0_9",
                      "gender": "M",
                      "microphone": "test"

关于swift - 使用 Swift 3 对 Snowboy API 的 RESTful API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585770/

相关文章:

node.js - 寻找具有关联支持的 sequelize.js REST API 生成器

ios - iOS REST 调用的身份验证问题

api - 股票市场 API - 最大赢家/输家

Swift: "Cannot invoke subscript":通过在索引处传递类的数组来设置对象成员

swift - 安装库 Alamofire 时可能出错

ios - 如何强制 UIPickerView.selectRow 调用 didSelectRow 方法?

javascript - 在哪里可以找到将 Breeze JS 与 Rails 结合使用的适配器?

python - 使用 JSON 用户输入填充 for 循环

php - 如何扩展 Magento API catalog_product.list 以包含更多产品信息 XML-RPC

ios - Scenekit - 软化物理主体