Разработка и реализация говорящего приложения
Эта глава собирается некоторые стратегии рассмотреть и инструкции для следования, поскольку Вы разрабатываете (или переоснащение) приложение для создания разговорного вывода. Это начинается с исследования различных стратегий реализации, которые необходимо рассмотреть для нахождения того, удовлетворяющего целям. Это тогда обеспечивает инструкции пользовательского интерфейса, которые необходимо иметь в виду, поскольку Вы разрабатываете свое приложение. Наконец, эта глава обрисовывает в общих чертах синтез речи APIs, доступный Вам, и обеспечивает некоторые примеры, показывающие, как начать.
Стратегии слияния синтезированной речи
Разговорный вывод является естественным улучшением для широкого диапазона приложений от игр до приложений для повышения производительности к образовательным приложениям. Например, при разработке приложения для изучения языка ясно, что необходимо обеспечить, точно объявленные речевые пользователи могут эмулировать. При разработке игры Вы, вероятно, хотите обеспечить большой набор выразительных фраз, которые могут говорить Ваши символы. Но синтезированная речь может также улучшить приложение, не имеющее таких очевидных причин произвести разговорный вывод, потому что это может предоставить пользователям более удобный и более приятный способ взаимодействовать с приложением.
Поскольку Вы разрабатываете свое приложение, ищете пути, синтезированная речь может улучшить пользовательский интерфейс. Несколько предложений включены в Руководство по проектированию Пользовательского интерфейса для Речи. Следующие разделы описывают способы, которыми можно использовать синтезированную речь в приложении, разделенном на три категории, примерно соответствующие уровням усилия, требуемого реализовать их.
Используйте в своих интересах предоставленную системой функциональность
Даже если Вы не будете включать специфичного для речи кода в свое приложение, то пользователи будут в состоянии услышать большую часть текста, выведенного на экран в Вашем приложении, на котором говорит вслух системная речь. В тексте к области Speech Речевых предпочтений пользователи могут создать сочетание клавиш для использования, когда они хотят услышать текст, они выбрали в любом приложении. В той же предпочтительной области пользователи могут также принять решение услышать текст предупреждений, на которых говорят вслух (это - функция, известная как Говорящие Предупреждения) и быть сказанным, когда приложение требует внимания.
Вы не должны делать ничего специального, чтобы позволить Вашим пользователям получать преимущества от этих функций; наоборот при использовании стандартного, предоставленного систему APIs и технологий это прибывает бесплатно. На выбираемом тексте, появляющемся в Вашем приложении, включая предоставленный пользователями текст, можно говорить вслух, когда пользователи нажимают свое определяемое сочетание клавиш или когда они выбирают Speech> Start Speaking Text от пункта меню Services. (Обратите внимание на то, что пункт меню Services включен по умолчанию в приложениях Какао и Углерода; для получения дополнительной информации см. Руководство по внедрению Служб и Установку Вашего Приложения Углерода для Использования Меню Служб.), Когда Ваше приложение использует предоставленные системой механизмы для отображения предупреждений, функция Talking Alerts автоматически говорит предупредительный текст.
Можно найти, что эти встроенные функции удовлетворяют речевые потребности приложения. Если, однако, Вы хотите улучшить и настроить разговорный вывод в Вашем приложении для дифференциации его от конкурирующих продуктов, считайте следующие разделы для исследования способов, которыми можно сделать это.
Обеспечьте некоторую настройку
В дополнение к разрешению пользователям выбрать текст для слушания говоривший вслух может говорить приложение, когда это встречается с особыми условиями или выполняет определенные задачи. Например, Ваше приложение могло направить новых пользователей путем описания шагов, требуемых выполнить общие задачи. Синтез речи APIs обеспечивает функции и методы, которые можно использовать для соединения разговорного вывода со специализированными задачами и событиями (для получения дополнительной информации о том, как сделать это, посмотрите, Синхронизируют Речь со Специализированными Действиями).
Если Вы хотите иметь больше контроля над производством речи в Вашем приложении, можно переопределить некоторые способы поведения по умолчанию синтезатора. Один способ сделать это должно использовать функции синтеза речи Углерода для изменения атрибутов речевого канала, таких как речевой уровень и подача. Другой способ сделать это должно использовать встроенные речевые команды (описанный в Речевом Качестве Управления Используя Встроенные Речевые Команды) и вставить их по мере необходимости в текст, на котором будут говорить. Синтезатор использует эти команды для изменения интонации слов и фраз путем управления подачей, акцентом слова и длиной паузы, среди других атрибутов. Этот метод особенно полезен, если Вы хотите, гарантируют корректное произношение имени собственного (такого как Ваше название компании) или если разговорное содержание должно соответствовать определенным требованиям (такой как в изучающем язык приложении или другом образовательном программном обеспечении). Встроенные речевые команды доступны независимо от языка программирования, который Вы используете.
Обеспечьте усовершенствованную настройку
Фонематическое и режимы обработки ввода TUNE позволяют Вам вносить тонкозернистые корректировки в разговорный вывод. Например, можно предусмотреть произношение слова путем предоставления синтезатору отдельных фонем, включающих слово.
Используя режим обработки ввода TUNE, можно воспроизвести всю минуту изменения в подаче и уровне фактического произнесения, позволив приложению произвести речь, тиражирующую часть тонкости человеческой речи. Если Вы хотите, чтобы Ваше приложение произвело речь, следующую за такими точными спецификациями, посмотрите Модификаторы Фонемы Использования для Корректировки Произношения и Использования Формат TUNE для Предоставления Сложных Контуров Подачи.
Руководство по проектированию пользовательского интерфейса для речи
Как описано, в Почему Синтезированная речь Использования?, существует много способов улучшить Ваше приложение путем обеспечения разговорного вывода. Например, можно использовать речь для уведомления пользователей относительно чего-то, что произошло в фоновом режиме, такие как “Загрузка закончен” или “У Вас есть встреча через 15 минут “. По существу разговорный вывод является другим фасетом пользовательского интерфейса и, как таковой, это должно следовать большинству высокоуровневых инструкций в Инструкциях по Интерфейсу пользователя OS X. В дополнение к тем инструкциям имейте в виду конструктивные соображения этого раздела и специфичные для речи инструкции, поскольку Вы разрабатываете свое приложение.
Полагайте, что обеспечение разговорного подтверждения информационных пользователей входит или выборы, которые они делают. Например, пользователь может не смотреть на экран при вводе в данных из другого источника, и разговорное подтверждение ввода приветствовалось бы. Точно так же, если бы пользователь непреднамеренно выбирает неправильный элемент из длинного списка, разговорное подтверждение каждого выбора сразу предупредило бы пользователя к любым ошибкам.
При использовании речи, чтобы уведомить пользователей, что событие имело место, рассмотрите приостановку в течение нескольких секунд между дисплеем события (таких как диалоговое окно) и разговорным сообщением. Речь является эффективным способом привлечь внимание пользователей, если они уже не смотрят на экран, но если они, разговорное уведомление могло бы казаться избыточным. Вставка задержки между визуальным и слуховым уведомлением дает пользователям возможность реагировать на событие, не слыша речи. Если такая пауза целесообразна в Вашем приложении, несомненно, обеспечат способ для пользователей настроить его длину.
Для обеспечения непротиворечивого и приятного речевого опыта для пользователей следуйте этим инструкциям:
Обеспечьте способ для пользователей включить и выключить разговорный вывод, который производит Ваше приложение. С ослабленным слухом пользователи не получат преимущества от речи, которую генерирует Ваше приложение, и другие пользователи могут не любить его или могут использовать Ваше приложение в ситуациях, требующих тишины (такой как в библиотеке). Рассмотрите свой целевой рынок тщательно, прежде чем Вы решите произнести речь настройка по умолчанию.
Обязательно обеспечьте визуальную альтернативу всем разговорным (или слуховой) коммуникация, которую производит Ваше приложение. Пользователи должны быть в состоянии выбрать между разговорной и видеосвязью, не теряя доступ ни к какой информации или функциональности.
Как можно больше, обеспечьте способы для пользователей настроить речь, которую они слышат. Например, пользователи должны быть в состоянии выбрать приятную речь и установить речевой уровень и подачу к удобным уровням.
При тестировании приложения убедиться слушать весь разговорный вывод приложение генерирует. Таким образом, Вы будете в состоянии поймать неправильное и неоднозначное произношение и фиксировать их со встроенными речевыми командами и модификаторами фонемы.
Как с записанными предупреждениями, разговорные предупреждения должны сказать пользователю, что произошло, почему это произошло, и что может делать с этим пользователь. Для большего количества инструкций по записи эффективных предупредительных сообщений см. Инструкции по Интерфейсу пользователя OS X.
Как можно больше, экспресс усложнил идеи в нескольких коротких предложениях вместо одного длинного предложения. Намного более трудно для пользователей обработать сложную разговорную информацию, потому что они не могут возвратиться и перечитать части, которые они пропустили или не понимали. Эффективное использование пунктуации может также помочь сделать сложноподчиненные предложения проще понять. Это вызвано тем, что синтезатор, как человеческий динамик, паузы, когда это встречается с запятыми, точками с запятой, и периоды. Для получения дополнительной информации о том, как привлечь внимание пользователей к важной информации в предложении, см. Четыре Способа Улучшить Разговорный Вывод.
Обязательно задокументируйте способности к синтезу речи Вашего приложения. Если пользователи не знают, какие функции доступны и как они могут настроить их, они никогда не могли бы использовать их.
Углерод и синтез речи какао сравненный APIs
Прежде чем Вы начнете разрабатывать свое приложение с синтезированной речью в памяти, обратите внимание на то, что тип настройки, которую Вы планируете сделать, оказывает некоторое влияние на Ваш выбор API. И Углерод и Какао предоставляют основную функциональность синтеза речи, но Углерод API обеспечивает больше программируемого управления речевыми атрибутами. В отличие от синтеза речи Углерода API, NSSpeechSynthesizer
класс, определенный в Наборе Приложения, не поддерживает возможность преобразовать текст в фонемы или изменить речевые атрибуты. Если Вы не планируете использовать в своих интересах программируемые функции теперь или в будущей версии Вашего приложения, можно использовать Какао API, не волнуясь о необходимости перепроектировать и повторно кодировать приложение позже. Если, однако, Вы хотите поддерживать усовершенствованные возможности (или существует шанс, что Вы могли бы сделать так в будущем), необходимо рассмотреть использование Углерода API с начала.
Несмотря на то, что можно смешать синтез речи Какао и Углерода APIs в отдельном приложении, можно испытать несколько трудностей из-за различий в реализации. Например, при указании речи, которую текущий синтезатор речи не поддерживает в Углероде, необходимо явно закрыть текущий речевой канал и открыть новый для использования новой речи, тогда как в Какао этот процесс является автоматическим. Можно найти, что наилучший вариант состоит в том, чтобы разработать приложение в Какао, но использовать синтез речи Углерода API для всех связанных с речью задач.
Прежде чем Вы выберете API, примете во внимание, что можно выполнить большую речевую настройку путем добавления встроенных команд к тексту приложение передает синтезатору. Однако потенциальный недостаток к использованию встроенных команд - то, что необходимо добавить надлежащие встроенные команды к каждому возникновению определенного слова для указания его произношения. Контрастируйте это с вызыванием функции, устанавливающей речевой атрибут для всего разговорного вывода, проходящего через речевой канал. В зависимости от Ваших обстоятельств, однако, можно решить, что этот недостаток перевешивается управлением с более прекрасными зернами, идущим с использованием встроенных команд.
Остаток от этого раздела обеспечивает краткие обзоры синтеза речи Какао и Углерода APIs. Для всесторонней справочной информации на этом APIs посмотрите менеджера по Ссылке класса и Синтезу речи NSSpeechSynthesizer Референса.
Обзор синтеза речи какао API
Какао API включает NSSpeechSynthesizer
класс, обрабатывающий много задач синтеза речи в пути собственный компонент Objective C. Когда Вы создаете и инициализируете экземпляр NSSpeechSynthesizer
, речевой канал создается и речь (или системная речь по умолчанию, или один Вы определяете в методе инициализации), связан с объектом. NSSpeechSynthesizer
объект является кабелепроводом Вашего приложения к платформе Синтеза речи.
NSSpeechSynthesizer
класс определяет методы, позволяющие Вам:
Получите информацию о речи (такой как возраст и род)
Измените речь, используемую для разговорного вывода
Определите, говорит ли в настоящее время другое приложение
Запустите и остановите речь
Управляйте делегатами
Для подавания заявки произносят слово или фразу, Вы используете метод экземпляра отправить текст в Ваш NSSpeechSynthesizer
объект (альтернативно, можно использовать метод экземпляра заставить звуковой вывод быть сохраненным к файлу). Используя методы делегата, определенные NSSpeechSynthesizer
класс, можно также выполнить специализированные действия как раз перед словом, или на фонеме говорят или сразу после того, как синтезатор заканчивает говорить строку. Вы могли бы использовать эти методы для, например, изменить состояние запустить/остановить говорящей кнопки или синхронизировать анимацию рта символа с разговорным выводом.
Несмотря на то, что можно использовать метод класса получить атрибуты для определенной речи, NSSpeechSynthesizer
класс не определяет методы, позволяющие Вам получать или изменять атрибуты речевого канала. Кроме того, NSSpeechSynthesizer
класс не поддерживает программируемое преобразование текста к фонемам. Чтобы сделать эти вещи, необходимо использовать функции в синтезе речи Углерода API.
Обзор синтеза речи углерода API
API синтеза речи Углерода (также названный менеджером по Синтезу речи) включает функции, позволяющие Вам:
Создайте и управляйте речевыми каналами
Скорректируйте речевые атрибуты на речевом канале
Преобразуйте текст в фонемы
Получите информацию о речевых каналах и речи
Запустите, остановитесь, и речь паузы
Создайте, вызовите и избавьтесь от универсальных указателей процедуры, указывающих на функции, которые Вы предоставляете для синхронизации речи со специализированными действиями
В дополнение к этим функциям синтез речи Углерода API определяет константы, описывающие речь и атрибуты речевого канала, типы данных (такие как фонема и речевые структуры описания), и большое количество селекторов, воздействующих на речевые каналы.
Даже при том, что синтез речи Углерода, API не объектно-ориентирован, это может помочь думать о речевом канале (структура типа SpeechChannel
) как аналогичный экземпляру NSSpeechSynthesizer
класс. Это вызвано тем, что речевой канал является основным кабелепроводом между Вашим приложением и платформой Синтеза речи, и необходимо создать для выполнения большинства связанных с речью задач, таких как получение информации о речи, отправка текста, на котором будут говорить, или корректировка речевых атрибутов. Одно исключение к этому SpeakString
функция, не требующая, чтобы Вы создали речевой канал. Когда Вы передаете строку SpeakString
функция, менеджер по Синтезу речи автоматически создает и управляет структурами, требуемыми говорить.
Используя селекторы, которые можно передать SetSpeechInfo
функция, можно тиражировать часть функциональности, которую Вы получаете при использовании встроенных речевых команд. Например, можно изменить обрабатывающий ввод режим на речевом канале путем передачи soInputMode
селектор. Это имеет тот же эффект как [[inpt <mode>]]
встроенная речевая команда, за исключением того, что это воздействует на речевой канал в целом, не на часть текста. Таблица 3-1 соединяет каждую встроенную речевую команду со своим аналогичным селектором, если Вы существуете. Другие селекторы позволяют Вам атрибутам канала заранее составленной речи или связать функцию обратного вызова с речевым каналом. Посмотрите менеджера по Синтезу речи Референса по полному списку доступных селекторов.
Реализация основных задач синтеза речи Используя какао и углерод
В этом разделе описывается использовать Какао и Углерод APIs для выполнения основных задач установки, таких как получение речевого канала, обозначение определенной речи, запуск и остановка речи и ответ на речевые события.
Генерация речи Используя синтез речи какао API
Для генерации речи с помощью синтеза речи Какао API необходимо инстанцировать NSSpeechSynthesizer
возразите и отправьте в него текст для разговора. Код в Перечислении 2-1 показывает, как использовать этот объект получить информацию о доступной речи и как реагировать на некоторые речевые события. Этот код является упрощенной версией проекта NSSpeechSynthesizerExample в качестве примера, расположенного в /Developer/Examples/Speech/Synthesis
. Код в Перечислении 2-1 не показывает, как создать всплывающее меню доступной речи или управлять текстовым выбором, и это не реализует обработки ошибок.
Код в Перечислении 2-1 показывает реализацию NSObject
подкласс вызывают ExampleWindow
. Это использует простое окно, содержащее следующие элементы:
Текстовое представление (объявленный как
NSTextView * _textView
) это выводит на экран текст, на котором будут говоритьВсплывающее меню (объявленный как
NSPopUpButton * _voicePop
) это выводит на экран доступную речь, из которой может выбрать пользовательКнопка (объявленный как
NSButton * _speakButton
) пользователь щелкает, чтобы запустить и остановить речь
Перечисление 2-1 , Генерирующее речь с помощью синтеза речи Какао API
@implementation ExampleWindow |
/* Instantiate an NSSpeechSynthesizer object when the application starts */ |
- (void)awakeFromNib |
{ |
_speechSynthesizer = [NSSpeechSynthesizer new]; |
/* Make the ExampleWindow object the responder to NSSpeechSynthesizer delegate methods */ |
[_speechSynthesizer setDelegate:self]; |
/* Call a custom method to populate the pop-up menu of available voices (implementation not shown) */ |
[self getSpeechVoices]; |
} |
/* When the user clicks the Start Speaking button, invoke the custom startSpeakingTextView method to retrieve (or create) the text and speak it */ |
- (IBAction) speakTextButtonSelected:(id)sender |
{ |
[self startSpeakingTextView]; |
} |
- (void)startSpeakingTextView |
{ |
if([_speechSynthesizer isSpeaking]) { |
[_speechSynthesizer stopSpeaking]; |
} |
else { |
NSString * theViewText; |
/* If the user chooses to hear the default system voice, get the text to speak from the window (either the default text or user-supplied) */ |
if ([_voicePop indexOfSelectedItem] == 0) { |
[_speechSynthesizer setVoice:NULL]; |
theViewText = [_textView string]; |
} |
/* Otherwise, get the user's chosen voice, create a string using the voice's demo text, and speak it */ |
else { |
[_speechSynthesizer setVoice:[[NSSpeechSynthesizer availableVoices] objectAtIndex:[_voicePop indexOfSelectedItem] - kNumOfFixedMenuItemsInVoicePopup]]; |
/* Get the attributes of the chosen voice */ |
NSDictionary * attributes = [NSSpeechSynthesizer attributesForVoice:[_speechSynthesizer voice]]; |
/* Get the value of the voice's name attribute */ |
NSString * theName = [attributes objectForKey:NSVoiceName]; |
/* Build a string using the voice's name and demo text in this format: "This is <name>. <Demo text.>" */ |
theViewText = [NSString stringWithFormat:@"This is %@. %@", theName,[attributes objectForKey:NSVoiceDemoText]]; |
/* Display this new string in the window */ |
[_textView setString:theViewText]; |
} |
/* Send string to synthesizer object */ |
[_speechSynthesizer startSpeakingString:theViewText]; |
/* Change button name to reflect current state */ |
[_speakButton setTitle:@"Stop Speaking"]; |
} |
} |
@end |
Как показано в awakeFromNib
метод в Перечислении 2-1, ExampleWindow
объект будет реагировать на методы делегата, определенные NSSpeechSynthesizer
класс. Перечисление 2-2 включает реализации в качестве примера двух из этих методов, показывая, как выполнить специализированные действия, синхронизирующиеся с речевыми событиями.
Перечисление 2-2 Используя методы делегата реагировать на речевые события
/* This delegate method is invoked when the NSSpeechSynthesizer object has finished speaking. This happens when there is no more text to speak or when the user clicks the Stop Speaking button. */ |
- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender didFinishSpeaking:(BOOL)finishedSpeaking |
{ |
/* Return cursor to beginning of line */ |
[_textView setSelectedRange:NSMakeRange(0,0)]; |
/* Reset button title to initial string */ |
[_speakButton setTitle:@"Start Speaking")]; |
[_speakButton setEnabled:YES]; |
[_voicePop setEnabled:YES]; |
} |
/* This delegate method is called when a word (defined by its character range within the string) is about to be spoken. This implementation uses this information to highlight each word as it's being spoken. */ |
- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)characterRange ofString:(NSString *)string |
{ |
UInt32 selectionPosition = characterRange.location; |
UInt32 wordLength = characterRange.length; |
[_textView scrollRangeToVisible:NSMakeRange(selectionPosition, wordLength)]; |
/* Highlight word about to be spoken */ |
[_textView setSelectedRange:NSMakeRange(selectionPosition, wordLength)]; |
[_textView display]; |
} |
Генерация речи Используя синтез речи углерода API
Для генерации речи с помощью синтеза речи Углерода API необходимо создать речевой канал и отправить в него текст для разговора. Пример кода в этом разделе моделируется на проекте CocoaSpeechSynthesisExample в качестве примера (расположенный в /Developer/Examples/Speech/Synthesis
), который показывает, как использовать синтез речи Углерода API в приложении Какао. Большая часть инфраструктуры примера приложения предоставлена Какао NSDocument
класс и код, выводящий на экран и управляющий окном и его содержанием, не воспроизводятся в следующих листингах кода. Код в списках ниже шоу, как использовать ряд функции синтеза речи Углерода; см. приложение CocoaSpeechSynthesisExample для более широкой выборки.
Код в Перечислении 2-3 показывает частичную реализацию NSDocument
подкласс, вызванный SpeakingTextWindow
. SpeakingWindow
содержит следующие переменные экземпляра:
fCurSpeechChannel
(типаSpeechChannel
) указать на текущий речевой каналfCurrentlySpeaking
(типаBOOL
) указать текущее речевое состояние
Перечисление 2-3 , Генерирующее речь с помощью синтеза речи Углерода API
/* Callback function prototype: */ |
static pascal void MyWordCallBackProc(SpeechChannel inSpeechChannel, long inRefCon, long inWordPos, short inWordLen); |
@implementation SpeakingTextWindow |
- (void)awakeFromNib |
{ |
OSErr theErr = noErr; |
short numOfVoices; |
long voiceIndex; |
BOOL voiceFoundAndSelected = false; |
VoiceSpec theVoiceSpec; /* VoiceSpec is a structure that contains the identity of the synthesizer required to use a voice and the ID of a voice. */ |
/* Get the number of voices on the system. Note that you do not need to get a speech channel to get information about available voices. */ |
theErr = CountVoices(&numOfVoices); // Handle error if necessary. |
for (voiceIndex = 1; voiceIndex <= numOfVoices; voiceIndex++) { |
VoiceDescription theVoiceDesc; |
/* Get the VoiceSpec structure for this voice. The structure fields will be filled in by a call to GetVoiceDescription. */ |
theErr = GetIndVoice(voiceIndex, &theVoiceSpec); // Handle error if necessary. |
/* Fill in the fields of the theVoiceDesc VoiceDescription structure. */ |
theErr = GetVoiceDescription(&theVoiceSpec, &theVoiceDesc, sizeof(theVoiceDesc)); // Handle error if necessary. |
/* Add this voice name to the pop-up menu (not shown). */ |
} |
/* If a speech channel already exists, dispose of it. */ |
if (fCurSpeechChannel) { |
theErr = DisposeSpeechChannel(fCurSpeechChannel); // Handle error if necessary. |
fCurSpeechChannel = NULL; |
} |
/* Create a speech channel. */ |
theErr = NewSpeechChannel(NULL, &fCurSpeechChannel); // Handle error if necessary. |
/* Set the refcon to the document controller object to ensure that the callback functions have access to it. */ |
theErr = SetSpeechInfo(fCurSpeechChannel, soRefCon, (Ptr)self); // Handle error if necessary. |
/* Enable the Start/Stop and Pause/Continue buttons (not shown). */ |
} |
- (IBAction)startStopButtonPressed:(id)sender |
{ |
/* This action method is called when a user clicks the Start/Stop speaking button. */ |
OSErr theErr = noErr; |
if (fCurrentlySpeaking) { |
/* If speech is currently being produced, stop it immediately. Alternatively, you could use the StopSpeechAt function to stop the speech at the end of a word or sentence.*/ |
theErr = StopSpeech(fCurSpeechChannel); // Handle error if necessary. |
fCurrentlySpeaking = false; |
/* Update the controls, based on current speaking state (the updateSpeakingControlState method is not shown). */ |
[self updateSpeakingControlState]; |
} |
else { |
/* Call the method that sets up the callbacks on the speech channel and sends the text to be spoken. */ |
[self startSpeakingTextView]; |
} |
} |
- (void)startSpeakingTextView |
{ |
/* This method sets up a callback that gets called when a word has been spoken. It also starts spoken output by calling the SpeakText function. */ |
OSErr theErr = noErr; |
NSString * theViewText; |
/* Get the text from the window and store in theViewText (not shown). */ |
/* Set up the word callback function. Other callback functions can be set up in a similar way. */ |
theErr = SetSpeechInfo(fCurSpeechChannel, soSpeechDoneCallBack, MySpeechDoneCallBackProc); // Handle error if necessary. |
/* Convert the theViewText NSString object to a C string variable.*/ |
char * theTextToSpeak = (char *)[theViewText lossyCString]; |
/* Send the text to the speech channel. */ |
theErr = SpeakText(fCurSpeechChannel, theTextToSpeak, strlen(theTextToSpeak)); // Handle error if necessary. |
/* Update variables and control states (you might want to define other variables to hold the current pause state and the most recent error code). */ |
fCurrentlySpeaking = true; |
[self updateSpeakingControlState]; |
} |
Как показано в Перечислении 2-3, startSpeakingTextView
метод устанавливает процедуру обратного вызова на речевом канале. Пример приложения CocoaSpeechSynthesisExample использует процедуру обратного вызова для вызывания функции, выделяющей каждое слово в тексте, поскольку на этом говорят.
Код в Перечислении 2-4 показывает процедуру обратного вызова, использующую NSObject
метод performSelectorOnMainThread:withObject:waitUntilDone:
вызывать подпрограмму, фактически выполняющую обработку, связанную с обратным вызовом. Причина MyWordCallBackProc
не выполняет слово, выделяющее себя, то, что все обратные вызовы синтеза речи Углерода (кроме SpeechTextDoneProcPtr
) вызовите их присоединенные функции на потоке кроме основного потока. Если Вы не указали, что Ваше приложение Какао многопоточно, это может вызвать проблемы, если Ваша подпрограмма обратного вызова касается пользовательского интерфейса или других объектов приложения. Для предотвращения этих проблем используйте performSelectorOnMainThread:withObject:waitUntilDone:
метод для обеспечения подпрограммы обработки обратного вызова вызывают на основном потоке. Конечно, этот механизм является ненужным в чистом приложении Углерода.
Перечисление 2-4 Используя процедуру обратного вызова Углерода для ответа на речевое событие
pascal void MyWordCallBackProc(SpeechChannel inSpeechChannel, long inRefCon, long inWordPos, short inWordLen) |
{ |
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; |
/* Call the highlightWordWithParams: method to highlight each word as it's spoken. highlightWordWithParams (not shown) receives a dictionary containing two values: the number of bytes between the beginning of the text and the beginning of the word about to be spoken and the length in bytes of that word. */ |
[(SpeakingTextWindow *)inRefCon performSelectorOnMainThread:@selector(highlightWordWithParams:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithLong:inWordPos], kWordCallbackParamPosition, [NSNumber numberWithLong:inWordLen], kWordCallbackParamLength, NULL] waitUntilDone:false]; |
[pool release]; |
} |
Если требуется исследовать подавание многопоточной заявки Какао, см. Руководство по программированию Поточной обработки. Если бы Вы пишете приложение, подобное CocoaSpeechSynthesisExample, и требуется сделать его многопоточным, убедиться включать следующую строку кода, прежде чем Вы вызовете любую функцию синтеза речи Углерода впервые:
[NSThread detachNewThreadSelector:@selector(self) toTarget:self withObject:nil]; |
После использования detachNewThreadSelector:toTarget:withObject:
метод для создания нового потока можно тогда выполнить задачи обработки обратного вызова в процедурах обратного вызова.
Используя AppleScript для создания разговорного вывода
Используя AppleScript say
команда, можно заставить текст говориться вслух или сохраняться к файлу. say
команда является одной из команд взаимодействия с пользователем, доступных в Стандартных Дополнениях, пишущих сценарий дополнения (доступный в /System/Library/ScriptingAdditions
). Для экспериментирования с примерами сценария в этом разделе откройте приложение Редактора сценариев (расположенный в Applications/AppleScript
), введите сценарий в окно Script Editor и нажмите Run.
say
команда говорит строку, следующую за нею (строка может быть текстом, включенным в двойные кавычки или текст в переменной). Дополнительно, можно использовать using
параметр для сообщения say
команда для использования определенной речи и saving to
параметр для перенаправления разговорного вывода к файлу AIFF. say
команда также принимает два параметра, проигнорированные, если не включено Распознавание речи. Эти два параметра (displaying
и waiting until completion
) не описаны в этом документе. Для получения дополнительной информации о синтаксисе и использовании say
команда, открытая StandardAddition.osax
в редакторе сценариев.
Следующий пример использует Переключатель для сценария Средства поиска (расположенный в Applications/AppleScript/Example Scripts/Finder Scripts
) показать, как можно добавить say
команда к сценарию для создания разговорного вывода.
Перечисление 2-5 Используя AppleScript для создания разговорного вывода
tell application "Finder" activate set visible of every process whose visible is true and name is not "Finder" to false say "To see other application windows again, select Show All from the Finder menu." using "Vicki" end tell |
При сохранении разговорного вывода к файлу AIFF можно использовать его в некотором другом приложении или слушать его в iTunes (или загрузить его на iPod). Следующий пример добавляет секунду say
команда к сценарию в Перечислении 2-5, этот направляющий часть разговорного вывода к файлу в /Users
папка.
Перечисление 2-6 Используя AppleScript для сохранения разговорного вывода к файлу
tell application "Finder" activate set visible of every process whose visible is true and name is not "Finder" to false say "To see other application windows again, select Show All from the Finder menu." using "Vicki" say "This is an example of using the AppleScript say command to save spoken output to a file." saving to "Users:AppleScript_speech.aiff" end tell |