Я работаю над тем, чтобы включить аудиоустройство синтеза речи Apple (работает только на macOS, а не на iOS) в AudioKit, и я создал класс AKSpeechSynthesizer (первоначально созданный wangchou в этом запрос на вытягивание) и демонстрационный проект оба доступны в ветке разработки AudioKit.
Мой проект очень похож на этот Пример синтеза речи какао, но в этом проекте переменная скорости может быть изменена и плавно варьируется от небольшого количества слов в минуту (40) до большого числа (300 иш). Тем не менее, мой проект начинается с скорости по умолчанию 175, и любое изменение замедляет скорость до минимума, за исключением случаев, когда вы увеличиваете ее до 350, тогда она идет очень быстро.
Я не вижу, чем я отличаюсь от этого примера, так как оба проекта полагаются на
SetSpeechProperty(speechChannel, kSpeechRateProperty, newRate as NSNumber?)
для установки скорости.
Вот моя реализация и рабочая.
Самое большое отличие состоит в том, что мой синтезатор настроен как аудиоустройство, в то время как в рабочем примере просто используется вывод по умолчанию на динамик.
Другие параметры частоты (высота тона) или модуляции (pitchMod) также демонстрируют странное поведение, но на них это менее заметно, и они работают немного забавно в обоих проектах.
Может ли кто-нибудь сказать мне, почему мой не работает, или исправить это с помощью запроса на включение? Любая помощь будет принята с благодарностью и указана в коде.
Спасибо!
Спасибо, я реализовал ваши предложения и многое другое здесь: github.com/AudioKit/AudioKit/commit/… Могу я спросить вашего совета, почему кнопка остановки не останавливает воспроизведение речи?
Я не мог остановить работу, до сих пор. Я пробовал
PauseSpeechAt(speechChannel, kImmediate)
,StopSpeechAt(speechChannel, kImmediate)
,SpeakCFString(speechChannel, "" as CFString, [ kSpeechNoSpeechInterrupt: false ] as CFDictionary)
. Также пытался принудительно прерывать речь при воспроизведении:SpeakCFString(speechChannel, text as CFString, [ kSpeechNoSpeechInterrupt: false ] as CFDictionary)
, прежде чем у меня закончились идеи. Кажется, что все речевые пьесы поставлены в очередь и будут воспроизводиться последовательно, несмотря ни на что. Связанный: coderhelper.com/questions/44730756/stop-audiounit-speechДа, ну, я полагаю, я могу хотя бы добавить регулятор громкости через AKBooster, чтобы хоть как-то управлять. Еще раз спасибо за изучение этого!
Я добавил обратный вызов с помощью «SetSpeechProperty (speechChannel, kSpeechWordCFCallBack, callbackAddr)». Обратный вызов будет регистрировать текущие диапазоны говорящего текста. Он показывает, что все диапазоны произносятся сразу после вызова SpeakCFString. Я не знаю, почему поведение отличается от Apple CocoaSpeechSynthesisExampe... В примере его можно остановить.
Похоже, что функции speechChannel "из audioUnit" и "из NewSpeechChannel" отличаются. lists.apple.com/archives/coreaudio-api/2016/Oct/msg00025.html