Arhn - архитектура программирования

Синтез речи на iOS странные ошибки при загрузке и отсутствие параллелизма

Я использую синтезатор речи в AVFoundation, создавая такой экземпляр голоса:

import AVFoundation

class CanSpeak {

    let voices = AVSpeechSynthesisVoice.speechVoices()
    let voiceSynth = AVSpeechSynthesizer()
    var voiceToUse: AVSpeechSynthesisVoice?

    init(){
        for voice in voices {
            if voice.name == "Arthur"
            {
                voiceToUse = voice
            }
        }
    }

    func sayThis(_ phrase: String){
        let utterance = AVSpeechUtterance(string: phrase)
        utterance.voice = voiceToUse
        utterance.rate = 0.5
        voiceSynth.speak(utterance)
    }
}

У меня две проблемы.

  1. Что касается №1, вероятно, этого не произойдет. Синтезатор речи - это общий ресурс системы, поэтому то, как система обрабатывает планирование нескольких запросов, находится вне нашего контроля как клиентов API. (Обратите внимание, что если вы повторно используете один и тот же синтезатор, он выстраивает в очередь дополнительные высказывания, но если вы создаете несколько синтезаторов, он не может озвучивать запрошенные высказывания, пока говорит другой синтезатор.)

2 - некоторые странные ошибки, которые я не понимаю при загрузке:

Параллелизма нет. Вызов этой функции несколько раз приводит к очереди строк для выступления. Я не хочу этого. Если есть несколько вызовов этой функции, близко друг к другу, я бы хотел, чтобы голос немедленно начал говорить, даже если это означает, что он говорит через себя. Как мне этого добиться?


Ответы:


1

Не знаю насчет №2, извините. Похоже на диагностический текст, не обязательно на ошибку. Вероятно, стоит зарегистрировать ошибку, поскольку они, вероятно, не хотят регистрировать диагностику, когда реальной проблемы нет.

Бонусный ответ: вы можете использовать функциональное программирование, чтобы сделать выбор голоса немного короче:

Мне действительно нужно немного узнать о фильтрах, карте, замыканиях и ... ну, действительно, программировании. Это НАМНОГО лучше.

let voice = AVSpeechSynthesisVoice.speechVoices().first(where: { $0.name == "Arthur" })
17.11.2016
  • Я жадный: stackoverflow.com/questions/40665160/ Я хочу сделать больше;) 17.11.2016
  • У меня есть подозрение, что эти ошибки загрузки речевого синтезатора вызывают ужасное заикание любого звука, воспроизводимого во время загрузки. Все остальное я устранил ... возможно ли это? 18.11.2016
  • Для контекста вот точная проблема, которую, как мне кажется, вызывает эта загрузка синтезатора речи: stackoverflow.com/questions/40724292/ 22.11.2016
  • Создал специальную версию тестового случая. ДА ... Это загрузка этого синтезатора речи, которая блокирует некоторые способы воспроизведения и вызывает уродливые заикания в других формах воспроизведения звука. Надо сделать так, чтобы загрузка задерживалась ... тогда все нормально. 22.11.2016
  • 2016-11-18 03: 03: 07.103349 mySKtest [687: 87489] 0x17415ee50 Копировать ответ сопоставления ресурсов: XPC_TYPE_DICTIONARY {count = 2, transaction: 0, voucher = 0x0, contents = "Assets" =>: {length = 3620 bytes, content = 0x62706c6973743030d4000100020003000400050006012d01 ...} "Result" =>: 0} 2016-11-18 03: 03: 07.109254 mySKtest [687: 87489] 0x17015e610 Копировать атрибуты ресурсов ответ: XPC_TYPE_DICTIONARY {0x0 = 1, транзакция , contents = "Result" =>: 1} 2016-11-18 03: 03: 07.109547 mySKtest [687: 87489] [MobileAssetError: 1] Невозможно скопировать атрибуты ресурса 2016-11-18 03: 03: 07.110080 mySKtest [687 : 87489] Не удалось получить атрибут «LocalURL»: Error Domain = MobileAssetError Code = 1 «Невозможно скопировать атрибуты актива» UserInfo = {NSDescription = Невозможно скопировать атрибуты актива} 18.11.2016 03: 03: 07.112341 mySKtest [687: 87489] 0x17015e610 Копирование атрибутов ресурсов, ответ: XPC_TYPE_DICTIONARY {count = 1, transaction: 0, voucher = 0x0, contents = "Result" => : 1} 18 ноября 2016 г. 03: 03: 07.112416 mySKtest [687: 87489] [MobileAssetError: 1] Невозможно скопировать атрибуты актива. 2016-11-18 03: 03: 07.112523 mySKtest [687: 87489] Не удалось получить атрибут » LocalURL ': Error Domain = MobileAssetError Code = 1 «Невозможно скопировать атрибуты актива» UserInfo = {NSDescription = Невозможно скопировать атрибуты ресурса} 2016-11-18 03: 03: 07.145658 mySKtest [687: 87489] 0x174341c30 Ответ на копирование соответствующих ресурсов: XPC_TYPE_DICTIONARY {count = 2, transaction: 0, voucher = 0x0, contents = "Assets" =>: {length = 4198 bytes, contents = 0x62706c6973743030d4000100020003000400050006016f01 ...} "Result" =>: 0} 18.11.2016 03: 03: 07.148403 mySKtest [687: 87489] 0x17015e610 Копировать атрибуты атрибутов, ответ: XPC_TYPE_DICTIONARY {count = 3, transaction: 0, voucher = 0x0, contents = "Attributes" =>: {length = 526 bytes, contents = 0x62706c697374304076d6227458 ... "Результат" =>: 0 "SandboxExtension" => {length = 269, contents = "b72954a376be b759be03a6411c3e2649f9845fd1; 00000000; 00000000; 0000000000000015; com.apple.assets.read; 00000001; 01000003; 00000000000ca4fc; /private/var/MobileAsset/Assets/com_apple_MobileAsset_VoiceSoiceServices03-28-64-64-64-64-64-64-64-64-64-64-64-64-a-a-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,, ,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 07.149858 mySKtest [687: 87489] 0x1743414a0 Копирование атрибутов ресурсов, ответ: XPC_TYPE_DICTIONARY {count = 2, transaction: 0, voucher = 0x0, contents = "Attributes" =>: {length = 526 bytes, contents = 0x62706c69737430d62762736940. ..} "Результат" =>: 0} 22.11.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..