Les méthodes de Aspeak (D6 Mac)

 

L'extension Speech Manager et le tableau de bord Speech permettent au Mac de lire un texte en synthèse vocale (en anglais ou en espagnol). Pour que Director tire parti de cette fonctionnalités, aspeak fut longtemps le seul Xobjet disponible. Nous vous proposons de découvrir les méthodes de aspeak.

On s'enquiert des Xchoses disponibles en saisissant ShowXlib dans la fenêtre message de Director:

showXlib
-- XLibraries:
--   Xtra: QTVRXtra
--   Xtra: ScriptColor
--   Xtra: PrintOMatic_Lite
--   Xtra: NetLingo
--   Xtra: Mui
--   Xtra: fileio
-- "*Standard.xlib"
--   XObject: SerialPort       Id:200 
--   XObject: XCMDGlue         Id:2020

Aucun Xobjet externe n'apparaît dans la deuxième partie de cette liste,  nous allons y remédier en indiquant à Director le chemin du fragment de code externe que nous voulons utiliser ("aspeak"). L'animation et aspeak sont enregistrés dans le même dossier; aucune mention de chemin n'est donc requise. Nous saisissons :

openXlib "ASpeak XOBJ"

Où Aspeak XOBJ est le nom actuel du fichier contenant le fragment de code. Director n'indique pas si l'ouverture de l'Xobjet a réussie. pour le savoir et connaître le nom véritable de l'Xobjet, Il nous faut interroger Director un nouvelle fois :

showXlib
-- XLibraries:
--   Xtra: QTVRXtra
--   Xtra: ScriptColor
--   Xtra: PrintOMatic_Lite
--   Xtra: NetLingo
--   Xtra: Mui
--   Xtra: fileio
-- "*Standard.xlib"
--   XObject: SerialPort       Id:200 
--   XObject: XCMDGlue         Id:2020
--- XObject: aspeak

Aspeak est désormais utilisable. Mais quelles sont ses méthodes. Passée à l'objet, la méthode globale mDescribe fournit la liste des fonctions disponibles :

put aspeak(mDescribe)
-- Factory: ASpeak ID:1998
-- ASpeak, Speaks strings using the Speech Manager, v1.0
-- Copyright © 1994 by Brian Stern, All rights reserved.
-- The ASpeak external object is shareware.
-- If you use this product you must send the shareware
-- fee of US$20 to Brian Stern
-- 10506A Little Pebble Drive
-- Austin, TX 78758
-- You can also contact me at Jaeger@fquest.com (on internet).
IS mNew, voicename              -- Specify name of voice for this channel.
X  mDispose                     -- Dispose of the object.
XS mSpeakText, text             -- Speak this text.
IS mSetVoice, voicename         -- Change the current voice.
S  mGetVoice                    -- Return the current voice.
SS mGetVoiceGender, voicename   -- Return gender of specified voice.
SS mGetVoiceComments, voicename -- Return comments for specified voice.
SS mGetVoiceAge, voicename      -- Return age of specified voice.
I  mAreWeSpeaking               -- Is this voice currently speaking?
I  mAreAnySpeaking              -- Are any voices currently speaking?
I  mAreWePaused                 -- Is this voice paused?
X  mStopSpeech                  -- Interrupt speech now.
X  mStopSpeechEndOfWord         -- Interrupt speech at end of current word.
X  mStopSpeechEndOfSentence     -- Interrupt speech at end of current sentence.
X  mPauseSpeech                 -- Pause speech now.
X  mPauseSpeechEndOfWord        -- Pause speech at end of current word.
X  mPauseSpeechEndOfSentence    -- Pause speech at end of current sentence.
X  mContinueSpeech              -- Continue speech after a pause.
I  mCountVoices                 -- How many voices are installed?
SI mGetVoicebyIndex, index      -- Get the name of the next voice,
                                -- index should repeat from 1 to Count voices.
