Swift - Как работает речевой основной оператор - Символ (+, -, ×)? - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь установить кнопку для произнесения текста в метке (с разными голосами / языками), но речь не очень хорошо работает, когда есть символы оператора (+, -, ×), любая идея исправить это проблема

Я пытался:

//Option 1
TextLabel.text = "1 + 2 - 3 × 4" // Result: "+" = "and" other voice "plus" (ok), "-" = mute, "×" = mute, other voice "X" (letter)

//Option 2
TextLabel.text = "1 ➕ 2 ➖ 3 ✖️ 4" // Result: "+" = plus symbol, "-" = minus symbol, "×" = multiplication symbol
import UIKit
import AVFoundation
import Speech

class ViewController: UIViewController {
    let synth = AVSpeechSynthesizer()

    @IBAction func speaker(_ sender: UIButton) {
        if (!synth.isSpeaking) {
            let speech = AVSpeechUtterance(string: TextLabel.text!)

            speech.voice = AVSpeechSynthesisVoice(language: "en-US")
            speech.rate = 0.5
            speech.pitchMultiplier = 1
            speech.volume = 1
            synth.speak(speech)
        }
    }

    @IBOutlet weak var TextLabel: UILabel!

    //Option 1
    TextLabel.text = "1 + 2 - 3 × 4" // "+" = "and" other voice "plus" (ok), "-" = mute, "×" = mute, other voice "X" (letter)

    //Option 2
    TextLabel.text = "1 ➕ 2 ➖ 3 ✖️ 4" // "+" = plus symbol, "-" = minus symbol, "×" = multiplication symbol
}

Я ожидаю, что речевой символ + (плюс), - (минус), × (раз) правильно на разных языках с AVSpeechSynthesisVoice, но вариант 1 не верен или не отключает какой-либо символ ... и вариант 2 лучше, но воспроизвести слово "символ"

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

... речь не очень хорошо работает, когда есть символы оператора (+, -, ×), есть идеи решить эту проблему?

Чтобы получить наиболее точные результаты, вы должны удалить любой неоднозначный символ (невозможно надежно определить контекст, который они должны быть прочитаны) и заменить их записанными формы.

Я ожидаю, что речь символизирует + (плюс), - (минус), × (раз) правильно на разных языках ...

Я предлагаю использовать NSLocalizedString(, comment:), чтобы каждый из ваших символов читался на разных языках.

Ниже приводится очень простой пример (удалить и заменить символы) :

class ViewController: UIViewController {

    var synthesizer = AVSpeechSynthesizer()

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

        let string1 = "1"
        let string2 = "5"
        let result = "6"

        let finalString = string1 + NSLocalizedString("MyPlus", comment: "") + string2 + NSLocalizedString("MyEqual", comment: "") + result

        let utterance = AVSpeechUtterance(string: finalString)
        let synthesizer = AVSpeechSynthesizer()
        synthesizer.speak(utterance)
    }
}

Создайте один Localizable.strings для каждого языка, где вы определяете следующие термины на английском языке, например:

"MyPlus" = " plus ";
"MyEqual" = " is equal to ";
0 голосов
/ 20 мая 2019

Вы можете использовать символы, просто используйте «Произношение произношения», чтобы заменить речь.

import AVFoundation

let text = "1 ➕ 2 ➖ 3 ✖️ 4"
let rangeOne = NSString(string: text).range(of: "➕")
let rangeTwo = NSString(string: text).range(of: "➖")
let rangeThree = NSString(string: text).range(of: "✖️")
let mutableAttributedString = NSMutableAttributedString(string: text)

let pronunciationKey = NSAttributedString.Key(rawValue: AVSpeechSynthesisIPANotationAttribute)
mutableAttributedString.setAttributes([pronunciationKey: "plʌs"], range: rangeOne)

mutableAttributedString.setAttributes([pronunciationKey: "ˈmaɪ.nəs"], range: rangeTwo)

mutableAttributedString.setAttributes([pronunciationKey: "taɪmz"], range: rangeThree)
let utterance = AVSpeechUtterance(attributedString: mutableAttributedString)


utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")

let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)

из NShipster

AVUtterance добавил функциональность для управленияпроизношение определенных слов, что особенно полезно для имен собственных.

Чтобы воспользоваться этим, создайте высказывание, используя init (attributetedString :) вместо init (string :).Инициализатор просматривает приписанную строку для любых значений, связанных с AVSpeechSynthesisIPANotationAttribute, и соответствующим образом корректирует произношение.

...