[Python-es] Problema con py2exe y pywin32 al usar SAPI5

manuel manuelcortez00 en gmail.com
Lun Dic 17 22:44:31 CET 2012


Hola,

Verán, estoy desarrollando una aplicación de aprendizaje de teclado 
mediante voz. Para esto, uso python-gi en Debian, que conecta con gtk3, 
y Pygtk en Windows. El tema de la voz lo llevo diferente en cada 
plataforma, ya que en Debian puedo disponer de Speech Dispatcher, y en 
Windows acceder a Microsoft SAPI 5, mediante pywin32.

La aplicación funciona muy bien en Debian, y si no se compila, también 
en Windows. El problema viene al intentar generar una versión compilada 
o distribuible (no es como si le entregues el programa a un usuario, 
además de tener que instalarle python, pywin32, pygtk, pyGObject, etc, 
etc, etc). Para esto uso py2exe.

Antes que nada, adjunto una parte del código de lo que uso para tomar la 
voz de SAPI5, porque creo que ahí está el problema. Si alguien cree que 
no, puedo poner lo que sea de código. Esto es lo que uso de pywin32:

import win32com.client
from win32com.client import Dispatch as dispatch
from win32com.client import constants

clas speak()
# inicializaciones y cosas así
     self.tts = dispatch("SAPI.SpVoice")
     ...
   def say(self, text, stopSignal=0):
     if stopSignal == 0:
       self.tts.Speak("", constants.SVSFPurgeBeforeSpeak)
     self.tts.Speak(text, 1)

Bueno, el detalle funciona. El stopSignal me dice si la aplicación que 
llama al tts quiere interrumpir la voz si hay algo que se esté 
ejecutando de lo mismo, si no es 0, se espera a que termine de decir lo 
que decía, y si es diferente, lo detiene y corta el habla para comenzar 
él. Aquí, lo que uso de constants es la constante SVSFPurgeBeforeSpeak, 
y a continuación sigo con el problema.

Todo funciona excelente siempre y cuando lo ejecute desde Python con 
todo instalado, pero, al compilarlo con py2exe, el programa se ejecuta, 
al menos la ventana, y cuando debería empezar a hablar, no lo hace, y me 
escribe un archivo con errores, este es el contenido del archivo:

Traceback (most recent call last):
   File "gtk_main.py", line 39, in say_widget
   File "tts.pyc", line 31, in say
   File "win32com\client\__init__.pyc", line 170, in __getattr__
AttributeError: SVSFPurgeBeforeSpeak

Y este el archivo setup.py, que usé para la compilación:

setup(name="DANI",
       version="0.91-alfa2",
       description="Asistente de aprendizaje de teclado",
       author="Manuel Cortez",
       author_email="manuelcortez00 en gmail.com",
       url="http://code.google.com/p/wcalc",
       license="GPL",
       scripts=["tts.py", "keyboardexplorer.py", "about.py", "lesson.py"],
      windows = ["gtk_main.py"],
options={'py2exe': dict(includes=['cairo', 'gio', 'pango', 'pangocairo', 
'atk', 'win32com'],)})

Alguien sabe qué sucede? según sé, todo está aparentemente bien, pero no 
funciona. El programa, repito, funciona si lo ejecuto con el intérprete 
Python que está instalado en el sistema.

Agradezco cualquier ayuda que me pudieran dar. Leí algo en google, pero 
nada hablaba del uso de SAPI con Python.

Gracias.


Más información sobre la lista de distribución Python-es