Swift 4.2 // Аргумент переданный в call, который не принимает аргументов - PullRequest
0 голосов
/ 12 ноября 2018

Я написал код (вы можете найти его ниже), но он частично не работает. Я хочу создать приложение, в котором я могу нажать кнопку pushMicButton, а когда кнопка нажата, просто скажите несколько слов, и SpeechKit или что-то подобное распознает его и добавит слово, распознанное системой, в распознаваемый текст Label.text. Я создал такой код, но у меня произошел сбой в строке 43.

Не могли бы вы помочь мне и исправить мой код?

Спасибо!

Пример кода:

import UIKit
import Speech

class VoiceController: UIViewController {

    private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "se-SE"))

    @IBOutlet weak var recognizedLabel: UILabel!

    @IBAction func pushMicButton(_ sender: Any) {
        print("Voice recognition button")
        voiceRecognition()
    }

    @IBAction func AddToListButton(_ sender: UIButton) {
        print("Add something to list")
        getAddedData()
    }

    override func viewDidLoad() {
        super.viewDidLoad()


    }

    func voiceRecognition() {

        SFSpeechRecognizer.requestAuthorization { _ in
            DispatchQueue.main.async {
                switch SFSpeechRecognizer.authorizationStatus() {
                case .authorized:

                    let audioURL = Bundle.main.url(forResource: "test", withExtension: "wav")!
                    let recognizer = SFSpeechRecognizer()
                    let request = SFSpeechRecognitionRequest(url: audioURL)
                    recognizer?.recognitionTask(with: request) { result, error in
                        guard error == nil else { print("Error: \(error)"); return }
                        guard let result else {print ("No result!"); return}
                        self.recognizedLabel.text = result.bestTranscription.formattedString
                    }
                    break
                default:
                    break
                }
            }
        }

        //ADD VOICE RECOGNITION HERE

    }

    func getAddedData() {
        let originalString = recognizedLabel.text
        let escapedString = originalString!.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
        let dataLink = "http://yabahi.st/items/find?name="
        let lookingURL = dataLink + escapedString!

        guard let url = URL(string: lookingURL) else {return}
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let dataResponse = data,
                error == nil else {
                    print(error?.localizedDescription ?? "Response Error")
                    return }
            do{
                let jsonResponse = try JSONSerialization.jsonObject(with:
                    dataResponse, options: [])
                print(jsonResponse)

                //SEND "jsonResponse.name" TO MAIN UITABLEVIEW

            } catch let parsingError {
                print("Error", parsingError)
            }
        }
        task.resume()
    }

}

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Метод voiceRecognition() должен быть реализован следующим образом:

func voiceRecognition() {
    SFSpeechRecognizer.requestAuthorization { _ in
        DispatchQueue.main.async {
            switch SFSpeechRecognizer.authorizationStatus() {
            case .authorized:

                guard let audioURL = Bundle.main.url(forResource: "test", withExtension: "wav") else {
                    return
                }
                let recognizer = SFSpeechRecognizer()
                let request = SFSpeechURLRecognitionRequest(url: audioURL)

                recognizer?.recognitionTask(with: request) { result, error in
                    if error != nil {
                        print("Error: \(error!)")
                        return
                    }

                    guard let result = result else { print ("No result!"); return }
                    self.recognizedLabel.text = result.bestTranscription.formattedString
                }

                break
            default:
                break
            }
        }
    }

    //ADD VOICE RECOGNITION HERE
}

Теперь вот различия:

1- В целях безопасности следует избегать принудительного развертывания audioURL, *Оператор 1008 * будет хорошим выбором.

2- Если вы хотите создать запрос на распознавание речи, инициализированный указанным URL-адресом, вы должны использовать SFSpeechURLRecognitionRequest вместо SFSpeechRecognitionRequest.

3- Похоже, что злоупотребление guard s ...

0 голосов
/ 12 ноября 2018

Используйте SFSpeechURLRecognitionRequest(url:) вместо SFSpeechRecognitionRequest(url:)

и изменить guard let result else { print ("No result!"); return } guard let результат = result else { print ("No result!"); return }

это должно решить все ваши ошибки в этом коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...