Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


Цитата evg64:
Но когда я установил Алену (русский голос), выдается сообщение "This machine doesn't have Alyona (Russian) SAPI5 installed", причем через интерфейс, который установился вместе с Аленой, все воспроизводится нормально. В чем может быть проблема? »
Понадобилось и мне послушать "Аленку", точно выдает ошибку. Вот маленько поправил код Creat0R-a, теперь все ок (по крайней мере у меня):
Код: Выделить весь код
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <SliderConstants.au3>
;

Global $oVoice = ObjCreate("SAPI.SpVoice")
Global $oError = ObjEvent("AutoIt.Error", "ErrFunc")

Global Const $WM_HSCROLL = 0x0114
Global Const $VOICE_LANG = 0419
Global $fStateOfVoice=0 ;состояние голосового движка 

$Main_GUI = GUICreate("SAPI Speaker", 600, 280)
GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")

$Text_Edit = GUICtrlCreateEdit("Здравствуйте дорогие друзья." & @CRLF & _
        "Этот текст читает выбранный вами диктор." & @CRLF & _
        "Если вам не нравиться мой голос," & @CRLF & _
        "то придется вам научится читать самому!", 10, 10, 580, 50)

$Speak_Button = GUICtrlCreateButton("Speak", 10, 65, 60, 22, $BS_DEFPUSHBUTTON)
$Pause_Button = GUICtrlCreateButton("Pause", 90, 65, 60, 22)
GUICtrlSetState(-1, $GUI_DISABLE)
$Resume_Button = GUICtrlCreateButton("Resume", 170, 65, 60, 22)
GUICtrlSetState(-1, $GUI_DISABLE)
$Stop_Button = GUICtrlCreateButton("Stop", 250, 65, 60, 22)
GUICtrlSetState(-1, $GUI_DISABLE)

GUICtrlCreateGroup("Options", 10, 100, 580, 170)
$Rate_Slider = GUICtrlCreateSlider(20, 150, 280, 30, $TBS_TOP + $TBS_AUTOTICKS)
GUICtrlSetLimit(-1, 50, -50)
GUICtrlSetData(-1, 0)

$Volume_Slider = GUICtrlCreateSlider(300, 150, 280, 30, $TBS_TOP + $TBS_AUTOTICKS)
GUICtrlSetLimit(-1, 100, 1)
GUICtrlSetData(-1, 100)

$Rate_Precent_Label = GUICtrlCreateLabel("Speach Speed: " & 0, 120, 125, 150, 15)
$Volume_Precent_Label = GUICtrlCreateLabel("Speach Volume: " & 100, 400, 125, 150, 15)

GUICtrlCreateLabel("Slow", 20, 185)
GUICtrlCreateLabel("Normal", 140, 185)
GUICtrlCreateLabel("Fast", 270, 185)
GUICtrlCreateLabel("Quiet", 310, 185)
GUICtrlCreateLabel("Loud", 550, 185)
GUICtrlCreateLabel("Voice:", 20, 233)

$Voice_Combo = GUICtrlCreateCombo("Microsoft Sam", 60, 230, 100)

$SOTokens = $oVoice.GetVoices('', 'Language=' & $VOICE_LANG)

For $Token In $SOTokens
    GUICtrlSetData($Voice_Combo, $Token.GetDescription, $Token.GetDescription)
Next

GUISetState()

While 1
;$oVoice.status.runningstate может принимать следующие значения: 1-остановлен, 0- пауза, 2-воспроизведение
If $fStateOfVoice=1  And $oVoice.status.runningstate=1 Then 
    GUICtrlSetState($Speak_Button, $GUI_ENABLE)
    GUICtrlSetState($Pause_Button, $GUI_DISABLE)
    GUICtrlSetState($Stop_Button, $GUI_DISABLE)
    GUICtrlSetState($Resume_Button, $GUI_DISABLE)
    $fStateOfVoice=0
