Swift - как перевести текст на речевые языки в виде описательной строки - PullRequest
0 голосов
/ 05 мая 2019

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

Ожидается -

Арабский (Саудовская Аравия) - китайский язык ar-SA (Китай) - китайский язык z-CN (Китай, Гонконг, Китай) - китайский язык z-HK (Тайвань) - чешский язык z-TW Чешская Республика (Чехия) - cs-CZ

Актуально -

ar-SA (исправлено) cs-CZ (исправлено)

class func getListOfSupportedLanguages() {
        for voice in (AVSpeechSynthesisVoice.speechVoices()){
            print(voice.language)
            let language = Locale.init(identifier: voice.language)
            print(language.description)
        }
    }

Я слежу за этим полезным сайтом и получаю разные результаты.

https://useyourloaf.com/blog/synthesized-speech-from-text/

@property (strong, nonatomic) NSArray *languageCodes;
@property (strong, nonatomic) NSDictionary *languageDictionary;
@property (strong, nonatomic) AVSpeechSynthesizer *synthesizer;

- (NSArray *)languageCodes
{
    if (!_languageCodes)
    {
        _languageCodes = [self.languageDictionary keysSortedByValueUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    }
    return _languageCodes;
}

// Map between language codes and locale specific display name
- (NSDictionary *)languageDictionary
{
    if (!_languageDictionary)
    {
        NSArray *voices = [AVSpeechSynthesisVoice speechVoices];
        NSArray *languages = [voices valueForKey:@"language"];

        NSLocale *currentLocale = [NSLocale autoupdatingCurrentLocale];
        NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
        for (NSString *code in languages)
        {
            dictionary[code] = [currentLocale displayNameForKey:NSLocaleIdentifier value:code];
        }
        _languageDictionary = dictionary;
    }
    return _languageDictionary;
}

1 Ответ

0 голосов
/ 06 мая 2019

У меня все работает, благодаря Мэтту - NSLocale имеет displayName, а Locale - нет.Согласно сообщению ниже

NSLocale Swift 3

Вот код -

   class func getListOfSupportedLanguages() {
         let current = Locale.current.languageCode

         for voice in (AVSpeechSynthesisVoice.speechVoices()){
              let language = NSLocale.init(localeIdentifier: current!)
              print(language.displayName(forKey: NSLocale.Key.identifier, value: voice.language)?.description as! String)
         }
   }

вывод -

English (Australia)
English (United Kingdom)
English (Ireland)
English (United States)
English (South Africa)
...