Skip to content

Plone.org.ru

Sections
Personal tools
You are here: Home » Статьи » Как заставить python разговаривать с помощью Microsoft SAPI
Log in
Реклама
Поддержка
Для общения можно использовать списки рассылки: и
Дружественный сайт
 

Как заставить python разговаривать с помощью Microsoft SAPI

  • Send this page to somebody
  • Print this page

Для начала придется найти в инете русские голоса. Второе, что надо это ActivePython. Как устанавливать распознавалку и сам SAPI рассказывать не буду. Если возникнут вопросы, то отвечу. Главным признаком того что у вас есть шанс заставить говорить является нечто похожее на эту картинку:

Control Panel and Gomez

Теперь первая задача. Заставить python голосом послать все на фиг. Код такой:

    # -*- coding: utf-8 -*-
    #обязательно указывайте кодировку и сохраняйте файл в ней
    import win32com.client
    speaker = win32com.client.Dispatch("SAPI.SpVoice")

    s=u"""Пошли все на фиг, я мегамозг"""
    speaker.Speak(s)

И если этот пример сработал, то дальше начинается самое интересное. У меня Zope во время запуска говорит, что запустился, а в нашей комнате стоит свободный комп который если сервера клиентов не отвечают, то начинает ругать нас нехорошими словами. Есть идея привинтить usb градусник и если температура падает, то это значит, что Саша открыл окно, и уж точно это добьет мой цветок, который стоит на окне. Вид у него цветка очень жалкий т.к. Саша постоянно открывает окно, как только мы выходим из офиса пообедать.

Теперь плавно приближаемся к новой задаче. А именно распознавание голоса. Ведь приятно когда заходит клиент и начинает спрашивать о статусе очередного проекта, ты включаешь микрофон и говоришь "Status project one", а тебе комп отвечает "Текущий прогресс 75%, закрытие проекта намечается 8 марта". Короче, это сказки, но все же ругаться мне в ответ я комп уже научил:

    from win32com.client import constants
    import win32com.client
    import pythoncom

    class SpeechRecognition:
        """ Наш базовый класс который будет работать с SAPI """
        def __init__(self, wordsToAdd):
            # Для разговоров
            self.speaker = win32com.client.Dispatch("SAPI.SpVoice")
            # Для распознавания
            self.listener = win32com.client.Dispatch("SAPI.SpSharedRecognizer")
            # Контекст слушателя
            self.context = self.listener.CreateRecoContext()
            # Ассоциированная грамматика
            self.grammar = self.context.CreateGrammar()
            # Нам не надо распознавать все что говорится, а только слушать комманды 
            self.grammar.DictationSetState(0)
            # Создаем новые правила для грамматики. Подробнее см. API и примеры
            self.wordsRule = self.grammar.Rules.Add("wordsRule", 
                           constants.SRATopLevel + constants.SRADynamic, 0)
            # Очищаем буфер. При первом запуске не обязательно, но поскольку 
            # мы список правил можем менять динмически, то это такой вызов полезен
            self.wordsRule.Clear()
            # Создаем правило для каждого из слов
            [ self.wordsRule.InitialState.AddWordTransition(None, word) for word in wordsToAdd ]
            # Активируем правила
            self.grammar.Rules.Commit()
            self.grammar.CmdSetRuleState("wordsRule", 1)
            # ...и грамматику
            self.grammar.Rules.Commit()
            # Добавляем обработчик событий который перехватывает рспознанные слова 
            self.eventHandler = ContextEvents(self.context)
            # Пора бы и представиться
            self.say(u"Я мегамозг, слушаю и повинуюсь")

        def say(self, phrase):
            """Метод для произнесения выражений вслух"""
            self.speaker.Speak(phrase)

    """ Создаем базовый класс на основе метода из SAPI, он перехватывает события 
        создаваемые объектом распознающем голос. За дополнительной информацией 
        см.  "Automation | SpSharedRecoContext (Events)" в MS Speech SDK"""
    base = win32com.client.getevents("SAPI.SpSharedRecoContext")

    class ContextEvents(base):
        """Обработчик события вызывается, когда слово было распознано"""
        def OnRecognition(self, StreamNumber, StreamPosition, RecognitionType, Result):
            newResult = win32com.client.Dispatch(Result)
            wordResult = newResult.PhraseInfo.GetText()
            if wordResult=="Python":
                speechReco.say(phrase=u"Лучший язык программирования")
            elif wordResult=="Status":
                speechReco.say(phrase=u"Текущий статус проекта...")
            elif wordResult=="Bill":
                speechReco.say(phrase=u"Выставить счет клиенту")
            elif wordResult=="Window":
                speechReco.say(phrase=u"Саша, гад! Закрой окно, сорняк дохнет")
            print u"Распознали слово: ", wordResult

    if __name__=='__main__':
        wordsToAdd = [ "Status", "Bill", "Window", "Python" ]
        speechReco = SpeechRecognition(wordsToAdd)
        while 1:
            pythoncom.PumpWaitingMessages()

И кстати, который пишет сапи.

За основу статьи были взяты рецепты:

Created by xen
Михаил Кашкин
Last modified 2005-03-05 07:54

одним словом

Posted by bugol at 2005-03-03 01:45

пиздато

А теперь то же самое под линуксом

Posted by sergey_v at 2005-04-15 03:58

Слабо?

Очень интересный материальчик

Posted by minotawr at 2007-07-11 02:22

Спасибо - понравилось, на днях попробую применить на практике...

 

Rambler's TOP 100