Принудительное произношение слов в AVSpeech и AVSpeechUtterance в Swift - PullRequest
2 голосов
/ 24 мая 2019

Для произнесения чисел с помощью AVSpeechUtterance я бы хотел, чтобы Сири произносила числа так, чтобы это соответствовало соглашению о типе числа.

Для даты я бы хотела произнести 1492 как 1492два, а не одна тысяча четыреста девяносто два.

Для номера телефона 650-412-3456 я бы хотел сказать: шесть пять о, четыре один два три четыре пять шесть, а не шестьсто пятьдесят тире четыреста 12 тире три тысячи четыреста пятьдесят шесть.

Есть ли способ указать произношение с помощью AVSpeech и AVUtterance?Кажется, в документах 1008 *.

нет ничего очевидного.

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Есть ли способ указать произношение с помощью AVSpeech и AVUtterance?Кажется, в документах нет ничего очевидного.

Лучший способ добиться своей цели - предоставить подходящий формат для текста, который нужно прочитать.

Ниже приведен фрагмент кода с несколькими примерами:

    class ViewController: UIViewController {

        let synthesizer = AVSpeechSynthesizer()

        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)

            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "dd/MM/yyyy HH:mm"

            let date = dateFormatter.date(from: "01/04/2015 05:30")

            let dateStr = DateFormatter.localizedString(from: date!,
                                                        dateStyle: .medium,
                                                        timeStyle: .short)
            let dateUtterance = AVSpeechUtterance(string: dateStr)
            dateUtterance.voice = AVSpeechSynthesisVoice(language: "en-GB")

            let hourComponents = Calendar.current.dateComponents([.hour, .minute],
                                                                 from: date!)
            let hourStr = DateComponentsFormatter.localizedString(from: hourComponents,
                                                                  unitsStyle: .spellOut)
            let hourUtterance = AVSpeechUtterance(string: hourStr!)
            hourUtterance.voice = AVSpeechSynthesisVoice(language: "en-GB")

            let numberValue = NSNumber(value: 54038921.7)
            let nbStr = NumberFormatter.localizedString(from: numberValue,
                                                        number: .decimal)
            let nbUtterance = AVSpeechUtterance(string: nbStr)
            nbUtterance.voice = AVSpeechSynthesisVoice(language: "en-GB")

            synthesizer.speak(hourUtterance) //Only time
            synthesizer.speak(dateUtterance) //The complete date and hour
            synthesizer.speak(nbUtterance) //Just for numbers
        }
    }

Подробнее информация с фрагментами кода (Objc и Swift) доступны, если этоПример не достаточно.

1 голос
/ 25 мая 2019

Хотя это и не настройка AV, разбор фразы для динамика даст желаемые результаты.

Например, используя расширение ниже:

let number = "1492"
let phrase = number.separate(every: 2, with: " ")
print(phrase) // 14 92

А для телефона:

let phone   = "650-412-3456"
let parts = phone.components(separatedBy: CharacterSet.decimalDigits.inverted)
var phrase2 = String()

for part in parts {
  if Int(part) != nil {
    phrase2.append(String(describing: part).separate(every: 1, with: " ") + ",")
  }
} 

print(phrase2) // 6 5 0,4 1 2,3 4 5 6,

Синтезатор речи добавил запятые для более естественного чтения, но их можно было отключить.

Удлинение строки от Джо Махера:

extension String {
  func separate(every: Int, with separator: String) -> String {
    return String(stride(from: 0, to: Array(self).count, by: every).map {
       Array(Array(self)[$0..<min($0 + every, Array(self).count)])
       }.joined(separator: separator))
  }
}
...