EndIf  

Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
        Exit
    Case $Speak_Button
        $sText = GUICtrlRead($Text_Edit)
        $SAPIVoice = GUICtrlRead($Voice_Combo)
        $nRate = GUICtrlRead($Rate_Slider) / 10
        $nVol = GUICtrlRead($Volume_Slider)
        _Speak($sText, $SAPIVoice, $nRate, $nVol)
        If @error Then ContinueLoop
            
        GUICtrlSetState($Speak_Button, $GUI_DISABLE)
        GUICtrlSetState($Pause_Button, $GUI_ENABLE)
        GUICtrlSetState($Stop_Button, $GUI_ENABLE)
        $fStateOfVoice=1
    Case $Pause_Button
        $oVoice.Pause
            
        GUICtrlSetState($Speak_Button, $GUI_DISABLE)
        GUICtrlSetState($Pause_Button, $GUI_DISABLE)
        GUICtrlSetState($Resume_Button, $GUI_ENABLE)
    Case $Resume_Button
        $oVoice.Resume
            
        GUICtrlSetState($Pause_Button, $GUI_ENABLE)
        GUICtrlSetState($Resume_Button, $GUI_DISABLE)
    Case $Stop_Button
            $oVoice = ObjCreate("SAPI.SpVoice")
            
        GUICtrlSetState($Speak_Button, $GUI_ENABLE)
        GUICtrlSetState($Pause_Button, $GUI_DISABLE)
        GUICtrlSetState($Stop_Button, $GUI_DISABLE)
        GUICtrlSetState($Resume_Button, $GUI_DISABLE)
        $fStateOfVoice=0
EndSwitch
WEnd

Func _Speak($sText, $SAPIVoice, $iRate = 1, $iVol = 100)
    $oVoice = ObjCreate("SAPI.SpVoice")
    $oVoice.Rate = $iRate
    If @error Then Return
    $oVoice.Volume = $iVol
    If @error Then Return
        
    Local $t_Voice = $oVoice.GetVoices()
    Local $SAPIVoices
    
    For $SAPIVoices In $t_Voice
        If $SAPIVoices.GetDescription() = $SAPIVoice Then
            $oVoice.Voice = $SAPIVoices
            If Not @error Then $oVoice.Speak($sText, 1)
            Return
        EndIf
    Next
    Msgbox(64,"Внимание", "Вы видимо попытались вручную ввести название 'голосового движка', и поэтому ошиблись, ибо таков голос не найден в вашей системе.",6)
EndFunc

Func WM_HSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
    Switch $LParam
        Case GUICtrlGetHandle($Rate_Slider)
            Local $nVoiceRateRead = GUICtrlRead($Rate_Slider)
            $oVoice.Rate = $nVoiceRateRead / 10
            GUICtrlSetData($Rate_Precent_Label, "Speach Speed: " & $nVoiceRateRead)
        Case GUICtrlGetHandle($Volume_Slider)
            Local $nVolumeRead = GUICtrlRead($Volume_Slider)
            $oVoice.Volume = $nVolumeRead
            GUICtrlSetData($Volume_Precent_Label, "Speach Volume: " & $nVolumeRead)
    EndSwitch
EndFunc

Func ErrFunc()
    If Hex($oError.Number,8) = 80020009 Then
        MsgBox(48, "Error", "This machine doesn't have " & GUICtrlRead($Voice_Combo) & " installed")
        Return SetError(1)
    EndIf
    
    Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !"      & @CRLF  & @CRLF & _
            "err.description is: "    & @TAB & $oError.description    & @CRLF & _
            "err.windescription:"     & @TAB & $oError.windescription & @CRLF & _
            "err.number is: "         & @TAB & Hex($oError.number,8)  & @CRLF & _
            "err.lastdllerror is: "   & @TAB & $oError.lastdllerror   & @CRLF & _
            "err.scriptline is: "     & @TAB & $oError.scriptline     & @CRLF & _
            "err.source is: "         & @TAB & $oError.source         & @CRLF & _
            "err.helpfile is: "       & @TAB & $oError.helpfile       & @CRLF & _
            "err.helpcontext is: "    & @TAB & $oError.helpcontext)
    Local $iErr = $oError.number
    If $iErr = 0 Then $iErr = -1
    
    SetError($iErr)
EndFunc
Кстати, ранее установленный голос Русского Николая, не отображался сдесь, как один из установленных "голосов". На днях скачал одну прогу где то из файлообменника, так там в архиве тож был голос Николая, но сей после установки, стал отображаться сдесь (в описанном выше скрипте, ну и работает конечно). Так что мож кому пригодится такая информация, что выходит есть всякие инсталяторы...(Данный инсталятор голоса в архиве назывался: Acapela-Elan-TTS-SpeechCube-5[1].1-RUS-Nicolai_MmE255_.msi. Кому интересно, Google в помощь.)

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.


Последний раз редактировалось beve, 07-11-2009 в 17:13. Причина: Немного улучшен скрипт, теперь по завершении воспроизведения текста, кнопки примут начальный вид.

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:34, 07-11-2009 | #5