2016-12-18 1 views
1

Je suis nouveau pour le développement d'applications swift et iOS. Je crée une application de synthèse vocale en utilisant AVSpeechSynthesiser. Je veux mettre une chaîne en anglais mais je la veux traduire cette chaîne particulière en discours mais dans une autre langue comme l'arabe. Suis-je capable de le faire en utilisant AVSpeechSynthesizer, ou aurais-je besoin d'utiliser une API de traduction pour le faire.AVspeechSynthesizer iOS texte discours

ThankYou

+0

vous devrez traduire la chaîne avant l'alimentation à salut merci 'AVSpeechSynthesizer' – Adrian

+0

pour votre réponse. Quelle API puis-je utiliser pour traduire la chaîne avant de l'introduire dans AVSpeechSynthesizer? Est-ce que Apple a ses propres API pour soutenir cela. – Aneesa

+0

Vous pouvez souvent trouver des choses en creusant sur GitHub. J'ai vu ce https://github.com/watson-developer-cloud/ios-sdk#language-translator, mais je ne l'ai pas utilisé. Google et Bing feront la traduction. Voici un cadre qui le fait -> https://github.com/gpolak/FGTranslator. Vous allez souvent tomber sur CocoaPods lorsque vous utilisez des frameworks, alors voici un tutoriel sur eux -> https://www.raywenderlich.com/97014/use-cocoapods-with-swift – Adrian

Répondre

1

j'ai jeté ensemble une classe AVSpeechSynthesizer pour gérer le retournement d'une langue à l'autre. Voici un AVSpeechSynthesizer tutorial on NSHipster qui est un bon point de départ pour apprendre à ce sujet. Je n'ai pas bidouillé avec la traduction, mais vous pouvez comprendre cette partie ... J'ai également créé une classe de traducteur de base qui traduira "bonjour" à "مرحبا". Vous pouvez voir le projet ici:

TranslateDemo

Pour utiliser le traducteur, vous voudrez probablement lier une action à un bouton comme ceci:

@IBAction func translateToArabicAction(_ sender: UIButton) { 
    // check that there are characters entered in the textField 
    if (textToTranslateTextField.text?.characters.count)! > 0 { 
     let translatedText = translator.translate(word: (textToTranslateTextField.text?.lowercased())!) 
     speechSynthesizer.speak(translatedText, in: Language.arabic.rawValue) 
    } 
} 

@IBAction func translateToEnglishAction(_ sender: UIButton) { 
    // check that there are characters entered in the textField 
    if (textToTranslateTextField.text?.characters.count)! > 0 { 
     let translatedText = translator.translate(word: (textToTranslateTextField.text?.lowercased())!) 
     speechSynthesizer.speak(translatedText, in: Language.english.rawValue) 
    } 
} 

Le synthétiseur vocal ressemble à ceci:

import AVFoundation 

// You can use an enum so you don't have to manually type out character strings. Look them up once and stick them in an enum. From there, you set the language with your enum rather than typing out the string. 
enum Language: String { 
    case english = "en-US" 
    case arabic = "ar-SA" 
} 

class Speaker: NSObject { 

    let synth = AVSpeechSynthesizer() 

    override init() { 
     super.init() 
     synth.delegate = self 
    } 

    func speak(_ announcement: String, in language: String) { 
     print("speak announcement in language \(language) called") 
     prepareAudioSession() 
     let utterance = AVSpeechUtterance(string: announcement.lowercased()) 
     utterance.voice = AVSpeechSynthesisVoice(language: language) 
     synth.speak(utterance) 
    } 

    private func prepareAudioSession() { 
     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, with: .mixWithOthers) 
     } catch { 
      print(error) 
     } 

     do { 
      try AVAudioSession.sharedInstance().setActive(true) 
     } catch { 
      print(error) 
     } 
    } 

    func stop() { 
     if synth.isSpeaking { 
      synth.stopSpeaking(at: .immediate) 
     } 
    } 
} 

extension Speaker: AVSpeechSynthesizerDelegate { 
    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) { 
     print("Speaker class started") 
    } 

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) { 
     print("Speaker class finished") 
    } 
} 
+0

Merci d'avoir créé le code exemplaire. C'est très apprécié. J'ai décidé de ne pas utiliser un traducteur car il n'y a qu'un certain nombre de chaînes à traduire et je peux utiliser l'exemple que vous avez donné pour les traduire moi-même. Je voulais demander si je pouvais utiliser une fonction similaire pour la parole au texte, est-ce possible? Merci encore pour votre aide. – Aneesa

+0

@Aneesa https://developer.apple.com/videos/play/wwdc2016/509/ – Adrian