         AF.request(request)
             .cURLDescription(calling: { log.debug($0) })
             .validate()
-            .responseData {
-                switch $0.result {
-                case .success(let data):
-                    guard let decoded = try? JSONDecoder().decode([VoicevoxSpeakerResponse].self, from: data) else {
-                        completion(Result.failure(.internal))
-                        return
-                    }
-                    completion(Result.success(decoded.toVoicevoxSpeakers()))
-                case .failure(let error):
-                    log.error(error)
-                    completion(Result.failure(.internal))
-                }
+            .responseData { [weak self] in
+                self?.handleSpeakersResponse($0, completion: completion)
             }
     }
 

}

private extension VoicevoxWrapper {
    func requestAudioQuery(config: AudioConfiguration, completion: @escaping AudioRequestCompletion) {
        log.debug("\(config.text), \(config.speedScale), \(config.speaker)")
        let urlString = voicevoxUrl + "/audio_query?text=\(config.text.escapsed)&speaker=\(config.speaker)"

}

enum VoicevoxWrapperError: Error {
    // XXX: More cases.
    case `internal`
}