I  mUseDictionary               -- Use a Speech Manager dictionary resource
-- errors returned by mNew and mSetVoice are noSpeechManager (-1)
-- insufficient memory (-108), and speech manager errors (-240 to -259).
----
-- <Null>

Les neuf premières lignes sont claires : aspeak est shareware et son utilisation implique le règlement de droits à son auteur. Les lignes suivantes présentent une à une et de façon conventionnelle, les méthodes utilisables pour aspeak. Chacune de ces lignes est rédigée de la même manière :

Le groupe de lettres initiales (capitales souvent) fournit de indications sur le type que la fonction retourne (premier caractère) et le type d'arguments qu'elle requiert (tous les autres).

X indique que la fonction ne retourne aucune valeur
I désigne un entier (ou un booléen)
S une chaîne de caractères entre guillemets

plus rarement on rencontre dans ces listes :
L pour une liste d'entiers (ou un entier long)
P pour une image
O pour une instance d'objet
V pour un type original (exemple une image PICT)

Nous devons commencer par créer une instance de aspeak en utilisant la méthode globale mNew. L'instance (ou enfant) doit recevoir un nom de baptême nous permettant de l'invoquer : plus précisément nous allons utiliser une variable pour  nommer celle-ci.

set Crapo to aspeak(mNew,"zarvox")

La méthode mNew et l'argument de type chaîne "Zarvox" (qui est le nom d'une voix du Mac, attention il faut respecter la casse !) sont passés à l'Xobjet. Un objet-enfant est créé qui est stocké dans la variable CRAPO. La méthode utilisée renvoie un entier code d'erreur (le premier "i") et exige un argument de type chaîne (le S, nom d'une voix du Mac). Les dernières lignes retournées par mDescribe indiquent quelques codes d'erreur. Si tout se passe bien le résultat est 0

Notre objet CRAPO est maintenant prêt à obéir à nos instructions. Nous lui passons la méthode mSpeakText et l'argument de type chaîne "bonjour":

crapo(mSpeakText, "bonjour")

Toujours avec les Xobjets la structure est la suivante : à l'objet on passe une méthode et ses arguments entre parenthèses. Ainsi pour connaître le nombre de voix disponibles dans le dossier "VOICES" du dossier système.

crapo(mcountvoices)

La méthode mCountVoices retourne un entier :

put the result
-- 19

Dix huit voix sont donc disponibles en plus de celle que nous utilisons actuellement. L'ordre n'est pas fixé. On commence par la voix courante

crapo(mgetvoicebyindex, 1)
put the result
-- "Zarvox"

puis les autres en remontant la liste par ordre alphabétique inversé.

put crapo(mgetvoicebyindex, 2)
-- "Whisper"

put crapo(mgetvoicebyindex, 3)
-- "Trinoids"

Pourquoi ne pas changer de voix ?

crapo(msetvoice, "trinoids")

Quel code d'erreur la fonction retourne-t-elle ?
put the result
-- 0

Jouons donc avec cette nouvelle voix

crapo(mspeaktext, "we are the trinoids")

Enfin pour se débarrasser de l'objet CRAPO et libérer la mémoire :

crapo(mdispose)

Un vérification n'est jamais inutile. Demandons si CRAPO n'existe plus.

put crapo
-- Void

Si une ressource "dict"  est jointe dans le fichier de l'Xobjet ou dans l'animation, il est possible d'utiliser la commande mUseDictionary pour l'exploiter.  Une ressources dictionnaire inclut une description phonétique des mots, à l'usage de Speech Manager

Une dernière chose : Speech manager requiert beaucoup de mémoire et plus encore avec certaine voix non compressées. La mémoire est prise pour moitié à Director et pour l'autre à la pile système. attention donc à ne pas utiliser les services de Speech manager sur des machines peu dotées. L'xobjet Aspeak est téléchargeable sur le site ftp Sharedcast : ftp://ftp.sharedcast.com/pub/XObjs/