transcriber-1.5.1.1/0000755000175000017500000000000010705457520012034 5ustar rtrttranscriber-1.5.1.1/doc/0000755000175000017500000000000010605162351012573 5ustar rtrttranscriber-1.5.1.1/doc/de/0000755000175000017500000000000010605162351013163 5ustar rtrttranscriber-1.5.1.1/doc/de/refFrame.html0000644000175000017500000000033610122047732015601 0ustar rtrt Manuel de Rfrence transcriber-1.5.1.1/doc/de/inst_13b7.html0000644000175000017500000001051510122047732015563 0ustar rtrt Transcriber's Installation for Windows NT

Installation der Version 1.3b7 für Windows NT

Nachstehend die Schritte für das Herunterladen und Installieren der Windows-Version des Transcribers.
 

(1) Tcl/Tk 8.0.5 installieren.


Dazu auf die Website

http://www.scriptics.com/products/tcltk/8.0.html

gehen und die Zeile

anklicken.

(Diese Zeile befindet sich etwa am Ende des ersten Drittels der Seite unter der Überschrift "Downloading Binary Releases for Windows and Macintosh").

Es ist wichtig, gerade diese Ausgabe der Software herunterzuladen - die jüngste Version von Tcl/Tk ist zwar 8.2, aber die aktuelle binäre Transcriber-Ausgabe für Windows geht von der Version 8.0.5 aus.

Nachdem die Datei heruntergeladen ist, kann sie durch einfaches Anklicken auf die übliche Art und Weise installiert werden.

Der standardmäßige Installationsort ist C:\Program Files\Tcl. Wie gewöhnlich kann zum Zeitpunkt der Installation ein nicht vorgegebener (non-default) Installationsort spezifiziert werden. Unabhängig davon, wo die Datei tatsächlich installiert wird, wird der Installationsort im Weiteren mit $TCL bezeichnet.

Der für eine vollständige Tcl/tk-Installation benötigte Speicherplatz beträgt etwa 5.5 MB. Durch Weglassen verschiedener Demo- und Hilfsdateien lässt sich der Speicherplatzbedarf verringern. Wahrscheinlich sieht die Installationssequenz eine Option für eine "benutzerspezifische Installation" vor.
 

(2) Transcriber-Zip-Archiv von der französischen Website

http://www.etca.fr/CTA/gip/Projets/Transcriber/distrib/Transcriber-1.3b7-nt.zip
oder von der US-Website

http://morph.ldc.upenn.edu/mirror/Transcriber/distrib/Transcriber-1.3b7-nt.zip

herunterladen.
 

(3) Das Transcriber-Zip-Archiv in einen beliebigen Ordner entpacken,

z. B. D:\Transcriber. Es ist egal, wo sich das Archiv befindet, solange der Ort in den nächsten gemerkt wird. Im Folgenden soll dieser Ordner mit $TRANS bezeichnet werden.
(Der vollständige Installationsumfang beträgt 2.5 MB. Ein nicht unbeträchtlicher Teil davon sind Audio-Samples und andere unwesentliche Dinge).
 

(4) In $TRANS\lib gibt es vier Ordner,

nämlich "html_library-0.3", "snack1.6", "tcLex1.1", "trans1.0". Diese nach $TCL\lib. kopieren (oder verschieben).
 

(5) Das ablauffähige Transcriber-Programm ist $TRANS\tcl\main.tcl.

Es kann durch Doppelklick auf die Datei an diesem Speicherplatz aufgerufen werden. Außerdem lässt sich die Datei auf dem Desktop mit einem Shortcut belegen, oder sie kann auf die übliche Art und Weise dem Startmenü hinzugefügt werden. Das Kopieren der Datei an einen neuen Speicherplatz funktioniert NICHT.
 

(6) Eine Online-Systembeschreibung enthält die französische Website

http://www.etca.fr/CTA/gip/Projets/Transcriber/en/refFrame.html
oder die US-Website

http://morph.ldc.upenn.edu/mirror/Transcriber/en/refFrame.html

Das Programm arbeitet mit den Audiodateiformaten .wav, .au, .snd, .aiff, .smp und .sph. Es kann auch Dateien ohne Header (Rohdateien) verarbeiten. Es erkennt die Bytefolge, unterscheidet zwischen 8-Bit- und 16-Bit-Abtastung usw., und der Nutzer kann die Abtastrate und die Kanalnummer eingeben (derzeit werden nur Kanal 1, 2 und 4 unterstützt). transcriber-1.5.1.1/doc/de/frame_web.html0000644000175000017500000000034610122047732016002 0ustar rtrt Prsentation de Transcriber transcriber-1.5.1.1/doc/de/inst_141.html0000644000175000017500000000525510122047732015421 0ustar rtrt Transcriber's Installation for Windows NT

Installation der Version 1.4.1 für Windows NT

Nachstehend die Schritte für das Herunterladen und Installieren der Windows-Version des Transcribers.
 

(1) Tcl/Tk 8.2 installieren.

Von der URL-Adresse

http://www.scriptics.com/products/tcltk/downloadnow82.html

"Windows 95 and Windows NT self-extracting installer" (tcl823.exe) herunterladen.
Doppelklick auf die .exe-Datei, um Tcl/Tk zu installieren.
Nach der Installation startet der Rechner neu.
 

(2) Snack 1.6 installieren.

Von der URL-Adresse

http://www.speech.kth.se/snack/download.html

"Binary Release for Windows 95/98/NT with Tcl/Tk 8.1.1 or later" (snack164.exe) herunterladen.
Doppelklick auf die .exe-Datei, um Snack zu installieren.
 

(3) Transcriber 1.4.1 installieren.

Von der französischen Website oder von der US-Website


trans141.exe herunterladen.

Doppelklick auf die .exe-Datei, um den Transcriber zu installieren.
In beiden Fällen fragt das Installationsprogramm, welcher Ordner verwendet werden soll.
Der Default-Ordner für den Transcriber ist
C:\Program Files\Transcriber
 

(4) Transcriber starten.

Im Programm-Untermenü des Startmenüs ist jetzt ein "Transcriber"-Menü verfügbar. Der Transcriber kann durch Wählen von "Main.tcl" gestartet werden. Die Dokumentation steht im selben Menü zur Verfügung und kann mit Hilfe des Browsers gelesen werden. Um den Zugriff auf das Programm zu erleichtern, kann "Main.tcl" auf dem Desktop auch mit einem in "Transcriber" umbenannten Shortcut belegt werden (für den Default-Installationsort in C:\Program Files\Transcriber\tcl zu finden). transcriber-1.5.1.1/doc/de/refMenu.html0000644000175000017500000001454010122047732015455 0ustar rtrt Zurück zur Präsentation

Schnittstelle

Fenster Transkriptionsdatei Signaldatei Handhabung des Signals Editieren Episode Segmentieren Sprechersequenzen und Sprecher Abschnitte und Themen Hintergrundgeräusch Ereignisse und Kommentare Tasten-Shortcuts Optionen und Schnittstellenkonfiguration Sonstige Merkmale transcriber-1.5.1.1/doc/de/installation.html0000644000175000017500000002071710122047732016560 0ustar rtrt Transcriber's Installation

Binäre Installation der Version 1.4.1 für Windows NT

Binäre Installation der Version 1.3b7 für Windows NT

Binäre Installation für Unix

Installation von den Quellen

Der Transcriber beruht auf einer Vielzahl von Softwareprodukten oder Bibliotheken, die zunächst installiert werden müssen. Tcl/Tk 8.0 - 8.3, Snack 2.0, tcLex 1.2 und optional NIST/Sphere 2.6 . Schritt 1-4 sind für diese Module, Schritt 5-6 sind für den Inhalt der Transcriber Distribution..
  1. Wenn  Tcl/Tk version 8.0 oder höher nicht bereits auf Ihrem System installiert ist, holen Sie es vom Scriptics Server:
    1. http://dev.scriptics.com/software/tcltk/choose.html
    oder von einem seiner Mirrorsites und entpacken Sie es:
      $ gunzip -c tcl8.3.2.tar.gz | tar xf -
    Wählen Sie ein Installationsverzeichnis (z.B. /usr/local) und folgen Sie den Anweisungen der README-Datei
    Für Tcl 8.2 unter Unix, wird es etwa so aussehen:
     
      $ cd tcl8.3.2/unix
      $ ./configure --enable-gcc --enable-shared --prefix=/usr/local
      $ make
      $ make install
    Führen dieselben Anweisungen für Tk aus. Wenn Sie in ein anderes Verzeichnis installiert haben, setzen Sie die Umgebungsvariablen (PATH und LD_LIBRARY_PATH) auf die richtigen Werte.
     
  2. Dieser Schritt ist nur erforderlich, wenn Sie das Sphere Audiodateiformat mit Snack verwenden wollen. Holen Sie das NIST/Shpere Archiv von:
  3. Entpacken Sie in ein Unterverzeichnis dieser Distribution
      Dann installieren Sie es: Sie werden nach der Zielplattform gefragt. Für Linux, wählen Sie 10 (custom) und ändern Sie folgende Werte (die anderen sollten OK sein): NB - Für die letzte Linux Distribution (z.B. Redhat 5.x oder Debian 2.x) müssen Sie die folgende Zeile in der Datei auskommentieren
    nist/src/lib/sp/exit.c : extern char *sys_errlist[]; (Danke an Dafydd Gibbon für diese Information) Für die anderen gibt es ein Patch in der Transcriber Source Distribution in src/patch-sphere für dynamische Compilation der Sphere libs unter Linux.
  4. Holen Sie das Snack 2.0 modul von:
    1. http://www.speech.kth.se/snack/
    entpacken es mit: Dann folgen Sie den Anweisungen der README-Datei und installieren Snack mit:
      NB:
  5. Holen Sie das tcLex 1.2 Modul von:

  6.  
      http://www.multimania.com/fbonnet/Tcl/tcLex/
    entpacken es mit:
      Dann folgen Sie den Anweisungen der  README.txt und installieren tcLex mit: NB - Sie müssen die kompletten Quellen von Tcl  haben um diese Erweiterung zu erzeugen, da sie sich auf besondere Headerdateien bezieht, die nicht bei der Standard Tcl Installation vorhanden sind.
     
  7. Entpacken Sie die Quellen aus dem Transcriber Archiv, compilieren und installieren mit:
  8. Als Option zum Befehl ./configure, müssen Sie das Verzeichnis angeben, in welchem Snack extrahiert wurde
    (--with-snack=...), die Verzeichnisse in welchen Tcl und Tk installiert wurden (--with-tcl=...--with-tk=...), und das Verzeichnis, wo Sie den Transcriber installieren werden (--prefix=...). Für den Gebrauch von Tcl/Tk Version 8.0, fügen Sie die Option  --disable-stubs hinzu.

  9.  

     
     

    NB - Wenn Sie nach der Installation die Verzeichnisstruktur ändern, müssen Sie das 'trans' Startscript editieren und den absoluten Pfadnamen angeben: TRANSPATH=... (der  lib Pfad wo das Unterverzeichnis transcriber1.4 zu finden ist)
     
     

  10. Testen Sie es !

  11. Sie werden gefragt, ob Sie ein Audiosignal oder eine Transkription öffnen wollen; einige finden Sie im Unterverzeichnis 'demo'.


Verzeichnisstruktur:


Mögliche Probleme

transcriber-1.5.1.1/doc/de/transblue.gif0000644000175000017500000000111510122047732015646 0ustar rtrtGIF87a00Ϯaa00ϞQQQaaaqqqϞǎaaa0000,00 dihj/+pms{i 3`H,y&A& F0 Z4E  hλ_@x8%  no7GL`y6z3@ y/z8> H\'b *$|(&@,w4o'>d"&Jbȳ# J 4'#֢K,JnNp0m2>'Gȕx_ w!-2",2H<| E"%W-P2w<2$͟ {T$oϘԊJP1zqhT8PaZDXSM\*n ̦N-q.]Ce6b]K WyDRSN9CCQpfC63Z3 -/dѿW-ő7u}Ko[H ë;transcriber-1.5.1.1/doc/de/functions.html0000644000175000017500000001352610122047732016067 0ustar rtrt Fonctionnalités de Transcriber

Hauptmerkmale

Transkriptionen

Audiosteuerung

Sonstige Merkmale

transcriber-1.5.1.1/doc/de/present_web.html0000644000175000017500000000531110122047732016365 0ustar rtrt Présentation de Transcriber

Choisissez un site proche géographiquement: Europe, USA.
Dernière mise à jour: 6 janvier 2000.

Modifié! Transcriber 1.4.2 - distribution binaire pour Linux, Solaris, SGI, Windows NT (voir la page download).

Screenshot

Présentation

Transcriber est un logiciel d'aide à la création de corpus de parole. Il permet de segmenter, annoter et transcrire manuellement des enregistrements de parole, en vue de leur exploitation ultérieure pour des travaux en traitement automatique de la parole. Il est plus spécialement dédié à la transcription d'enregistrements radio- et télédiffusés de longue durée, avec la possibilité de gérer les tours de paroles (changement de locuteur) et les sections (émission, thème...). Il est conçu afin d'être simple d'emploi et l'interface est personnalisable.

Transcriber est programmé en langage de script Tcl/Tk et en C. Il utilise la librairie Snack de gestion du son, ce qui permet de gérer les formats audio classiques, et l'analyseur syntaxique tcLex. Il fonctionne sur différents systèmes Unix (Linux, Sun Solaris, Silicon Graphics) et Windows NT. Transcriber est distribué en logiciel libre sous licence GNU.


Transcriber - Copyright (C) 1998-2000, DGA
http://www.etca.fr/CTA/gip/Projets/Transcriber/

Auteur :
Claude Barras, DGA/DCE/CTA/GIP
Coordinateurs :
Edouard Geoffrois, DGA/DCE/CTA/GIP
Mark Liberman & Zhibiao Wu, LDC
transcriber-1.5.1.1/doc/de/distribution.html0000644000175000017500000000107110122047732016566 0ustar rtrt Distribution de Transcriber

Distribution

Pour des raisons de maintenance, les informations relatives à la distribution de l'outil (chargement, installation, modifications...) sont disponibles uniquement en anglais.

transcriber-1.5.1.1/doc/de/about.html0000644000175000017500000000235610122047732015170 0ustar rtrt A propos de Transcriber...

Transcriber - un outil pour la segmentation, l'annotation et la transcription de la parole

Transcriber - Copyright (C) 1998-2000, DGA
http://www.etca.fr/CTA/gip/Projets/Transcriber/
Auteur: Claude Barras (DGA)
Coordination: Edouard Geoffrois (DGA), Mark Liberman & Zhibiao Wu (LDC)
Ce programme est diffusé en logiciel libre - voir la traduction de la Licence GNU.
Transcriber utilise aussi des librairies externes - voir les Crédits.

transcriber-1.5.1.1/doc/de/previous.bmp0000644000175000017500000000045010122047732015535 0ustar rtrt#define previous_width 16 #define previous_height 16 static unsigned char previous_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x82, 0x20, 0xc2, 0x30, 0xe2, 0x38, 0xf2, 0x3c, 0xfa, 0x3e, 0xfe, 0x3f, 0xfe, 0x3f, 0xfa, 0x3e, 0xf2, 0x3c, 0xe2, 0x38, 0xc2, 0x30, 0x82, 0x20, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/de/forward.bmp0000644000175000017500000000044510122047732015331 0ustar rtrt#define forward_width 16 #define forward_height 16 static unsigned char forward_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0c, 0x03, 0x1c, 0x07, 0x3c, 0x0f, 0x7c, 0x1f, 0xfc, 0x3f, 0xfc, 0x3f, 0x7c, 0x1f, 0x3c, 0x0f, 0x1c, 0x07, 0x0c, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/de/userFrame.html0000644000175000017500000000033610122047732016003 0ustar rtrt Manuel du transcripteur transcriber-1.5.1.1/doc/de/backward.bmp0000644000175000017500000000045010122047732015437 0ustar rtrt#define backward_width 16 #define backward_height 16 static unsigned char backward_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0xc0, 0x30, 0xe0, 0x38, 0xf0, 0x3c, 0xf8, 0x3e, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8, 0x3e, 0xf0, 0x3c, 0xe0, 0x38, 0xc0, 0x30, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/de/menu_local.html0000644000175000017500000000376310122047732016177 0ustar rtrt Transcriber in English    en franais    in Deutsch

Präsentation

Dokumentation
Hauptmerkmale
Systembeschreibung
Nutzerhandbuch
International Guidelines
Verteilung
Installation
Änderungen
Sonstige Informationen
Urheber und Mitarbeiter
Kontakt, Unterstützung
transcriber-1.5.1.1/doc/de/userDe.html0000644000175000017500000001171310122047732015302 0ustar rtrt

Bediener-Kurzleitfaden zum Transcriber

Was ist eine Transkription

Eine Transkription ist die orthografische Verschriftung einer Audiodatei. Das Audio wird als eine Sammlung kurzer Audiosegmente betrachtet, die durch Synchronisationshaltepunkte getrennt sind. Jeder Sprecherwechsel markiert den Beginn einer neuen Sprechersequenz. Die Sprechersequenzen selbst gruppieren sich in homogene Abschnitte über verschiedene Themen.

Eine typische Transkriptionssitzung

Start einer Sitzung

Wenn Sie die Konfiguration vor Verlassen über das Menü Options/Save configuration speichern, werden sowohl die Audio- als auch die Transkriptionsdatei beim nächsten Start des Transcribers automatisch geöffnet.

Anhören des Signals

Das Signal kann mit der Maus (Bildlaufleisten, Schaltflächen), über Menüs oder mit Tasten-Shortcuts gehandhabt werden. ,Tab'-Taste für Start der Wiedergabe bzw. Pause verwenden.

Erster Schritt: Grobsegmentierung

Zweiter Schritt: Transkription

Dritter Schritt: Überprüfung

transcriber-1.5.1.1/doc/de/pause.bmp0000644000175000017500000000043710122047732015003 0ustar rtrt#define pause_width 16 #define pause_height 16 static unsigned char pause_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/de/reference.html0000644000175000017500000011361210122047732016012 0ustar rtrt Transcriber's Interface

Fenster

Menüleiste

Transkription

Im oberen Bereich der Schnittstelle (d. h. des Bildschirms) kann die orthografische Transkription des Signals in einem Texteditor eingetippt werden: Jede Segmentierung beginnt zum Zeitpunkt t = 0; die ersten drei Zeilen der Transkription umfassen zumindest einen Abschnitt, eine Sprechersequenz und ein Segment. Die Zeile, in den welcher der Cursor steht, wird hervorgehoben. Am rechten Rand befindet sich eine (vertikale) Bildlaufleiste.

Schaltflächenleiste

Im mittleren Bildschirmbereich liegt eine Schaltflächenleiste (die ausgeblendet werden kann) mit Shortcuts für die Signalwiedergabe bzw. für die Anzeige von Informationen; dort werden die aktuellen Dateinamen angezeigt.

Available commands:

Signal und Segmentierung

Signal und Segmentierung erscheinen in der unteren Bildschirmhälfte. Hier steht auch eine (horizontale) Bildlaufleiste für die Wahl des darzustellenden Signalteils zur Verfügung; mit Hilfe einer (über ein Kontextmenü ausblendbaren) kleineren Bildlaufleiste wird die Auflösung eingestellt. Unter dem Signal werden die Segmentierungen (orthografische, in Sprechersequenzen, in Abschnitten, in Hintergrundbedingungen) angezeigt und mit dem Signal synchronisiert. Das aktuelle Segment in der orthografischen Transkription wird optisch hervorgehoben. Eine zweite Darstellung des Signals mit geänderter Auflösung ist möglich. Die aktuelle Cursorposition im Signal wird durch einen vertikalen roten Balken dargestellt. Beide Cursor (der im Texteditor und der im Signal) laufen synchron, so dass das aktuelle Segment im Text stets dem aktuellen Segment unter dem Signal entspricht. Sobald sich ein Cursor in ein anderes Segment bewegt, geht der zweite Cursor mit und erscheint im selben Segment.

Für das Signal stehen die folgenden mausgesteuerten Funktionen zur Verfügung:

Für die Segmentierungszeilen stehen die folgenden mausgesteuerten Funktionen zur Verfügung:

Transkriptionsdatei

Erzeugen einer neuen Transkription

Menü [File]/[New trans] wählen. Ein Dialogfenster fragt nach der zu transkribierenden Audiodatei. Diese Eingabe kann später geändert werden.

Lesen einer Transkription

Über [File]/[Open trans ...] können vom Transcriber erzeugte Transkriptionsdateien, Transkriptionsdateien im .typ-Format oder Segmentierungsdateien in einigen Standardformaten (xwaves, OGI ...) gelesen werden. Bei letzteren erfolgt die Formatidentifizierung anhand des Dateinamensuffixes. Das kann falsch sein. In diesem Fall wird die der Transkription zugeordnete Signaldatei gesucht. Wird sie nicht automatisch gefunden, wird der Nutzer aufgefordert, sie zu suchen.

Speichern der Transkription

Die Transkription kann über das Menü [File]/[Save] gespeichert werden, wenn seit ihrer Erzeugung oder der letzten Speicherung Änderungen durchgeführt wurden. Beim ersten Mal wird der Transkriptionsdateiname defaultmäßig auf den Signaldateinamen mit .trs-Erweiterung gesetzt. Später kann er über [File]/[Save as ...] unter einem anderen Namen gespeichert werden.

Exportieren in ein anderes Format

Die Transkription kann über das Menü [File]/[Export] in nicht native Transkriptionsformate (.typ oder .stm) geschrieben werden, die aber unvollständig sind.

Rückkehr zur vorherigen Version

Der Befehl [File]/[Revert] macht alle Änderungen im Speicher rückgängig und lädt die zuletzt auf der Festplatte gespeicherte Version.

Automatische Sicherung

Eine automatische Sicherung (automatic backup) erfolgt innerhalb einer bestimmten Zeit nach Durchführung einer Änderung (falls die Transkription nicht zwischenzeitlich abgespeichert wurde). Die entsprechende Datei wird im selben Verzeichnis wie die Transkription gespeichert und erhält denselben Namen, jedoch eingerahmt durch das Zeichen # (z. B. /data
/transcription/#radio.trs#). Diese Datei wird gelöscht, sobald die Transkription das nächste Mal routinemäßig abgespeichert wird. Das Zeitintervall wird im Fenster [Options]/[General ...] angezeigt. Ist das Zeitintervall 0, erfolgt keine automatische Sicherung.

Sicherungsdatei (Backup File)

Wenn eine zuvor bereits vorhandene Transkription auf der Festplatte gelesen, dann geändert und wieder abgespeichert wird, wird die vorhandene Version in einer Datei mit demselben Namen wie die Transkription beibehalten, gefolgt von einer vom Nutzer in das Fenster [Options]/[General ...] eingegebene Zeichenkette (z. B. /data/transcription
/radio.trs~). Ist das Feld leer, wird die vorherige Datei nicht beibehalten.

Dateicodierung

Beim Transcriber 1.4.1 unter Tcl/Tk 8.1.1 oder höher kann die Codierung für die Dateiein- und
-ausgabe im Menü [Options]/[General ...] gewählt werden. Die Standardcodierung ist ISO-8859-1 (Latin 1), kann aber in andere gängige Codierungen (ISO-8859-*, EUC-JP ...), einschließlich Unicode (UTF-8), geändert werden. Beim Lesen handelt es sich bei der verwendeten Codierung um die im Dateikopf (file header) definierte (bei Transkriptionen, die mit früheren Transcriber-Versionen ohne diese Informationen erzeugt wurden, findet die aktuelle Codierung Anwendung).

Signaldatei

Öffnen einer Signaldatei

Die Signaldatei wird nach Erzeugen einer neuen Transkription gewählt oder durch Ändern des mit der Transkription verknüpften Signals über das Menü [File]/[Open audio file ...].

Audiodateiformat

Die meisten Standard-Audiodateien werden aufgrund der Snack-Programmbibliothek automatisch erkannt: WAV, AU, SND, AIFF, SMP und Sphere, wenn das Format mit Snack installiert wurde. Der Zugriff auf das MP3-Format kann aufgrund der Komprimierung langsam sein. Das Format vorsatzloser (headerless) Audiodateien (8- oder 16-Bit Abtastlänge, Bytefolge ...) wird automatisch erkannt. Das gilt nicht für die Abtastfrequenz und die Kanalzählung, die vom Nutzer in das Fenster [Options]/[Audio file ...] eingegeben werden.

Signalform

Um die Signalanzeige bei niedrigeren Auflösungen zu beschleunigen (Anzeige von Intervallen länger als 30 s), wird eine geringauflösende Form des gesamten Signals berechnet, wenn das Signal länger als 30 s ist. Die Signalformberechnung erfolgt im Hintergrund, wenn das Signal zum ersten Mal angezeigt wird, und wird für die spätere Verwendung in einem spezifischen Verzeichnis abgelegt. Die laufende Berechnung kann gestoppt oder die Funktion in [Options]/[Audio file ...] deaktiviert werden. Der Hintergrundberechnungsmodus lässt sich ebenfalls deaktivieren. Das Verzeichnis zum Speichern von Signalformen ist ebenfalls unter [Options]/[Audio file ...] zu finden. Es kann von Vorteil sein, ein allen Transcriber-Nutzern gemeinsames Verzeichnis zu verwenden, aber dann müssen alle Nutzer darauf Schreibzugriff haben, um neue Signalformen erzeugen zu können.

Öffnen einer externen Datei

Die Client-Server-Architektur für Audioanzeige und -wiedergabe kann durch Konfigurieren des Skripts tcl/SoundServer.tcl und seines anschließenden Starts auf dem Host aktiviert werden. Die Nutzerwahl des externen Servers und Ports erfolgt in [Options]/[Audio file ...].

Handhabung des Signals

Während der Transkription müssen kurze Signalabschnitte mehrmals gehört werden. In der Befehlsschaltflächenleiste stehen ebenso wie im Menü [Signal] Befehle zur Verfügung, wie sie in ähnlicher Form von der Bedienung eines Tonbandgeräts her bekannt sind, aber Tasten-Shortcuts sind wahrscheinlich bei intensivem Gebrauch am praktischsten.

Positionieren des Cursors

Der Cursor kann per Mausklick auf die gewünschte Position im Signal gesetzt werden. Ein genauer Wert kann im Menü [Signal]/[Go to ...]/[Position] oder durch Klicken auf die Informationszeile unter dem Signal angegeben werden.

Auswählen eines Signalausschnitts

Ein Signalausschnitt kann durch Klick auf die linke Maustaste, Ziehen und Loslassen gewählt werden, und mit Hilfe der mittleren Maustaste (bzw. durch Drücken der Shift-Taste und Klick auf die linke Maustaste) erweitert werden. Die Cursorposition und die Zeitgrenzen für die Wahl des Signalausschnitts werden unter dem Signal angegeben. Ist die Option Automatic selection playback im Menü [Options]/[General ...] aktiviert, startet die Wiedergabe des gewählten Segments, sobald die Maustaste losgelassen wird.

Signalwiedergabe

Mit den Schaltflächen Play und Pause , dem Befehl [Signal]/[Play/Pause] oder dem entsprechenden Shortcut Tab kann die Wiedergabe an der Cursorposition gestartet oder gestoppt werden. Ist eine Auswahl aktiviert, wird nur dieser Teil wiedergegeben.

Segmentwiedergabe

Über den Befehl [Signal]/[Play segment] oder seine Shortcuts (Shift-Tab oder Alt-Tab) wird die Wiedergabe des aktuellen Segments von Anfang bis Ende gestartet.

Schnellvorlauf

Mit den Schaltflächen Schnellvorlauf  und Schnellrücklauf  (Menü [Signal]/[Go to ...]/[Forward] bzw. [Backward]) wird der Signalcursor um eine halbe Sekunde nach vorne bzw. nach hinten verschoben. Bleibt die Maustaste auf der Befehlsschaltfläche gedrückt, kommt es zu einer fortlaufenden Verschiebung in Schritten von 0,5 s. Das funktioniert auch bei der Wiedergabe, doch wirkt der Klang dann abgehackt.

Gehe zum nächsten Segment

Die Schaltflächen Vorheriges Segment  und Nächstes Segment  (Menü [Signal]/[Go to ...]/[Previous] bzw. [Next]) bewegen den Cursor an den Anfang des vorherigen bzw. des nächsten Segments in der orthografischen Segmentierung (auch während der Wiedergabe, die auf die neue Position springt).

Zweite Signalansicht

Das Menü [Options]/[Display]/[Second signal view] ermöglicht eine zweite Ansicht des Signals, die mit einer anderen Auflösung dargestellt werden kann. Für eine korrekte Anzeige ist u. U. eine Größenanpassung des Fensters erforderlich.

Ändern der Lautstärke

Die Lautstärke (von 0 bis 100) ist im Fenster [Signal]/[Control panel] einstellbar.

Vertikaler Zoom

Bei Signalen mit geringer Dynamik kann mit einem Schieber im Fenster [Signal]/[Control panel] die vertikale Amplitude des Signals verändert werden. Die Lautstärke bleibt hiervon unberührt.

Editieren

Cut/Copy/Paste (Ausschneiden/Kopieren/Einfügen)

Die Standard-Editierbefehle (Menü [Edit]/[Copy], [Cut] oder [Paste] und die Standard-Shortcuts Control-x/c/v) können verwendet werden, um Teile der Transkription zu bearbeiten, einschließlich Ereignisse, jedoch nicht die Schaltflächen für Abschnitt, Sprechersequenz oder Hintergrund.

Undo (Rückgängig machen)

Der Befehl Rückgängig machen (Menü [Edit]/[Undo] bzw. der Standard-Shortcut Control-z) ist nur eingeschränkt verfügbar und stellt lediglich den vorherigen Zustand der orthografischen Transkription des aktuellen Segments wieder her. Eine ganze Reihe von Aktionen lässt sich nicht rückgängig machen; deshalb ist häufiges Speichern zu empfehlen.

Find/Replace (Suchen/Ersetzen)

Der Befehl [Edit]/[Find/Replace] (Shortcut Control-f) hat verschiedene Optionen: case sensitive (Unterscheidung Groß-/Kleinbuchstaben), backward search (Rückwärtssuche), use regular expression (gängigen Ausdruck verwenden). Es kann eine Ersatzzeichenfolge vorgegeben werden.

Glossary (Glossar)

Der Befehl [Edit]/[Glossary] bzw. sein Shortcut Control-k hat zwei Modi: Erstellen eines neuen Eintrags im Glossar oder Einfügen eines vorhandenen Eintrags in den Editor an der aktuellen Position. Die Änderung vorhandener Einträge ist in beiden Modi möglich. Ist ein Teil des Textes ausgewählt, wenn der Befehl aufgerufen wird, wird das Erstellen eines neuen Eintrags aus dieser Auswahl vorgeschlagen. Es kann ein Kommentar hinzugefügt werden. Auf OK klicken, um den neuen Eintrag zu registrieren. Wurde kein Text ausgewählt, kann durch Anklicken ein Eintrag in der Liste ausgewählt werden. Dann auf Insert klicken, und der Eintrag wird an der aktuellen Position eingefügt. Derzeit wird das Glossar in der Konfigurationsdatei geführt, in einer späteren Version aber wahrscheinlich in einer getrennten Datei untergebracht.

Automatische Leerzeichensteuerung

Die automatische Leerzeichensteuerung erfolgt im Menü [Options]/[General ...]. Ist sie aktiviert, wird am Zeilenende, nach Erzeugung eines neuen Haltepunkts und vor den Satzzeichen . , ; : (Punkt, Komma, Strichpunkt, Doppelpunkt) ein Leerzeichen eingefügt.

Episode

Editieren von globalen Parametern

Einige globale Informationen über die Transkription können in [File]/[Edit episode attributes ...] angegeben werden:

Segmentieren

Einfügen eines Haltepunkts

Über den Befehl [Segmentation]/[Insert breakpoint] bzw. seinen Shortcut Return wird an der aktuellen Cursorposition im Text und im Signal ein neuer Haltepunkt erzeugt. Grenzpositionen werden auf die nächste Millisekunde gerundet, so dass jeder neue Haltepunkt mindestens 1 ms Abstand zu bereits vorhandenen Haltepunkten einhält. In der Transkription erscheint eine neue Zeile, und das Segment wird an der Cursorposition geteilt. Dieser Vorgang kann während der Wiedergabe erfolgen.

=> 

Entfernen eines Haltepunkts

Der Befehl [Segmentation]/[Delete breakpoint] bzw. sein Shortcut Shift-Backspace entfernt den Haltepunkt am Beginn des aktuellen Segments und übernimmt dessen Inhalt in das vorherige Segment. Hat dieser Haltepunkt gleichzeitig den Beginn einer neuen Sprechersequenz oder eines neuen Abschnitts markiert, werden diese ebenfalls entfernt.

Verschieben der Grenze zwischen zwei Segmenten

Durch Klicken auf eine Grenze zwischen zwei Segmenten mit der mittleren Maustaste (bzw. mit der linken Maustaste bei gedrückter Taste Control oder Strg) und Ziehen mit der Maus können die Grenze sowie die in anderen Segmentierungen synchronisierten Grenzen verschoben werden.

Wählen des Signals für ein oder mehrere Segmente

Durch Anklicken eines Segments unter dem Signal mit der linken Maustaste wird das Signal über den Umfang des gesamten Segments gewählt, und der Signalcursor bewegt sich zum Anfang des Segments. Die Wahl kann durch Drücken der Shift-Taste und Anklicken mit der linken Maustaste erweitert werden.

Ausblenden/Anzeigen einer Segmentierung

Nach Drücken der rechten Maustaste erscheint ein Kontextmenü mit Befehlen für Signalwiedergabe, Auflösung und Anzeigen bzw. Ausblenden jeder Segmentierung.

Sprechersequenzen und Sprecher

Erzeugen einer neuen Sprechersequenz

Mit Hilfe des Befehls [Segmentation]/[Create turn ...] oder seines Shortcuts Control-t wird am Beginn des aktuellen Segments eine neue Sprechersequenz erzeugt. Eine Sprechersequenz wird durch ihre(n) Sprecher und weitere optionale Parameter beschrieben:

Die erste Zeile im Fenster ist für sich überlappende Sprache bestimmt (siehe nachfolgenden Abschnitt). Der mittlere Teil betrifft Erzeugung, Auswahl oder Modifizierung von Sprechern. Durch Klicken auf die Schaltfläche Create Speaker oder direkte Eingabe eines neuen Namens wird ein neuer Sprecher erzeugt. Des Weiteren können sein Typ, sein Dialekt usw. beschrieben werden. Eine sortierte Liste mit bereits definierten Sprechern erscheint rechts, mit einer Auswahl der zuletzt verwendeten Sprecher. Durch Anklicken eines Namens wird dieser Sprecher als Sprecher für die neue Sequenz gewählt. Die Rechtschreibung seines Namens und andere Merkmale können nach Anklicken der Schaltfläche Modify Speaker und anschließendes Validieren über die Schaltfläche OK geändert werden. Die Änderungen beziehen sich auf die gesamte Transkription. Das Feld no speaker kann für Signalsegmente ohne Sprache gewählt werden.

Overlapping speech

Bei der Erzeugung bzw. Änderung von Sprechersequenzparametern kann overlapping speech aktiviert werden. Ein zweiter Sprecher kann auf dieselbe Weise wie der erste gewählt werden. Im Texteditor enthält jedes Segment zwei Zeilen, die mit 1 bzw. 2 beginnen. Die orthografische Segmentierung unter dem Signal wird für jeden Sprecher horizontal geteilt. Die Rückkehr zu sich nicht überlappender Sprache erfolgt durch Deaktivieren der Schaltfläche overlapping speech im Feld der Sprechersequenzparameter. Nur der erste Sprecher wird beibehalten, und die Transkriptionen beider werden in einem einzigen Text zusammengeführt.

Editieren oder Unterdrücken einer Sprechersequenz

Der Befehl [Segmentation]/[Edit turn attributes...] ermöglicht das Editieren und Löschen der Sprechersequenz, die das aktuelle Segment enthält (auch wenn das aktuelle Segment nicht das erste Segment der Sprechersequenz ist). Alternativ dazu kann im Editorfenster die Schaltfläche für die Sprechersequenz angeklickt werden. Alle während der Erzeugung vorgegebenen Parameter können geändert werden. Eine Schaltfläche ermöglicht das Löschen der Sprechersequenz.

Suchen von Sequenzen eines Sprechers

Der Befehl [Edit]/[Speakers]/[Find speaker] zeigt die Liste der Sprecher in der Transkription an. Nach Anklicken des Namens wird unter der Liste angezeigt, wie oft dieser Sprecher in der Transkription aufgetreten ist. Die Schaltfläche Next ruft die nächste Sequenz des Sprechers auf.

Importieren von Sprechern aus einer anderen Datei

Der Befehl [Edit]/[Speakers]/[Import from file ...] fragt nach einer Transkriptionsdatei und zeigt innerhalb dieser Datei die Sprecherliste an, die noch nicht in der aktuellen Transkription vorhanden ist. Der Nutzer kann durch Anklicken der betreffenden Namen Sprecher wählen/abwählen oder einen Sprecher wählen, dessen Feld Global name aktiviert ist.

Unterdrücken nicht verwendeter Sprecher

Mit dem Befehl [Edit]/[Speakers]/[Remove unused speakers] werden alle Sprecher unterdrückt, die in keiner Sprechersequenz erscheinen.

Abschnitte und Themen

Erzeugen eines neuen Abschnitts

Über den Befehl [Segmentation]/[Create section ...] oder seinen Shortcut Control-e wird am Beginn des aktuellen Segments ein neuer Abschnitt erzeugt. Die Art des Abschnitts ("report", "filler" oder "nontrans") und das Thema können im Dialogfenster gewählt werden. Eine Liste bereits definierter Themen wird rechts, kürzlich verwendete Themen werden links angezeigt. Auf Schaltfläche New topic klicken oder Text zum Definieren eines neuen Themas direkt eintippen. Wird ein schon vorhandenes Thema gewählt, kann auf die Schaltfläche Modify topic geklickt und das Thema editiert werden. Anschließend auf Schaltfläche OK klicken. Es kann auch no topic gewählt oder der Eintrag im Feld Topic gelöscht werden. Am Beginn des Abschnitts wird automatisch eine neue Sprechersequenz erzeugt. Der aktuelle Sprecher wird als Default-Einstellung vorgeschlagen.

Editieren oder Unterdrücken eines Abschnitts

Der Befehl [Segmentation]/[Edit section attributes...] ermöglicht das Editieren und Unterdrücken des Abschnitts, der das aktuelle Segment enthält. Es kann auch im Texteditor auf die Schaltfläche für den gewählten Abschnitt geklickt werden. Alle Abschnittsparameter lassen sich ändern, und über eine Schaltfläche kann der Abschnitt gelöscht werden.

Suchen von Abschnitten zu einem Thema

Über den Befehl [Edit]/[Topics]/[Find topic] wird eine Liste bereits definierter Themen angezeigt. Nach Anklicken eines Themas wird die zugehörige Anzahl unter der Liste angezeigt. Die Schaltfläche Next ruft den nächsten Abschnitt zu dem Thema auf.

Importieren von Themen aus einer anderen Datei

Der Befehl [Edit]/[Topics]/[Import from file ...] fragt nach einer Transkriptionsdatei und zeigt eine Liste neuer Themen an. Der Nutzer kann durch Anklicken des betreffenden Namens Themen wählen/abwählen.

Unterdrücken nicht verwendeter Themen

Der Befehl [Edit]/[Topics]/[Remove unused topics] löscht nicht verwendete Themen aus der Liste.

Hintergrundgeräusch

Die Segmentierung in akustische Bedingungen berücksichtigt dauerhafte Änderungen im Hindergrundgeräusch. Die Marken stehen für eine Änderung des Hintergrundzustands. Ihr Wert ersetzt jeweils den vorherigen. Jede Transkription beginnt mit einer leeren Hintergrundbedingung bei t = 0.

Erzeugen einer Hintergrundmarke

Der Befehl [Segmentation]/[Insert background] erzeugt an der aktuellen Cursorposition im Signal eine Hintergrundmarke. Es ist nicht zulässig, zwei Marken im selben Zeitindex zu erzeugen. Befindet sich der Cursor im Signal am Beginn des Segments, wird die Hintergrundmarke stets mit dem Segmentanfang synchronisiert und das Hintergrund-Icon erscheint am Zeilenanfang. Der Hintergrundtyp (Sprache, Musik, elektronisches Rauschen usw.) wird gewählt. Der Wert wird defaultmäßig auf den vorherigen gesetzt. Ein Musik-Icon erscheint im Texteditor an der aktuellen Cursorposition. Die Hintergrundsegmentierung unter dem Signal ist auf geräuschbehafteten Signalanteilen farbig (Standardfarbe: grau).

Anzeigen der Veränderung bzw. des Endes eines Hintergrundgeräusches

An der dem Ende eines Hintergrundgeräuschs entsprechenden Position ist eine neue Hintergrundmarke zu erzeugen, wobei alle Geräuschtypen leer bleiben. Zum Verändern eines Geräuschzustandes nicht das Ende des vorherigen Geräuschs markieren, sondern nur das neue, das das vorherige ersetzt.

Editieren oder Unterdrücken einer Hintergrundgeräuschmarke

Hintergrundgeräuschmarken können durch Anklicken des Musik-Icons im Editor editiert oder unterdrückt werden. Wird die Marke gelöscht, werden die in der vorherigen Hintergrundmarke definierten Bedingungen zu den aktuellen Hintergrundbedingungen.

Ereignisse und Kommentare

Einfügen eines Ereignisses

Über den Befehl [Edit]/[Insert event] oder seinen Shortcut Control-d wird ein Fenster geöffnet, in dem sich folgende Definitionen vornehmen lassen:

Einfügen des Beginns und Endes eines Ereignisses

Wird vor dem Einfügen eines Ereignisses ein Textteil gewählt, werden Marken für Beginn und Ende des Ereignisses gleichzeitig eingefügt.

Einfügen eines Kommentars

Der Befehl [Edit]/[Insert comment] fügt ein Kommentarereignis ein. Kommentare haben kein zeitliches Ausmaß.

Editieren oder Unterdrücken eines Ereignisses

Im Texteditor das Ereignis anklicken und es editieren oder löschen. Ereignisse können im Texteditor auch wie ein einzelnes Zeichen gelöscht werden.

Kopieren/Einfügen eines Ereignisses

Innerhalb des Transcribers können Ereignisse kopiert/eingefügt werden (copy/paste). Werden sie in andere Anwendungen eingefügt, erscheinen die Ereignismarken als XML-Tags.

Erzeugen eines Tasten-Shortcuts für ein Ereignis

Siehe Abschnitt Tasten-Shortcuts.

Editieren der Ereignisliste

Die Geräuschliste, Aussprachekennzeichnungen, lexikalische Kennzeichnungen oder die Sprachenliste lassen sich über [Options]/[Events]/[Edit * list ...] editieren. Der Wert erscheint im Editor und in der Segmentierung, die Beschreibung im Menü mit der Liste der vordefinierten Ereignisse. Eine Leerezeile dient im Menü als Trennzeichen. Aus Gründen der Einheitlichkeit sollten für die Sprachenliste die Codes gemäß ISO 639 verwendet werden.

Konfigurieren der Ereignisanzeige

Schriftarten und Farben für die Ereignisanzeige können über die Menüs [Options]/[Fonts]/[Events] und [Options]/[Colors ...] geändert werden; die Formatzeichenfolge für Kommentare und Ereignisse sowie für das zeitliche Ausmaß der Ereignisse wird im Fenster [Options]/[Events]/[Events display ...] gewählt.

Tasten-Shortcuts

Über das Menü [Options]/[Bindings ...] wird ein Fenster für das Editieren, Unterdrücken oder Erzeugen von Zuweisungen (bindings) aufgerufen.

Definieren eines Shortcuts

Im Menü [Options]/[Bindings ...] New anklicken, um einen neuen Shortcut zu erzeugen. Dann im ersten Feld die Tastenkombination und im zweiten die Ersatzzeichenfolge eingeben. Auf OK (Editionsende) oder Modify (vor anderen Editionen) klicken. Die Tastenkombination kann direkt mit Control, Shift, Alt ... eingegeben werden, wenn sich der Cursor im Feld Keystrokes befindet. Vorsicht: Es können vordefinierte Menü-Shortcuts aufgehoben werden!

Shortcut für einen aktuell verwendeten Ausdruck

Den aktuell verwendeten Ausdruck mit der Maus im Texteditor wählen, dann Menü [Options]/[Bindings] wählen, die gewünschten Keystrokes (Tastenanschläge) angeben und auf OK klicken. Der Shortcut kann auch aus den ersten Buchstaben des Ausdrucks bestehen, z. B. "gor" für "Gorbatschow". Diese Shortcuts haben nichts mit dem Glossar zu tun.

Shortcut für ein Ereignis

Ereignisse (Geräusch, Kommentar usw.) können mit einem Shortcut generiert werden. Im Texteditor ein Ereignis des gewünschten Typs erzeugen, es selektieren und den vorherigen Anweisungen folgen. Der selektierte Text kann eine beliebige Kombination aus regulärem Text und einem oder mehreren Ereignissen sein.

Optionen und Schnittstellenkonfiguration

Transcriber-Name (Name der die Transkription durchführenden Person)

Der defaultmäßige Transcriber-Name steht im Menü [Options]/[General ...]. Er wird für die Initialisierung der Episode-Parameter bei Erzeugen einer neuen Transkription verwendet.

Überwachung des Arbeitsfortgangs

Ein Dateiname für die Überwachung des Arbeitsfortgangs bei Nutzung des Transcribers kann in Menü [Options]/[General ...] vorgegeben werden. Defaultmäßig ist das Feld leer und die Funktion deaktiviert. Ist sie aktiviert, wird die Arbeitsdauer (ohne Pausen) hochgezählt, solange Arbeit geleistet wird (Zahl der neuen Abschnitte, Sprechersequenzen, Wörter ...). Sie wird im Fenster [File]/[Information] angezeigt und am Ende der Sitzung in der Protokolldatei gespeichert. Derzeit erfolgt keine automatische Nutzung dieser Datei durch die Software.

Edition von Farben

Die meisten Farben können über das Menü [Options]/[Colors ...] geändert werden.
 

Edition von Schriftarten

Die für die Textanzeige verwendeten Schriftarten werden über das Menü [Options]/[Fonts] geändert.
 

Lokalisieren der Schnittstelle (Wahl der Dialogsprache)

Die Sprache für die Schnittstelle wird im Menü [Options]/[General ...] gewählt. Sie ist defaultmäßig auf Englisch gesetzt, aber auch in Französisch verfügbar. Die Lokalisierung in einer neuen Sprache ist möglich. Steht keine Lokalisierung zur Verfügung, wird die ursprüngliche englischsprachige Meldung beibehalten. Sobald nicht lokalisierte Meldungen angezeigt werden, werden sie der Liste der zu lokalisierenden Meldungen hinzugefügt. Um eine Lokalisierung aufrechtzuerhalten, im Menü [Options]/[General ...] einen Localization file-Namen eingeben und [Options]/[Save configuration] wählen.

Anzeigen/Ausblenden der mittleren Schaltflächenleiste

Die mittlere Schaltflächenleiste wird über das Menü [Options]/[Display]/[Command buttons] ein- und ausgeblendet.

Speichern der Optionen

Geänderte Optionen, Fensterpositionen, Tasten-Shortcuts, Glossarinhalt und aktuell editierte Dateinamen werden mit dem Befehl [Options]/[Save configuration] in einer Konfigurationsdatei (defaultmäßig ~/.transcriber) gespeichert; diese Datei wird beim Einschalten gelesen, und aktuell editierte Dateien werden zu Beginn der nächsten Sitzung automatisch wieder geöffnet.

Sonstige Merkmale

Informationen über das Signal und die Transkription

Über die Schaltfläche  bzw. den Befehl [File]/[Informations] wird ein Fenster mit Informationen über den Signaldateinamen, die Dauer, die Wortzählung usw. geöffnet. Schaltfläche update anklicken, um die Informationen zu aktualisieren.
 

Verlassen des Transcribers

Dies erfolgt über das Menü [File]/[Quit] bzw. mit Shortcut Control-q; sofern zutreffend, wird das Speichern von Änderungen in der Transkription vorgeschlagen. Ist die entsprechende Option aktiviert, wird auch das Speichern der Konfiguration vorgeschlagen.

Hilfe

Online-Hilfe ist über das Menü [Help] verfügbar. Die Hilfedateien können auch mit jedem HTML-Browser mit Frames eingesehen werden. transcriber-1.5.1.1/doc/de/todo.html0000644000175000017500000000415110122047732015016 0ustar rtrt To do list for Transcriber

To-do-Liste

Wir entwickeln den Transcriber in erster Linie für Rundfunk-Nachrichten und nicht für andere Zwecke. Wir wollen jedoch Bedürfnisse anderer Nutzer beachten und Entwicklungen von Anderen berücksichtigen und Koordinieren.

Dinge, die wir gerade entwickenl oder planen zu tun

Der Transcriber ist unter ständiger Entwicklung. Folgende Verbesserungen können Sie in künftigen Versionen erwarten.

Dinge, nach denen wir gefragt wurden

Einige leistungsfähige Benutzer haben Bedarf an folgenden Funktionen angemeldet: Wir dürften einige von diesen Funktionen selbst einbauen, wenn wir Zeit haben, aber Beiträge sind willkommen!

Wenn Sie gern zusätzliche Anfragen haben, die in der obigen Liste erscheinen sollen, senden Sie bitte eine Nachricht an: transcriber-request@etca.fr. transcriber-1.5.1.1/doc/de/doc_local.html0000644000175000017500000000116110153371046015770 0ustar rtrt Documentation about Transcriber

Dokumentation

Der Transcriber ist in einem auf der First International Conference on Language Resources and Evaluation (LREC)  im Mai 1998 vorgestellten Artikel beschrieben. 

  transcriber-1.5.1.1/doc/de/banner.html0000644000175000017500000000140110122047732015311 0ustar rtrt Transcriber  
Transcriber
Ein Werkzeug für das Segmentieren, Labeln und Transkribieren gesprochener Sprache
transcriber-1.5.1.1/doc/de/present_local.html0000644000175000017500000000445210122047732016707 0ustar rtrt Présentation de Transcriber  
Screenshot

Präsentation

Der Transcriber ist ein Tool, das das Anlegen von Sprachkorpora unterstützt. Es ermöglicht das manuelle Segmentieren, Labeln und Transkribieren (Verschriften) von Sprachsignalen zur späteren Verwendung in der automatischen Sprachverarbeitung. Es ist speziell für die Transkription längerer Aufzeichnungen von Rundfunknachrichten konzipiert und gewährleistet das Labeln von Sprecher- und Themenwechsel. Das Tool stellt eine nutzerfreundliche und konfigurierbare Schnittstelle bereit.

Der Transcriber wurde mit der Skript-Sprache  Tcl/Tk und C-Erweiterungen entwickelt. Er bedient sich der Snack-Bibliothek einer Tonsignalerweiterung, die die meisten handelsüblichen Audioformate unterstützt, und des tcLex. Lexer Generators. Der Transcriber wurde auf verschiedenen Unix-Systemen (Linux, Sun Solaris, Silicon Graphics) und Windows NT getestet und wird als Freeware unter der  GNU  General Public License   vertrieben.



Transcriber - Copyright (C) 1998-2000, DGA
http://www.etca.fr/CTA/gip/Projets/Transcriber/
Auteur :
             Claude Barras, DGA/DCE/CTA/GIP
Coordinateurs :
Edouard Geoffrois, DGA/DCE/CTA/GIP

Mark Liberman & Zhibiao Wu, LDC
 
 
transcriber-1.5.1.1/doc/de/next.bmp0000644000175000017500000000043410122047732014641 0ustar rtrt#define next_width 16 #define next_height 16 static unsigned char next_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x04, 0x41, 0x0c, 0x43, 0x1c, 0x47, 0x3c, 0x4f, 0x7c, 0x5f, 0xfc, 0x7f, 0xfc, 0x7f, 0x7c, 0x5f, 0x3c, 0x4f, 0x1c, 0x47, 0x0c, 0x43, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/de/play.bmp0000644000175000017500000000043410122047732014630 0ustar rtrt#define play_width 16 #define play_height 16 static unsigned char play_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0xfc, 0x00, 0xfc, 0x03, 0xfc, 0x0f, 0xfc, 0x3f, 0xfc, 0x3f, 0xfc, 0x0f, 0xfc, 0x03, 0xfc, 0x00, 0x3c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/de/credits.html0000644000175000017500000000461110122047732015507 0ustar rtrt Transcriber's Credits

Urheber und Mitarbeiter

Der Transcriber beruht auf externen Modulen und Bibliotheken: Vielen Dank an: transcriber-1.5.1.1/doc/de/frame_local.html0000644000175000017500000000035010122047732016312 0ustar rtrt Transcriber Dokumentation transcriber-1.5.1.1/doc/de/info.bmp0000644000175000017500000000043410122047732014616 0ustar rtrt#define info_width 16 #define info_height 16 static unsigned char info_bits[] = { 0x60, 0x00, 0xb0, 0x00, 0x60, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xd8, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xa8, 0x01, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/de/user.html0000644000175000017500000017700510122047732015040 0ustar rtrt Manuel de l'utilisateur

Manuel du transcripteur

Conventions de transcription pour
les enregistrements radio-télédiffusés

mise à jour pour Transcriber 1.4.1

DGA/Limsi, juin 1999


1. Introduction

2. Structuration de la transcription

2.1. Enregistrement

2.2. Segmentation du signal

2.3. Tours et locuteurs

2.4. Sections et thèmes

2.5. Transcription orthographique

2.6. Bruits et conditions acoustiques

2.7. Commentaires

3. Conventions de transcription

3.1. Conventions d'écriture

3.2. Mots hors-lexique

3.3. Spécificités du langage parlé

4. Vérification


1. Introduction

La création manuelle de transcriptions d'enregistrements de journaux radio- ou télédiffusés, permet de faire avancer les recherches en transcription automatique, en indexation et en archivage de ce type de documents sonores.

1.1. Documents concernés

Les enregistrements de journaux radio- ou télédiffusés présentent un contenu varié : le signal acoustique peut correspondre à de la parole, de la musique ou du bruit, mais également à des mélanges de parole, de musique et de bruit. Ensuite il y a, pour la parole proprement dite, une grande diversité de locuteurs et de thèmes abordés. Plusieurs personnes peuvent intervenir sur un sujet donné successivement, voire simultanément. La qualité acoustique de l'enregistrement (fidélité) peut varier de manière considérable au cours du temps. La durée de tels enregistrements peut varier de quelques dizaines de minutes à plusieurs heures.

Pour l'instant nous nous intéressons plus particulièrement aux nouvelles (journal, flash, revue de presse, incluant météo et bourse, économie, faits de société ...) dans le document sonore. Toute autre forme d'enregistrement (publicités, jeux, fictions....) ne sera pas transcrite.

1.2. Objectifs du manuel

Nous décrivons dans ce qui suit un ensemble de conventions pour structurer, annoter et transcrire des enregistrements de journaux radio- ou télédiffusés. Ces conventions doivent permettre de structurer les enregistrements au niveau du contenu thématique, des locuteurs et de la qualité acoustique. Les informations produites à ce sujet sont nommées annotations. La parole de chaque locuteur doit aussi être transcrite orthographiquement. C'est la transcription proprement dite. La transcription est ici la partie la plus importante et donc sur laquelle le maximum d'attention doit être porté.

Les différentes étapes du travail de transcription sont : la segmentation de la bande son, l'identification des tours de paroles et des locuteurs, l'identification des sections thématiques, la transcription orthographique, et la vérification. Ces étapes peuvent être menées en parallèle ou au contraire appliquées séquentiellement sur de longues portion du signal, suivant le choix du transcripteur.


2. Structuration de la transcription

L'étape d'annotation vise à structurer les enregistrements, c'est-à-dire à segmenter et à décrire le signal acoustique à différents niveaux jugés pertinents pour le traitement ultérieur. Il s'agit ici principalement de l'identité du locuteur, de l'identification du contenu thématique, ou de la qualité du canal de transmission (acoustique).

Actuellement, un document de transcription est structuré de la manière la suivante :

2.1. Enregistrement

2.1.1. Comment transcrire un nouvel enregistrement?

Par la suite, pensez à enregistrer fréquemment votre travail avec [Fichier]/[Enregistrer] ou le raccourci Control-s, surtout si vous n'avez pas activé la sauvegarde automatique. Par ailleurs, un double affichage du signal (un avec une résolution de 10 secondes, l'autre de une minute environ) peut être pratique.

2.1.2. Caractéristiques de l'enregistrement

Les informations associées à un enregistrement, éditées avec [Fichiers]/[Paramètres de l'épisode], sont les suivantes :

Pour des enregistrements de même nature (par exemple sur plusieurs jours) il convient de respecter la même nomenclature pour des programmes identiques.

2.2. Segmentation du signal

Pour fournir des repères temporels par rapport au signal, et pour faciliter le travail de transcription, on segmente le signal en insérant des balises temporelles instantanées de synchronisation (ou frontières).

2.2.1. Où segmenter?

Nous recommandons de faire correspondre ces balises à des groupes de souffle dans le signal ou à des marques de ponctuation dans le langage écrit. Pour des raisons techniques du traitement ultérieur il est également souhaitable de fournir une balise de synchronisation après différents types de problèmes au niveau acoustique (mots mal prononcés, bruit court superposé à un mot...).

En résumé, l'insertion d'une frontière de synchronisation est recommandé dans les situations suivantes :

2.2.2. Comment segmenter?

Vous obtenez une segmentation grossière d'une partie du signal en intervalles de 5 à 20 secondes en moyenne. Il est possible de positionner les frontières plus précisément par la suite.

2.3. Tours et locuteurs

À ce niveau on décrit la succession de tours de parole avec les différents locuteurs qui interviennent.

2.3.1. Comment créer les tours de parole?

A la création d'un tour, le locuteur proposé par défaut est l'avant-dernier utilisé, ce qui est pratique dans le cas d'un dialogue.

2.3.2. Caractéristiques des tours

Pour chaque tour de parole le transcripteur indique :

et éventuellement si cela est demandé :

2.3.3. Caractéristiques des locuteurs

Pour chaque nouveau locuteur le transcripteur indique :

Il est important de respecter l'orthographe des noms. On peut trouver les noms des journalistes et des différentes émissions radio et télé français dans le guide MédiaSid.

On considère tout francophone (français, belge, suisse, québécois) de langue maternelle française.

2.3.4. Parole simultanée

Il faut distinguer différentes situations de parole superposée :

  1. Un locuteur parle, et un autre intervient ponctuellement par des interjections (hum oui ...) ; il convient de noter ces dernières comme de simples bruits se superposant à la parole.
  2. Un locuteur parle en premier plan, et une ou plusieurs voix sont audibles à un niveau moindre (par exemple la voix d'un traducteur est superposée à la voix d'origine) ; seule la voix au premier plan est transcrite et un marqueur de bruit de fond (de type parole ou conversation) doit être utilisé.
  3. Deux locuteurs dialoguent, se coupent mutuellement la parole et parlent simultanément sur plusieurs mots. Le mécanisme de gestion de parole simultanée décrit ci-après peut être appliqué. En cas de difficulté, les segments pourront être annotés comme parole "non-transcrite" .
  4. Si plus de deux locuteurs interviennent à un fort niveau sonore, il faut annoter la portion de signal comme "non-transcrite".

Dans le cas de parole simultanée avec deux locuteurs (cas numéro 3), le deuxième locuteur est identifié dans la fenêtre des paramètres du tour après avoir validé Parole superposée. L'affichage dans le logiciel est par exemple :

Dans la transcription, 1: va identifier les paroles (évidemment découvert que) du premier locuteur (Patricia Martin) et 2: les paroles (enfin n'oubliez pas) du deuxième locuteur Invite1. Les frontières au niveau du signal seront posées au niveau des frontières de mot, de sorte à inclure dans le segment ainsi découpé, toute la parole superposée (par exemple si le mot enfin du locuteur 2 ne démarre qu'à la fin du mot évidemment du locuteur 1, ce dernier est quand même inclus dans le segment).

Cependant la transcription de ce type de signal est très coûteuse. À l'heure actuelle on ne sait pas traiter de manière satisfaisante la parole superposée et les transcriptions, mêmes si elles sont produites, ne sont pas encore exploitées. Le transcripteur peut donc choisir de marquer simplement le signal comme parole superposée sans transcription, avec éventuellement un commentaire décrivant la situation ou le contenu du dialogue.

2.4. Sections et thèmes

La structuration complète d'un enregistrement peut être complexe : une succession d'émissions, composées de sections journalistiques, subdivisées elles-mêmes en rubriques thématiques... En l'état actuel du logiciel, il faut choisir un seul niveau de découpage (en sections journalistiques ou en rubriques thématiques) et les frontières des segments ne sont pas toujours évidentes ; une structuration plus fine est envisagée pour l'avenir.

2.4.1. Que faut-il transcrire?

Un enregistrement peut contenir des segments sans intérêt pour le traitement automatique ultérieur. Les transcriptions sont limitées aux émissions d'information avec les messages d'introduction et de conclusion. Le reste sera annoté non-transcribed, c'est-à-dire inexploitable et ne sera pas transcrit.

2.4.2. Type et thème des sections

Un enregistrement est découpé en sections de 3 types :

2.4.3. Comment indiquer les sections?

2.5. Transcription orthographique

Nous abordons ici les problèmes de transcriptions des segments de parole. Ces conventions concernent d'abord la parole pour laquelle la transcription graphémique peut être ambiguë. Elles sont nécessaires ensuite pour coder les bruits, catégorie dans laquelle on regroupe tous les événements acoustiques non assimilables à des mots (ou entrées lexicales) de la langue.

2.5.1. Comment transcrire?

2.5.2. Conventions de transcription

La transcription graphémique doit permettre de prédire au mieux la prononciation du locuteur. Si une même séquence graphémique permet de générer différentes prononciations (typiquement les dates qu'on peut énoncer en utilisant mille et cent), on adoptera des conventions capables de lever l'ambiguïté. Les conventions concernent aussi les éléments de la langue pour lesquels la transcription n'est pas unique (typiquement les sigles et les épellations, ou encore les nombres qu'on peut écrire sous forme de séquence de chiffres ou comme séquence de mots). Dans tous les cas, les conventions adoptées visent à standardiser la forme graphémique attendue pour minimiser l'ambiguïté, éventuellement en utilisant des balises de prononciation. Les conventions n'étant pas exhaustives le transcripteur peut adopter par défaut une écriture telle qu'on peut la trouver dans des textes de journaux.

Les conventions de transcription sont détaillées dans la 3ème partie.

2.5.3. Transcription ou prononciation ambiguë

La balise de prononciation permet de rajouter par dessus une graphie à prononciation multiple (typiquement les nombres, les sigles/acronymes, noms propres) une description levant l'ambiguïté de la prononciation.

Il est difficile d'énoncer une règle stricte ici. La balise de prononciation permet de spécifier si un mot a été prononcé de manière peu standard, l'interprétation du standard dépendant évidemment du transcripteur. On peut utiliser la balise de prononciation aussi pour n'importe quel autre commentaire relatif à la prononciation d'un mot (par exemple le marquage du -euh typique en fin de mot de l'accent parisien).

2.6. Bruits et conditions acoustiques

Parmi les bruits on peut trouver de la parole ne correspondant pas à des mots proprement dits de la langue (mots tronqués, erronés, ... dont le cas est traité dans les conventions de transcription), des bruits émis par le locuteur (par son appareil phonatoire, mais qui ne sont pas de la parole, et donc dans la plupart des cas non-superposés à la parole : bruits de bouche, de gorge, toux, respirations) ou bien des bruits produits par des sources différentes de l'appareil phonatoire du locuteur. Ces derniers bruits sont plus gênants parce qu'ils se superposent en général à la parole, dégradant ainsi la qualité du signal enregistré. Les sources de bruit peuvent être, sur le lieu d'enregistrement, le locuteur lui-même ou son environnement : bruits d'écouteur ou froissements de papiers en général produits par le locuteur pendant qu'il parle, conversations annexes, radio, télé, claquements de porte, horloge, bruits de voiture, ... Le système d'enregistrement radio-télédiffusé peut également générer des bruits : bruits de micro, craquements de ligne téléphonique, bips, effet Larsen, raccrochement téléphone, ... Enfin certains bruits peuvent provenir du système de diffusion (parasites) ou d'enregistrement (souffle électrique).

2.6.1. Comment noter les bruits ?

Pour les bruits instantanés ou de courte durée, le transcripteur crée une balise de bruit par [Edition]/[Insérer une balise]/[Bruit instantané] ou Control-d, et indique :

Par défaut, les balises de bruit sont affichées entre crochets. Si le bruit s'étend sur plusieurs mots on peut sélectionner les mots et insérer une balise ; les marqueurs de début et de fin seront automatiquement insérés autour.

Pour les bruits de longue durée, une autre procédure est détaillée plus loin (paragraphe 2.6.4).

2.6.2. Bruits de l'appareil phonatoire (non-parole)

Ici nous considérons des bruits produits par l'appareil phonatoire du locuteur enregistré : en général ces bruits ne se superposent pas à la parole, sauf quand la personne parle en chuchotant ou en rigolant : je+[rire] voudrais+[rire] (on peut utiliser aussi des marqueurs de début et de fin : [rire-] je voudrais [-rire]).

Pour ne pas trop compliquer la tâche du transcripteur (à identifier la nature exacte du bruit) les codes de bruit marqués en gras sont à utiliser par défaut pour un type de bruit donné. Si le transcripteur a envie de marquer plus particulièrement un bruit donné, il peut choisir un des codes proposés en retrait de la marge ; cependant, ces différences ne sont actuellement pas exploitées.

Suggestion : le transcripteur peut accompagner les codes de bruit de balises temporelles de synchronisation (afin de poser un repère pour la segmentation automatique).

Respiration
  1. acte physiologique :
  2. acte volontaire :
Autres bruits de bouche et de gorge

2.6.3. Bruits extérieurs à l'acte de parole

Nous regroupons dans cette section tous les bruits produits en dehors de l'appareil phonatoire du locuteur. La plupart de ces bruits peuvent se produire à n'importe quel instant de l'enregistrement, et peuvent donc se superposer au signal de parole, dégradant ainsi sa qualité.

Tout bruit de nature indéterminée ou non-répertorié dans ce document peut être noté comme suit :

Bruits dus à l'environnement et au matériel d'enregistrement

2.6.4. Changement de conditions acoustiques

Lorsqu'un bruit s'étend sur une longue durée (bruit de fond persistant), un système de marquage spécifique doit être utilisé. La balise de bruit de fond est une balise instantanée décrivant un changement durable ans les conditions acoustiques. L'information apportée par cette balise reste valable à l'intérieur d'un même enregistrement jusqu'à l'apparition d'une nouvelle balise de bruit de fond, ou bien jusqu'à la fin de l'enregistrement.

Le transcripteur positionne le curseur temporel à l'instant du changement de conditions acoustiques, choisit [Segmentation]/[Insérer un bruit de fond] et indique :

Une icône de note de musique apparaît dans le texte à la position courante.

Si le changement de conditions acoustiques est associé aux conditions d'enregistrement et lié au tour de parole (par exemple, une intervention téléphonique de très mauvaise qualité), il sera plus pratique d'utiliser le champ Fidelité=low dans les paramètres du tour de parole [Segmentation]/[Paramètres du tour...] , plutôt que la balise de bruit de fond.

2.7. Commentaires

Cette balise permet au transcripteur de commenter l'enregistrement (la parole ou les conditions acoustiques ) à transcrire. Le transcripteur peut également faire ici des remarques sur ce qui lui paraît utile pour faciliter la transcription.


3. Conventions de transcription

Concernant la transcription l'idée de base consiste à focaliser l'attention sur ce qui apparaît en premier plan. Si de multiples sources sonores sont présentes il convient de focaliser la transcription sur la source la plus émergente. Par exemple on entend en arrière-plan une personnalité parler une langue étrangère, un traducteur donnant la version française en premier plan. Il suffit de transcrire le traducteur en signalant de la parole en bruit de fond. On entend de la musique en premier plan avec des commentaires en arrière-plan. On peut annoter un tel segment comme musique avec comme bruit de fond de la parole (non transcrite). Si deux locuteurs se 'disputent' le premier plan, on transcrit les deux grâce au mécanisme de parole superposée. Cependant de manière générale on fait l'hypothèse qu'il n'y a qu'une source sonore unique au premier plan.

De manière générale, dans tous les segments de parole qui ont été annotés transcribed (sections report ou filler), tout ce qui est entendu doit être transcrit : la transcription doit fournir la séquence orthographique exacte correspondant à ce que le locuteur a prononcé, à laquelle il faut rajouter dans la mesure du possible tous les événements extra-lexicaux présents dans le signal acoustique (les répétitions, hésitations, troncatures, bruits).

3.1. Conventions d'écriture

Le produit de la transcription est essentiellement une séquence de mots séparés par des espaces, entre lesquels s'intercalent des balises identifiant les bruits, les conditions acoustiques et diverses informations permettant de lever l'ambiguïté de prononciation. Autant que possible, il convient de respecter l'orthographe standard des mots. La ponctuation sert à marquer les frontières syntaxiques et prosodiques claires.

Dans la suite les icônes représentent :

3.1.1. Majuscules/minuscules

Tout est transcrit en minuscules (pas de majuscule systématique en début de phrase). L'emploi des majuscules est réservé à la transcription des épellations et des sigles, au début des noms propres et dans des formules de politesse.

Pour les noms propres d'organisation assimilables à des marques (tels que les journaux, les banques...) et utilisant des noms communs, les noms communs en question sont écrits avec des initiales majuscules.

Dans le doute, on peut suivre la pratique des journeaux qui peuvent ne mettre en majuscules que le premier mot d'un sigle :

Pour les noms de lieux on adopte la convention d'écrire en minuscule le nom commun. S'il est suivi d'un nom propre, celui-ci a évidemment son initiale en majuscule.

Des mots communs ayant fonction de nom propre (par exemple : titres d'émissions, de films, de livre, d'institutions ) s'écrivent entre guillemets. À l'intérieur des guillemets les noms communs sont écrits en minuscules.

Par exemple :

Pour les sigles étendus (c'est-à-dire prononcés en toutes lettres) la suite de mots composant le sigle est entourée de guillemets. Les noms communs y sont écrits en minuscules.

Enfin, on met une majuscule à monsieur (ainsi qu'à madame, mademoiselle ...) dans les formules de politesse comme indiqué dans l'exemple :

mais

3.1.2. Ponctuations

Il est recommandé de mettre des marques de ponctuation là où il y a des pauses dans le signal qui correspondent à des frontières syntaxiques, ou bien dans le cas où l'absence de ponctuation engendre une ambiguïté dans le texte.

Attention : il faut précéder les signes de ponctuations d'un blanc.

Les marqueurs de ponctuations sont indicateurs du mode de l'énoncé :
conclusif ''.'', interrogatif ``?'', exclamatif ``!'', hésitation ``...'', etc.
Ces informations sont fortement liées à la prosodie et à la compréhension. Il est recommandé d'accompagner les marques de ponctuation forte (. ? !) d'une marque temporelle dans le signal (balise de synchronisation , permettant de segmenter).

3.1.3. Apostrophe

Il n'y a pas de séparateur entre l'apostrophe et le mot suivant.

3.1.4. Trait d'union

Les mots liés par un trait d'union sont écrits normalement sans séparation par un blanc.

Attention : on ne relie pas par trait d'union les suites de noms propres. On peut marquer graphiquement le lien par un slash entouré de blancs.

3.1.5. Sigles

Par défaut : les sigles sont notés par des majuscules non séparés par des blancs.

La distinction entre un sigle prononcé comme un mot et un sigle prononcé comme une suite de lettres se fera par la balise de prononciation, uniquement dans les cas d'ambiguïté (dans l'exemple qui suit, les caractères gras correspondent à l'affichage de la balise ; le transcripteur la produit avec [Edition] / [Insérer une balise]/ [Prononciation] ou Alt-= puis en sélectionnant les options appropriées).

On peut observer des expressions complexes composées de sigles et de mots ou de fragments de mots (acronymes,...), par exemple :

3.1.6. Abréviations

Il existe dans la langue des abréviations standards comme etc pour et caetera. Les transcripteurs utilisent etc sans point accolé.

3.1.7. Nombres

Les nombres sont transcrits sous forme de suite de chiffres si la prononciation correspond à la syntaxe standard de prononciation des nombres (écrire la suite de mots est toujours autorisé, mais cela demande plus de travail et peut générer plus d'erreur de la part du transcripteur).

Attention: il ne faut pas introduire d'espace entre les chiffres!

Attention: il ne faut pas écrire: 1,50 francs !

3.1.8. Dates

Pour les dates dont la prononciation peut être ambiguë (dix-neuf cent ou mille neuf cent), on utilisera une balise de prononciation dans le cas non-standard.

3.1.9. Chiffres romains

Ils peuvent être utilisés dans les noms de roi ou de pape (qui servent souvent à désigner des lieux publics ). La transcription se fait avec les chiffres romains, en ajoutant une balise de prononciation.

3.1.10. Adresses internet

Pour les adresses internet (URL ou e-mail), la transcription se fait en notant l'adresse telle qu'elle s'écrit (habituellement tout en minuscules), et en ajoutant une balise de prononciation.

3.2. Mots hors-lexique

3.2.1. Mots d'origine étrangère, changement de langue

Une balise de changement de langue permet d'identifier un mot ou une suite de mots qui ne font pas partie du parler français.

Les mots d'origine étrangère (et absorbés dans la langue avec une prononciation donnée) ne sont pas marqués (par exemple week-end, playstation, business prononcés à l'anglaise). On considère ces prononciations comme ``standard''.

En revanche des prononciations peu communes devront être signalées (par exemple les correspondants à l'étranger démarrant leur intervention par buon giorno di Roma, good morning from London... ).

Il est inutile d'ajouter un marqueur d'orthographe incertaine aux mots étrangers, même si la transcription est simplement acoustique. Un segment de longue durée en langue étrangère doit être annoté non-trans.

3.2.2. Noms propres étrangers

Les noms propres Beatles, Clinton, les sigles CNN, CBS prononcés à l'anglaise correspondent au standard ; à l'inverse une prononciation à la française inhabituelle doit être spécifiée par une balise de prononciation :

Pour des noms propres comme Morgan le standard dépend évidemment du contexte (Michèle Morgan ou Nelson Morgan par exemple). Mais pour des noms propres comme Benjamin, le contexte peut ne pas être suffisant : Benjamin Netanyahou peut admettre différentes prononciations.

3.2.3. Mots techniques, nouveaux mots, noms propres inconnus

Cette section concerne les problèmes d'écriture qui se posent pour des néologismes, entités idiosyncrasiques, des mots techniques .

Dans un contexte particulier des mots nouveaux peuvent apparaître. Ces mots ne font pas partie du vocabulaire de la langue courante, et sont souvent ignorés des gens extérieurs à ce domaine particulier. Ceci est vrai pour des domaines techniques spécialisés, mais se rencontrent fréquemment aussi dans le milieu journalistique (par exemple le terme de pu-putch a été employé plusieurs fois début décembre 98). Ces mots sont à considérer comme des entités lexicales à part entière.

Lorsque l'orthographe se déduit sans ambiguïté, il suffit de l'écrire sans balise supplémentaire :

Des noms propres inconnus (souvent d'origine étrangère) peuvent admettre plusieurs graphies en français. Afin de pouvoir normaliser ces graphies lors d'un traitement ultérieur, il est important de marquer les mots qui posent problèmes.

Règle : tous, mots techniques, mots idiosyncrasiques, noms propres dont la graphie est incertaine (non figée), seront précédés par deux accents circonflexes :

Exemples :

De manière équivalente, une balise de commentaire lexical peut être utilisée :

3.3. Spécificités du langage parlé

Lorsqu'on écoute attentivement le signal, on se rend compte que des parties de mots, voire des mots entiers peuvent avoir disparus.

On peut être tenté de marquer graphémiquement les réductions produites par le locuteur. La consigne à suivre ici est de respecter l'orthographe standard: ne pas marquer, dans l'écriture, l'élision ou la réduction présente dans la parole. On peut utiliser la balise de prononciation ou la balise de commentaire, si on veut décrire les phénomènes observés.

3.3.1. Onomatopées

Les onomatopées font partie de la langue et sont à transcrire au même titre que les autres mots. Les plus fréquentes existent en général en tant que mots graphémiques, pour toutes les autres on devra créer des mots correspondants et maintenir cette liste à jour.

Exemples :

3.3.2. Répétitions

Les répétitions ne portent pas d'information et on tenterait naturellement de les éliminer dans un processus de transcription d'une dictée. Elles doivent être transcrites comme tout autre mot.

3.3.3. Elisions & formes réduites

La réduction peut porter sur un seul mot ou une suite de mots, par exemple:

Remarque: La réduction de qu'il en qu'i' est transcrite qu'il et non pas qui.

Autres exemples:

On peut écrire (il) y a si le il est absent de manière évidente. Mais nous tenons à souligner qu'il est inutile de faire des écoutes répétées pour décider si le il est présent ou non.

Dans le langage parlé le ne de la négation est très souvent omis. Dans ce cas on ne l'écrit pas.

3.3.4. Troncatures

Les mots tronqués peuvent provenir de deux origines différentes : soit le locuteur s'arrête avant la fin du mot, soit le locuteur est coupé par le système d'enregistrement. Dans ce dernier cas le mot peut être tronqué au début : le locuteur a commencé à parler avant le début de l'enregistrement. La troncature est marquée par des parenthèses. Si le mot tronqué est connu (grâce au contexte) on note la partie manquante du mot entre parenthèses.

notation : ()

3.3.5. Lapsus

Il arrive que la prononciation erronée soit un mot correct de la langue. Dans ce cas, on transcrit les mots tel qu'ils ont été prononcés.

3.3.6. Prononciation erronée

Si on arrive à identifier le mot mal prononcé, on écrit le mot correct précédé d'une étoile.

notation : *mot-correct

La prononciation effective peut être signalée par une balise :

S'il s'agit de parole inintelligible, on utilise la notation suivante :
notation : [pi]

Si la parole est inintelligible parce qu'il s'agit de parole inaudible et faible, on peut noter ce type d'événement, si on veut la différencier du cas ci-dessus, par :
notation : [pif]

Le transcripteur est invité à insérer une balise de synchronisation près du mot (juste après le mot) mal prononcé (afin de poser un repère pour la segmentation automatique dans cette zone erronée).

3.3.7. Liaisons

On ne marque pas les liaisons dans la transcription orthographique. Les liaisons erronées sont relevées par la balise de prononciation.

3.3.8. Épellations

Toutes les lettres sont notées en majuscules séparées par des blancs, p. ex :
P A R I S
L'épellation des lettres accentuées peut conduire à différentes transcriptions, suivant l'énoncé du locuteur, par exemple :

Remarque : l'épellation des lettres redoublées peut donner lieu à différentes transcriptions. Par exemple le locuteur doit épeler Vannes :

3.3.9. Ponctuation verbalisée

Si un locuteur énonce la ponctuation (comme s'il faisait une dictée, verbalized punctuation) on écrit le mot correspondant préfixé avec le symbole de ponctuation.


4. Vérification

4.1. Comment vérifier la transcription ?

transcriber-1.5.1.1/doc/de/userMenu.html0000644000175000017500000001030710122047732015654 0ustar rtrt

Retour à la présentation

Manuel du transcripteur

1. Introduction

2. Structuration de la transcription

2.1. Enregistrement

2.2. Segmentation du signal

2.3. Tours et locuteurs

2.4. Sections et thèmes

2.5. Transcription orthographique

2.6. Bruits et conditions acoustiques

2.7. Commentaires

3. Conventions de transcription

3.1. Conventions d'écriture

3.2. Mots hors-lexique

3.3. Spécificités du langage parlé

4. Vérification

transcriber-1.5.1.1/doc/de/menu_web.html0000644000175000017500000000231710122047732015654 0ustar rtrt

in English    en fran\xe7ais

Présentation

Documentation
Fonctionnalités
Manuel du transcripteur
Manuel de rfrence

Distribution

Autres informations...
Crédits
transcriber-1.5.1.1/doc/de/contact.html0000644000175000017500000000360210122047732015504 0ustar rtrt Transcriber's support Mailing-Liste

Wenn Sie über künftige Versionen des Transcribers informiert werden möchten, lassen Sie sich bitte durch ein Mail an  majordomo@etca.fr  in der "transcriber-announce"-Mailing-Liste registrieren, und geben Sie im Nachrichtenfeld folgende Zeile ein:
subscribe transcriber-announce Vorname Nachname <E-Mail-Adresse>
Beispiel: subscribe transcriber-announce John Doe jdoe@freemail.org

Möchten Sie sich an der Diskussion über die Weiterentwicklung von Transcriber beteiligen, lassen Sie sich bitte durch ein Mail an dieselbe Adresse, aber mit folgender Eingabe im Nachrichtenfeld, in der "transcriber-devel"-Mailing-Liste registrieren:
subscribe transcriber-devel Vorname Nachname <E-Mail-Adresse>
Beispiel: subscribe transcriber-devel John Doe jdoe@freemail.org

Kontakt

Wenn Sie glauben, im Transcriber einen Fehler entdeckt zu haben, senden Sie bitte ein Mail mit einer ausführlichen Beschreibung des aufgetretenen Fehlers an transcriber-bug-report@etca.fr..
Haben Sie eine Frage, auf die diese Site keine Antwort gibt, oder möchten Sie Vorschläge für weitere Verbesserungen machen, die noch nicht in der  To-do-Liste (Vormerkliste optionaler Punkte) aufgeführt sind, können Sie ein Mail an transcriber-request@etca.fr. senden.
  transcriber-1.5.1.1/doc/de/gpl.html0000644000175000017500000005032210122047732014634 0ustar rtrt GPL (adaptation franaise non officielle)

GPL

Introduction

This is an unofficial translation of the GNU General Public License into French. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL--only the original English text of the GNU GPL does that. However, we hope that this translation will help French speakers understand the GNU GPL better.

Voici (http://www.linux-france.org/article/these/gpl.html) une adaptation non officielle de la Licence Publique Gnrale du projet GNU. Elle n'a pas t publie par la Free Software Foundation et son contenu n'a aucune porte lgale car seule la version anglaise de ce document dtaille le mode de distribution des logiciels sous GNU GPL. Nous esprons cependant qu'elle permettra aux francophones de mieux comprendre la GPL.

Licence Publique Gnrale GNU Version 2, Juin 1991

Copyright © Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307
tats-Unis, 1989, 1991.
La copie et la distribution de copies exactes de ce document sont autorises, mais aucune modification n'est permise.

Prambule

Les licences d'utilisation de la plupart des programmes sont dfinies pour limiter ou supprimer toute libert l'utilisateur. l'inverse, la Licence Publique Gnrale (General Public License) est destine vous garantir la libert de partager et de modifier les logiciels libres, et de s'assurer que ces logiciels sont effectivement accessibles tout utilisateur.

Cette Licence Publique Gnrale s'applique la plupart des programmes de la Free Software Foundation, comme tout autre programme dont l'auteur l'aura dcid (d'autres logiciels de la FSF sont couverts pour leur part par la Licence Publique Gnrale pour Bibliothques GNU (LGPL)). Vous pouvez aussi appliquer les termes de cette Licence vos propres programmes, si vous le dsirez.

Libert des logiciels ne signifie pas ncessairement gratuit. Notre Licence est conue pour vous assurer la libert de distribuer des copies des programmes, gratuitement ou non, de recevoir le code source ou de pouvoir l'obtenir, de modifier les programmes ou d'en utiliser des lments dans de nouveaux programmes libres, en sachant que vous y tes autoris.

Afin de garantir ces droits, nous avons d introduire des restrictions interdisant quiconque de vous les refuser ou de vous demander d'y renoncer. Ces restrictions vous imposent en retour certaines obligations si vous distribuez ou modifiez des copies de programmes protgs par la Licence. En d'autre termes, il vous incombera en ce cas de :

Nous protgeons vos droits de deux faons : d'abord par le copyright du logiciel, ensuite par la remise de cette Licence qui vous autorise lgalement copier, distribuer et/ou modifier le logiciel.

En outre, pour protger chaque auteur ainsi que la FSF, nous affirmons solennellement que le programme concern ne fait l'objet d'aucune garantie. Si un tiers le modifie puis le redistribue, tous ceux qui en recevront une copie doivent savoir qu'il ne s'agit pas de l'original afin qu'une copie dfectueuse n'entache pas la rputation de l'auteur du logiciel.

Enfin, tout programme libre est sans cesse menac par des dpts de brevets. Nous souhaitons tout prix viter que des distributeurs puissent dposer des brevets sur les Logiciels Libres pour leur propre compte. Pour viter cela, nous stipulons bien que tout dpt ventuel de brevet doit accorder expressment tout un chacun le libre usage du produit.

Les dispositions prcises et les conditions de copie, de distribution et de modification de nos logiciels sont les suivantes :

Stipulations et conditions relatives la copie, la distribution et la modification



FIN DES TERMES ET CONDITIONS

Comment appliquer ces directives vos nouveaux programmes

Si vous dveloppez un nouveau programme et dsirez en faire bnficier tout un chacun, la meilleure mthode est d'en faire un Logiciel Libre que tout le monde pourra redistribuer et modifier selon les termes de la Licence Publique Gnrale.

Pour cela, insrez les indications suivantes dans votre programme (il est prfrable et plus sr de les faire figurer au dbut de chaque fichier source ; dans tous les cas, chaque module source devra comporter au minimum la ligne de copyright et indiquer o rsident toutes les autres indications) :


((une ligne pour donner le nom du programme et donner une ide de sa finalit))
Copyright (C) 19xx ((nom de l'auteur))

Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Gnrale GNU publie par la Free Software Foundation (version 2 ou bien toute autre version ultrieure choisie par vous).

Ce programme est distribu car potentiellement utile, mais SANS AUCUNE GARANTIE, ni explicite ni implicite, y compris les garanties de commercialisation ou d'adaptation dans un but spcifique. Reportez-vous la Licence Publique Gnrale GNU pour plus de dtails.

Vous devez avoir reu une copie de la Licence Publique Gnrale GNU en mme temps que ce programme ; si ce n'est pas le cas, crivez la Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, tats-Unis.


Ajoutez galement votre adresse lectronique, le cas chant, ainsi que votre adresse postale.

Si le programme est interactif, faites-lui afficher un court avertissement du type de celui-ci chaque invocation :


...(nom du programme) version 69, Copyright (C) 19aa nom de l'auteur

...(nom du programme) est fourni sans AUCUNE GARANTIE.
Pour plus de dtails, tapez `g'.

Ce programme est libre et vous tes encourag le redistribuer sous certaines conditions ; tapez `c' pour plus de dtails.


Les commandes hypothtiques `g' et `c' doivent afficher les sections appropries de la Licence Publique Gnrale GNU. Bien entendu, vous pouvez implanter ces commandes comme bon vous semble : options dans un menu, ou bien accessibles d'un clic de souris, etc., tout dpend de votre programme.

Si vous officiez en tant que programmeur, n'omettez pas de demander votre employeur, votre tablissement scolaire ou autres de signer une dcharge stipulant leur renoncement aux droits qu'ils pourraient avoir sur le programme :


...((employeur, cole...)) dclare par la prsente ne pas revendiquer de droits sur le programme (nom du programme) ralis par ...((nom de l'auteur)).
((signature du responsable)), ...((date)), ...((nom et qualit du responsable)).

La Licence Publique Gnrale ne permet pas d'inclure votre programme dans des logiciels sous licence commerciale spcifique. Si votre programme est une fonction de bibliothque, vous jugerez probablement plus judicieux de le faire relever de la Licence Gnrale de Bibliothque GNU (LGPL) plutt que de la prsente.



Last modified: Tue Sep 29 22:41:45 MET DST 1998 transcriber-1.5.1.1/doc/de/history.html0000644000175000017500000007333210122047732015561 0ustar rtrt Transcriber's History

Chronologie der Transcriber-Versionen



Version 1.4.3

Herausgegeben am 11 Oktober 2000
benötigt Tcl/Tk 8.0-8.3, Snack 1.7 ooder vorzugsweise  2.0.1, tcLex 1.2

Neue oder geänderte Funktionen:

Implementierung bzw. Behebung von Fehlern:

Version 1.4.2

Herausgegeben am 6. Januar 2000
Tcl/Tk 8.0-8.2, Snack 1.6, tcLex 1.2 erforderlich

Neue bzw. geänderte Funktionen:

Implementierungsänderungen bzw. Behebung von Fehlern:

Version 1.4.1 (bietet Unicode-Unterstützung unter Tcl/Tk 8.1.1 oder höher)

Herausgegeben am 28 Oktober 1999
Tcl/Tk 8.0-8.2, Snack 1.6, tcLex 1.2erforderlich

kompiliert unter Linux/x86 (Debian 1.3/2.0), Linux/alpha, Solaris (SunOS 5.5), SGI (IRIX 6.2).

Neue bzw. geänderte Funktionen:
 

Implementierungsänderungen bzw. Behebung von Fehlern:

Version 1.4 (größtenteils eine stabile Version von 1.3 beta)

Herausgegeben am 27. September 1999
Tcl/Tk 8.0-8.2, Snack 1.6, tcLex 1.2 erforderlich
kompiliert unter Linux/x86 (Debian 1.3/2.0), Linux/alpha, Solaris (SunOS 5.5), SGI (IRIX 6.2).

Neue bzw. geänderte Funktionen:

Implementierungsänderungen bzw. Behebung von Fehlern:

Version 1.3b7

Herausgegeben am 6. Juli 1999
Tcl/Tk 8.0 oder 8.1, Snack 1.5p2 oder 1.6a2 (1.6b1 unter Linux  nicht verwenden), tcLex 1.1.3 (zusammen mit Tcl/Tk 8.1 keine ältere Version verwenden) erforderlich
kompiliert unter Linux/x86 (Debian 1.3/2.0), Linux/alpha, Solaris (SunOS 5.5), SGI (IRIX 6.2), Windows NT.

Neue bzw. geänderte Funktionen:

Implementierungsänderungen bzw. Behebung von Fehlern:

Version 1.3b6

Herausgegeben am 17. Mai 1999
Neue bzw. geänderte Funktionen: Implementierungsänderungen bzw. Behebung von Fehlern: Noch zu beheben bzw. nicht implementiert:

Version 1.3b5

Herausgegeben am 23. März 1999

Neue bzw. geänderte Funktionen:

Implementierungsänderungen bzw. Behebung von Fehlern:

Version 1.3b4

Herausgegeben am 16. März 1999
Neue bzw. geänderte Funktionen: Implementierungsänderungen bzw. Behebung von Fehlern:

Version 1.3b3

Herausgegeben am 7. März 1999

Neue bzw. modifizierte Funktionen:

Implementierungsänderungen bzw. Behebung von Fehlern:

Version 1.3b2

(Nicht öffentlich) herausgegeben am 12. Februar 1999

Neue bzw. geänderte Funktionen:

Implementierungsänderungen bzw. Behebung von Fehlern:

Version 1.3b1

Herausgegeben am 21. Januar 1999 - Test unter Linux (Debian 1.3/2.0), Solaris (SunOS 5.5), SGI (IRIX 6.2).

Neue bzw. geänderte Funktionen:

Implementierungsänderungen:

Version 1.2

Herausgegeben am 16. September 1998 - Test unter Linux (Debian 1.3 und Redhat 4.3), Solaris, SGI (IRIX 6.2).

Neue Funktionen:

Behebung von Fehlern: Implementierungsänderungen:

Version 1.1

Herausgegeben am 26. Juni 1998 - Test unter Linux (Debian), Solaris, SGI.

Änderungen:

Version 1.0

Herausgegeben am 25. Mai 1998 - Entwicklung unter PC/Linux (Debian 1.3); Test unter Sun Solaris.
 
  transcriber-1.5.1.1/doc/en/0000755000175000017500000000000010605162351013175 5ustar rtrttranscriber-1.5.1.1/doc/en/refFrame.html0000644000175000017500000000033707510315716015623 0ustar rtrt Transcriber's Interface transcriber-1.5.1.1/doc/en/faq.html0000644000175000017500000000421507510315716014642 0ustar rtrt Frequently Asked Questions about Transcriber

Why did we start developping Transcriber?

In the framework of a project for automatic transcription of Broadcast News in French, we needed a corpus of manually transcribed Broadcast News material to train and develop the system. For that purpose, a suitable software environment was required. The LDC already had the experience of creating Broadcast News corpora. However, the software environment they use ran on high-end servers or rely on third-party software. We therefore looked for other solutions (which are detailed in an article presented at the LREC conference; see Question 3 below), but none was fully satisfactory, and we therefore decided to build our own tool, in collaboration with the LDC.

Why did we release Transcriber as Free Software?

There are several reasons:

To understand better why one might be willing to distribute software freely, you can read about the philosophy of free software (mirror in Europe) promoted by the FSF.

transcriber-1.5.1.1/doc/en/refMenu.html0000644000175000017500000001364207510315716015500 0ustar rtrt

Back to the presentation

Reference Manual

  1. Startup
  2. Windows
  3. Transcription file
  4. Signal file
  5. Signal management
  6. Edition
  7. Episode
  8. Segmentation
  9. Speech turns and speakers
  10. Sections and topics
  11. Background noise
  12. Events and comments
  13. Keyboard shortcuts
  14. Options and interface configuration
  15. Other features transcriber-1.5.1.1/doc/en/inst_142.html0000644000175000017500000000464007510315716015440 0ustar rtrt Transcriber's Installation for Windows NT

    Installation of version 1.4.2 for Windows NT

    Here are the steps involved in downloading and installing the Windows version of Transcriber.

    (1) Install Tcl/Tk 8.2

    From URL

    download "Windows 95 and Windows NT self-extracting installer" (tcl823.exe)
    Double-click on the .exe file to install Tcl/Tk.
    The machine will reboot after installation.

    (2) Install Snack 1.6

    From URL

    download "Binary Release for Windows 95/98/NT with Tcl/Tk 8.1.1 or later" (snack165n.exe)
    Double-click on the .exe file to install Snack.

    (3) Install Transcriber 1.4.2

    From the French site

    or from the US site download transcriber1.4.2.exe
    Double-click on the .exe file to install Transcriber.

    In each case, the installer program will ask you what folder to use.
    For Transcriber, the default is

      C:\Program Files\Transcriber
    (4) Start Transcriber

    In the start menu, within the program sub-menu, a "Transcriber" menu is now available. You can start Transcriber by choosing "Main.tcl". The documentation is available in the same menu and is viewed from your browser. You can also place a shortcut to Main.tcl (for the default installation location, it will be found in C:\Program Files\Transcriber\tcl) on your desktop, renamed "Transcriber", as a more convenient way of accessing the program. transcriber-1.5.1.1/doc/en/installation.html0000644000175000017500000010163710166464372016606 0ustar rtrt Installation of Transcriber 1.5.0

    Installation of Transcriber 1.5.0

    Installation from sources


    Binary installation


    Linux installation from sources

    Transcriber relies on several softwares or libraries that you need to install first : Tcl/Tk, Snack, tcLex and optionally NIST/Sphere. The complete procedure is explained in the following steps:

    • If Tcl/Tk version 8.0 or higher is not already installed on your system, get it on Tcl developper Xchange website :

        http://www.tcl.tk/software/tcltk/choose.html

      or one of its mirrors and unpack them:

        $ gunzip -c tcl.tar.gz | tar xf -

      Choose an installation directory (e.g. < size="2">/usr/local) and follow instructions found in tcl/README and tk/README (configure with --enable-shared option). For Tcl under Unix, it will be something like:

        $ cd tcl/unix
        $ ./configure --enable-gcc --enable-shared --prefix=/usr/local
        $ make
        $ make install

      Do the same for Tk. If you choose to install into a different directory, make sure to set the environnement variables of your system (e.g., PATH and LD_LIBRARY_PATH) to the right values.

    • This step is needed only if you plan to use Sphere sound file format with Snack. Get NIST/Sphere archive:

        ftp://jaguar.ncsl.nist.gov/pub/sphere_2.6a.tar.Z

      Unpack it in a sibling directory of this distribution

        $ zcat sphere_2.6a.tar.Z | tar xf -

      Then install it:

        $ cd nist; sh src/scripts/install.sh

      You will be asked the target platform. For Linux, choose 10 (i.e. custom) and change following values (the other ones should be OK):

      1. What is/are the Compiler Flags: -O -Wall -fPIC

      2. What is/are the Architecture: INTEL

      NB - For Linux Distributions older than Redhat 5.x and Debian 2.x, you need to comment the following line inside the file nist/src/lib/sp/exit.c : extern char *sys_errlist[]; (thanks to Dafydd Gibbon for this information) For the courageous ones, a patch is given in the Transcriber source distribution in src/patch-sphere for a dynamic compilation of Sphere libs under Linux.

    • Get the last Snack library. Depending on whether you want to compile it yourself or not, download source or binary library release at :

        http://www.speech.kth.se/snack/

      If you want to compile it yourself, then extract it:

        $ gunzip -c snack.tar.gz | tar xf -

      Then follow the instructions in README and install Snack, e.g. with:

        $ cd snack/unix
        $ ./configure --prefix=/usr/local
        $ make
        $ make install

      NB:

      1. If './configure' fails, you have probably Tcl/Tk installed in a non standard directory; give it with --with-tcl and --with-tk options.

      2. for use with Tcl/Tk version 8.0, add the option --disable-stubs

      3. Be sure to get the latest release

      4. In order to use Sphere format, configure with --with-nist=...

      5. Test Snack demos!

    • Get tcLex 1.2 module:

        http://www.multimania.com/fbonnet/Tcl/tcLex/

      extract it:

        $ gunzip -c tcLex1.2a1.tar.gz | tar xf -

      Then follow the instructions in README.txt and install tcLex, e.g. with:

        $ cd tcLex1.2a1/src
        $ chmod a+x configure install-sh
        $ ./configure --prefix=/usr/local
        $ make
        $ make install

      NB - You need to have the complete sources of Tcl for building this extension, since it relies on specific header files not installed by standard Tcl installation.

    • Extract the source archive of Transcriber, compile and install it:

          $ gunzip -c Transcriber-1.4.4.tar.gz | tar xf -
          $ cd Transcriber-1.4.4/src
          $ ./configure --with-snack=... --with-tcl=... --with-tk=... --prefix=...
          $ make
          $ make install
    As options to the ./configure command, you have to give the directory where Snack archive was extracted (--with-snack=...), the directories where Tcl and Tk were installed (--with-tcl=...--with-tk=...), and the directory where you will install Transcriber (--prefix=...). For use with Tcl/Tk version 8.0, add the option --disable-stubs.
    • Test it !

        $ trans

      You will be asked to open a sound signal or a transcription; some are found in the 'demo' sub-directory


    Windows installation from sources

    The installation in a Windows environment looks like the Linux one because it also uses the tools configure and make. It consists in:

      • installing the tools, MinGW and MinSYS, to enable to compile using make and configure on Windows.

      • installing the libraries TcLex and Snack, used by Transcriber

      • using a kit (TclKit) that embeds Tcl and Tk to source Transcriber

    Hereunder, the different steps are detailed:

    • Download Transcriber source package for Windows at http://sourceforge.net/project/showfiles.php?group_id=40021&package_id=51790 and extract it in c:\TransSource

    • Download the MinGW binary at http://www.mingw.org/ and install it in c:\MinGW (not in c:\Program Files because it does not handle paths with white spaces). MinGW ("Minimalistic GNU for Windows") refers to a set of runtime headers, used in building a compiler system based on the GNU GCC and binutils projects. It compiles and links code to be run on Win32 platforms, providing C, C++ and Fortran compilers plus other related tools.

    • Download the MinSYS binary at http://www.mingw.org/ install it in c:\MSYS. MinSYS or Minimal SYStem is a POSIX and Bourne shell environment use with MinGW. It provides a hand picked set of tools to allow a typical configuration script with Bourne syntax to execute. This allows most of the GNU packages to create a Makefile just from executing the typical configure script which can then be used to build the package using the native MinGW version of GCC.

    • Download Tcl/Tk binary library at http://www.mingw.org/ and install it in c:\MinGW . Those libraries are used during the linkage step of the Transcriber compilation.

    • Launch MinGW (by cliquing on its icon) and move to c:\TransSource\src directory:

          cd c:\TransSource\src

          Launch the compilation/installation precising Tcl and Tk library paths and Transcriber installation directory

          ./configure --with-tcl=/mingw/lib --with-tk=/mingw/lib/ --prefix=c:\TransBin

          make

          make install

    • Download TclLex windows binary library at http://membres.lycos.fr/fbonnet/Tcl/tcLex/ and extract it in c:\TransBin\lib\TcLex12a1

    • Download the last Snack binary release for windows with Tcl/Tk at http://www.speech.kth.se/snack/download.html . Extract it and copy the content of Snack\bin\windows (ie all .dll, .lib and snack.tcl and pkgIndex.tcl) to c:\TransBin\lib\Snack

    • Download Tclkit for Windows at http://www.equi4.com/tclkit.html and copy it in c:\TransBin. This tool embeds in a single executable file all what you need to source Tcl an Tk script files. To source Transcriber, you just have to launch Tclkit and type :

          source c:\TransBin\lib\Transcriber1.4\tcl\Main.tcl

          Note, that if you prefer to use Active Tcl (http://www.activestate.com/), in that case you don't have to install Snack because it is included in it. And if you want to launch Transcriber, you just have to launch Wish and then type:

          source c:\TransBin\lib\Transcriber1.4\tcl\Main.tcl

          The Tclkit solution is preferred to Active Tcl because it enables to create a single setup package for Transcriber which includes: the Transcriber binary and script files, the Snack library, the TcLex library, Tcl and Tk. And nothing else is needed to run Transcriber.


    Mac OS installation from sources

    The installation procedure described here, just concerns the Mac OS X 10.3 version, usually called « panther ».

        - paths and compilation flags of Makefile should be modified, depending on your configuration (the one that has been used to create the binary version is present in the 'snapshot' version of Transcriber on SourceForge in the file src/Makefile-MacOSX)

        - then 'make'



    Linux binary installation
    • Download the last Linux binary distribution at http://sourceforge.net/project/showfiles.php?group_id=40021

    • Make sure you have an installed version of Tcl/Tk 8.0 or higher and get the binary archive for your system (e.g. Linux, Solaris...) matching your version of Tcl/Tk.

    • Switch to the place where you want to install the tool, e.g.:

        $ cd /usr/local

      If you choose to install into a non-standard directory, make sure to set the environnement variables of your system (e.g., PATH and LD_LIBRARY_PATH) to the right values.

    • Extract the files from the archive:

        $ gunzip -c Transcriber-1.5.0.tar.gz | tar xf -
    • Launch the tool:

        $ trans

      You will be asked to open a transcription or a sound signal to start a new transcription.



    Windows binary installation


    Mac OS binary installation
    • Installation guide for Mac OS X 10.3:
    • Download the last Mac OS binary distribution (*.dmg) at

                 http://sourceforge.net/project/showfiles.php?group_id=40021

    • Decompress it using 'Disk utility' (done automatically by double-clicking on the .dmg file) and drag-and-dropping the Transcriber application in the Application folder.


    transcriber-1.5.1.1/doc/en/functions.html0000644000175000017500000001117707510315716016110 0ustar rtrt Transcriber's Main Features

    Main features

    Transcriptions

    • management of several layers of segmentation: basic segmentation for orthographic transcription (e.g. at each sentence or at each breathing), speech turn segmentation (new speaker) and section segmentation (new topic...); these 3 layers are hierarchically embeded. A 4th segmentation in background acoustic conditions is also available
    • display of segmentations under the signal and in the text editor; display of each segmentation under the signal can be toggled with a contextual menu
    • always synchronize the cursors in the text editor window and in the signal window: as soon as the cursor moves in one window, it is moved in the other one and appears within the same segment
    • easy creation of the basic segmentation by the way of successive insertions of boundaries at current cursor position, even during playback
    • move segment boundaries with the mouse
    • insert mark of change in background acoustic condition (music, speech, other) at current cursor position in the signal
    • indicate some boundaries as the beginning of a new speech turn or of a new section
    • edition of turns, sections or background conditions with a mouse clic on the corresponding button in the editor, including possible destruction
    • management of a speaker list with a precise description of each (name, type, accent...), further modification of its characteristics, research of turns involving a specific speaker, importation of speakers from another transcription
    • in the same way, management of a list of topics, find sections about a topic, import topics from another file
    • specific management of overlapping speech with marks for each speaker in the text editor
    • insert predefined events (noise, pronouciation mark, lexical mark, language change) which can be instantaneous or be at the beginning or the end of the event; user defined display of events (font, color, format); edit or remove with a single clic on the event in the text
    • standard text edition features: cut/copy/paste, find/replace, (very limited) undo
    • glossary for predefined words or expressions
    • transcriptions in XML format for easier automatic processing and exchange; syntaxic validation of files upon their DTD
    • user-chosen encoding is used for transcriptions input/output; most current encodings (ISO-8859-*, EUC-JP...) and Unicode (UTF-8) can be used
    • when opening a file, automatic research of corresponding sound file; if none is found, user is being asked to locate it.
    • import .typ transcriptions in .typ format and various labelling (xwaves, OGI...); export to .typ and .stm
    • periodic automatic backup
    • keep previous version in backup file

    Sound management

    • read most standards audio formats (thanks to Snack library)
    • handle long duration audio files (up to several hours) - for duration over 30 sec., a low-resolution view of the signal is computed in background and stored for speeding up later display
    • direct access to any position in the signal; selection of part of the signal
    • synchronized cursor during playback
    • several playback modes through keyboard combinations: play/pause, play the current segment, the selection, around the cursor
    • interactive change in resolution without stopping playback
    • able to display two views of the signal at different resolutions
    • vertical zoom

    Other features

    • display cursor position (also during playback), selection width and other messages under the signal
    • monitoring of user's productivity during the session
    • information window about the signal (filename, duration, format), about the transcription (number of segments, of words...) et optionnaly of the amount of work in the current session
    • edit the list of predefined events (noise, pronounciation...)
    • edit keyboard shortcuts for insertion of characters or strings (including events)
    • font and colors user editable
    • easy localization in any language (English and French provided)
    • possible backup of the current state in a configuration file for use in the next session: open files, options, window position
    transcriber-1.5.1.1/doc/en/map.html0000644000175000017500000002567610151053056014655 0ustar rtrt

    Transcriber 1.4 file's map

     Transcriber-1.4/

    • COPYING
    • README
    • convert/*
    • Tcl script modules for format conversion
    • demo/*
    • sound and transcription demo files
    • doc/*
    • help files
    • etc/*
    • default configuration file, DTD, localization file
    • img/*
    • bitmap images
    • src/*
    • sources for new Tcl commands and Tk widgets
    • tcl/*
    • Tcl scripts


    tcl/*

    tcl/About.tcl

    Display online help. Tries to view it in the default browser on Windows and Mac OS, and on Mozilla or Firefox on Linux.

    tcl/BgShape.tcl

    Compute the shape of a signal. Script launched as a background sub-process by Transcriber when background  shape calculation mode is on.

    tcl/ComputeShape.tcl

    Stand-alone script for pre-computing a set of signal shapes (see comments in the code for the command line options)

    tcl/Debug.tcl

    Very rough debugger window which can be activated when debug menu in general options is on.

    tcl/Dialog.tcl

    Some generic functions for management of the user interface, e.g.:
    • ListFrame, EntryFrame, ListEntryFrame, MenuEntryFrame, MenuFrame, RadioFrame, ColorFrame: create a frame with a variable editor of various kinds
    • proc ListEditor: generic list editor used for configuration of Glossary, Bindings, Localization and Event lists.
    • proc ChooseFont: generic font chooser (also works for named fonts)

    tcl/Edit.tcl

    Management of the text editor pane.
    • CreateTextFrame, EmptyTextFrame, DestroyTextFrame: creation/destruction of text widget with associated scrollbars and bindings. All commands to the text widget are filtered by TextFilter
    • InitEditor, Create*Button, Insert*Button,  ChangeSyncButton, InsertData: creation of text and buttons in the editor.
    • CopyAll, PasteAll, tk_text*, :TextCmd,  InsertText: cut/copy/paste with embedded tags
    • TextFilter: all actions to the text widget are trapped :
      • insertion of chars is only allowed in data segments (i.e. after an index position with a '*data*' text tag); the transcription is updated accordingly.
      • suppression of chars with part of the editor with the 'locked' text tag (i.e. sync, turns, section buttons) is avoided. When deleting one char of an event, the whole event is suppressed.
      • position of the cursor in the text editor is constrained to be in a data section with various heuristics, and the signal view is synchronized with the new position
    • GetDataFromPos: get XML text id associated with the cursor position in the text editor
    • ModifyText: update an XML text field from the content of the text editor
    • ViewAroundText: tries to show some context around current text cursor
    • TextFirstSync, TextLastSync, TextNext*: move in the transcription
    • Find, FindNext, Replace, ReplaceAll: Find & Replace

    tcl/Episode.tcl

    Management of global properties of the transcription edited in "File/Edit Episode attributes..."

    tcl/Events.tcl

    Management of:
    • Overlapping speech
    • Background conditions
    • Speech and non-speech events

    tcl/Interface.tcl

    Management of the user interface.
    • BuildGUI: creation of fonts, widgets, bindings, menus
    • ConfigureGeneral: "Options/General..."
    • EncodingChooser: (only for Tcl/Tk >= 8.1) for output file default encoding
    • EditGlossary
    • ConfigureBindings: implementation of "Options/Bindings..."
    • ConfigureColors: implementation of "Options/Colors..."

    tcl/Main.tcl

    The main script part  loads all needed libraries and other script parts, reads configuration, parses the command line.
    • Main: the procedure called at startup with all command line arguments.
    • Quit: !
    • InitDefault, LoadOptions, SaveOptions: initialization of the global array v(*) with default configuration values and user saved values (found in ~/.transcriber for Unix).
    • Local, *Local...: management of localization
    • LoadModules: load Snack, tcLex and other tcl modules.
    • StartWith: parses command line options and open sound and transcription file.

    tcl/Menu.tcl

    • add_menu, ..., bind_menu: generic menu management
    • InitMenus: create menu for Transcriber application
    • Update*Menu: enable/disable some menu items.

    tcl/Play.tcl

    Management of various playback modes
    • PlayRange: launches playback of an excerpt of the currrent sound file
    • Cursor*: automatic move of signal cursor
    • Play: launches playback in current mode (play selection, with pauses or beeps...)

    tcl/Segmt.tcl

    Within Transcriber, a "segmentation" designs one layer of the transcription (i.e., sections, turns, synchros, background conditions) and also the associated segmentation widget displayed under the signal.
    • CreateSegmentWidget,  ..., DestroySegmentWidgets: management of the 4 segmentation widgets and their associated bindings
    • InitSegmt, AddSegmt, ... : management of the segmentation (viewed in an associated segment widget) and stored in memory as a Tcl list:
      • { {start_position  end_position description color} ...}
    • GetSegmentFromPos, ..., SegmentSelect: mouse-driven selection of segments
    • SegmentMove: move segment boundaries with the mouse
    • SetCurrentSegment: highlight given segment in signal and text view. If necessary, moves text and signal cursor to some compatible, heuristic-driven places.
    • JoinTransTags, SplitTransTags, JoinData, SplitData: split transcription at given point and update XML data structure (used as intermediate functions between user level and segmentation list level)
    • InsertSegment, DeleteSegment, ChangeSegType: creation/destruction of breakpoints and creation of turns/sections at a given breakpoint.

    tcl/Signal.tcl

    • EmptySignal: reset current sound file
    • Signal: open given sound file and optionally get associated shape
    • ShapeDone, ShapeAbort: interaction with background shape calculation sub-process
    • LookForShape: tries to find a shape file matching the sound file name
    • LookForSignal: tries to find a sound file  matching the transcription name in the known sound paths
    • SoundFileType: identifies a sound file header, else returns "RAW"
    • OpenAudioFile: menu "File/Open audio file..."
    • ConfigureAudioFile: menu "Options/Audio File..."
    • OpenSound: creates a local sound Snack object  or give access to a remote sound through sockets (using SoundClient)

    tcl/SoundServer.tcl

    Stand-alone script to be used for providing access to sound files on a server (to be configured for the application, see the code).

    tcl/Speaker.tcl

    Speakers and turns management
    • 'speaker' namespace:
      • speaker::create/get_atts/set_atts/... : management of speaker list
      • speaker::find : menu "Edit/Speakers/Find speaker"
      • speaker::import : menu "Edit/Speakers/Import from file..."
    • 'turn' namespace:
      • turn::choose/choose_* : menu "Segmentation/Edit turn attributes..."

    tcl/Spelling.tcl

    Spell checking with ispell if available

    tcl/Synchro.tcl

    Management of the list of breakpoint times

    tcl/Topic.tcl

    Topic and sections management, very similar to Speaker.tcl

    tcl/Trans.tcl

    Management of transcription I/O and display
  16. trs::import/export : default I/O for transcription in the native .trs XML format
  17. InitConvertors: read convertor plug-ins found in sibling 'convert' directory
  18. ReadFile: generic file input using default encoding
  19. OpenSegmt: display a supplementary segmentation layer under the signal - not user interface yet provided
  20. SegmtToTrans: convert a simple, single layer, segmentation (as found in most label formats) to a transcription data structure.
  21. ReadTrans; WriteTrans: reads/writes a transcription file
  22. OpenTransFile/OpenTransOrSoundFile/SaveTrans: user interface for transcription I/O
  23. NormalizeTrans: Normalize the transcription by "filling the holes" with sections or turns and creates empty data sections between non-contiguous breakpoints
  24. ConvertData: attempt to find event tags in a .typ transcription file (rough parsing)
  25. DisplayTrans: creates the display of the transcription in the editor window
  26. TextFromSync: construct the character string which will be displayed for the given segment  in the segmentation under the signal
  27. tcl/Undo.tcl

    Managmenent of:
  28. Undo (not reliable)
  29. Auto-save and rescue
  30. Logging of transcribers' activity
  31. tcl/Waveform.tcl

    • Create sound frame
    • Synchronize waveform, axis and scrollbars
    • Resolution setting and selection zooming
    • Cursor and selection handling
    • Events bindings for cursor position and  selection

    tcl/Xml.tcl

    Gereric-purpose XML library. Loads and initialize XmlItem, XmlDtd ans XmlParse

    tcl/XmlDtd.tcl

    Management of an XML DTD

    tcl/XmlItem.tcl

    Management of XML tags and data in Tcl in an object-oriented way

    tcl/XmlParse.tcl

    Parsing of an XML document in Tcl using the tcLex library.


    convert/*

    Directory containing transcription I/O filters (see convert/README for more infos). Provided filters are:
    • ESPS/xwaves .lab input
    • TIMIT .phn/.wrd/.txt input
    • OGI .lola input
    • LIMSI .lbl input
    • LDC .typ input/output
    • NIST .stm output


    src/*

    src/axis.c

    C code for 'axis' Tk widget

    src/segmt.c

    C code for 'segmt' Tk widget

    src/shape.c

    C code for Snack sound sub-commands:
  32. $snd centi
  33. $snd shape
  34. $snd get
  35. $snd order
  36. src/trans.c

    Main body of 'trans' package

    src/trans.in

    Source of Transcriber launching script "trans"

    src/wavfm.c

    C code for 'wavfm' Tk widget transcriber-1.5.1.1/doc/en/about.html0000644000175000017500000000213607510315716015205 0ustar rtrt About Transcriber...

    Transcriber - a free tool for segmenting, labeling and transcribing speech

    Copyright (C) 1998-2002, DGA
    http://www.etca.fr/CTA/gip/Projets/Transcriber/

    Author: Claude Barras (DGA)
    Coordination: Edouard Geoffrois (DGA), Mark Liberman & Zhibiao Wu (LDC)

    This program is free software; see the GNU General Public License for more details.
    Transcriber also relies on external libraries - see the Credits.

    transcriber-1.5.1.1/doc/en/sample.xml0000644000175000017500000000425107510315716015210 0ustar rtrt
    ouais . sr ? ah bon ? non . blague , blague de Patricia . France-Inter , il est 7 heures .
    le journal , Simon Tivolle :
    bonjour ! mardi 28 avril . la consultation nationale sur les programmes des lyces : grand dbat aujourd'hui et demain Lyon
    transcriber-1.5.1.1/doc/en/menu_local.html0000644000175000017500000000406210122050345016174 0ustar rtrt Transcriber in English    en franais    in Deutsch

    Presentation

    Documentation
    Main features
    Reference manual
    User manual (currently only in French)

    Distribution
    Installation
    Changes
    To do list

    Further information
    Tools & formats
    Motivations
    Credits
    Contact, support
    transcriber-1.5.1.1/doc/en/reference.html0000644000175000017500000012713507510315716016040 0ustar rtrt Transcriber's Interface

    Reference Manual

    Interface and commands description

    Transcriber 1.4.4

    DGA, April 2002


    1. Startup
      1. Working environment
      2. Starting the tool
      3. Initial configuration
    2. Windows
      1. Menu bar
      2. Transcription
      3. Button bar
      4. Signal and segmentation
    3. Transcription file
      1. Create a new transcription
      2. Read a transcription
      3. Save the transcription
      4. Export to another format
      5. Revert to previous version
      6. Automatic backup
      7. Backup file
      8. File encoding
    4. Signal file
      1. Open a signal file
      2. Sound file format
      3. Signal shape
      4. Open a remote file
    5. Signal management
      1. Position the cursor
      2. Select part of the signal
      3. Signal playback
      4. Segment playback
      5. Fast forward
      6. Go to next segment
      7. Change the sound level
      8. Vertical zoom
    6. Edition
      1. Cut/Copy/Paste
      2. Undo
      3. Find/Replace
      4. Glossary
      5. Automatic space handling
      6. Spell checking
      7. Accented characters and internationalization
    7. Episode
      1. Edit global parameters
    8. Segmentation
      1. Insert a boundary
      2. Suppress a boundary
      3. Move the boundary between two segments
      4. Select the signal over one or several segments
      5. Hide/Show a segmentation
    9. Speech turns and speakers
      1. Create a new turn
      2. Overlapping speech
      3. Edit or suppress a turn
      4. Find one speaker's turn
      5. Import speakers from another file
      6. Suppress unused speakers
    10. Sections and topics
      1. Create a new section
      2. Edit or suppress a section
      3. Find sections about a topic
      4. Import topics from another file
      5. Suppress unused topics
    11. Background noise
      1. Create a background mark
      2. Indicate the change or the end of a background noise
      3. Edit or suppress a background noise mark
    12. Events and comments
      1. Insert an event
      2. Insert the beginning and the end of an event
      3. Insert a comment
      4. Edit or suppress an event
      5. Copy/Paste an event
      6. Create a keyboard shortcut for an event
      7. Edit the event list
      8. Configure events display
    13. Keyboard shortcuts
      1. Define a shortcut
      2. Shortcut for currently used expression
      3. Shortcut for an event
    14. Options and interface configuration
      1. Transcriber's name
      2. Productivity monitoring
      3. Colors edition
      4. Fonts edition
      5. Localization of the interface
      6. Second signal view
      7. Show/Hide central button bar
      8. Save the options
    15. Other features
      1. Informations about the signal and the transcription
      2. Quit Transcriber
      3. Help


    1. Startup
      1. Working environment
      2. The software is meant to allow the transcription of long duration audio signals with standard hardware. For instance, several one hour long recordings (sampled at 16 kHz on 16 bits, mono) were already successfully transcribed with a PC/Pentium 200MHz under Linux. Using headphones is strongly recommended for a quality transcription, but loudspeakers may be useful for checking with other people.

      3. Starting the tool
      4. When Transcriber is correctly installed, it can be started with the command:
          trans
        or, depending on the configuration, by clicking a given menu or icon. A dialog box then proposes to select a sound file to create a new transcription associated with this signal, or a transcription file to display or modify it. A short example of signal with an associated transcription are available in the "demo" directory, distributed with the software.

        When the working configuration has been saved during a previous session, the current signal and transcription files are automatically opened if they are still available on the disk.

        It is also possible to start the tool and give it the signal and/or transcription file as arguments on the command line. If both files are in the same directory, have the same name (except for the extension) and if the signal file has a standard extension (like .wav or .snd), the name of the signal file can be omitted, as it will be automatically opened:

          trans demo/frint980428.xml

      5. Initial configuration
      6. After the first use of the tool, it is recommended to open the [Options]/[General...] menu and to fill in:
        • the scribe's name, which will become the default scribe saved in each new transcription;
        • the language of the software interface (currently English or French);
        • if necessary, the name of the file used to record the informations on production monitoring - the default state of this function is disabled (cf. 14.2);
        and more signal specific options, in the menu [Options]/[Audio file...] :
        • the format of headerless files (cf. 4.2) ;
        • the computing mode and storage directory for the signal shape (cf. 4.3).
        The options should then be saved with the menu [Options]/[Save configuration].


    2. Windows
      1. Menu bar
      2. Transcription
      3. In the upper side of the interface, the orthographic transcription of the signal can be typed in a text editor.

        • for each new section (change of topic, of emission...), there is a button in the middle of a line (default color orange);
        • for each new speech turn (change of speaker, or no speaker), there is a button at the left of a line (default color blue);
        • for each segment in the orthographic transcription, a little circle (default color green) appears to the left of the line.

        Each segmentation begins at time t=0; there is at least a section, a turn and a segment on the first 3 lines of the transcription. The line containing the cursor is highlighted. There is a scrollbar to the right.

      4. Button bar
      5. In the middle, a button bar (which can be hidden) gives shortcuts for signal playback or for information display and shows the current filenames.

        Available commands:

          : back to segment beginning or go to previous segment
          : fast backward (with 1/2 second step)
          : pause
          : play
          : fast forward (with 1/2 second step)
          : go to next segment
          : display information window about signal and transcription

      6. Signal and segmentation
      7. Signal and segmentation appear in the lower half; there is also a scrollbar for choosing the part of the signal to display and another smaller scrollbar (which can be hidden with a contextual menu) for resolution control. Under the signal, the segmentations (orthographic one, in speech turns, in sections, in background conditions) is displayed and synchronized with the signal; the current segment in the orthographic transcription is highlighted. A second view of the signal in a different resolution can be displayed. Current cursor position in the signal is shown with a vertical red bar. Both cursors (in the text editor and in the signal) are always synchronized so that the current segment in the text is the same as the current segment under the signal; as soon as one cursor enter another segment, the other one is automatically moved in order to appear in the same segment.

        On the signal, mouse controls are the following:

        • click button 1: set cursor to the given position
        • click-move button 1: select part of the signal
        • click button 2 (or shift-click button 1): extend the selection
        • click button 3: display a contextual menu

        On the segmentation lines, mouse controls are:

        • click button 1: select the signal on the extent of the segment
        • click-move button 1: select the signal over several segments
        • shift-click button 1: extend the selection
        • click-move button 2 (or control-click-move button 1): move the boundary between 2 segments
        • click button 3: display a contextual menu


    3. Transcription file
      1. Create a new transcription
      2. Choose menu [File]/[New trans]. A dialog window ask for the sound file to be transcribed. This can be changed later.

      3. Read a transcription
      4. With [File]/[Open trans...], you can read transcription files produced by Transcriber, and transcription or segmentation files in some standard formats identified by the filename suffix:

        • Native XML format (.trs, .xml)
        • OGI lola (.lola)
        • LDC .typ format (.typ)
        • ESPS/xwaves (.lab)
        • LIMSI label (.lbl)
        • TIMIT format (.phn, .wrd, .txt)
        • Childes/CHAT (.cha) experimental support, with new attributes available in the interface.
        The signal file associated with the transcription is then searched for; if it is not automatically found, the user is asked to look for it.

      5. Save the transcription
      6. The transcription can be saved with menu [File]/[Save] if modifications occurred since creation or last save. The first time, transcription filename defaults to signal filename with .trs extension. It can be saved later under another name with [File]/[Save as...].

      7. Export to another format
      8. The transcription can be written into non-native transcription formats (.typ, .stm or .html) with menu [File]/[Export], but these formats are not as complete as the native one, and information can be lost in the process. However .html format makes printing the transcription possible using any browser.

      9. Revert to previous version
      10. Command [File]/[Revert] will undo all changes in memory and load lastly saved version on disk.

      11. Automatic backup
      12. An automatic backup is performed within a fixed time after a modification (if the transcription has not been saved in between). It is saved in the same directory as the transcription with the same name surrounded with # character (for example, /data/transcription/#radio.trs#). This file will be removed the next time the transcription is regularly saved. Time interval is given within window [Options]/[General...]; if it is zero, no automatic backup occurs.

      13. Backup file
      14. When a previously existing transcription is read on the disk, then modified and saved, the existing version is kept in a file with the same name as the transcription followed by a string given by the user in the window [Options]/[General...] (for example, ~ will /data/transcription/radio.trs~). If the field is empty, the previous file is not kept.

      15. File encoding
      16. Since Transcriber 1.4.1 under Tcl/Tk 8.1.1 or higher, the encoding for file output can be chosen in [Options]/[General...]. It defaults to ISO-8859-1 (Latin1) but can be changed to other widespread 8 bits encodings (ISO-8859-*, EUC-JP...) but also to Unicode (saved as UTF-8, which is backward compatible with 7 bits US-ASCII). If Latin1 does not work and you are not sure what to use, try UTF-8 as it supersedes the other ones.
        Upon reading, the encoding used is the one defined in the file header. For transcriptions missing this information (like the ones produced with earlier versions of Transcriber or Tcl/Tk), or when the encoding is not ASCII-compatible, the current encoding is used.


    4. Signal file
      1. Open a signal file
      2. The signal file is chosen after creation of a new transcription or by changing the signal linked to the transcription with menu [File]/[Open audio file...].

      3. Sound file format
      4. Most standard audio files are automatically recognized thanks to Snack library: WAV, AU, SND, AIFF, SMP, and Sphere if the format has been installed with Snack. Access to MP3 format can be slow due to the compression. Headerless sound files format (8 or 16 bits sample length, byte order...) is automatically guessed, except for sample frequency and channel count which are given by the user in the window [Options]/[Audio file...].

      5. Signal shape
      6. In order to speed up signal display at lower resolutions (display of intervals over than 30 seconds), a low-resolution shape of the whole signal is computed if the signal is longer than 30 seconds. Shape computation is performed in background the first time a signal is displayed, and is stored in a specific directory for subsequent uses. Current computation can be stopped, or the function can be disabled in [Options]/[Audio file...]. Background computation mode can be disabled. The directory for storing shapes is also given in [Options]/[Audio file...]; it can be a good idea to use a directory shared by all Transcriber's users but it must then be writable to all users in order to allow creation of new shapes.

      7. Open a remote file
      8. The client-server architecture for sound display and playback can be enabled by configuring the script tcl/SoundServer.tcl and launching it on the host. User choice of remote server and port is done within [Options]/[Audio file...].


    5. Signal management
      1. During transcription, one has to listen several times to short portions of signal. Tape-recorder-like commands are available in the command button bar as long as in the menu [Signal], but keyboard shortcuts will probably more practical for most intensive use.

      2. Position the cursor
      3. One can place the cursor in the signal with a mouse click on the wished position. A precise value can be given with menu [Signal]/[Go to...]/[Position] or by clicking on the information line under the signal.

      4. Select part of the signal
      5. Part of signal can be selected by click-move-release of the left mouse button, and it can be extended with central button (or shift-click of the left button). Cursor position and selection boundary times are given under the signal. With option Automatic selection playback option on in [Options]/[General...], selected segment playback starts as soon as mouse button is released.

      6. Signal playback
      7. With play and pause buttons, command [Signal]/[Play/Pause] or its shortcut Tab, one can start playback at cursor position or stop it. If a selection is active, only this part will be played.

        The menu [Signal]/[Playback mode] allows a choice between the following playback modes: continuous play (default mode), playback with pauses at segment boundaries, with a beep at boundaries, with a pause at the next boundary, or loop on the current selection if active, otherwise on the current segment after a pause. The duration of the pause and the selection of an audio file for the beep are customizable in the window [Options]/[Audio file...]; the parameter Go back before playing allows to rewind before each new playback.

        When Snack version 2.0 is installed with Transcriber, it is possible to play only the left or right channel from a stereo file using the new menu [Signal]/[Stereo channel]. It has no effects for mono sound files or when previous Snack version 1.7 is used.

      8. Segment playback
      9. Command [Signal]/[Play segment] or its shortcuts (Shift-Tab or Alt-Tab) launches playback of the current segment from its beginning up to its end.

      10. Fast forward
      11. Fast forward and backward buttons (menu [Signal]/[Go to...]/[Forward] or [Backward]) make the signal cursor move half a second forward or backward. If mouse button is kept down on the command button, move becomes continuous with 0.5 second step. This does even work during playback - but sound becomes choppy.

      12. Go to next segment
      13. Next and previous buttons (menu [Signal]/[Go to...]/[Previous] or [Next]) move cursor to the beginning of next or previous segment in the orthographic segmentation (even during playback which jumps to its new position).

      14. Change the sound level
      15. Sound level is given (from 0 to100) in the window [Signal]/[Control panel].

      16. Vertical zoom
      17. For signal with low dynamic, a cursor in [Signal]/[Control panel] changes vertical amplitude on the signal. Volume is not modified.


    6. Edition
      1. Cut/Copy/Paste
      2. Standard editing commands (menu [Edit]/[Copy], [Cut] or [Paste] and standard shortcuts Control-x/c/v) can be used to handle parts of the transcription, including events but not section, turn or background buttons.

      3. Undo
      4. Undo command (menu [Edit]/[Undo] or standard shortcut Control-z) is limited, and only restores orthographic transcription of the current segment to its previous state. A lot of actions are not undoable. Save often.

      5. Find/Replace
      6. Command [Edit]/[Find/Replace] (shortcut Control-f) has various options: case sensitive, backward search, use regular expressions. A replacement string can be given.

      7. Glossary
      8. Command [Edit]/[Glossary] or its shortcut Control-k has two modes: create a new entry in the glossary, or insert an existing entry in the editor at current position; modification of existing entries is possible in both modes. If part of the text is selected when the command is called, creation of a new entry is proposed from this selection; a comment can be added and choose OK in order to register it. If no text was selected, one can click and select an entry in the list then click Insert; the entry will be inserted in the current position. Glossary is currently kept within configuration file but will probably switch to a separate file in a future version.

      9. Automatic space handling
      10. Automatic space handling is controlled within [Options]/[General...]. If it is active, a space is added at the end of line upon creation of a new breakpoint and before punctuation symbols .,; or :.

      11. Spell checking
      12. Spell checking is started by the command [Edit]/[Spell checking]. It relies on the installation of the 'ispell' software (standard on most Unix systems but not with Windows). The dictionary used for the correction is automatically deduced from the language selected in the global options (cf 7.1). An error message indicates if the dictionary was not found or if the name does not match; it is then necessary to check your local installation of ispell to determine the correct name of the dictionary.

        When an unknown word is found, a dialog box proposes to:

        • add it to the dictionary - it will then be memorized forever;
        • ignore and go to next word;
        • replace the selected word by one of the selections, or after manual correction;
        • close the window and stop the spell checking.
        An option of the menu [Options]/[General] allows to control the spell checking on words starting with a capital letter. The default behavior is to ignore them.

      13. Accented characters and internationalization
      14. The character input method is not selected in Transcriber but is system-dependent. Thus, with an appropriate keyboard, some characters can be input directly. Unix system allows you to remap some keyboard keys (like for instance function keys) with software tools like 'xmodmap' for X11. However it is also possible to input accentuated characters from keys combinations by defining shortcuts in Transcriber (cf. section 13).
        The default encoding of transcription files is ISO-8859-1 (Latin1), but other encodings are available if Transcriber is run with a version of Tcl/Tk at least 8.1.1 (cf. section 3.8).


    7. Episode
      1. Edit global parameters
      2. Some global informations about transcription can be given in [File]/[Edit episode attributes...]:

        • filename of sound being transcribed (without path or extension), which allows automatically finding the signal if it doesn't bear the same name as the transcription;
        • the transcriber's name, which is used as default name upon creation of a new transcription;
        • version of the transcription, which is automatically incremented and can't be edited;
        • last modifications date, automatically updated and not editable;
        • the program (emission, radio...);
        • the recording date if it is known;
        • the main language of the transcription.


    8. Segmentation
      1. Insert a breakpoint
      2. Command [Segmentation]/[Insert breakpoint] or its shortcut Return create a new breakpoint at current cursor position in the text and in the signal. Boundary positions are rounded to the nearest milli-second, so any new breakpoint must be at least 1 ms away from existing ones. A new line appears in the transcription, and segment is sliced at cursor position. This can be done during playback.

        =>

      3. Suppress a breakpoint
      4. Command [Segmentation]/[Delete breakpoint] or its shortcut Shift-Backspace suppress the breakpoint at the beginning of current segment and fold its content with previous segment. If the breakpoint was also the beginning of a new turn or a new section, they are also removed.

      5. Move the boundary between two segments
      6. By clicking with central mouse button (or with left button with Control key pressed) over a boundary between two segments and moving the mouse, one can move the boundary and the one which are synchronized in other segmentations.

      7. Select the signal over one or several segments
      8. With a click of the left mouse button over a segment under the signal, the signal is selected over the extent of the segment, and signal cursor moves at the beginning of the segment. The selection can be extended with Shift click of left button.

      9. Hide/Show a segmentation
      10. With a click of right button, a contextual menu appears and gives commands for signal playback, resolution, and showing or hiding each segmentation.


    9. Speech turns and speakers
      1. Create a new turn
      2. Command [Segmentation]/[Create turn...] or its shortcut Control-t creates a new speech turn from the beginning of current segment. A speech turn is described by it(s) speaker(s) and other optional parameters:

        • elocution mode (spontaneous or planned),
        • recording quality (high, medium, low),
        • bandwidth of signal (telephonic speech or studio recording).

        First line of the window is for overlapping speech (see next section). Central part is for creation, selection or modification of speakers. By clicking on Create Speaker or by typing directly a new name, a new speaker is created; one can further describe its type, dialect... A sorted list of already defined speakers appears to the right, with a selection of recently used speakers. By clicking on a name, the speaker is chosen as speaker for the turn. Spelling of its name and other characteristics can be modified after a click on Modify Speaker, and then validating with OK; the changes will apply to the whole transcription. The field no speaker can be chosen for signal segments without speech.

      3. Overlapping speech
      4. During creation or modification of turn parameters, overlapping speech can be activated. Second speaker can be chosen the same way as the first one. In the text editor, each segment contains 2 lines beginning with 1 or 2; orthographic segmentation under the signal is split horizontally for each speaker. Return to non-overlapping speech is done by deactivating the overlapping speech field in turn parameters; only first speaker is kept and transcriptions of both are merged in one single text.

      5. Edit or suppress a turn
      6. Command [Segmentation]/[Edit turn attributes...] allows for edition and destruction of the speech turn which contains current segment (even if the current segment is not the first segment of the turn). Alternatively, one can click on the turn button in the editor window. All parameters given during creation can be modified. A button allows destruction of the turn.

      7. Find one speaker's turns
      8. Command [Edit]/[Speakers]/[Find speaker] displays the list of speakers in the transcription. By clicking on the name, number of occurrences of this speaker in the transcription is shown under the list. Next button moves to the next speech turn of the speaker.

      9. Import speakers from another file
      10. Command [Edit]/[Speakers]/[Import from file...] asks for a transcription file and displays the list of speakers within this file which doesn't yet exist in the current transcription. User can select/unselect speakers by clicking on its name, or select one speakers which Global name field is on.

      11. Suppress unused speakers
      12. Command [Edit]/[Speakers]/[Remove unused speakers] suppress any speakers which doesn't appear in any speech turn.


    10. Sections and topics
      1. Create a new section
      2. Command [Segmentation]/[Create section...] or its shortcut Control-e creates a new section at beginning of current segment. Section type ("report", "filler" or "nontrans") and topic can be chosen in the dialog window. Already defined topics list is on the right, recently used ones are on the left. Click New topic or type in directly a text to define a new topic. If an existing topic is selected, one can click Modify topic and edit it, then choose OK. You can choose no topic or empty the Topic field. A new speech turn is automatically created at the beginning of the section; the current speaker is proposed as default value.

      3. Edit or suppress a section
      4. Command [Segmentation]/[Edit section attributes...] allows edition and suppression of the section which contains the current segment. One can also click on the chosen section button in the text editor. All section parameters can be modified, and a button allows for section destruction.

      5. Find sections about a topic
      6. Command [Edit]/[Topics]/[Find topic] displays a list of already defined topics. Click on a topic and its count will appear under the list. Next button moves to the next section about the topic.

      7. Import topics from another file
      8. Command [Edit]/[Topics]/[Import from file...] ask for a transcription file and displays a list of new topics. User can select/deselect topics by clicking on their name.

      9. Suppress unused topics
      10. Command [Edit]/[Topics]/[Remove unused topics] suppress unused topics from the list.


    11. Background noise
      1. The segmentation in acoustic conditions if for lasting modifications in background noises. The marks are for a change in background state; their value replace the previous one. Each transcriptions begins with an empty background condition at t=0.

      2. Create a background mark
      3. Command [Segmentation]/[Insert background] creates a background mark at current cursor position in the signal. It is not allowed to create two marks at the same time index. If the cursor in the signal is at the beginning of the segment, background mark will always be synchronized with segment beginning, and background icon appears at the beginning of line. Background type (speech, music, electric noise, other) is chosen; value defaults to previous one. A music icon appears in the editor at current position of the cursor. Background segmentation under the signal is colored (grey default color) on signal parts with noise.

      4. Indicate the change or the end of a background noise
      5. Create at the position of the end of noise a new background mark with all noise types empty. For a noise change, don't mark the end of the previous noise, but only the new one which replaces the previous one.

      6. Edit or suppress a background noise mark
      7. Background noise marks can be edited or suppressed by clicking on the music icon in the editor. If it is deleted, current background conditions become the ones defined in the previous background mark.


    12. Events and comments
      1. Insert an event
      2. Command [Edit]/[Insert event] or Control-d pops up a window for defining:

        • event type: noise, comment, pronunciation mark, lexical mark, language change;
        • description of the event. A list of predefined values can be available to the right;
        • temporal extent of the event (except for comments); an event can be instantaneous or have an extent. In this last case, start and end of events must be given. A mark can also apply to the previous or the following word.

      3. Insert the beginning and the end of an event
      4. If a part of text is selected before the insertion of the event, beginning and end of event marks are simultaneously inserted

      5. Insert a comment
      6. [Edit]/[Insert comment] inserts a comment event. Comments have no temporal extent.

      7. Edit or suppress an event
      8. Click on the event in the text editor and edit or destroy the event. Events can also be deleted in the text editor like a single character.

      9. Copy/Paste an event
      10. Within Transcriber, events can be copied/pasted. When pasted in other applications, event marks will appear as XML tags.

      11. Create a keyboard shortcut for an event
      12. See shortcut section

      13. Edit the default event list
      14. Noise list, pronunciation marks, lexical marks or language list can be edited with [Options]/[Events]/[Edit * list...]. Value will appear in the editor and in the segmentation; description appears in the menu with list of predefined events. An empty line is a separator in the menu. For language list, iso639 codes should be used for consistency.

      15. Configure events display
      16. Fonts and colors for event display can be modified with menus [Options]/[Fonts]/[Events] and [Options]/[Colors...] ; format string for comment and events, and for event extent are chosen in window [Options]/[Events]/[Events display...].


    13. Keyboard shortcuts
      1. Menu [Options]/[Bindings...] pops-up a window for edition, suppression or creation of bindings.

      2. Define a shortcut
      3. Click New in [Options]/[Bindings...] for creation of a new shortcut, then type in keyboard combination in the first field, replacement string in the second and click OK (end of edition) or Modify (before other editions). Keyboard combination can be directly typed with Control, Shift, Alt... if cursor is in the Keystrokes field. Be careful, you can override predefined menu shortcuts.

      4. Shortcut for a currently used expression
      5. Select currently used expression with mouse in the text editor, then choose menu [Options]/[Bindings...], give wished Keystrokes and click OK. Shortcut can also consist in the first letters of the expression, e.g. "gor" will be replaced with "Gorbatchev". These shortcuts are not related to the glossary.

      6. Shortcut for an event
      7. Events (noise, comment, etc.) can be generated with a shortcut. Create an event of the wished kind in the text editor, select it and follow the previous instructions. Selected text can be any combination of regular text and one or several events.


    14. Options and interface configuration
      1. Transcriber's name
      2. Default transcriber's name is given in [Options]/[General...]. It is used in episode parameters initialization when creating a new transcription.

      3. Productivity monitoring
      4. A filename for transcriber's productivity monitoring can be given in [Options]/[General...]. By default, the field is empty and function is disabled. When it is active, work duration is traced (without pauses), as long as produced work (number of new sections, turns, words...); it is displayed in window [File]/[Informations] and saved in the logging file at the end of the session. No automatic exploitation of these file is currently performed by the software.

      5. Colors edition
      6. Most colors can be modified with menu [Options]/[Colors...].

      7. Fonts edition
      8. Fonts used for text display are modified with menu [Options]/[Fonts].

      9. Localization of the interface
      10. Language for the interface is chosen in [Options]/[General...]. It defaults to English, and French is available. Localization in new language can be created. When no localization is available, the original English message is kept. As soon as non-localized messages are displayed, they are added to the list of messages to be localized. In order to keep your localization, give a Localization file name in [Options]/[General...] and choose [Options]/[Save configuration].

      11. Second signal view
      12. Menu [Options]/[Display]/[Second signal view] shows or hide a second view of the signal, which can be displayed at another resolution. Resizing the window can be necessary for a correct display.

      13. Show/Hide central button bar
      14. Central button bar display is switched on/off with [Options]/[Display]/[Command buttons].

      15. Save the options
      16. Modified options, window positions, keyboard shortcuts, glossary content and currently edited filenames are saved with command [Options]/[Save configuration] in a configuration file (defaults to ~/.transcriber); this file is read at startup and currently edited files will be automatically reopen at beginning of next session.


    15. Other features
      1. Informations about the signal and the transcription
      2. Button or command [File]/[Informations] displays a window with informations about signal filename, duration, word count, etc. Click update button for an update of the informations.

      3. Quit Transcriber
      4. Menu [File]/[Quit] or Control-q ; save of the transcription is proposed if necessary. If corresponding option is activated, save of the configuration is also proposed.

      5. Help
      6. Online help is available with menu [Help] ; help files can also be viewed with any HTML browser with frames

        transcriber-1.5.1.1/doc/en/todo.html0000644000175000017500000000352407510315716015042 0ustar rtrt To do list for Transcriber

        To do list

        We develop Transcriber primarilly for Broadcast News, and do not commit to developments for other purposes. However, we are willing to take into account user needs, and to coordinate developments made by contributors.

        Things we are doing or plan to do

        Transcriber is under ongoing development. You can expect the following improvements in future versions:

        • Switch to a new transcription format based on annotation graphs, in order to increase flexibility.
        • Enhanced glossary management and automatic completion while typing in.
        • When creating a speaker, access speakers from other transcription files.

        Things users have asked for

        Some (potential) users have expressed the need for the following functions:

        • Dump the transcription as plain text or as postscript.
        • Spectrogram display.
        • Pitch extraction and display.
        • Playback speed control (slower than real time for detailed transcription, faster than real time for scanning).
        • Manage many small signal files rather than a single big file.
        • Manage video in addition to sounds.
        • auto saving of backup transcription in a separate thread/forked process.

        We might implement some of these functions ourselves if we have time, but contributions will be welcomed!

        If you would like an additional request to appear in the above list, please send a message to transcriber-request@etca.fr.

        transcriber-1.5.1.1/doc/en/banner.html0000644000175000017500000000126407510315716015341 0ustar rtrt Transcriber

        Transcriber
        a tool for segmenting, labeling and transcribing speech

        transcriber-1.5.1.1/doc/en/formats.html0000644000175000017500000000247507510315716015554 0ustar rtrt Transcriber Data and Formats

        Data format used within Transcriber

        A transcription file created by Transcriber is in XML format and its syntax is described by its DTD. You can look at short sample of transcription file in French.

        For more informations about XML, look at W3C technical reports or e.g. at Robin Cover's SGML/XML Web Page

        Link to other tools and formats

        Mark Liberman, Steven Bird and Terri Lander from LDC maintain a very complete page about tools and formats for linguistic annotations; please have a look there for a more global discussion about formats and a short description of various transcription tools and projects.

        transcriber-1.5.1.1/doc/en/present_local.html0000644000175000017500000000433307510315716016726 0ustar rtrt Transcriber
        Screenshot

        Presentation

        Transcriber is a tool for assisting the manual annotation of speech signals. It provides a user-friendly graphical user interface for segmenting long duration speech recordings, transcribing them, and labeling speech turns, topic changes and acoustic conditions. It is more specifically designed for the annotation of broadcast news recordings, for creating corpora used in the development of automatic broadcast news transcription systems, but its features might be found useful in other areas of speech research.

        Transcriber is developed with the scripting language Tcl/Tk and C extensions. It relies on the Snack sound extension, which allows support for most common audio formats, and on the tcLex lexer generator. It has been tested on various Unix systems (Linux, Sun Solaris, Silicon Graphics) and Windows NT. Transcriber is distributed as free software under GNU General Public License.


        Transcriber - Copyright (C) 1998-2002, DGA
        http://www.etca.fr/CTA/gip/Projets/Transcriber/

        Author:
        Claude Barras, DGA/DCE/CTA/GIP
        Coordinators:
        Edouard Geoffrois, DGA/DCE/CTA/GIP
        Mark Liberman & Zhibiao Wu, LDC
        transcriber-1.5.1.1/doc/en/credits.html0000644000175000017500000000426507510315716015535 0ustar rtrt Transcriber's Credits

        Credits

        Transcriber relies on external modules and libraries :

        Many thanks to:

        • Zhibiao Wu for Transcriber's port to NT and numerous bug detections;
        • Brian MacWhinney and Leonid Spektor for making port to Macintosh possible;
        • David van Leeuwen for 'Debianization' and hints for installation process, and Damien Mercier for RPM package;
        • Marcello Federico and Dimitri Giordani for adaptation of spelling module and bindings to Italian;
        • Dafydd Gibbon, Martine Garnier, Wim Goedertier, Vlasta Radova, Lowell Brunson, Pat Ward and other beta-testers who gave bug-reports and hints useful for Transcriber's update;
        • Kare Sjolander for supporting Transcriber with its Snack module.
        transcriber-1.5.1.1/doc/en/frame_local.html0000644000175000017500000000035107510315716016334 0ustar rtrt Transcriber's presentation transcriber-1.5.1.1/doc/en/user.html0000644000175000017500000001001307510315716015042 0ustar rtrt Transcriber's User Guide

        What is a transcription

        A transcription is the orthographic description of a sound file. The sound is considered as a collection of short sound segments separated by synchronization breakpoints. Each speaker change mark the beginning of a new turn. The turns are themselves grouped in homogeneous sections on different topics.

        A typical transcription session

        Start a session

        • To start a new transcription, choose menu File/New trans. You will be asked for a signal to transcribe. This choice can be changed later with menu File/Open audio file...
        • Save your work often with menu File/Save. The first time you save a new transcription, you will be proposed the same name as the signal (but with a different extension, depending on the chosen format -you should not type in manually this extension).
        • If you want to work on an existing transcription, open it with menu File/Open trans... Transcriber will look for signal sharing the same name as the transcription; if it fails, you will be asked to give location of the signal with a dialog box.

        If you save the configuration with menu Options/Save configuration before leaving, both sound and transcription files will be re-opened automatically the next time you launch Transcriber.

        Listen to the signal

        Signal can be manipulated with mouse (scrollbars, buttons), menus, or keyboard shortcuts. Use 'Tab' to start/pause playback.

        First pass: rough segmentation

        • Choose a resolution of 30 seconds or less for the signal
        • Start playback at the beginning of the file (or at the beginning of the untranscribed part of the signal).
        • During playback, insert a new breakpoint with the 'Enter' key each time you ear short pauses in the speech or changes in background. A new line with a point will appear in the text, and a bar will appear under the signal a the position of the cursor.
        • After a few minutes of rough segmentation, you should get a succession of segment of 10 to 30 seconds.

        Don't forget to save your work often (menu File/Save).

        Second pass: transcription

        • Choose a resolution of 10 seconds or less for the signal
        • Go back to the first untranscribed segment by clicking on the first line of the text or the beginning of the signal.
        • Listen to the segment (menu Signal/Replay segment)
        • If necessary, adjust the segment boundaries by clicking with button-2 on the segment boundary and draging the mouse
        • If a new speaker starts speaking at the beginning of the current segment, mark it as a new turn (menu Segmentation/Change segment type/Turn, or its shortcut). You will be asked the speaker name, but you can keep the default (New speaker) and modify it later if you want.
        • Type in the transcription; it will automatically appear in the text editor and in the segmentation under the signal
        • Process in the same way all remaining segments

        Third pass: verification

        • Go back and listen to the signal while reading the transcription. Start and pause playback as often as you need (use the 'Tab' key). It is possible to move forward/backward during playback.
        • Structure the document at the global level by marking new sections (menu Segmentation/Change segment type/Section, or its shortcut). Section types are 'report' , 'filler' or 'nontrans'. You can attribute an arbitrary topic to the section.
        • Transcribed text can be modified in the text window. Speaker names and topic can be modified from the menu Segmentation/Edit attributes... or directly clicking on the button in the text window
        transcriber-1.5.1.1/doc/en/contact.html0000644000175000017500000000343007510315716015524 0ustar rtrt Transcriber's support

        Mailing list

        If you wish to receive announcements of future versions of Transcriber, register to the ``transcriber-announce'' mailing list by sending a message to majordomo@etca.fr with the following line in the message body:
        subscribe transcriber-announce First_name Last_Name <E-mail_address>
        Ex: subscribe transcriber-announce John Doe <jdoe@freemail.org>

        If you wish to take part in the discussions about the development of Transcriber, register to the ``transcriber-devel'' mailing list by sending a message to the same address but with the following line in the message body:
        subscribe transcriber-devel First_name Last_Name <E-mail_address>
        Ex: subscribe transcriber-devel John Doe <jdoe@freemail.org>

        Contact us

        If you think you have found a bug in Transcriber, please send a message with a detailed description of what happened to transcriber-bug-report@etca.fr.

        If you have a question for which you have not found the answer on this site, or if you wish to make suggestions or proposals for further improvements which do not already appear in the to do list, you can send a message to transcriber-request@etca.fr.

        transcriber-1.5.1.1/doc/en/history.html0000644000175000017500000011352110174217316015572 0ustar rtrt Transcriber's History

        History of Transcriber versions


        Version 1.5.1

        Changes or bugs fixed:

        • Upper extensions are now recognized as valid extensions for transcription and audio files.
        • A DTD different from trans13.dtd or trans14.dtd is not considered anymore as a former DTD.
        • All unicode encoding are now supported on Windows
        • Transcriber 1.5.0 refused to be launched if it found an external speaker database. That file was created when the speaker turns were modified. That bug has been corrected.
        • The default browser (used for viewing help files) could not be set. This bug has been corrected.


        Version 1.5.0

        New or modified functions:

        • A new DTD (trans-14.dtd) replace the old one (trans-13.dtd). For compatibility, files that need an older DTD can be opened with Transcriber-1.5.0. For such files, save or exit without any changes will display a message that inform you that the original format of your file is older than the format of your Transcriber application. You can choose to export in new format (recommended) or keep the original one.
        • improvement of the "save audio selection" function: the menu entry is now "Save audio segment(s)" with two submenus "Selected..." and "Automatic...". You can also reached this function with contextual menu by right clicking on the signal and look in "Audio file" entry. The first submenu do exactely the same as the old function (i.e. save an audio selection) and the second one is an automatic mode to save all the audio segemnts corresponding to section, turn and sync. A dialog box allow you to choose wich kind of segment do you want and where you want to save it in.
        • the event tags can now be translated when displayed in Transcriber, but they are not translated in TRS files.
        • the binary released 1.5.0 is now available on Linux, Windows
        • the spell checker is now Aspell and works on Linux and Windows
        • help files are now viewed with the default browser
        • shape computation for large files is now available on Windows
        • help files are available in German
        • now, when you destroy a begin or end event it also destroy the symetric associated event.
        • trs files are associated to Transcriber on Windows
        • shortcuts F1 to F7 are available. F1 is for help, F2 to F7 are used to hide or not the different parts of the interface (text, NE, command button, first and second signal view and message display).
        • creation of a new event "Named entities" for named entities (NE) annotation. The F3 button is a shortcut that make available an interface to easily annotate NE. Automatic annotion is possible and every colors or fonts are configurable. The list of entities can also be modified. More details in the reference manual.
        • creation of a global speakers database which contains all the global speakers you have imported in it. Import is done by Edit->Speakers->Update global speakers database, then you have to select the file from wich you want to import global speakers. More details in the reference manual.
        • transcription files may use a different format than the original one provided with the package, provided that they point to a DTD located in the same directory, that their root element is still <Trans> and that they are in a superset of the existing format. Unknown XML tag will be only displayed in gray, but may not be edited. Any XML file whith <Trans> root tag is now supposed a valid .trs file, regardless of its actual extension (it used to be limited to .trs and .xml).
        • it is possible to define a default topic or speaker import file, loaded when opening a transcription or creating a new one, using 'Edit/Speaker|Topic/Automatic import from selected file'
        • export a transcription to text format in a simple "Speaker i: transcription" format; control over the formatting may be done by setting some configuation values on the command line or in the configuration file - see convert/text.tcl for more details (NB: a beta version of this filter was already distributed in the 1.4.6)
        • display of NIST RT'03S .mdtm format (speaker subset only).
        • added "-version" command line option.

        changes or bug fixes:

        • removing of lrec documentation (useless)
        • removing of html_library (useless)
        • Migration of user preferences to Transcriber 1.5.0 (Event widget size is reset)
        • popups Find/Replace, Find Speaker, Find Topic, Spell Checker, Control Panel, Informations are now in foreground
        • a warning window pops up if more than one transcription line is deleted
        • fixed bug : an error message appeared when doing File/Synchronized Audio File/Add Audio File. That made the function unvailable.
        • fixed bug : on some platform when using the Num_lock key, the edition was impossible.
        • fixed bug : when changing localisation (for example english to french) the contextual menu of the wave were not translate so that when you wanted to open an audio file, an error message appreared.
        • a warning message is displayed when temporal inconsistencies are found in a .trs file.
        • Export to .stm format now includes a commented header giving information about the conversion process, and the file is written in the user-defined encoding (rather than the default system encoding) - it may be possible to override it on the command line e.g with 'trans -set encoding utf-8 -export stm *.trs'.
        • multiwav extension now has a menu entry in the main 'File/Synchronized audio files' menu.
        • 'Open segmentation file..' has been moved frome 'Options/Display' to  'File' menu.
        • default string for new speaker or topics may be modified (currently only by editing the default settings or the configuration file, see etc/default.txt).
        • improved parsing of LDC hub4 files in sgml/utf formats for segmenation display.
        • bug corrected in the "-set" line option.
        • bug corrected in saving a modified localization file.
        • command line option "-export" may be used instead of "-convertto".
        • Transcriber is launched in batch mode (i.e. with tclsh rather than wish) by 'trans' script when -export or -help command line options are found.
        • under Tcl/Tk 8.4, it should be possible to open multiple files in a single dialog for the multiwav and segmentation features.
        • convert filters using the extended tcl API 'readSegmtSet' have been made backward compatible with previou versions (<1.4.6).


        Version 1.4.6

        Released on October 3, 2003.

        New or modified functions:

        • multiwav extension, allowing several synchronized audio files to be associated with a single transcription. New audio files can be added using the contextual menu on the waveform (right-click), or a list of audio files can be given on the command line when launching the tool. It is derived from an original proposal by David Gelbart and Dan Ellis from ICSI, intended for meeting recordings management.
        • Czech localization of the menus added, kindly provided by Zdenek Konopasek.
        • Management of several configuration files (menus "Options/Save configuration as..." and "Options/Load configuration file..."); a configuration file may be specified at startup with '-cfg filename' command line option.
        • Save audio selection in a separate .wav file (menu "File/Save audio selection as...").
        • Explicit message when signal shape is not available and resolution display is thus limited.
        • Text editor may be hidden (checkbox menu "Options/Display/Text editor", '-notext' command line option).
        • Segmentation layers for background, sections or turns which are not in use (i.e. having a single segment for the whole document) may be automatically hidden (checkbox menu "Options/Display/Smart segmentation display").
        • Random colorization of the turn segmentation layer, so that a color is automatically attributed to all occurences of the same speaker in the document (checkbox menu "Options/Display/Colorize speaker segments").
        • Open a label file and display under the signal (menu "Options/Display/Open segmentation file..." or command line option "-lbl filename" -- option may be repeated). The label file information may span several segmentation layers.
        • Improved support of NIST .ctm file (including RT'03 format extensions and multi-level display as labels); .stm can be either imported or displayed as multi-level labels.
        • Added '-convertto format filename ...' command line option for converting a set of file from the Transcriber format to the given format in batch mode.
        • Various other command line options added: '-set option value' for overriding configuration value, '-sig2' for display of second signal view, '-socket' for activation of external scripting service, '-help' for a list of options.
        changes or bug fixes:
        • added compatibility update for Tcl8.4, due to changes in (internal) Tcl and C API. Transcriber binary libs will probably be incompatible between Tcl versions 8.3 and 8.4
        • added support for Mac OS X (Darwin/Aqua).
        • extended conversion filter API with 'readSegmtSet', for management of multi-level label files.
        • discard unreadable default signal or transcription files from a configuration file.
        • localization of the interface is now in a separate file for each language, for a better extensibility.
        • segmentation layer name in the signal contextual menu becomes more explicit ("Background", "Turns", etc.)
        • resolved a confusion involving GB-2312 encoding

        Version 1.4.5

        Released on July 11, 2002.
        needs Tcl/Tk 8.0-8.3, Snack 1.7 or preferably 2.0.1, tcLex 1.2

        New or modified functions:

        • added new playback mode stopping before (rather than after) next boundary; added related menu entry
        • added menu entry and ctrl-return binding for playing next segment
        • added bindings alt-backspace/delete for deleting word before/after cursor respectively.
        • added ctrl-alt-t binding for modifying turn attributesImplementation.
        • added support for floating boundaries. They are viewed in the text editor as empty circles (standard boundaries being displayed as full bullets) and it is possible to toggle the state of each boundary or of the whole set of boundaries by right-clicking (or control-left-clicking) on the bullet (except the first one). When a boundary is moved, the neighbouring floating ones move while keeping a proportionality up to the next "hard" boundary. A floating boundary becomes automatically fixed after being moved. The floating state is marked in the .trs format with a space before the time value (this behaviour is meant for backward compatibility of .trs files with prior versions of Transcriber and should evolve in the future). Floating boundaries are intended for later support of import and edition of non-temporized manual transcriptions or dialogs.
        • added import filters for various formats defined by NIST speech group (/www.nist.gov/speech/), especially the output of the 'sclite' scoring tool (alignement between word hypothesis from automatic speech recognition and manual reference) - see header of convert/sclite.tcl file -, the acoustic segmentation .sdt format and the word segmentation .ctm format (developed for the Coretex European project).
        • reworked remote playback support (the script tcl/SoundServer.tcl needs to be launched on the client side) - feature still experimental
        • support for client-server scripting of Transcriber through sockets. One need to launch the tool with: "trans -patch tcl/Socket.tcl" - see tcl/Socket.tcl for details on API. Experimental, intended for interface with other tools.
        changes or bug fixes:
        • improved support for NIST .stm format (convert/stm.tcl).
        • store encoding used along with default settings and localization texts for better portability.
        • improved default setting of shape directory for Windows/Mac platforms.
        • turn around for Tcl8.3.2 bug involving 'a grave' appearing as 'A tilde'.
        • turn around for Tk bug resulting in a bad cursor position when moving to the end of a word.
        • define word boundary to be empty char on Unix platform, similar to Windows settings.
        • take user preference about start or end of line into account when changing line with cursor.
        • do not limit temporal display to 30 sec any more when the signal is not available.
        • case insensitive split of the apostrophe for French and Italian spell checking.
        • selection of a speaker in the list of speakers in the turn attribute windows now also possible with space keystroke.
        • corrected automatic XML encoding detection for OS whose default encoding is not ASCII compatible (e.g. asiatic).
        • corrected possible display inconsistency of axis (delayed repaint).
        • various corrections to the configuration/compilation step.

        Version 1.4.4

        Released on April 19, 2002.
        needs Tcl/Tk 8.0-8.3, Snack 1.7 or preferably 2.0.1, tcLex 1.2

        New or modified functions: none.

        Implementation changes or bug fixes:

        • The cursor disappeared after playing a segment with Shift-Tab - fixed.
        • The waveform display was sometimes not correctly refreshed - fixed.

        Version 1.4.3

        Released on June 21, 2001.
        needs Tcl/Tk 8.0-8.3, Snack 1.7 or preferably 2.0.1, tcLex 1.2

        New or modified functions:

        • when Snack version 2.0 is installed with Transcriber, it is possible to play only the left or right channel from a stereo file using the new menu [Signal]/[Stereo channel]. It has no effects for mono sound files or when previous Snack version 1.7 is used.
        • new conversion filter to .html format, which makes printing the transcription possible from any browser.
        • new conversion filter to .cha (Childes/CHAT) format provided by Zhibiao Wu. Support for this format is yet experimental. When reading a ".cha" file, the tool switches to a CHAT mode with new attributes available in the interface. It switches back to the initial mode when creating a new transcription or reading a file in any non-Chat format.
        • convert filter to .stm format has been modified; import from .stm is limited to the transcription.
        • at first startup, the window automatically fits the whole screen; further resizing is better managed.
        • slight corrections for signal and cursor display.
        • (hidden feature, activated by putting 'hideLevels  1' in the configuration file): when reading a segmentation file (i.e. .lab file), hide the section/turn/background segmentation levels under the signal since they are always empty (their display can be switched on again using contextual menu available with the right button on the signal)

        •  
        Implementation changes or bug fixes:
        • Transcriber has been ported for the Macintosh/G3 platform (thanks to L. Spektor for the modifications). A new sub-directory 'src/mac' includes resources for the compilation of Snack, tcLex and Transcriber on a Mac with CodeWarrior Pro 5.
        • automatic detection of sound files associated to a transcription file now works also for uppercase extensions (e.g. .WAV); it used to recognize only lowercase extensions (e.g. .wav).
        • src/shape.c is now integrated into Snack1.7 (thanks to K. Sjölander) and is no longer distributed with Transcriber. Various parts of the code (src/wavfm.c, tcl/Signal.tcl, tcl/Play.tcl,...) has been modified according to the syntax of the new Snack commands. As a result, Transcriber 1.4.3 doesn't work with Snack 1.6.
        • the format of the sound shapes has changed and has now the suffix ".shape". Previously computed shapes with ".shp" extension become useless and can be removed.
        • src/segmt.c: corrected a bug in BorderTableFree (attempt to free an empty pointer when a wrong segment color name was given)
        • src/wavfm.c: a double pixmap buffering is used for speeding up cursor-only changes (BTW, pixmaps are now freed at the end); a new widget sub-command 'cursor' has been created for that purpose and is used in tcl/Waveform.tcl:proc Cursor.

        Version 1.4.2

        Released on January 6, 2000
        needs Tcl/Tk 8.0-8.2, Snack 1.6, tcLex 1.2

        New or modified functions:

        • boundary move can be forced with Shift-Button2 (or Shift-Control-Button1) - in this case, other boundaries are pushed accordingly.
        • a break can be forced inside a segment with Shift-Return
        • different playback modes can be chosen in [Signal]/[Playback mode] menu (continuous, with pauses, stop or beep at segment boundaries, or looping on segment or selection). The mode applies to any further playback. Default pause duration, beep file, and also an initial step back before playing are set in [Options]/[Audio file...].
        • default position of the text cursor during automatic synchronization with the signal can be chosen in [Options]/[General...] between start and end of line (it used to be the end of line).
        Implementation changes or bug fixes:
        • in the 'Find and Replace' window, the 'Replace all' button sometimes caused an infinite loop - replacement is now stopped at the end of the document. Replacement of text within event descriptions failed and is now avoided.
        • in the segmt widget, segments are now splitted vertically at first form-feed character instead of newline.
        • execution failed if the installation pathname contained spaces - fixed.
        • on first launch, open dialog box in the 'demo' subdirectory rather than in the current directory.
        • when cancelling a font chooser and saving the configuration (i.e., [Options]/[Fonts]/[...], then Cancel, then [Options]/[Save configuration]), current font description was lost - fixed.
        • always display cursor time with 3 digits precision.
        • a date change with monitoring activated caused an infinite loop (e.g. after a night of inactivity).
        • under Windows, user configuration file is now saved in the $USERPROFILE directory
        • upon creation of a new turn, the channel setting was lost - fixed.
        • the list of encodings is now located inside the etc/default.txt file for easier (manual) configuration.
        • the character set used in any encoding remained restricted to iso-latin1 in version 1.4.1; it is now extended to the whole Unicode set for Tcl/Tk8.1 or higher. However, it is not possible to choose a font for a specific encoding, and display of non-ascii chars sometimes fails.
        • src/shape.c slightly modified to follow API change in Snack1.6.4

        Version 1.4.1 (offers Unicode support under Tcl/Tk 8.1.1 or higher)

        Released on October 28, 1999
        needs Tcl/Tk 8.0-8.2, Snack 1.6, tcLex 1.2
        compiled under Linux/x86 (Debian 1.3/2.0), Linux/alpha, Solaris (SunOS 5.5), SGI (IRIX 6.2).

        New or modified functions:

        • Unicode support, only available under Tcl/Tk 8.1.1 or higher. The encoding used for writing the transcriptions can be chosen in [Options]/[General...]. It defaults to ISO-Latin-1, but can be modified to Unicode (UTF-8) or other widespread 8-bits encodings. The same user-defined encoding is used for reading transcriptions produced by earlier versions of Transcriber without encoding header. Under Tcl/Tk 8.0, the behaviour remains unchanged and makes reading transcriptions in Unicode not possible.
        • Changing all occurences of a speaker to another already existing one is possible by changing the old name to the new one.
        Implementation changes or bug fixes:
        • with Transcriber 1.4 under Tcl/Tk8.1.1 or higher, display of non-ASCII chars in the segmentation tier under the signal was followed by garbage; this has been corrected. Any Unicode char should be now correctly displayed, provided it is available in an installed font.
        • for Windows, call to XDrawLines in segmt.c with empty segment is avoided.
        • the transcription input/output has been modularized; modules can be added into the convert sub-directory for supporting new input or output formats (see convert/README file).

        Version 1.4 (mostly a stable version of 1.3 beta)

        Released on September 27, 1999
        needs Tcl/Tk 8.0-8.2, Snack 1.6, tcLex 1.2
        compiled under Linux/x86 (Debian 1.3/2.0), Linux/alpha, Solaris (SunOS 5.5), SGI (IRIX 6.2).

        New or modified functions:

        • handling of raw sound files is improved - a default header size can be given in the [Options]/[Audio file...] window; changes to the default raw sound files settings immediately apply to the current sound file if necessary.
        • background color of selected signal can be modified by the user - this can be necessary when not enough colors are available in the colormap.
        • a sample of speech conversation transcription is provided in the demo sub-directory.
        • the Help is viewed through 'netscape' when it is available.
        • a -patch directory_name option has been added to the command line options for 'trans'; this will allow loading some extensions to the tool at startup in the future.
        Implementation changes or bug fixes:
        • no more Makefile at the root directory - all compilation and installation is done from within the 'src' sub-directory.
        • the DTD has been extended with the "elapsed_time" field in the Trans tag (intended for total transcription time monitoring, but not currently used)
        • shape calculation mode disabled by default for Windows platform; background calculation is always disabled.

        Version 1.3b7

        Released on July 6, 1999
        needs Tcl/Tk 8.0 or 8.1, Snack 1.5p2 or 1.6a2 (do not use 1.6b1 under Linux), tcLex 1.1.3 (do not use older release with Tcl/Tk8.1)
        compiled under Linux/x86 (Debian 1.3/2.0), Linux/alpha, Solaris (SunOS 5.5), SGI (IRIX 6.2), Windows NT.

        New or modified functions:

        • check spelling (GUI for using 'ispell' external program)
        • upon reading a transcription, look for a more recent automatically saved version and ask user to restore from this version instead (in case of crash during previous session)
        • playback with pauses at segment boundaries (menu [Signal]/[Play with pauses])
        • significant update of French user and reference manuals
        • remote sound file server is functional again (tcl/SoundServer.tcl has to be launched on the host)
        • menu for sorting an edited list (bindings, localization, etc.) upon any field (name, value...)
        • slight modifications in .stm format
        Implementation changes or bug fixes:
        • no clock calibration needed anymore (instead, native Snack "audio elapsedTime" function available since 1.5p2 is used); cursor and callbacks management in tcl/Play.tcl updated.
        • mp3 sound files work with the most recent Snack versions (1.6a2).
        • new Snack sub-command "order", to be used in conjunction with "shape" and "get" sub-commands for remote sound file access in heterogeneous network.
        • use a specific Snack API allowing support of Transcriber under Windows NT platform.
        • updated "Help" menu for display of correct .html files.

        Version 1.3b6

        Released on May 17, 1999

        New or modified functions:

        • completely new French reference and user manual (HTML format)
        • current cursor position in signal and vertical zoom are now saved with session configuration
        • at user option, saving current configuration is proposed before leaving
        • direct access to a cursor position is now possible with menu [Signal]/[Go to...] or by clicking on the message under the signal
        • direct control of sound level in [Signal]/[Control Panel]; vertical zoom moved to the same window
        • at startup, sound files are automatically detected, even if their suffix is unknown or lacking (in 1.3b5, they were rejected with the message "format unknown"); more suffixes are now recognized (.aif, .aiff, .smp)
        • move segment boundaries can also be done using control-left button 1 (instead of middle button) for 2-buttons only mouse users.
        • modification date and version are not editable any more in Episode window.
        • language list is now displayed in lexicographical order of the current langugage.
        Implementation changes or bug fixes:
        • corrected bug in 1.3b5 with activity logging when day changed during session (caused infinite loop)
        • corrected bug in update of turn and section button colors in the text editor
        • changed duration for recalibration of clock to 10 seconds.
        To be corrected or not implemented:
        • "undo" very limited
        • no spelling correction, automatic completion etc. yet
        • no printing
        • mp3 sound files partially working, but randomly causing Transcriber to crash

        Version 1.3b5

        Released on March 23, 1999

        New or modified functions:

        • transcription time monitoring has been rewritten and is displayed inside the "Informations" window if a log file is given
        • upon startup, user is asked either for a transcription file or for an audio file.
        Implementation changes or bug fixes:
        • bug in 1.3b4 with turn attributes edition

        Version 1.3b4

        Released on March 16, 1999

        New or modified functions:

        • Cut/Copy/Paste of mixed text and events works as expected
        • Bindings replacement string can include Events (through copy/paste or directly with selection); binding key can be typed as-is in the editor field
        • Automatic space insertion at user option
        • Save the geometry of some windows
        • A user glossary is available
        • Imported speaker can be selected; topics can also be imported the same way. Unused topics and speakers can be removed. All these functions are available with menu "Edit/Speakers" or "Edit/Topics"
        Implementation changes or bug fixes:
        • Bug correction in shape.c for 8bit wav sound files
        • Format used in list edition since 1.3b3 slightly modified to allow a generic n-fields edition instead of 2-fields only

        Version 1.3b3

        Released on March 7, 1999

        New or modified functions:

        • DTD: extended Event tag with attributes type (noise/lexical/pronounce/language) and extent (begin/end/previous/next/instantaneous); previously defined Events default to instantaneous noise.
        • Edition of Event has been upgraded to ths new format
        • Background shape computation is back at user option
        • Events are displayed in the segmentation bar; they weren't any more in 1.3b2
        • Overlapping speech is now managed inside turn window
        • Turns and sections can be destroyed from within their edition window
        • Information window now also gives information about transcription
        • Signal and transcription name are both displayed in the button bar when necessary
        • Better localization of the interface
        • Added menu "File/Export/..." for explicit exportation to non-native format; "File/Save" and "File/Save as..." always use native XML format
        • Default extension of transcription files has been changed to .trs; .xml can still be used
        • User configuration of:
          • language list (in iso639 code)
          • noise events list
          • pronounce events list
          • lexical events list
          • display format of events, their color
          • bindings
          • localization strings in any language
        Implementation changes or bug fixes:
        • Switched to Snack1.5 (final), tcLex1.1 (final) and tcl8.0.5 for development (should still work with previous 8.0.x)
        • C sources: reworked shape.c for use of latest Snack function and shape display of any type of sound file, including compressed ones.
        • File format .typ has been corrected to come back to 1.2 behaviour
        • Updated Transcriber URL to its new home page inside distribution and docs
        • no more patch to tk_getSaveFile lib for choosing the save format

        Version 1.3b2

        (not publically) released on February 12, 1999

        New or modified functions:

        • DTD:
          • added channel attibutes in Turn tag (=telephone/studio)
          • added scope attribute in Speaker tag (=local/global)
        • Added "File/Import speakers..." menu: import all speakers from a .xml file
        • Automatic insertion of spaces before punctuations
        • Suppressed "File/Close" menu
        • Write to .stm format for further exploitation
        Implementation changes or bug fixes:
        • Modifs to Xml parsing libs

        Version 1.3b1

        Released on January 21, 1999 - test under Linux (Debian 1.3/2.0), Solaris (SunOS 5.5), SGI (IRIX 6.2).

        New or modified functions:

        • a new XML format becomes the native format for the tool instead of LDC's .typ
        • validity of the transcription is checked upon the DTD (i.e. the syntax of the format)
        • general informations about the transcriber name, the emission or the signal file are now kept along with the transcription
        • when opening a transcription, the corresponding sound file is open automatically
        • background music or noise is now handled and displayed in a separate transcription tier
        • Speech or non-speech events and of comments are now handled as XML tags rather than normal text
        • management of overlapping speech has been reworked
        • management of speakers and topics is easier and more powerful, and allows global research and edition of speakers or topics
        • automatic shape computation for large signals can be disabled at user option
        • loading raw files is once again a problem - but it should work even better than before with future updates of Snack module...
        • transcriber's productivity can be logged in a file at user option
        Implementation changes:
        • SoX libraries aren't used anymore; instead, all sound files are accessed with Snack module; specific open_sound and play_sound command disapeared
        • tcLex module from Frédéric Bonnet (a lexical analyser generator for Tcl) is now used for the implementation of an object-oriented tcl-only validating XML parser
        • installation procedure and global tool structure has been reworked thanks to D. van Leeuven useful hints

        Version 1.2

        Released on September 16, 1998 - test under Linux (Debian 1.3 and Redhat 4.3), Solaris, SGI (IRIX 6.2).

        New functions:

        • Signal:
          • Display topic and speaker segmentation under the waveform along with text segmentation.
          • Ability to display a second view of the signal at a different scale.
          • Possibility to open raw sound files.
          • Contextual menus on the waveform for direct actions on the signal and its display.
        • Transcription:
          • Undo/Redo, limited to segmentation boundary moves and text changes (undo all text modifs in the current segment since cursor moved into it).
          • Find and replace in the text.
          • Automatic auto-save at periodic intervals.
          • New XML format for transcription output (format will probably be modified soon - see discussion about formats).
        • Management of overlapping speech over one segment.
        • More configurable options (fonts, colors, windows to display...). Most user choices (including current sound file, transcription file and current resolution display) are saved in the "~/.transcriber" user configuration file upon request.
        • Localization of the menus in english or in french as option; other languages can be easily added.
        • Help in HTML format.
        Bug fixes:
        • Topics were lost when file was saved as ".typ". Original LDC format was slightly modified to include topic. Markup for overlapping speech is now recognized.
        • Default configuration file was named "~/.trancriber" (without 's'); it was corrected.
        • Shortcut for 'Signal/Replay Segment' has been moved from <Alt-Tab> to <Shift-Tab>; it could be a problem on some platforms.
        • Menus 'Segmentation/Move to.../First segment' and '.../Last segment' are now executed.
        • ... plus a lot of minor changes
        Implementation changes:
        • Internal data management has been completely rewritten. Transcriptions are stored in memory as a tree structured like an XML file, and are accessed with a set of procedures in "tcl/Tags.tcl". Input file parsing is very simplified (an XML-conformant library using tcLex extension for Tcl written by Frédéric Bonnet is under development).
        • Sound files are accessed via a new Tcl command "open_sound" which calls sox and/or sphere libraries and creates a new "sound-file" Tcl command - not (yet) compatible with Snack "sound" commands. Playback with a new Tcl command "play_sound" which calls Snack libraries. These functions are documented in the "doc" sub-directory.
        • Sound shape (pre-computed at the resolution of 10 ms per pixel) are not computed in background any more. Rather, the interface is stopped the first time a large sound file is open during the shape computation; it is then saved for the next time it is needed.
        • Remote audio playback server is no longer available; it seemed not to be essential, and Snack playback design is more robust. Remote audio file server is still in the distribution, but the default behaviour is to read audio files locally without launching the audio file server on the local host. If needed, the file server should be configured before launching to avoid security holes (e.g. by testing the client port or the sound file directory).
        • axis, wavfm and segmt new Tk widgets have been updated (but they are not yet documented):
          • wavfm widget now calls a "sound-file" command created with the "open_sound" command for shape calculation rather than reading/writing a channel (pipe or socket). Widget options "-width" and "-height" added.
          • segmt widget support one indirection level for time indices : start and end segment times can be an index in an associative array. Time array and list of segment variables are automatically traced, and the widget is redisplayed if they are modified. Some minor other fixes.
          • axis and segmt widgets are redrawn if named fonts are modified (allows interactive fonts configuration).
        • Distribution structure:
          • the main distribution directory is now named Trans-x.y (x.y being 1.2 in this version). For simplification, the "editor" sub-directory has been suppressed and its content ("doc", "img", "src", "tcl") is in the first level. The "pkg" sub-directory has been renamed "lib". The "bin" and "obj" sub-directory are no longer used.
          • all C extensions to Tcl/Tk are grouped in a single auto-loadable package "libtrans.so"; there are no binary executable to be launched in background any more.
          • a patched version of the last distribution of SoX (v-12.14) is included in the distribution in the "contrib" sub-directory
          • html_library-0.3 from Stephen Uhler is included in the "lib" sub-directory.
          • Snack official distribution is used without any patch. The lite version of the package is installed in the "lib" sub-directory.
          • a configure procedure is available for the compilation of C sources in the "src" sub-directory

        Version 1.1

        Released on June 26, 1998 - test under Linux (Debian), Solaris, SGI.

        Modifications:

        • SNACK 1.1 module from Kåre Sjölander is used instead of Sox libraries for audio playback. This solution is more stable and portable : Snack works under HP-UX, Sun Solaris, SGI IRIX, Linux, and Windows 95/NT. The module is used in a patched version.
        • No modifications of the user interface, installation procedure still rather crude.

        Version 1.0

        Released on May 25, 1998 - development under PC/Linux (Debian 1.3); test under Sun Solaris.

        transcriber-1.5.1.1/doc/fr/0000755000175000017500000000000010605162351013202 5ustar rtrttranscriber-1.5.1.1/doc/fr/refFrame.html0000644000175000017500000000033607510315716015627 0ustar rtrt Manuel de Rfrence transcriber-1.5.1.1/doc/fr/refMenu.html0000644000175000017500000001554207510315717015507 0ustar rtrt

        Retour à la présentation

        Manuel de référence

        1. Démarrage

        2. Disposition des fenêtres

        3. Fichier de transcription

        4. Fichier de signal

        5. Manipulation du signal

        6. Edition

        7. Episode

        8. Segmentation du signal

        9. Tours de parole et locuteurs

        10. Sections et sujets

        11. Bruit de fond

        12. Evénements et commentaires

        13. Raccourcis clavier

        14. Options et configuration de l'interface

        15. Autres fonctions

        transcriber-1.5.1.1/doc/fr/functions.html0000644000175000017500000001623607510315717016117 0ustar rtrt Fonctionnalités de Transcriber

        Fonctionnalités

        Transcriptions

        • gestion de plusieurs niveaux de segmentation : la segmentation élémentaire (généralement une segmentation par phrase ou à chaque prise de souffle), la segmentation en tours de parole (changement de locuteur) et la segmentation en grandes sections (changement d'émission, de sujet...) ; à ces 3 niveaux imbriquées de manière hiérarchique s'ajoute une 4ème segmentation en condition acoustique (bruit de fond) indépendante
        • affichage des segmentations sous le signal ainsi que dans la fenêtre de texte ; l'affichage de la segmentation sous le signal peut être désactivé ou réactivé par un menu contextuel
        • édition de la transcription orthographique associée à la segmentation élémentaire dans une fenêtre d'édition de texte
        • synchronisation permanente entre la position du curseur dans le texte et du curseur dans le signal : quand le curseur change de segment dans une fenêtre (texte ou signal), le curseur de l'autre fenêtre est déplacé automatiquement pour apparaître dans le même segment
        • création aisée d'une segmentation élémentaire du signal par insertions successives de frontières à la position courante du curseur, et ce sans interrompre la lecture du son
        • déplacement des frontières des segments avec la souris
        • insertion de marqueurs de changement de conditions acoustiques (musique, conversations, autres bruits) à la position du curseur dans le signal
        • désignation de frontières comme début de nouveau tour de parole ou comme traitant d'un nouveau sujet
        • édition des tours de parole, des changements de section ou des conditions acoustiques par clic de souris sur le bouton correspondant dans l'éditeur, avec possibilité de destruction
        • gestion d'une liste des locuteurs avec la description précise de chacun (nom, genre, accent...), modification ultérieure de ses caractéristiques, recherche des prises de parole d'un locuteur dans la transcription, importation sélective des locuteurs d'une autre transcription
        • de même, gestion d'une liste des sujets, recherche des sections portant sur un sujet, importation sélective de sujets à partir d'un autre fichier
        • gestion spécifique de la parole superposée avec la présence dans le texte de marqueurs pour les tours de parole des deux locuteurs
        • insertion d'événements prédéfinis (bruits, marqueurs de prononciation, marqueurs lexicaux, changement de langue ou commentaires), qui peuvent être instantanés ou désigner le début ou la fin de l'événement ; affichage dans un format spécifique (police, couleur, balises de début et fin) modifiable par l'utilisateur; édition ou destruction en cliquant sur le texte
        • fonctionnalités standard d'édition du texte de la transcription : couper/copier/coller, annuler (très limité), chercher/remplacer...
        • correction orthographique utilisant le logiciel 'ispell'
        • glossaire de mots ou d'expressions prédéfinies
        • fichiers au format XML pour une exploitation automatisée et des échanges simplifiés ; validation des fichiers lus d'après la syntaxe normalisée (DTD)
        • choix du format d'encodage pour l'enregistrement et la relecture des transcriptions ; les formats standards (ISO-8859-*, EUC-JP...) et Unicode (UTF-8) sont disponibles.
        • à l'ouverture d'un fichier de transcription, recherche automatique du signal correspondant par diverses heuristiques; s'il n'est pas trouvé, une fenêtre de dialogue permet de le désigner (et éventuellement de n'utiliser aucun signal).
        • importation automatique des fichiers .typ et de divers formats de segmentations (xwaves, OGI...); exportation en .typ et .stm
        • enregistrement automatique à intervalle régulier et récupération en cas de plantage
        • conservation de la version précédente dans un fichier de secours

        Manipulation des signaux

        • lecture des formats audio les plus standards (via la librairie Snack)
        • gestion de signaux audio de longue durée (jusqu'à plusieurs heures);
          pour les signaux de plus de 30 secondes, une image à faible résolution du signal est pré-calculée en tâche de fond et stockée afin d'accélerer les affichages ultérieurs
        • accès direct à n'importe quelle position du signal ; sélection d'une portion du signal
        • curseur défilant lors de la restitution audio
        • plusieurs modes de lecture accessibles par combinaison de touches : lecture/pause simple, lecture de la totalité du segment courant, de la sélection, ou encore d'un intervalle avant et après le curseur
        • changement interactif de l'échelle d'affichage sans interruption du son
        • possibilité d'afficher deux vues du signal à des échelles différentes
        • zoom vertical

        Autres fonctions

        • affichage en secondes de la position du curseur durant la restitution, des bornes de la sélection, et de divers messages sous le signal
        • enregistrement possible de la quantité de travail effectuée par le transcripteur à chaque session pour un suivi de la productivité (à activer dans les options)
        • fenêtre d'information sur le signal (nom, durée, format), sur l'état de la transcription à l'instant considéré (nombre de segments des différents niveaux de segmentation, nombre de mots...) et éventuellement le travail produit dans la session (si le suivi est activé)
        • édition de la liste des événements prédéfinis (bruits, prononciation...)
        • édition des raccourcis claviers (pouvant inclure des balises d'événements)
        • choix des polices de caractères et des couleurs utilisées par l'interface
        • interface internationalisable par l'utilisateur dans toutes les langues (anglais et français en standard)
        • possible sauvegarde des noms des fichiers ouverts, des options et de la position des fenêtres pour la session suivante dans un fichier de configuration
        transcriber-1.5.1.1/doc/fr/tete.gif0000644000175000017500000000032307510315716014636 0ustar rtrtGIF89a!7Image generated by Aladdin Ghostscript (device=ppmraw) ,qIZո "'Ybbp5 faL2 IiS\v2'^!CBF\mXp@&@@8>NR2 FvD7P;transcriber-1.5.1.1/doc/fr/about.html0000644000175000017500000000235607510315716015216 0ustar rtrt A propos de Transcriber...

        Transcriber - un outil pour la segmentation, l'annotation et la transcription de la parole

        Transcriber - Copyright (C) 1998-2002, DGA
        http://www.etca.fr/CTA/gip/Projets/Transcriber/
        Auteur: Claude Barras (DGA)
        Coordination: Edouard Geoffrois (DGA), Mark Liberman & Zhibiao Wu (LDC)
        Ce programme est diffusé en logiciel libre - voir la traduction de la Licence GNU.
        Transcriber utilise aussi des librairies externes - voir les Crédits.

        transcriber-1.5.1.1/doc/fr/userFrame.html0000644000175000017500000000033607510315716016031 0ustar rtrt Manuel du transcripteur transcriber-1.5.1.1/doc/fr/menu_local.html0000644000175000017500000000353310122050367016207 0ustar rtrt

        in English    en franais    in Deutsch

        Présentation

        Documentation
        Fonctionnalités
        Manuel du transcripteur
        Manuel de rfrence
        Distribution (en anglais)
        Installation
        Historique
        A faire ...
        Autres informations...
        Outils & formats (en anglais)
        Motivations (en anglais)
        Remerciements
        Contact, support (en anglais)
        transcriber-1.5.1.1/doc/fr/reference.html0000644000175000017500000017750707510315716016055 0ustar rtrt Interface de Transcriber

        Manuel de référence

        Description de l'interface et des commandes

        Transcriber 1.4.4

        DGA, avril 2002


        1. Démarrage 2. Disposition des fenêtres 3. Fichier de transcription 4. Fichier de signal 5. Manipulation du signal 6. Edition 7. Episode 8. Segmentation du signal 9. Tours de parole et locuteurs 10. Sections et sujets 11. Bruit de fond 12. Evénements et commentaires 13. Raccourcis clavier 14. Options et configuration de l'interface 15. Autres fonctions


        1. Démarrage

        1.1. Environnement de travail

        Le logiciel est conçu afin de permettre la transcription de signaux de longue durée sur un matériel standard. A titre d'exemple, plusieurs enregistrements d'une heure (échantillonnés à 16 kHz sur 16 bits en mono) ont déjà été transcrits avec un PC/Pentium 200MHz sous Linux. L'usage d'un casque est fortement conseillé pour une transcription de qualité, mais des haut-parleurs sont utiles pour une vérification à plusieurs.

        1.2. Lancement de l'outil

        Lorsque Transcriber est installé de manière standard, on peut le lancer avec la commande :
          trans
        ou suivant la configuration en cliquant dans un menu ou sur une icône particulière. Une fenêtre de dialogue propose alors de sélectionner un fichier son pour créer une nouvelle transcription associée à ce signal, ou un fichier de transcription pour afficher ou modifier celle-ci. Un court exemple de signal avec une transcription associée est disponible dans le sous-répertoire "demo" distribué avec le logiciel.

        Lorsque la configuration de travail a été enregistrée au cours d'une session précédente, les fichiers de signal et de transcription en cours sont automatiquement réouverts s'ils sont encore disponibles sur le disque.

        Il est possible aussi de lancer l'outil en indiquant sur la ligne de commande un nom de fichier signal, de fichier de transcription, ou les deux. Si les deux fichiers sont dans le même répertoire, portent le même nom (à l'exception de l'extension) et que le fichier signal possède une extension standard (par exemple .wav ou .snd) , le nom du fichier signal peut être omis, son ouverture étant automatique :

          trans demo/frint980428.xml

        1.3. Configuration initiale

        Après le premier lancement de l'outil, il est conseillé d'ouvrir le menu [Options]/[Général...] pour renseigner :
        • le nom du transcripteur qui sera enregistré par défaut dans chaque nouvelle transcription ;
        • la langue pour l'interface du logiciel (l'anglais et le français sont disponibles) ;
        • éventuellement le nom du fichier dans lequel seront enregistrées les informations sur la production quotidienne - par défaut la fonction est désactivée (cf. 14.2) ;
        ainsi que des options plus spécifiques aux signaux dans le menu [Options]/[Fichier son...] :
        • le format des fichiers sans entête (cf. 4.2) ;
        • le mode de calcul et le répertoire de stockage de l'enveloppe des signaux (cf. 4.3).
        Les options doivent ensuite être enregistrées avec le menu [Options]/[Enregistrer la configuration].


        2. Disposition des fenêtres

        2.1. La barre des menus

        2.2. La transcription

        Dans la moitié supérieure de l'interface, une fenêtre d'éditeur de texte permet de saisir la transcription orthographique du signal.
        • les débuts de section (changement de sujet, d'émission...) sont indiqués par un bouton (orange par défaut) centré dans une ligne ;
        • les débuts de tour de parole (changement de locuteur, ou éventuellement pas de locuteur) sont représentés par un bouton (bleu par défaut) à gauche d'une ligne ;
        • et un petit cercle (vert par défaut) à gauche des autres lignes signale le début de la transcription orthographique d'un nouveau segment.
        Le début du signal marque aussi le début de chaque segmentation ; la transcription contient donc toujours au moins une section, un tour et un segment sur les trois premières lignes. La ligne dans laquelle se trouve le curseur est surlignée. Une barre de défilement à droite permet de manipuler des transcriptions de longueur arbitraire.

        2.3. La barre de boutons

        Au centre de l'écran, un bandeau de boutons (masquable) offre des raccourcis pour jouer le signal ou pour afficher les informations sur le signal et la transcription, et rappelle le nom des fichiers en cours d'édition.

        Le commandes sont :

          : retourne au début du segment ou au segment précédent
          : retour rapide (de 1/2 seconde)
          : pause
          : lecture
          : avance rapide (de 1/2 seconde)
          : va au segment suivant
          : affiche la fenêtre d'informations sur le signal et la transcription

        2.4. Le signal et la segmentation

        Dans la moitié inférieure de l'interface sont affichés le signal et la segmentation ; une barre de défilement au-dessus permet de se déplacer et une autre barre de défilement plus petite (masquable par un menu contextuel) permet de modifier la résolution d'affichage. Sous le signal, la segmentation orthographique, en tours de parole, en section ainsi qu'en conditions acoustiques est affichée et alignée avec le signal ; le segment courant de la transcription orthographique est surligné. Le texte du segment (transcription, nom du locuteur, sujet de la section) est affiché dans l'intervalle temporel correspondant aux bornes du segment. Une deuxième vue du signal à une échelle différente peut être affichée. La position courante du curseur dans le signal est représentée avec une barre rouge verticale. Les deux curseurs (celui dans la fenêtre de texte et celui dans le signal) sont synchronisés de manière à ce que le segment courant dans le texte soit à chaque instant identique au segment courant sous le signal ; lorsqu'un des curseurs change de segment, l'autre curseur est donc automatiquement déplacé afin d'apparaître dans le même segment.

        Sur le signal, la souris permet de réaliser les contrôles suivants :

        • clic du bouton 1: place le curseur à la position désignée dans le signal
        • cliquer-déplacer le bouton 1 : sélectionner une partie du signal
        • clic du bouton 2 (ou shift-clic du bouton 1) : étendre la sélection du signal
        • clic du bouton 3 : afficher un menu contextuel
        Sur les lignes de segmentation, les commandes de la souris sont :
        • clic du bouton 1 : sélectionner le signal sur l'intervalle du segment
        • cliquer-déplacer le bouton 1 : sélectionner le signal sur plusieurs segments contigus
        • shift-clic du bouton 1 : étendre la sélection
        • cliquer-déplacer le bouton 2 (ou control-cliquer-déplacer le bouton 1) : déplacer la frontière entre deux segments
        • clic du bouton 3 : afficher un menu contextuel


        3. Fichier de transcription

        3.1. Créer une nouvelle transcription

        Choisir le menu [Fichier]/[Nouvelle transcription]. Une fenêtre de dialogue propose de choisir le fichier son à transcrire. Il est possible de modifier ce choix ultérieurement.

        3.2. Lire une transcription

        Avec [Fichier]/[Ouvrir une transcription...], il est possible de lire un fichier de transcription produit par Transcriber, ainsi que des fichiers de transcription ou de segmentation dans quelques formats courants identifiés par le suffixe du nom du fichier:
        • Format XML natif (.trs, .xml)
        • OGI lola (.lola)
        • LDC .typ format (.typ)
        • ESPS/xwaves (.lab)
        • LIMSI label (.lbl)
        • TIMIT format (.phn, .wrd, .txt)
        • Childes/CHAT (.cha) support expérimental, avec de nouveaux attributs disponibles dans l'interface.
        Le fichier signal associé à la transcription est ensuite recherché ; s'il n'est pas trouvé automatiquement, une fenêtre de dialogue demande à l'utilisateur de le localiser.

        3.3. Enregistrer la transcription

        La transcription peut être enregistrée avec le menu [Fichier]/[Enregistrer] si des modifications ont eu lieu depuis la création ou le dernier enregistrement. Lors du premier enregistrement, le nom du fichier signal suivi de l'extension .trs est proposé. La transcription peut être enregistrée sous un autre nom avec la commande [Fichier]/[Enregistrer sous...].

        3.4. Exporter sous un autre format

        L'exportation sous un format différent du format de Transcriber (aux formats .typ, .stm ou .html) est proposée dans le menu [Fichier]/[Exporter], mais ces formats ne sont pas aussi complets que le format normal et n'assurent pas la relecture complète de la transcription. Cependant le format .html permet d'imprimer la transcription à partir de n'importe quel browser.

        3.5. Revenir à la version précédente

        La commande [Fichier]/[Revenir au fichier] propose d'annuler toutes les modifications en mémoire et de relire la dernière version enregistrée sur le disque.

        3.6. Enregistrement automatique

        Après une modification, si la transcription en cours n'est enregistrée sous un certain délai, alors un enregistrement automatique est réalisé dans le répertoire de la transcription et avec le même nom précédé et suivi du caractère # (par exemple, /data/transcription/#radio.trs#). Ce fichier est détruit lors de la sauvegarde normale du fichier. Le délai est donné par l'utilisateur dans la fenêtre [Options]/[Général] ; s'il est nul, la fonction est désactivée. La récupération automatique de la sauvegarde est proposée si une sauvegarde de la transcription est détectée à l'ouverture.

        3.7. Fichier de sauvegarde

        Lorsqu'une transcription qui a été lue sur le disque puis modifiée est enregistrée, l'état de la transcription au moment de sa lecture initiale est conservé dans un fichier du même nom que la transcription suivi de l'extension indiquée dans la fenêtre [Options]/[Général] (par exemple, /data/transcription/radio.trs~ ). Si le champ contenant l'extension est vide, la fonction est désactivée.

        3.8. Encodage des fichiers

        Avec Transcriber 1.4.1 fonctionnant sous Tcl/Tk version 8.1.1 ou plus récente, l'encodage utilisé pour l'enregistrement des fichiers pour être modifié dans [Options]/[Général]. L'encodage par défaut est le ISO-8859-1 (Latin1). Il est possible d'utiliser un autre encodage 8 bits (ISO-8859-*, EUC-JP...) mais aussi Unicode (enregistré au format UTF-8 de longueur variable, compatible ascendant avec l'ASCII-US 7 bits). Dans le doute, si Latin1 ne convient pas, il est conseillé d'essayer UTF-8 qui est un sur-ensemble de tous les autres.
        En lecture, l'encodage défini dans l'entête de la transcription lors de son enregistrement est automatiquement utilisé. Lorsque cette information est absente de l'entête (par exemple pour des transcriptions produites avec une version plus ancienne de Transcriber ou de Tcl/Tk), ou lorsque la transcription est dans un encodage qui n'est pas compatible ASCII, l'encodage défini par l'utilisateur est utilisé aussi pour la lecture.

        4. Fichier de signal

        4.1 Ouvrir un fichier signal

        Le fichier signal est normalement sélectionné lors de la création d'une nouvelle transcription ou en changeant le signal associé à une transcription avec la commande [Fichier]/[Ouvrir un fichier son...].

        4.2. Format des fichiers sons

        La plupart des formats de fichiers audio sont reconnus automatiquement par l'intermédiaire de la librairie Snack : WAV, AU, SND, AIFF, SMP, Sphere (si ce format particulier a été installé avec Snack). Les fichiers au format MP3 sont acceptés, mais du fait de la compression dans ces fichiers, l'accès direct à une portion du signal est parfois lent. Le format des fichiers sans en-tête (codage sur 8 bits ou 16 bits, ordre des octets...) est déterminé automatiquement, sauf en ce qui concerne la fréquence d'échantillonnage et le nombre de canaux (mono/stéréo) qui sont indiqués par l'utilisateur dans la fenêtre de dialogue [Options]/[Fichier son...].

        4.3. Enveloppe du signal

        Pour accélérer l'affichage du signal à faibles résolutions (affichage d'un intervalle de plus de 30 secondes), une image à basse résolution (ou enveloppe) globale est calculée pour tous les signaux de plus de 30 secondes. Le calcul est réalisé en tâche de fond à la première ouverture du signal, et l'enveloppe est enregistrée dans un répertoire spécifique pour être réutilisée lors des sessions suivantes. Il est possible d'interrompre le calcul en cours, ou de désactiver cette fonction dans le menu [Options]/[Fichier son...]. Le calcul en tâche de fond peut aussi être désactivé. Dans la version pour Windows, le calcul de l'enveloppe est désactivé en raison de dysfonctionnements.

        Le répertoire dans lequel les enveloppes sont stockées (avec le suffixe .shp) est indiqué lui aussi dans [Options]/[Fichier son...] ; par défaut, un répertoire du type /var/tmp est proposé, mais il est souhaitable de créer un répertoire spécifique, éventuellement partagé par tous les utilisateurs de Transcriber, et autorisé en écriture pour que l'utilisateur puisse créer de nouvelles enveloppes.

        Il est aussi possible de distribuer le fichier d'enveloppe dans le même répertoire que le fichier signal, y compris dans un répertoire en lecture seule (attention, le format du fichier dépend de l'architecture de la machine).

        4.4. Ouvrir un fichier distant

        L'architecture client-serveur pour l'affichage et la restitution des signaux à distance nécessite le lancement d'un serveur spécifique sur la machine hôte (un script tcl/SoundServer.tcl est proposé dans la distribution et doit être éventuellement adapté) et la sélection par l'utilisateur de l'accès à distance (ainsi que la désignation du serveur et du port de données utilisé) dans [Options]/[Fichier son...].


        5. Manipulation du signal

        La transcription d'un long enregistrement nécessite d'écouter généralement plusieurs fois des portions courtes du signal. Les commandes-type d'un magnétophones sont disponibles avec les boutons de la barre de commandes ainsi que dans le menu [Signal] ; en pratique, les raccourcis claviers sont très utiles et il est conseillé de mémoriser les plus fréquents.

        5.1 Positionner le curseur

        Il est possible de positionner directement le curseur à n'importe quelle position dans le signal par clic de souris. La commande [Signal]/[Aller à...]/[Position] permet d'indiquer une valeur précise (commande accessible aussi en cliquant sur la ligne d'information sous le signal).

        5.2. Sélectionner une portion de signal

        La sélection d'une partie du signal s'effectue en cliquant puis en déplaçant la souris avant de relâcher le bouton, ou en cliquant avec le bouton central de la souris (ou avec le bouton de gauche avec la touche Shift enfoncée) pour étendre la sélection. La position du curseur et éventuellement l'étendue de la sélection sont indiquées sous le signal. Si l'option Joue automatiquement la sélection dans [Options]/[Général] est activée, le segment sélectionné est joué dès que le bouton de la souris est relâché.

        5.3. Jouer le signal

        Les boutons de lecture et pause , la commande [Signal]/[Joue/Pause] ou son raccourci (la touche Tab) permettent de jouer le son à partir de la position du curseur ou de l'arrêter. Si une sélection est active, seule cette partie sera jouée. Le menu [Signal]/[Mode de lecture] permet de choisir un mode de lecture parmi les suivant: lecture en continu (le mode par défaut), lecture avec pause aux frontières des segments, avec émission d'un bip aux frontières, avec arrêt à la prochaine frontière, ou lecture en boucle sur la sélection (si elle est active) ou à défaut sur le segment courant après une pause. La durée de la pause ou le choix du fichier son pour le bip sont contrôlés dans la fenêtre [Options]/[Fichier son...]; le paramètre Recul avant la lecture permet de revenir automatiquement en arrière avant chaque redémarrage de la lecture.

        Si Snack version 2.0 est installé, il est possible de ne lire que le canal gauche ou droit d'un fichier stéréo grâce au menu [Signal]/[Stereo channel]. Si le fichier est mono ou si la version de Snack est plus ancienne, cela n'aura aucun effet.

        5.4. Jouer un segment

        Lorsqu'une segmentation du signal est réalisée, la commande [Signal]/[Joue le segment] ou un de ses raccourcis (Shift-Tab ou Alt-Tab) joue le segment dans lequel se trouve le curseur à partir du début et jusqu'à la fin du segment, puis repositionne le curseur en début de segment.

        5.5. Avance rapide

        Les boutons d'avance  et de retour rapide (menu [Signal]/[Aller à...]/[Avant] ou [Arrière]) font avancer ou reculer le curseur du signal d'une demi seconde. Lorsque le bouton reste enfoncé (bouton de la souris enfoncé), le mouvement devient continu par pas d'une demi seconde. Cela fonctionne aussi pendant la restitution, mais le son est haché.

        5.6. Passer au segment suivant

        Les boutons de plage précédente et suivante (menu [Signal]/[Aller à...]/[Précédent] ou [Suivant]) déplacent le curseur au début du segment suivant ou précédent dans la transcription orthographique (y compris aussi pendant la restitution).

        5.7. Changer le volume

        Le niveau sonore est réglable (de 0 à 100) dans la fenêtre [Signal]/[Panneau de contrôle].

        5.8. Zoom vertical

        Pour les portions de signal dont la dynamique est faible, [Signal]/[Panneau de contrôle] affiche un curseur pour modifier l'amplitude verticale du signal. Cela ne modifie pas le volume.


        6. Edition

        6.1. Couper/Copier/Coller

        Les commandes habituelles d'édition de texte (menu [Edition]/[Copier], [Couper] ou [Coller] et les raccourcis standards associés Control-x/c/v) permettent de manipuler des portions de transcription, y compris les événements contenus dans le texte, à l'exclusion des boutons de section, de tour et de bruit de fond.

        6.2. Annuler

        La commande d'annulation (menu [Edition]/[Annuler] ou raccourci standard associé Control-z) est de capacité limitée, car elle restaure simplement le segment courant de la transcription orthographique dans l'état précédant l'édition du segment. De très nombreuses actions ne sont pas annulables. Il est donc conseillé d'enregistrer fréquemment, éventuellement sous différentes versions.

        6.3. Chercher/Remplacer

        La commande [Edition]/[Chercher/Remplacer] (raccourci Control-f) propose une recherche avec différentes options: sensible ou non aux majuscules, recherche vers l'arrière, utilisation d'expressions régulières à la place de la suite de caractères à trouver, et éventuellement une chaîne de caractères de remplacement.

        6.4. Glossaire

        La commande [Edition]/[Glossaire] ou son raccourci Control-k propose principalement deux modes : la création d'une nouvelle entrée dans un glossaire et l'insertion d'une entrée existante dans l'éditeur de texte à la position courante ; de plus, la modification des entrées existants reste toujours possible. Lorsqu'une portion de texte est sélectionnée en grisé à l'appel de la commande, la création d'une nouvelle entrée du glossaire est proposée pour cette sélection ; il est possible de rajouter un commentaire, puis OK permet de mémoriser la nouvelle entrée. Si aucune sélection de texte est active à l'appel de la commande, on peut cliquer sur une ligne de la liste des entrées du glossaire pour la sélectionner puis cliquer sur Insérer pour l'ajouter à la position du curseur. Les entrées du glossaire sont actuellement enregistrées avec le fichier de configuration ; un fichier autonome sera probablement utilisé dans le futur.

        6.5. Gestion automatique des espaces

        L'insertion automatique des espaces est contrôlée dans la fenêtre [Options]/[Général]. Lorsque celle-ci est active, un espace est rajouté en fin de ligne à la création d'une nouvelle frontière et avant les symboles de ponctuation .,;: pour les séparer des mots précédents.

        6.6. Correction orthographique

        La correction orthographique est lancée par la commande [Edition]/[Correction orthographique]. Elle nécessite l'installation préalable du logiciel 'ispell' (en standard sur la plupart des systèmes Unix, mais pas sous Windows). Le dictionnaire utilisé pour la correction est choisi automatiquement en fonction de la langue indiquée dans les paramètres globaux (cf. 7.1). Un message d'erreur signale si le dictionnaire n'est pas trouvé ou que le nom ne correspond pas; il faut alors vérifier l'installation locale de ispell pour indiquer le nom exact du dictionnaire.

        Dès qu'un mot inconnu est rencontré, une fenêtre de dialogue propose de :

        • ajouter ce mot au dictionnaire - il sera mémorisé définitivement;
        • ignorer le mot et passer au suivant;
        • remplacer le mot après correction manuelle ou sélection d'une des propositions;
        • fermer la fenêtre et arrêter la correction.
        Une option dans la fenêtre [Options]/[Général] permet de contrôler la correction orthographique sur les mots commençant par une majuscule. Par défaut, ils sont ignorés.

        6.7. Caractères accentués et internationalisation

        La méthode d'entrée des caractères ne dépend pas de Transcriber mais du système.  Ainsi, avec un clavier adapté, certains caractères peuvent être entrés directement.  Sous Unix, on peut reprogrammer logiciellement les touches (par exemple les touches de fonctions) en configurant X11 avec l'outil 'xmodmap'. Cependant, il est aussi possible d'entrer des caractères accentués par combinaisons de touches, en définissant des raccourcis dans Transcriber (cf. section 13).
        L'encodage des fichiers est par défaut en ISO-8859-1 (Latin1), mais d'autres sont disponibles si Transcriber est lancé avec Tcl/Tk version 8.1.1 ou plus récente (cf. section 3.8).


        7. Episode

        7.1. Modifier les paramètres globaux de la transcription

        Des informations globales à la transcription peuvent être renseignées dans la fenêtre [Fichiers]/[Paramètres de l'épisode]. Il s'agit :

        • du nom du fichier son associé à la transcription (sans le chemin d'accès ni l'extension), ce qui permet de retrouver automatiquement le signal associé à la transcription si ceux-ci portent des noms différents ;
        • du nom du transcripteur ; lors de la création d'une nouvelle transcription, le nom par défaut indiqué au logiciel est utilisé ;
        • du numéro de version de la transcription. Ce numéro est automatiquement incrémenté à la première modification du fichier et ne peut être édité ;
        • de la date de la dernière modification. Cette date est automatiquement mise à jour à la date courante à la première modification du fichier et ne peut être éditée ;
        • du programme (émetteur, émission...) éventuellement renseigné par l'utilisateur ;
        • de la date d'enregistrement si celle-ci est connue ;
        • de la langue principale du programme.


        8. Segmentation du signal

        8.1. Insérer une frontière

        La commande [Segmentation]/[Insérer une frontière] ou son raccourci Return crée une nouvelle frontière à la position courante du curseur dans le texte et dans le signal. Les positions des frontières étant arrondies à la milli-seconde la plus proche, la nouvelle frontière doit être à une distance minimale de 1 ms des frontières déjà existantes. Une nouvelle ligne apparaît dans la transcription, et le segment sous le signal est coupé en deux à la position du curseur. Il est possible de réaliser cette opération pendant que le son est joué.

        => 

        8.2. Supprimer une frontière

        La commande [Segmentation]/[Supprimer la frontière] ou son raccourci Shift-Backspace supprime la frontière du début du segment courant et en fusionne le contenu avec le segment précédent. Si la frontière marquait aussi le début d'un nouveau tour de parole ou même d'une section, ceux-ci sont supprimés dans la segmentation correspondante.

        8.3. Déplacer la frontière entre deux segment

        En cliquant avec le bouton central de la souris (ou le bouton de gauche avec la touche Control simultanément enfoncée) sur la frontière entre deux segments et en déplaçant la souris, on déplace cette frontière ainsi que les frontières synchronisées dans les autres segmentations. L'amplitude du mouvement est limitée par les frontières des segments contigus. Lorsque l'action est réalisée avec le bouton Shift enfoncé, les frontières des segments adjacents sont repoussées si nécessaire. L'intervalle laissé entre les frontières dépend de la résolution d'affichage au moment de l'action et reste toujours supérieur à 1 ms.

        8.4. Sélectionner le signal sur un ou plusieurs segments

        En cliquant avec le bouton de gauche sur un segment sous le signal (et pour n'importe quel niveau de segmentation), le signal est sélectionné sur toute l'étendue du segment et le curseur est positionné au début du segment ; cette sélection peut être étendue en déplaçant la souris avant de relâcher le bouton ou en cliquant avec le bouton de gauche avec la touche Shift simultanément enfoncée.

        8.5. Masquer/Afficher des segmentations

        En cliquant avec le bouton de droite, un menu contextuel est activé qui permet de jouer le signal, de changer la résolution, et de contrôler l'affichage ou le masquage des différentes segmentations sous le signal.


        9. Tours de parole et locuteurs

        9.1. Créer un tour de parole

        La commande [Segmentation]/[Créer un tour...] ou son raccourci Control-t crée un nouveau tour de parole commençant au début du segment courant. Un tour de parole est caractérisé par l'identité d'un (ou plusieurs) locuteur(s), ainsi que par des paramètres facultatifs décrivant :

        • le mode d'élocution du tour (spontané ou planifié)
        • la qualité d'enregistrement (bonne, moyenne, médiocre)
        • et la largeur de bande du signal (parole téléphonique à bande étroite ou signal large bande de studio).
        La première ligne de la fenêtre sert à gérer la parole superposée qui est décrite dans la section suivante. La partie centrale de la fenêtre sert à la création, la sélection ou la modification des locuteurs et de leurs caractéristiques. En cliquant sur Créer un locuteur ou en tapant directement son nom au clavier, on crée un nouveau locuteur pour lequel il est possible de définir le genre, l'accent, etc. A droite de la fenêtre, une liste des locuteurs déjà définis triée par ordre alphabétique est disponible, ainsi que la sélection des locuteurs récemment utilisés. En cliquant sur un de ces locuteurs, on le choisit comme locuteur de ce tour. L'orthographe de son nom et ses caractéristiques sont fixées mais peuvent être modifiées globalement après avoir cliqué sur Editer le locuteur puis en validant avec OK. Enfin, le champ pas de locuteur s'applique aux segments de signal sans parole.

        9.2. Parole superposée

        Lors de la création ou de la modification des paramètres d'un tour, le mode Parole superposée peut être activé. Le deuxième locuteur est alors désigné de la même façon que le premier.

        Dans l'éditeur de texte, chaque segment du tour de parole modifié contient alors deux lignes précédées du chiffre 1 ou 2 ; la segmentation orthographique sous le signal est séparée horizontalement entre les deux locuteurs. A l'inverse, le retour au mode normal se fait en désélectionnant le champ Parole superposée dans les paramètres du tour ; le premier locuteur est proposé comme locuteur restant et les transcriptions des deux locuteurs sont fusionnées en une seule.

        9.3. Modifier ou supprimer un tour de parole

        La commande [Segmentation]/[Paramètres du tour...] permet l'édition et éventuellement la suppression du tour de parole qui contient le segment courant (même si ce segment n'est pas le premier du tour). Il est possible alternativement de cliquer sur le bouton correspondant au tour à éditer dans la fenêtre de l'éditeur de texte. Tous les paramètres proposés lors de la création du tour sont modifiables. Un bouton supplémentaire autorise la destruction du tour.

        9.4. Chercher les prises de parole d'un locuteur

        La commande [Edition]/[Locuteurs]/[Chercher un locuteur] affiche la liste des locuteurs définis pour la transcription. En cliquant sur un nom, le nombre de références de ce locuteur dans la transcription est affiché sous la liste. Le bouton Suivant déplace le curseur jusqu'au premier segment de la prochaine occurrence d'un tour de parole dans lequel le locuteur intervient.

        9.5. Importer des locuteurs d'un autre fichier

        La commande [Edition]/[Locuteurs]/[Importer à partir du fichier...] fait choisir un fichier de transcription et affiche la liste des locuteurs de ce fichier qui n'existent pas déjà dans la transcription courante. Le nom des locuteurs est suivi de la liste abrégée des attributs (orthographe vérifiée: y/n, genre: m/f; natif: nat/non; accent; global: glo/_). L'utilisateur peut sélectionner ou désélectionner individuellement des locuteurs en cliquant sur la ligne correspondante, ou sélectionner uniquement les locuteurs qui ont été signalés avec le champ "nom global" actif.

        9.6. Supprimer les locuteurs inutilisés

        La commande [Edition]/[Locuteurs]/[Supprime les locuteurs inutilisés...] supprime de la liste des locuteurs tous ceux qui n'interviennent dans aucun tour de parole.


        10. Sections et sujets

        10.1. Créer une nouvelle section

        La commande [Segmentation]/[Créer une section...] ou le raccourci associé Control-e crée une nouvelle section commençant au début du segment courant. Une fenêtre de dialogue permet de choisir la catégorie parmi celles prédéfinies ("report" pour reportage, "filler" pour les transitions, "nontrans" pour toutes les sections non transcrites), et le sujet. La liste des sujets existants est affichée à droite, les sujets utilisés récemment sont rappelés à gauche. En cliquant sur Nouveau sujet ou en tapant directement un texte au clavier, un nouveau sujet est défini. Si un sujet existant est sélectionné et que l'on clique sur Editer le sujet, toutes les sections portant sur ce sujet sont modifiées simultanément. En effaçant le texte ou en choisissant pas de sujet, la section ne porte pas de sujet. De plus, un nouveau tour de parole est systématiquement créé à chaque début de section ; par défaut, le locuteur courant est proposé.

        10.2. Modifier ou supprimer une section

        La commande [Segmentation]/[Paramètres de la section...] permet l'édition et éventuellement la suppression de la section qui contient le segment courant (même si ce segment n'est pas le premier de la section). Il est possible alternativement de cliquer sur le bouton correspondant à la section à éditer dans la fenêtre de l'éditeur de texte. Tous les paramètres proposés lors de la création de la section sont modifiables. Un bouton supplémentaire autorise la destruction de la section.

        10.3. Chercher l'apparition d'un sujet

        La commande [Edition]/[Sujets]/[Chercher un sujet] affiche la liste des sujets définis pour la transcription. En cliquant sur un nom, le nombre de références de ce sujet dans la transcription est affiché sous la liste. Le bouton Suivant déplace le curseur jusqu'au premier segment de la prochaine occurrence d'une section portant sur ce sujet.

        10.4. Importer les sujets d'un autre fichier

        La commande [Edition]/[Sujets]/[Importer à partir du fichier...] fait choisir un fichier de transcription et affiche la liste des sujets de ce fichier qui n'existent pas déjà dans la transcription courante. L'utilisateur peut sélectionner ou désélectionner individuellement des sujets en cliquant sur la ligne correspondante.

        10.5. Supprimer les sujets inutilisés

        La commande [Edition]/[Sujets]/[Supprime les sujets inutilisés...] supprime de la liste des sujets tous ceux qui n'interviennent dans aucune section.


        11. Bruit de fond

        La segmentation en conditions acoustiques sert à indiquer des modifications durables du bruit de fond. Les marqueurs correspondants signalent un changement d'état de la valeur du bruit de fond, et leur valeur annule et remplace celle du marqueur précédent. Chaque transcription commence implicitement à l'instant initial avec un marqueur de bruit de fond vide.

        11.1. Créer un bruit de fond

        La commande [Segmentation]/[Insérer un bruit de fond] crée un marqueur de bruit de fond à la position courante du curseur dans le signal. Il n'est pas possible de créer deux marqueurs au même instant. Si le curseur dans le signal est exactement au début du segment courant, le marqueur de bruit de fond restera toujours synchronisé avec le début du segment et l'icône associé apparaîtra en début de ligne ; sinon, les deux segmentations ne seront pas synchronisées. Le type du bruit est indiqué par un combinaison de différents choix (parole, musique, bruit électrique, autre) avec des boîtes à cocher ; le type de bruit proposé par défaut est celui du marqueur précédent. L'icône d'une note de musique apparaît dans l'éditeur de texte à la position courante du texte dans le segment. La segmentation en bruit de fond, sous le signal, est colorée en grisé (par défaut) sur les portions du signal comportant un bruit de fond.

        11.2. Indiquer la fin d'un bruit de fond, le changement de bruit

        Il faut créer à la position correspondant à la fin du bruit un nouveau marqueur de bruit de fond vide, c'est-à-dire en désélectionnant tout les types de bruits. Lors des changements de bruits, il ne faut pas indiquer la fin du bruit précédent, mais uniquement le nouveau bruit lorsque celui-ci remplace l'ancien.

        11.3. Modifier ou supprimer un marqueur de bruit de fond

        On peut modifier ou détruire un marqueur de bruit de fond en cliquant sur l'icône en forme de note de musique dans l'éditeur de texte. Dans ce dernier cas, les conditions acoustiques du marqueur précédent redeviennent les conditions courantes.


        12. Evénements et commentaires

        12.1. Insérer un événement

        La commande [Edition]/[Insérer un événement] ou Control-d ouvre une fenêtre qui propose de définir:

        • la catégorie de l'événement: bruit, commentaire, balise de prononciation, marqueur lexical, changement de langue.
        • la description de l'événement par une chaîne de caractères librement éditable. Pour chaque catégorie, une liste de valeurs prédéfinies avec une description peut néanmoins être proposée dans un menu à droite du champ de texte.
        • l'étendue temporelle de l'événement (sauf pour les commentaires) ; un événement peut être instantané ou avoir une durée ; dans ce cas, il faut indiquer un marqueur de début et un marqueur de fin. Un marqueur peut aussi s'appliquer uniquement au mot précédent ou suivant.

        12.2. Insérer le début et la fin d'un événement

        Il est possible d'insérer simultanément les marqueurs de début et de fin d'événement en sélectionnant avec la souris la portion de texte à laquelle s'applique l'événement (par exemple, les quelques mots d'une citation étrangère qui recevront un marqueur de langue).

        12.3. Insérer un commentaire

        Avec [Edition]/[Insérer un commentaire], un événement de type commentaire est créé. Les commentaires ont une interface similaire aux autres événements ; en revanche, ils sont dépourvus de l'attribut d'étendue temporelle.

        12.4. Modifier ou supprimer un événement

        Cliquer sur le texte de l'événement dans l'éditeur de texte ; le curseur prend la forme d'une flèche au-dessus de ces marqueurs. Tout les paramètres sont modifiables, et un bouton propose la destruction du marqueur. Il peut être détruit aussi dans l'éditeur de texte en l'effaçant comme un caractère unique.

        12.5. Copier/Coller un événement

        A l'intérieur de Transcriber, il est possible de copier et coller des événements en conservant tous les attributs. Avec d'autres applications, le marqueur d'événement est remplacé par une balise texte au format XML (ce qui peut ne pas correspondre au résultat voulu).

        12.6. Créer un raccourci pour un événement

        Voir la section sur les raccourcis.

        12.7. Modifier la liste des événements

        La liste des bruits, des marqueurs de prononciation, des marqueurs lexicaux ou des langues peut être éditée avec les menus [Options]/[Evénements]/[Modifier la liste...]. La valeur sera affichée dans l'éditeur et la segmentation ; la description sera rappelée dans le menu proposant la liste des événements prédéfinis. Une ligne vide dans la liste apparaît comme un séparateur dans le menu lors de l'insertion d'un événement. Pour la liste des langue, il est souhaitable pour des raisons de cohérence de rentrer le code iso639 de la langue rajoutée.

        12.8. Configurer l'affichage des événements

        La police de caractère et les couleurs utilisées pour l'affichage des événements sont modifiables respectivement par les menus [Options]/[Polices]/[Evénements] et [Options]/[Couleurs...] ; la fenêtre [Options]/[Evénements]/[Affichage des événements...] permet de choisir la chaîne de caractères de formatage des commentaires et des événements, ainsi que les marqueurs instantanés, de début ou fin pour les événements.


        13. Raccourcis clavier

        Le menu [Options]/[Raccourcis clavier...] propose une fenêtre de dialogue pour la modification des raccourcis existants, leur destruction, ou la création de nouveaux.

        13.1. Définir un raccourci

        Pour créer un nouveau raccourci, cliquer sur le bouton Nouveau dans [Options]/[Raccourcis clavier...] puis renseigner la combinaison de touches dans le premier champ, la chaîne de caractères dans le deuxième et valider avec Modifier (pour continuer l'édition) ou OK (pour terminer l'édition). Il est possible de taper directement au clavier la combinaison de touches souhaitée avec Control, Shift, Alt... lorsque le curseur se trouve dans le premier champ (Touches). Attention, les raccourcis clavier pour les commandes du menu peuvent être remplacés par vos raccourcis.

        13.2. Raccourci pour une expression courante

        Sélectionner avec la souris l'expression courante pour laquelle on souhaite faire un raccourci, choisir le menu [Options]/[Raccourcis clavier...], entrer le raccourci souhaité dans le champ Touches et valider avec OK. Le raccourci n'est pas nécessairement une combinaison de touches mais peut être aussi constitué des premières lettres de l'expression. Par exemple, "gor" peut ainsi être remplacé automatiquement par "Gorbatchev". Ces raccourcis sont indépendants du glossaire.

        13.3. Raccourci pour un événement

        Il est possible de générer un événement (bruit, commentaire, prononciation, etc.) avec un raccourci clavier. Il faut générer dans la transcription un événement identique à celui que l'on veut mémoriser (quitte à le détruire ensuite), le sélectionner en grisé avec la souris puis suivre la procédure précédente. Le texte sélectionné peut même être une combinaison arbitraire de texte et d'un ou plusieurs événements.


        14. Options et configuration de l'interface

        14.1. Nom du transcripteur

        Le nom du transcripteur utilisant le logiciel peut être indiqué dans [Options]/[Général]. Ce nom est utilisé comme valeur par défaut dans les paramètres de l'enregistrement lors de la création d'une nouvelle transcription.

        14.2. Enregistrement de l'activité

        Le nom d'un fichier pour enregistrer l'activité du transcripteur peut être indiqué dans [Options]/[Général]. Par défaut, le champ est vide et la fonction est désactivée. Si la fonction est active, le temps de travail est décompté en excluant les pauses, et la quantité de travail sur chaque transcription (nombre de sections, de tours créés, nombre de mots saisis) est comptabilisée. Ces quantités sont affichées dans la fenêtre [Fichier]/[Informations] et sont enregistrées dans le fichier d'activité à la fin de la session. Des informations spécifiques par fichier de transcription sont aussi enregistrées. L'exploitation automatique de ces fichiers n'est actuellement pas réalisée par le logiciel.

        14.3. Changer les couleurs

        Le menu [Options]/[Couleurs...] propose une fenêtre de dialogue qui permet de modifier la plupart des couleurs utilisées dans le logiciel.

        14.4. Changer les polices de caractères

        Les commandes du menu [Options]/[Police] permettent de modifier les polices de caractères utilisées pour afficher différents textes.

        14.5. Traduction de l'interface

        Il est possible de choisir la langue des messages affichés dans [Options]/[Général...]. L'anglais est sélectionné par défaut, et le français est disponible. Il est possible de modifier les traductions de chacun des messages originaux en anglais. Il est possible aussi de créer une traduction dans une nouvelle langue. Si aucune traduction n'est indiquée, le message en anglais s'affiche. La liste des messages à traduire va être complétée progressivement lors de l'affichage de nouveaux messages en anglais. Pour conserver ces traductions, il faut indiquer le nom d'un fichier dans le champ Fichier de traduction dans [Options]/[Général] puis choisir [Options]/[Enregistrer la configuration].

        14.6. Deuxième vue du signal

        Le menu [Options]/[Affichage]/[Deuxième vue du signal] permet d'afficher ou de masquer une deuxième vue du signal, affichée à une autre échelle. Il peut être nécessaire d'augmenter la taille de la fenêtre pour la voir effectivement.

        14.7. Masquer/afficher la barre centrale des boutons

        Pour gagner de la place à l'écran, la commande [Options]/[Affichage]/[Boutons de commande] commute l'affichage de la barre centrale des boutons de commande.

        14.8. Enregistrer les options choisies

        Les options modifiées, la position des fenêtres, les raccourcis claviers, le contenu du glossaire et les nom des fichiers de signal et de transcription en cours d'édition sont être enregistrées avec la commande du menu [Options]/[Enregistrer la configuration] dans un fichier (normalement ~/.transcriber ) qui sera relu au démarrage de la prochaine session. Les fichiers courants seront réouverts automatiquement.

        Avec l'option Propose d'enregistrer la configuration avant de quitter est activée dans [Options]/[Général...], une boîte de dialogue est systématiquement affichée avant de quitter le logiciel pour enregistrer la configuration courante.


        15. Autres fonctions

        15.1. Informations sur le signal et la transcription

        Le bouton ou la commande [Fichier]/[Informations] permet d'afficher une fenêtre récapitulant des informations sur le nom des fichiers de signal et de transcription, la durée du signal, le nombre de mots, de segments, de tours de parole, de sections... de la transcription. Le bouton update déclenche une mise à jour des informations affichées. Dans le cas où l'enregistrement de l'activité est activé, des informations supplémentaires sur la quantité de travail effectuée sont affichées.

        15.2. Quitter Transcriber

        Menu [Fichier]/[Quitter] ou Control-q ; la sauvegarde de la transcription est proposée si cela n'a pas déjà été réalisé. Si l'option correspondante est activée, l'enregistrement de la configuration courante est aussi proposé.

        15.3. Aide

        Une aide en ligne (affichant en particulier la licence, le manuel du transcripteur et le présent manuel de référence) est disponible dans le menu [Aide] ; ces documents peuvent être consultés plus confortablement avec n'importe quel navigateur HTML gérant les frames. transcriber-1.5.1.1/doc/fr/pencil.gif0000644000175000017500000000040007510315717015144 0ustar rtrtGIF89a0ht??pp!7Image generated by Aladdin Ghostscript (device=ppmraw) ,0zPI8[` `q]Xgnkܾol{Kl< CQ7Kf0S&R2HtŒmb5r8Tӝ\.g{{~he{m$ m~;transcriber-1.5.1.1/doc/fr/banner.html0000644000175000017500000000132207510315716015341 0ustar rtrt Transcriber

        Transcriber
        un outil pour la segmentation, l'annotation et la transcription de la parole

        transcriber-1.5.1.1/doc/fr/present_local.html0000644000175000017500000000443107510315716016732 0ustar rtrt Présentation de Transcriber
        Screenshot

        Présentation

        Transcriber est un logiciel d'aide à l'annotation de signaux de parole. Il offre une interface graphique simple permettant à un utilisateur non informaticien de segmenter des enregistrements de longue durée, de les transcrire et de marquer les tours de parole (changement de locuteur), la segmentation thématique et les conditions acoustiques. Il est plus spécialement conu pour l'annotation d'´missions radio- et télédiffusés, pour créer des corpus nécessaires au développement de systèmes de transcription automatique de telles émissions, mais ses fonctionnalités peuvent être utiles dans d'autres domaines du traitement de la parole.

        Transcriber est programmé en langage de script Tcl/Tk et en C. Il utilise la librairie Snack de gestion du son, ce qui permet de gérer les formats audio classiques, et l'analyseur syntaxique tcLex. Il fonctionne sur différents systèmes Unix (Linux, Sun Solaris, Silicon Graphics) et Windows NT. Transcriber est distribué en logiciel libre sous licence GNU.


        Transcriber - Copyright (C) 1998-2002, DGA
        http://www.etca.fr/CTA/gip/Projets/Transcriber/

        Auteur :
        Claude Barras, DGA/DCE/CTA/GIP
        Coordinateurs :
        Edouard Geoffrois, DGA/DCE/CTA/GIP
        Mark Liberman & Zhibiao Wu, LDC
        transcriber-1.5.1.1/doc/fr/credits.html0000644000175000017500000000454507510315716015543 0ustar rtrt Crédits pour Transcriber

        Crédits

        Transcriber utilise des modules externes et librairies :

        Remerciements à :

        • Zhibiao Wu pour le portage de Transcriber sous NT et de nombreux déboguages;
        • Brian MacWhinney et Leonid Spektor pour avoir rendu le portage sous Macintosh possible;
        • David van Leeuwen pour la 'Debianization' et des conseils sur les procédures d'installation, et Damien Mercier pour le package RPM;
        • Marcello Federico et Dimitri Giordani pour l'adaptation du module de vérification orthographique et des bindings à l'italien; <\li>
        • Dafydd Gibbon, Martine Garnier, Wim Goedertier, Vlasta Radova, Lowell Brunson, Pat Ward qui ont donné des rapports d'erreur et des conseils utilises pour le développement de Transcriber;
        • Kare Sjolander pour son module Snack très performant.
        transcriber-1.5.1.1/doc/fr/frame_local.html0000644000175000017500000000035207510315716016342 0ustar rtrt Prsentation de Transcriber transcriber-1.5.1.1/doc/fr/user.html0000644000175000017500000017614210137467355015075 0ustar rtrtManuel de l'utilisateur

        Manuel du transcripteur

        Conventions de transcription pour
        les enregistrements radio-tldiffuss

        Version 1.21, 24 mars 2004

        (valable avec les version 1.4.1 et plus rcentes de Transcriber)


        1. Introduction

        2. Structuration de la transcription

        2.1. Enregistrement

        2.2. Segmentation du signal

        2.3. Tours et locuteurs

        2.4. Sections et thmes

        2.5. Transcription orthographique

        2.6. Bruits et conditions acoustiques

        2.7. Commentaires

        3. Conventions de transcription

        3.1. Conventions d'criture

        3.2. Mots hors-lexique

        3.3. Spcificits du langage parl

        4. Vrification


        1. Introduction

        La cration manuelle de transcriptions d'enregistrements de journaux radio- ou tldiffuss, permet de faire avancer les recherches en transcription automatique, en indexation et en archivage de ce type de documents sonores.

        1.1. Documents audios concerns

        Les enregistrements de journaux radio- ou tldiffuss prsentent un contenu vari : le signal acoustique peut correspondre de la parole, de la musique ou du bruit, mais galement des mlanges de parole, de musique et de bruit. Ensuite il y a, pour la parole proprement dite, une grande diversit de locuteurs et de thmes abords. Plusieurs personnes peuvent intervenir sur un sujet donn successivement, voire simultanment. La qualit acoustique de l'enregistrement (fidlit) peut varier de manire considrable au cours du temps. La dure de tels enregistrements peut varier de quelques dizaines de minutes plusieurs heures.

        Pour l'instant nous nous intressons plus particulirement aux nouvelles (journal, flash, revue de presse, incluant mto et bourse, conomie, faits de socit ...) dans le document sonore. Toute autre forme d'enregistrement (publicits, jeux, fictions....) ne sera pas transcrite.

        1.2. Objectifs du manuel

        Nous dcrivons dans ce qui suit un ensemble de conventions pour structurer, annoter et transcrire des enregistrements de journaux radio- ou tldiffuss. Ces conventions doivent permettre de structurer les enregistrements au niveau du contenu thmatique, des locuteurs et de la qualit acoustique. Les informations produites ce sujet sont nommes annotations. La parole de chaque locuteur doit aussi tre transcrite orthographiquement. C'est la transcription proprement dite. La transcription est ici la partie la plus importante et donc sur laquelle le maximum d'attention doit tre port.

        Les diffrentes tapes du travail de transcription sont : la segmentation de la bande son, l'identification des tours de paroles et des locuteurs, l'identification des sections thmatiques, la transcription orthographique, et la vrification. Ces tapes peuvent tre menes en parallle ou au contraire appliques squentiellement sur de longues portion du signal, suivant le choix du transcripteur.

        1.3. Versions

        version 1.2.1 (mars 2003) :

        • Mise jour des conventions d'annotations des mots mals prononcs : ceux-ci doivent toujours tre prcds d'une toile mme si une balise de prononciation effective "+[pron=...]" est prsente (cf. 3.3.6)
        • Ajout de conventions concernant la segmentation des passages sans locuteurs (musique, jingle, etc.) par cration d'un tour de parole sans locuteur (cf. 2.3.1)
        • Correction de l'orthographe de "pourcent" qui doit s'crire "pour cent".
        • Diverses modifications mineures : mise en cohrence des prsentes conventions avec l'interface graphique de Transcriber ([lexical=...] devient [lex=...], [pronounce=...] devient [pron=...] ...

        version 1.2 (octobre 2003) :

        • Conventions concernant les tours de parole traduite simultanment explicites (cf. 2.3.4)
        • Ajout de conventions concernant les nombres fractionnaires et ordinaux (cf. 3.1.7)
        • Mise jour des conventions concernant les chiffres romains (cf. 3.1.9) et les adresses internet ( 3.1.10)

        version 1.1 (juillet 2003) :

        • L'exemple de France-Inter est remplac par la graphie officielle France Inter.
        • Ajout de prcisions sur l'utilisation du marqueur d'orthographe incertaine ^^ (cf. 3.2.3)
        • Explicitation de l'utilisation du raccourci % (cf. fin 3.1.7)
        • Le marquage des entits spcifiques par des guillemets est rendu facultatif dans l'attente de conventions plus dtailles (cf. 3.1.1)
        • Abandon de la notation .point ou ,virgule pour la ponctuation pele.

        version 1.0 (juin 1999) : La premire version stable du prsent manuel.

        2. Structuration de la transcription

        L'tape d'annotation vise structurer les enregistrements, c'est--dire segmenter et dcrire le signal acoustique diffrents niveaux jugs pertinents pour le traitement ultrieur. Il s'agit ici principalement de l'identit du locuteur, de l'identification du contenu thmatique, ou de la qualit du canal de transmission (acoustique).

        Actuellement, un document de transcription est structur de la manire la suivante :

        • L'enregistrement correspond la totalit de l'enregistrement transcrire.
        • L'enregistrement est dcoup en sections, dlimitant les parties des missions transcrire, les enchanements journalistiques, ou les parties non-transcrites.
        • l'intrieur d'une section on va distinguer les tours de parole (turn) qui correspondent des changements de locuteur.
        • Les tours de paroles sont eux-mmes dcoups en segments plus courts au moyen de points de synchronisation. La transcription proprement dite n'intervient qu' ce niveau de structuration.
        • A certains points de synchronisation, des changements durables de bruit de fond sont indiqus ; cette segmentation en conditions acoustiques est indpendante de la structuration en tours et sections.

        2.1. Enregistrement

        2.1.1. Comment transcrire un nouvel enregistrement?

        • Dmarrez Transcriber (cf. manuel de rfrence !)
        • Crez une nouvelle transcription avec le menu [Fichier]/[Nouvelle transcription]. Une fentre de dialogue propose de choisir le fichier son transcrire.
        • Indiquez les informations gnrales associes l'enregistrement dans la fentre [Fichiers]/[Paramtres de l'pisode].
        • Si vous voulez rutiliser certains locuteurs ou sujets d'une transcription prcdente, vous pouvez le faire ds prsent avec [Edition]/[Locuteurs]/[Importer partir du fichier...] et [Edition]/[Sujets]/[Importer partir du fichier...].
        • Enregistrez la nouvelle transcription vide avec [Fichier]/[Enregistrer]. Un nom par dfaut driv du nom du signal sera propos.
        • Enregistrez la configuration avec [Options]/[Enregistrer la configuration], afin de rouvrir automatiquement ces fichiers au prochain dmarrage

        Par la suite, pensez enregistrer frquemment votre travail avec [Fichier]/[Enregistrer] ou le raccourci Control-s, surtout si vous n'avez pas activ la sauvegarde automatique. Par ailleurs, un double affichage du signal (un avec une rsolution de 10 secondes, l'autre de une minute environ) peut tre pratique.

        2.1.2. Caractristiques de l'enregistrement

        Les informations associes un enregistrement, dites avec [Fichiers]/[Paramtres de l'pisode], sont les suivantes :

        • l'identit du transcripteur (par exemple Claire Montaigne) est automatiquement remplie ;
        • le nom du fichier son transcrire (par exemple france-inter980428-0700:0820) est automatiquement renseign ;
        • la date et le numro de version de la transcription sont automatiquement renseigns par le logiciel et ne peuvent pas tre modifis ;
        • le programme: la provenance du document sonore (c'est--dire qui a enregistr), la chane qui a diffus le document (par exemple France Inter) et le nom de l'mission (par exemple tranche matinale 7-9) ;
        • la date de diffusion ;
        • la langue principale de diffusion.

        Pour des enregistrements de mme nature (par exemple sur plusieurs jours) il convient de respecter la mme nomenclature pour des programmes identiques.

        2.2. Segmentation du signal

        Pour fournir des repres temporels par rapport au signal, et pour faciliter le travail de transcription, on segmente le signal en insrant des balises temporelles instantanes de synchronisation (ou frontires).

        2.2.1. O segmenter?

        Nous recommandons de faire correspondre ces balises des groupes de souffle dans le signal ou des marques de ponctuation dans le langage crit. Pour des raisons techniques du traitement ultrieur il est galement souhaitable de fournir une balise de synchronisation aprs diffrents types de problmes au niveau acoustique (mots mal prononcs, bruit court superpos un mot...).

        En rsum, l'insertion d'une frontire de synchronisation est recommand dans les situations suivantes :

        • dbut et fin d'locution,
        • respiration,
        • ponctuation,
        • mauvaise prononciation,
        • bruit instantan,
        • dbut et fin de musique...

        2.2.2. Comment segmenter?

        • Choisissez une rsolution d'environ 30 secondes pour l'affichage du signal.
        • Lancez la restitution partir du dbut du signal ou du dbut de la section non encore transcrite.
        • Pendant la restitution, chaque instant correspondant un changement de locuteur ou une zone de silence, une pause, une respiration, un changement de conditions acoustiques... insrez une frontire en pressant la touche Return. Une nouvelle ligne prcde d'un petit cercle apparat dans la fentre de texte, et la segmentation sous le signal est scinde au niveau du curseur.

        Vous obtenez une segmentation grossire d'une partie du signal en intervalles de 5 20 secondes en moyenne. Il est possible de positionner les frontires plus prcisment par la suite.

        2.3. Tours et locuteurs

        ce niveau on dcrit la succession de tours de parole avec les diffrents locuteurs qui interviennent.

        2.3.1. Comment crer les tours de parole?

        • Affichez le signal une rsolution d'environ 30 secondes ou plus et coutez le signal.
        • Si un nouveau locuteur prend la parole au dbut du segment courant, indiquez le dbut d'un nouveau tour de parole avec [Segmentation]/[Crer un tour...] ou le raccourci Control-t.
        • Le locuteur du tour doit tre identifi :
          • Si le locuteur est connu et existe dj dans la liste, il suffit de cliquer sur son nom.
          • Pour un nouveau locuteur, le nom peut tre tap directement au clavier. Si l'identit est inconnue cliquez simplement sur Crer un locuteur. Les caractristiques du locuteur (l'orthographe prcise de son nom, le genre, l'accent...) peuvent tre modifies plus tard.
        • S'il s'agit de parole superpose, validez l'option correspondante et identifiez le deuxime locuteur de la mme faon.
        • D'autres caractristiques du tour (type de parole, canal, qualit) peuvent ventuellement tre renseigns.
        • Des tours de parole spcifiques avec l'indication "Pas de locuteur" doivent tre utiliss pour les passages sans parole (musique, jingle, silence,etc.) d'une dure significative ( de l'ordre de 1s ou plus ) :

        • NB : Les balises de bruit de fond ne doivent tre utilises que pour annoter un phnomne en arrire plan. Ainsi, prenons l'exemple d'un segment ne contenant que de la musique, il devra tre annot l'aide d'une balise [musique] sans indication de bruit de fond, qui serait alors une redondance puisque l'information temporelle du segment dlimite dj l'venement dans le temps et la balise en donne son type.

        A la cration d'un tour, le locuteur propos par dfaut est l'avant-dernier utilis, ce qui est pratique dans le cas d'un dialogue.

        2.3.2. Caractristiques des tours

        Pour chaque tour de parole le transcripteur indique :

        • un identificateur du locuteur,

        et ventuellement si cela est demand :

        • le type de parole : prpar, spontan
        • la qualit du son : bon, moyen, faible
        • le canal de transmission : intervention tlphonique ou prise en studio

        2.3.3. Caractristiques des locuteurs

        Pour chaque nouveau locuteur le transcripteur indique :

        • le nom du locuteur s'il est identifi, sinon un numro de locuteur avec un qualificatif (au titre duquel l'inconnu est intervenu dans l'mission).
        • le statut : orthographe connue ou incertaine.
        • le sexe du locuteur : homme, femme, inconnu
        • langue maternelle : oui/non.
        • l'accent : on peut spcifier ici les diffrents accents : rgionaux, francophones, trangers.
        • le statut global/local : un nom est global s'il est identifiable en dehors du contexte de la transcription (par exemple, un journaliste, un homme politique connu, etc.)

        Il est important de respecter l'orthographe des noms. On peut trouver les noms des journalistes et des diffrentes missions radio et tl franais dans le guide MdiaSid.

        On considre tout francophone (franais, belge, suisse, qubcois) de langue maternelle franaise.

        2.3.4. Parole simultane

        Il faut distinguer diffrentes situations de parole superpose :

        1. Un locuteur parle, et un autre intervient ponctuellement par des interjections (hum oui ...) ; il convient de noter ces dernires comme de simples bruits se superposant la parole.
        2. Un locuteur parle en premier plan, et une ou plusieurs voix sont audibles un niveau moindre (par exemple la voix d'un traducteur est superpose la voix d'origine) ; seule la voix au premier plan est transcrite et un marqueur de bruit de fond (de type parole ou conversation) doit tre utilis.
        3. Deux locuteurs dialoguent, se coupent mutuellement la parole et parlent simultanment sur plusieurs mots. Le mcanisme de gestion de parole simultane dcrit ci-aprs peut tre appliqu. En cas de difficult, les segments pourront tre annots comme parole "non-transcrite" .
        4. Si plus de deux locuteurs interviennent un fort niveau sonore, il faut annoter la portion de signal comme "non-transcrite".

        Dans le cas de parole traduite simultanment, les rgles prcdemment nonces s'appliquent. Ainsi si on entend le locuteur traduit s'exprimer seul pendant plus d'un mot, un tour de paroles sera cr. Pour les autres cas (moins d'un mot prononc seul ou traducteur s'exprimant simultanment) on insrera une balise bruit de fond de type parole. L'intgralit du passage traduit sera encadr par deux balises de type commentaire: {traduction-}....{-traduction} :

        Dans le cas de parole simultane avec deux locuteurs (cas numro 3), le deuxime locuteur est identifi dans la fentre des paramtres du tour aprs avoir valid Parole superpose. L'affichage dans le logiciel est par exemple :

          Patricia Martin + Invite1

            1: videmment dcouvert que
            2: enfin n'oubliez pas

        Dans la transcription, 1: va identifier les paroles (videmment dcouvert que) du premier locuteur (Patricia Martin) et 2: les paroles (enfin n'oubliez pas) du deuxime locuteur Invite1. Les frontires au niveau du signal seront poses au niveau des frontires de mot, de sorte inclure dans le segment ainsi dcoup, toute la parole superpose (par exemple si le mot enfin du locuteur 2 ne dmarre qu' la fin du mot videmment du locuteur 1, ce dernier est quand mme inclus dans le segment).

        Cependant la transcription de ce type de signal est trs coteuse. l'heure actuelle on ne sait pas traiter de manire satisfaisante la parole superpose et les transcriptions, mmes si elles sont produites, ne sont pas encore exploites. Le transcripteur peut donc choisir de marquer simplement le signal comme parole superpose sans transcription, avec ventuellement un commentaire dcrivant la situation ou le contenu du dialogue.

        2.4. Sections et thmes

        La structuration complte d'un enregistrement peut tre complexe : une succession d'missions, composes de sections journalistiques, subdivises elles-mmes en rubriques thmatiques... En l'tat actuel du logiciel, il faut choisir un seul niveau de dcoupage (en sections journalistiques ou en rubriques thmatiques) et les frontires des segments ne sont pas toujours videntes ; une structuration plus fine est envisage pour l'avenir.

        2.4.1. Que faut-il transcrire?

        Un enregistrement peut contenir des segments sans intrt pour le traitement automatique ultrieur. Les transcriptions sont limites aux missions d'information avec les messages d'introduction et de conclusion. Le reste sera annot non-transcribed, c'est--dire inexploitable et ne sera pas transcrit.

        2.4.2. Type et thme des sections

        Un enregistrement est dcoup en sections de 3 types :

        • Les segments de type report rfrent des parties d'mission transcrire (journal, chronique...). Pour chaque section journalistique, le transcripteur peut indiquer un thme gnral (journal, revue de presse, chronique, politique, faits de socit, conomie, bourse, culture, sports, mto) choisi dans une liste prdfinie, suivi ventuellement d'un titre rsum.
        • Les segments de type filler ne concernent pas directement le thme journalistique abord, mais rfrent plutt l'organisation rdactionnelle, l'enchanement des journalistes ou des invits etc.
        • Les segments de type non-trans sont les parties de l'enregistrement dont la transcription n'est pas souhaite ; il convient d'indiquer au moins la nature de ces segments suivi ventuellement d'un titre rsum (par exemple : publicit - les prts malins du CA).

        2.4.3. Comment indiquer les sections?

        • Affichez le signal une rsolution d'environ 30 secondes ou plus et coutez le signal.
        • A chaque changement d'mission ou de sujet (et en fonction des consignes donnes), indiquez le dbut d'une nouvelle section avec [Segmentation]/[Crer une section...] ou le raccourci Control-e.
        • Indiquez pour chaque section :
          • le type de la section :report, filler, non-transcribed
          • un thme gnral (journal, politique intrieure, international,
            bourse, conomie, culture, sports, mto, faits de socit, revue, chronique, ...) suivi ventuellement d'une courte description du sujet.

        2.5. Transcription orthographique

        Nous abordons ici les problmes de transcriptions des segments de parole. Ces conventions concernent d'abord la parole pour laquelle la transcription graphmique peut tre ambigu. Elles sont ncessaires ensuite pour coder les bruits, catgorie dans laquelle on regroupe tous les vnements acoustiques non assimilables des mots (ou entres lexicales) de la langue.

        2.5.1. Comment transcrire?

        • Choisissez une rsolution d'environ 10 secondes ou moins pour l'affichage du signal.
        • Allez au premier segment non transcrit en cliquant sur la ligne correspondante dans le texte ou la position dans le signal.
        • Ecoutez ce segment avec [Signal]/[Joue le segment] ou un des raccourcis Shift-Tab ou Alt-Tab; vous pouvez faire une pause ou redmarrer tout moment avec [Signal]/[Joue/Pause] ou le raccourci Tab.
        • Si ncessaire, ajustez la frontire entre le segment et son voisin en cliquant sur cette frontire avec la touche Control enfonce (ou avec le bouton du milieu) puis en dplaant la souris.
        • Tapez la transcription au clavier ; elle apparat simultanment dans l'diteur de texte et dans la segmentation sous le signal.
        • Certains vnements (bruits divers, respirations...)peuvent tre indiqus avec des balises spciales par [Edition]/[Insrer une balise]/[...] ou Control-d.
        • Les changements durables de condition acoustique (bruits de fond persistants)sont indiquer avec [Segmentation]/[Insrer un bruit de fond].

        2.5.2. Conventions de transcription

        La transcription graphmique doit permettre de prdire au mieux la prononciation du locuteur. Si une mme squence graphmique permet de gnrer diffrentes prononciations (typiquement les dates qu'on peut noncer en utilisant mille et cent), on adoptera des conventions capables de lever l'ambigut. Les conventions concernent aussi les lments de la langue pour lesquels la transcription n'est pas unique (typiquement les sigles et les pellations, ou encore les nombres qu'on peut crire sous forme de squence de chiffres ou comme squence de mots). Dans tous les cas, les conventions adoptes visent standardiser la forme graphmique attendue pour minimiser l'ambigut, ventuellement en utilisant des balises de prononciation. Les conventions n'tant pas exhaustives le transcripteur peut adopter par dfaut une criture telle qu'on peut la trouver dans des textes de journaux.

        Les conventions de transcription sont dtailles dans la 3me partie.

        2.5.3. Transcription ou prononciation ambigu

        La balise de prononciation permet de rajouter par dessus une graphie prononciation multiple (typiquement les nombres, les sigles/acronymes, noms propres) une description levant l'ambigut de la prononciation.

        Il est difficile d'noncer une rgle stricte ici. La balise de prononciation permet de spcifier si un mot a t prononc de manire peu standard, l'interprtation du standard dpendant videmment du transcripteur. On peut utiliser la balise de prononciation aussi pour n'importe quel autre commentaire relatif la prononciation d'un mot (par exemple le marquage du -euh typique en fin de mot de l'accent parisien).

        2.6. Bruits et conditions acoustiques

        Parmi les bruits on peut trouver de la parole ne correspondant pas des mots proprement dits de la langue (mots tronqus, errons, ... dont le cas est trait dans les conventions de transcription), des bruits mis par le locuteur (par son appareil phonatoire, mais qui ne sont pas de la parole, et donc dans la plupart des cas non-superposs la parole : bruits de bouche, de gorge, toux, respirations) ou bien des bruits produits par des sources diffrentes de l'appareil phonatoire du locuteur. Ces derniers bruits sont plus gnants parce qu'ils se superposent en gnral la parole, dgradant ainsi la qualit du signal enregistr. Les sources de bruit peuvent tre, sur le lieu d'enregistrement, le locuteur lui-mme ou son environnement : bruits d'couteur ou froissements de papiers en gnral produits par le locuteur pendant qu'il parle, conversations annexes, radio, tl, claquements de porte, horloge, bruits de voiture, ... Le systme d'enregistrement radio-tldiffus peut galement gnrer des bruits : bruits de micro, craquements de ligne tlphonique, bips, effet Larsen, raccrochement tlphone, ... Enfin certains bruits peuvent provenir du systme de diffusion (parasites) ou d'enregistrement (souffle lectrique).

        2.6.1. Comment noter les bruits ?

        Pour les bruits instantans ou de courte dure, le transcripteur cre une balise de bruit par [Edition]/[Insrer une balise]/[Bruit instantan] ou Control-d, et indique :

        • la catgorie de la balise - un bruit, une balise de prononciation, d'annotation lexicale, de changement de langue, ou un commentaire.
        • la description du bruit ou de l'vnement par une chane de caractres ; des valeurs prdfinies sont proposes dans un menu.
        • l'tendue de la balise - balise instantane, de dbut ou de fin, ou encore applique au mot prcdent ou suivant.

        Par dfaut, les balises de bruit sont affiches entre crochets. Si le bruit s'tend sur plusieurs mots on peut slectionner les mots et insrer une balise ; les marqueurs de dbut et de fin seront automatiquement insrs autour.

        • Si le bruit advient entre deux mots le code est affich comme un mot, c'est--dire spar des mots voisins par des blancs : parole1 [b] parole2
        • Si le bruit se superpose au mot prcdent ou suivant, l'affichage le code correspondant est accol au mot avec le caractre + (mais le transcripteur n'a pas taper ce caractre)
          Affichage : parole+[b]
        • Si le bruit se superpose plusieurs mots, des marqueurs de dbut et de fin seront utiliss.
          Affichage : parole1 [b-] parole2 [-b] parole3
          le bruit de type [b] commence avant parole2 et se termine avant parole3.

        Pour les bruits de longue dure, une autre procdure est dtaille plus loin (paragraphe 2.6.4).

        2.6.2. Bruits de l'appareil phonatoire (non-parole)

        Ici nous considrons des bruits produits par l'appareil phonatoire du locuteur enregistr : en gnral ces bruits ne se superposent pas la parole, sauf quand la personne parle en chuchotant ou en rigolant : je+[rire] voudrais+[rire] (on peut utiliser aussi des marqueurs de dbut et de fin : [rire-] je voudrais [-rire]).

        Pour ne pas trop compliquer la tche du transcripteur ( identifier la nature exacte du bruit) les codes de bruit marqus en gras sont utiliser par dfaut pour un type de bruit donn. Si le transcripteur a envie de marquer plus particulirement un bruit donn, il peut choisir un des codes proposs en retrait de la marge ; cependant, ces diffrences ne sont actuellement pas exploites.

        Suggestion : le transcripteur peut accompagner les codes de bruit de balises temporelles de synchronisation (afin de poser un repre pour la segmentation automatique).

        Respiration
        • [r] : respiration
        1. acte physiologique :
          • [i] : inspiration
          • [e] : expiration
          • [n] : reniflement
        2. acte volontaire :
          • [pf] : souffle (on entend par souffle un acte de respiration volontairement bruyant pour marquer son dsaccord ou sa mauvaise humeur, pour retenir un rire, ...)
        Autres bruits de bouche et de gorge
        • [bb] : bruit de bouche (ce code regroupe les bruits de lvres, de langue ou autre combinaison, ...)
          • [tx] : toux, rclement de gorge, ternuement
          • [bg] : bruit de gorge (par exemple coup de glotte, bruit de larynx )
          • [rire] : rires du locuteur
          • [sif] : sifflement du locuteur
          • [ch] : le locuteur se parle en voix chuchote pour faire un commentaire
            [ch-] voix chuchote [-ch]

        2.6.3. Bruits extrieurs l'acte de parole

        Nous regroupons dans cette section tous les bruits produits en dehors de l'appareil phonatoire du locuteur. La plupart de ces bruits peuvent se produire n'importe quel instant de l'enregistrement, et peuvent donc se superposer au signal de parole, dgradant ainsi sa qualit.

        Tout bruit de nature indtermine ou non-rpertori dans ce document peut tre not comme suit :

        • [b] : bruit indtermin

        Bruits dus l'environnement et au matriel d'enregistrement

        • [conv] : conversations dans le fond : il peut s'agir de personnes prsentes, de public, de voitures, ...
        • [pap] : froissement de papiers.
        • [mic] : bruits micros.

        2.6.4. Changement de conditions acoustiques

        Lorsqu'un bruit s'tend sur une longue dure (bruit de fond persistant), un systme de marquage spcifique doit tre utilis. La balise de bruit de fond est une balise instantane dcrivant un changement durable ans les conditions acoustiques. L'information apporte par cette balise reste valable l'intrieur d'un mme enregistrement jusqu' l'apparition d'une nouvelle balise de bruit de fond, ou bien jusqu' la fin de l'enregistrement.

        Le transcripteur positionne le curseur temporel l'instant du changement de conditions acoustiques, choisit [Segmentation]/[Insrer un bruit de fond] et indique :

        • la nature : musique, parole ou conversations, bruit lectrique, autre...

        Une icne de note de musique apparat dans le texte la position courante.

        Si le changement de conditions acoustiques est associ aux conditions d'enregistrement et li au tour de parole (par exemple, une intervention tlphonique de trs mauvaise qualit), il sera plus pratique d'utiliser le champ Fidelit=low dans les paramtres du tour de parole [Segmentation]/[Paramtres du tour...] , plutt que la balise de bruit de fond.

        2.7. Commentaires

        Cette balise permet au transcripteur de commenter l'enregistrement (la parole ou les conditions acoustiques ) transcrire. Le transcripteur peut galement faire ici des remarques sur ce qui lui parat utile pour faciliter la transcription.


        3. Conventions de transcription

        Concernant la transcription l'ide de base consiste focaliser l'attention sur ce qui apparat en premier plan. Si de multiples sources sonores sont prsentes il convient de focaliser la transcription sur la source la plus mergente. Par exemple on entend en arrire-plan une personnalit parler une langue trangre, un traducteur donnant la version franaise en premier plan. Il suffit de transcrire le traducteur en signalant de la parole en bruit de fond. On entend de la musique en premier plan avec des commentaires en arrire-plan. On peut annoter un tel segment comme musique avec comme bruit de fond de la parole (non transcrite). Si deux locuteurs se 'disputent' le premier plan, on transcrit les deux grce au mcanisme de parole superpose. Cependant de manire gnrale on fait l'hypothse qu'il n'y a qu'une source sonore unique au premier plan.

        De manire gnrale, dans tous les segments de parole qui ont t annots transcribed (sections report ou filler), tout ce qui est entendu doit tre transcrit : la transcription doit fournir la squence orthographique exacte correspondant ce que le locuteur a prononc, laquelle il faut rajouter dans la mesure du possible tous les vnements extra-lexicaux prsents dans le signal acoustique (les rptitions, hsitations, troncatures, bruits).

        3.1. Conventions d'criture

        Le produit de la transcription est essentiellement une squence de mots spars par des espaces, entre lesquels s'intercalent des balises identifiant les bruits, les conditions acoustiques et diverses informations permettant de lever l'ambigut de prononciation. Autant que possible, il convient de respecter l'orthographe standard des mots. La ponctuation sert marquer les frontires syntaxiques et prosodiques claires.

        Dans la suite les icnes reprsentent :

          = le locuteur dit

          = le transcripteur crit

        3.1.1. Majuscules/minuscules

        Tout est transcrit en minuscules (pas de majuscule systmatique en dbut de phrase). L'emploi des majuscules est rserv la transcription des pellations et des sigles, au dbut des noms propres et dans des formules de politesse.

        Pour les noms propres d'organisation assimilables des marques (tels que les journaux, les banques...) et utilisant des noms communs, les noms communs en question sont crits avec des initiales majuscules.

          as-tu lu Le Monde, L'Humanit et Le Dimanche ...
          les journalistes du Monde, de L'Humanit et du Dimanche ...
          au Crdit Lyonnais

        Dans le doute, on peut suivre la pratique des journeaux qui peuvent ne mettre en majuscules que le premier mot d'un sigle :

          le Front national est au bord de l'implosion

        Pour les noms de lieux on adopte la convention d'crire en minuscule le nom commun. S'il est suivi d'un nom propre, celui-ci a videmment son initiale en majuscule.

          le lyce Anatole France
          l'opra Garnier

        Des mots communs ayant fonction de nom propre (par exemple : titres d'missions, de films, de livre, d'institutions ) s'crivent entre guillemets. l'intrieur des guillemets les noms communs sont crits en minuscules.

        Par exemple :

          "le tlphone sonne" de ce soir sera consacr  "la chane de l'espoir"
          "le monde d'est en ouest et du nord au sud" sur France Inter
          "regards sur le monde" , Dominique Bromberger bonjour !
          bienvenue  "radio com , c'est vous"
          aux Etats-Unis , le "Monica gate" continue
          euh , je prfre "Tomb raider"
          le chanteur de "divine comdie"
          des associations comme "mdecins du monde"
          le prix Louis-Delluc pour Cdric Kahn et son film "l'ennui"
          sortie aujourd'hui de " la place du coeur" de Robert Gudiguian 
          un bel exemple de Le Clzio dans "la fivre"
          "neuf mois marathon" , Marie-Ccile Picquet , aux ditions "hors commerce"
          une grande opration "mains propres" a t lance
          le "conseil conomique et social"
          ils ont gagn la "terre promise"

        Pour les sigles tendus (c'est--dire prononcs en toutes lettres) la suite de mots composant le sigle est entoure de guillemets. Les noms communs y sont crits en minuscules.

          le "fond montaire international" a fonctionn
          le "commissariat  l'nergie atomique"
          l'"agence France presse"

        Notes : cette utilisation des guillemets demande tre prcise. Dans l'attente d'un vritable guide d'annotation des entits spcifiques, elle est facultative.

        Enfin, on met une majuscule monsieur (ainsi qu' madame, mademoiselle ...) dans les formules de politesse comme indiqu dans l'exemple :

          est-il vrai Monsieur le prfet que, ...

        mais

          le monsieur qui ...

        3.1.2. Ponctuations

        Il est recommand de mettre des marques de ponctuation l o il y a des pauses dans le signal qui correspondent des frontires syntaxiques, ou bien dans le cas o l'absence de ponctuation engendre une ambigut dans le texte.

        Attention : il faut prcder les signes de ponctuations d'un blanc.

          les fleurs sont fanes , le pain est devenu sec .

        Les marqueurs de ponctuations sont indicateurs du mode de l'nonc :
        conclusif ''.'', interrogatif ``?'', exclamatif ``!'', hsitation ``...'', etc.
        Ces informations sont fortement lies la prosodie et la comprhension. Il est recommand d'accompagner les marques de ponctuation forte (. ? !) d'une marque temporelle dans le signal (balise de synchronisation , permettant de segmenter).

        3.1.3. Apostrophe

        Il n'y a pas de sparateur entre l'apostrophe et le mot suivant.

          l'horaire
          l'arrive
          jusqu'

        3.1.4. Trait d'union

        Les mots lis par un trait d'union sont crits normalement sans sparation par un blanc.

          aprs-midi
          voulez-vous
          anglo-saxons

        Attention : on ne relie pas par trait d'union les suites de noms propres. On peut marquer graphiquement le lien par un slash entour de blancs.

          dans le Nord / Pas-de-Calais
          le trajet Paris
          / Toulouse

        3.1.5. Sigles

        Par dfaut : les sigles sont nots par des majuscules non spars par des blancs.

          s n c f

          SNCF

          otan

          OTAN

          c d rom, ina p g

          CDROM, INA PG

        Uniquement dans les cas d'ambigut, la distinction entre un sigle prononc comme un mot et un sigle prononc comme une suite de lettres se fera par l'ajout devant le sigle d'un underscore "_" s'il est lu ou d'un point d'exclamation "!" s'il est pel, par exemple:

          l' onu ou l'o n u, c'est selon

          l'_ONU ou l'!ONU , c'est selon

        On peut observer des expressions complexes composes de sigles et de mots ou de fragments de mots (acronymes,...), de chiffres voire de ponctuation, par exemple :

          JCSat+[pron=J C sat] , RMIste , Smicard , Pacser , l'autoroute A10 , l'association AC!

        La distinction entre sigle et lexie standard est parfois floue (ainsi, LASER qui tait l'origine un acronyme est devenu Laser puis laser). Pour l'utilisation des majuscules, on considrera qu' partir de 5 lettres un acronyme lu est lexicalis et donc crit en minuscules sauf la premire lettre :

          Medef , Insee , Staps , Pacs , Assedic (sigle lu, 5 lettres ou plus)

          IFOP , SMIG , SFOR , PACS , ENA (sigle lu, 4 lettres ou moins)

          FM , ETA , CFDT , EHESS , FNSEA , DGCCRF (sigle pel)

        Dans les cas mixtes comme RMiste, CDROM..., on prendra la graphie majoritaire des journaux: RMiste, CDROM....

        3.1.6. Abrviations

        Il existe dans la langue des abrviations standards comme etc pour et caetera. Les transcripteurs utilisent etcsans point accol.

          et caetera

          etc

          okay

          OK

        3.1.7. Nombres

        Les nombres sont transcrits sous forme de suite de chiffres si la prononciation correspond la syntaxe standard de prononciation des nombres (crire la suite de mots est toujours autoris, mais cela demande plus de travail et peut gnrer plus d'erreur de la part du transcripteur).

          soixante mille

          60000 ou bien 60 mille

          soixante millions

          60000000 ou bien 60 millions

        Attention: il ne faut pas introduire d'espace entre les chiffres!

          vingt virgule cinquante-sept

          20,57 ou bien 20 virgule 57

          un franc cinquante

          1 franc 50

        Attention: il ne faut pas crire: 1,50 francs !

          cent cinquante-huit litres virgule neuf

          158 litres virgule 9

        Les fractions de l'unit (demi, tiers...) seront crits en toutes lettres:

          deux tiers

          deux tiers ou 2 tiers

        Attention: il ne faut pas crire: 2/3 !

        Les nombres ordinaux seront crits en toutes lettres:

          le troisime

          le troisime

        Attention: il ne faut pas crire: le 3me !

        Le signe moins pouvant tre confondu avec le tiret, il sera crit en toutes lettres, ainsi que plus, fois, gale, etc. La seule exception est "pour cent", qui sera crit % :

          moins dix degrs

          moins 10 degrs

          trois pour cent

          3 %

        3.1.8. Dates

        Pour les dates dont la prononciation peut tre ambigu (dix-neuf cent ou mille neuf cent), on utilisera une balise de prononciation dans le cas non-standard, s'appliquant au mot prcdent (ou suivant). Le choix propos par dfaut est "19 cent...", il faudra veiller le modifier manuellement en fonction du sicle en question, exemple pour 1660 on utilisera "16 cent..."

          mille neuf cent quatre-vingts

          1980

          dix-neuf cent quatre-vingts

          1980+[pron=19 cent...]

        3.1.9. Chiffres romains

        Ils peuvent tre utiliss dans les noms de roi ou de pape (qui servent souvent dsigner des lieux publics ). La transcription se fait avec les chiffres romains, en ajoutant une balise de prononciation s'appliquant au mot prcdent (ou suivant).

          l'htel Charles cinq

          l'htel Charles V+[pron=(chiffres romains:) 5]

          le stade Louis deux

          le stade Louis II+[pron=(chiffres romains:) 2]

        3.1.10. Adresses internet

        Pour les adresses internet (URL ou e-mail), la transcription se fait en notant l'adresse telle qu'elle s'crit (habituellement tout en minuscules), et en ajoutant une balise de prononciation s'appliquant au mot prcdent (ou suivant).

          telsonne at radio tiret france point f r

          telsonne@radio-france.fr+[pron=(URL:) telsonne at radio tiret France point FR]

          w w w point radio tiret france point f r

          www.radio-france.fr+[pron=(URL:) WWW point radio tiret France point FR]

        Dans le cas de prsence d'inspirations, d'hsitations... au milieu de l'URL, celles-ci seront annotes dans la balise prononciation, par exemple il faut crire :

          www.tf1.fr+[pron=(URL:) WWW [i] point TF() 1 point FR]

        Attention: il ne faut pas crire:

            www [i].tf() 1.fr+[pron=(URL:) WWW point TF1 point FR]

        Dans le cas cas particulier d'une URL scinde, par exemple prononce par plusieurs locuteurs, transcrire comme dans cet exemple :

        3.2. Mots hors-lexique

        3.2.1. Mots d'origine trangre, changement de langue

        Une balise de changement de langue permet d'identifier un mot ou une suite de mots qui ne font pas partie du parler franais.

        Les mots d'origine trangre (et absorbs dans la langue avec une prononciation donne) ne sont pas marqus (par exemple week-end, playstation, business prononcs l'anglaise). On considre ces prononciations comme ``standard''.

        En revanche des prononciations peu communes devront tre signales (par exemple les correspondants l'tranger dmarrant leur intervention par buon giorno di Roma, good morning from London... ).

          changeant des potins [lang=anglais-] cashing up with gossip [-lang=anglais]

          a s'appelle l'[lang=anglais-] easy listening [-lang=anglais]

          cela reviendra lgaliser le sabouba+[lang=arabe]

        Il est inutile d'ajouter un marqueur d'orthographe incertaine aux mots trangers, mme si la transcription est simplement acoustique. Un segment de longue dure en langue trangre doit tre annot non-trans.

        3.2.2. Noms propres trangers

        Les noms propres Beatles, Clinton, les sigles CNN, CBS prononcs l'anglaise correspondent au standard ; l'inverse une prononciation la franaise inhabituelle doit tre spcifie par une balise de prononciation :

          Bill Clinton , en franais Guillaume Clinton+[pron=franais]

        Pour des noms propres comme Morgan le standard dpend videmment du contexte (Michle Morgan ou Nelson Morgan par exemple). Mais pour des noms propres comme Benjamin, le contexte peut ne pas tre suffisant : Benjamin Netanyahou peut admettre diffrentes prononciations.

        3.2.3. Mots techniques, nouveaux mots, noms propres inconnus

        Cette section concerne les problmes d'criture qui se posent pour des nologismes, entits idiosyncrasiques, des mots techniques .

        Dans un contexte particulier des mots nouveaux peuvent apparatre. Ces mots ne font pas partie du vocabulaire de la langue courante, et sont souvent ignors des gens extrieurs ce domaine particulier. Ceci est vrai pour des domaines techniques spcialiss, mais se rencontrent frquemment aussi dans le milieu journalistique (par exemple le terme de pu-putch a t employ plusieurs fois dbut dcembre 98). Ces mots sont considrer comme des entits lexicales part entire.

        Lorsque l'orthographe se dduit sans ambigut, il suffit de l'crire sans balise supplmentaire :

          un tlvirenquethon ? a ne sonne pas trs bien

          le greige , quelque part entre gris et beige

          la primature du chef est publiquement mise en cause

        Des noms propres inconnus (souvent d'origine trangre) peuvent admettre plusieurs graphies en franais. Afin de pouvoir normaliser ces graphies lors d'un traitement ultrieur, il est important de marquer les mots qui posent problmes.

        Rgle : tous mots techniques, idiosyncrasiques, noms propres, etc, dont la graphie est incertaine (non fige, et qu'un complment d'information permettrait de corriger ou confirmer), seront prcds par deux accents circonflexes :

          ^^mot_inconnu

        Exemples :

          ^^Annam ^^Lefebvre ^^Baranov ^^Tourner ^^Rresse ^^Micoine ^^Ita ^^Arad ^^Mougins ^^Mossey ^Klipffel ^^Jaillard ^^Elina ^^Castella ^^Zwetaeva ...

        De manire quivalente, une balise de commentaire lexical peut tre utilise :

          ^^Gudet ou Gudet+[lex=orthographe incertaine]

        Remarque: Ceci ne s'applique pas aux mots qui ont deux orthographes possibles (on choisira la premire venant l'esprit) :

          cl ou clef , cuillre ou cuiller , aroclub ou aro-club , CDROM ou cdrom , etc

        En revanche, cela s'applique aux prnoms ambigus :

          ^^Michle ou ^^Michelle Martin ; ^^Danile ou ^^Danielle Durand ; mais

          Michle Morgan ; Danielle , avec 2 L ,

        3.3. Spcificits du langage parl

        Lorsqu'on coute attentivement le signal, on se rend compte que des parties de mots, voire des mots entiers peuvent avoir disparus.

        On peut tre tent de marquer graphmiquement les rductions produites par le locuteur. La consigne suivre ici est de respecter l'orthographe standard: ne pas marquer, dans l'criture, l'lision ou la rduction prsente dans la parole. On peut utiliser la balise de prononciation ou la balise de commentaire, si on veut dcrire les phnomnes observs.

        3.3.1. Onomatopes

        Les onomatopes font partie de la langue et sont transcrire au mme titre que les autres mots. Les plus frquentes existent en gnral en tant que mots graphmiques, pour toutes les autres on devra crer des mots correspondants et maintenir cette liste jour.

          euh , ben, eh, hein, ah, hum, oh, h, 
          ouahou, huhum, hou, hop, ae ...

        Exemples :

          euh on voit que les ... , ah , comment dire 
          et en fait euh bon ben
          l'indice Nikkei et non pas Mickey hein ! 
          eh bien , 
          h oh comme vous dites !
          hou l l 
          une tude sur le le hum ()
          ouahou , chic alors !
          on en parle plus , hop .

        3.3.2. Rptitions

        Les rptitions ne portent pas d'information et on tenterait naturellement de les liminer dans un processus de transcription d'une dicte. Elles doivent tre transcrites comme tout autre mot.

          le le le dput ...

        3.3.3. Elisions & formes rduites

        La rduction peut porter sur un seul mot ou une suite de mots, par exemple:

          orches' de chambre | s'i 'ous plat | qu'i soit | dans c' domaine

          orchestre de chambre | s'il vous plat | qu'il soit | dans ce domaine

        Remarque: La rduction de qu'il en qu'i' est transcrite qu'il et non pas qui.

        Autres exemples:

          i' y a ou bien y a

          il y a ou bien (il) y a

        On peut crire (il) y a si le il est absent de manire vidente. Mais nous tenons souligner qu'il est inutile de faire des coutes rptes pour dcider si le il est prsent ou non.

        Dans le langage parl le ne de la ngation est trs souvent omis. Dans ce cas on ne l'crit pas.

          j'en sais rien

          j'en sais rien

          chais pas ou bien chsais pas ou bien ...

          je sais pas ou bien je (ne) sais pas

          mais y a pas d' raison qu'i' soit pas l

          mais il y a pas de raison qu'il soit pas l
          ou bien mais (il n') y a pas de raison qu'il (ne) soit pas l

        3.3.4. Troncatures

        Les mots tronqus peuvent provenir de deux origines diffrentes : soit le locuteur s'arrte avant la fin du mot, soit le locuteur est coup par le systme d'enregistrement. Dans ce dernier cas le mot peut tre tronqu au dbut : le locuteur a commenc parler avant le dbut de l'enregistrement. La troncature est marque par des parenthses. Si le mot tronqu est connu (grce au contexte) on note la partie manquante du mot entre parenthses.

        notation : ()

          vou() : troncature finale de voudrais, voulais,...

          ()embre : troncature initiale de septembre, novembre, dcembre,...

          aprs-de(main) : le mot complet peut tre dduit du contexte

        3.3.5. Lapsus

        Il arrive que la prononciation errone soit un mot correct de la langue. Dans ce cas, on transcrit les mots tel qu'ils ont t prononcs.

          une augmentation consquence euh consquente

          une augmentation consquence euh consquente

        3.3.6. Prononciation errone

        Si on arrive identifier le mot mal prononc, on crit le mot correct prcd d'une toile.

        notation : *mot-correct

          pestacle

          *spectacle

        La prononciation effective peut tre, en plus, signale par une balise :

          rnumration

          *rmunration+[pron=rnumration]

        S'il s'agit de parole inintelligible, on utilise la notation suivante :
        notation : [pi]

        Si la parole est inintelligible parce qu'il s'agit de parole inaudible et faible, on peut noter ce type d'vnement, si on veut la diffrencier du cas ci-dessus, par :
        notation : [pif]

        Le transcripteur est invit insrer une balise de synchronisation prs du mot (juste aprs le mot) mal prononc (afin de poser un repre pour la segmentation automatique dans cette zone errone).

        3.3.7. Liaisons

        On ne marque pas les liaisons dans la transcription orthographique. Les liaisons errones sont releves par la balise de prononciation.

          vingt-z-animaux

          vingt+[pron=vingt-z] animaux

          trop-z ennuyeux il voudrait-z y aller

          trop+[pron=trop-z] ennuyeux il voudrait y aller

        3.3.8. pellations

        Toutes les lettres sont notes en majuscules spares par des blancs, p. ex :
        P A R I S
        L'pellation des lettres accentues peut conduire diffrentes transcriptions, suivant l'nonc du locuteur, par exemple :

          accent aigu

          accent aigu

          e accent aigu

          E accent aigu

        Remarque : l'pellation des lettres redoubles peut donner lieu diffrentes transcriptions. Par exemple le locuteur doit peler Vannes :

          v a n n e s

          V A N N E S

          v a deux n e s

          V A 2 N E S

        3.3.9. Ponctuation verbalise

        Si un locuteur nonce la ponctuation (comme s'il faisait une dicte, verbalized punctuation) on crit le mot correspondant en toutes lettres :

          cent-cinq point cinq

          105 point 5


        4. Vrification

        4.1. Comment vrifier la transcription ?

        • Ecoutez le signal tout en lisant la transcription. Stoppez et redmarrez aussi souvent que ncessaire. Utilisez de prfrence la commande [Signal]/[Joue le segment] ou Shift-Tab.
        • La transcription est modifier dans l'diteur de texte. Dans une future version du logiciel, un correcteur orthographique devrait tre disponible pour la correction des fautes d'orthographe (et plus gnralement des fautes de frappe).
        • Les frontires des segments peuvent tre dplaces ou supprimes
        • Les tours de paroles et les sections sont ditables en cliquant sur le bouton correspondant.
        • La correction orthographique est disponible par [Edition]/[Correction orthographique]
        transcriber-1.5.1.1/doc/fr/userMenu.html0000644000175000017500000001030707510315717015703 0ustar rtrt

        Retour à la présentation

        Manuel du transcripteur

        1. Introduction

        2. Structuration de la transcription

        2.1. Enregistrement

        2.2. Segmentation du signal

        2.3. Tours et locuteurs

        2.4. Sections et thèmes

        2.5. Transcription orthographique

        2.6. Bruits et conditions acoustiques

        2.7. Commentaires

        3. Conventions de transcription

        3.1. Conventions d'écriture

        3.2. Mots hors-lexique

        3.3. Spécificités du langage parlé

        4. Vérification

        transcriber-1.5.1.1/doc/fr/gpl.html0000644000175000017500000005032207510315717014663 0ustar rtrt GPL (adaptation franaise non officielle)

        GPL

        Introduction

        This is an unofficial translation of the GNU General Public License into French. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL--only the original English text of the GNU GPL does that. However, we hope that this translation will help French speakers understand the GNU GPL better.

        Voici (http://www.linux-france.org/article/these/gpl.html) une adaptation non officielle de la Licence Publique Gnrale du projet GNU. Elle n'a pas t publie par la Free Software Foundation et son contenu n'a aucune porte lgale car seule la version anglaise de ce document dtaille le mode de distribution des logiciels sous GNU GPL. Nous esprons cependant qu'elle permettra aux francophones de mieux comprendre la GPL.

        Licence Publique Gnrale GNU Version 2, Juin 1991

        Copyright © Free Software Foundation, Inc.
        59 Temple Place, Suite 330, Boston, MA 02111-1307
        tats-Unis, 1989, 1991.
        La copie et la distribution de copies exactes de ce document sont autorises, mais aucune modification n'est permise.

        Prambule

        Les licences d'utilisation de la plupart des programmes sont dfinies pour limiter ou supprimer toute libert l'utilisateur. l'inverse, la Licence Publique Gnrale (General Public License) est destine vous garantir la libert de partager et de modifier les logiciels libres, et de s'assurer que ces logiciels sont effectivement accessibles tout utilisateur.

        Cette Licence Publique Gnrale s'applique la plupart des programmes de la Free Software Foundation, comme tout autre programme dont l'auteur l'aura dcid (d'autres logiciels de la FSF sont couverts pour leur part par la Licence Publique Gnrale pour Bibliothques GNU (LGPL)). Vous pouvez aussi appliquer les termes de cette Licence vos propres programmes, si vous le dsirez.

        Libert des logiciels ne signifie pas ncessairement gratuit. Notre Licence est conue pour vous assurer la libert de distribuer des copies des programmes, gratuitement ou non, de recevoir le code source ou de pouvoir l'obtenir, de modifier les programmes ou d'en utiliser des lments dans de nouveaux programmes libres, en sachant que vous y tes autoris.

        Afin de garantir ces droits, nous avons d introduire des restrictions interdisant quiconque de vous les refuser ou de vous demander d'y renoncer. Ces restrictions vous imposent en retour certaines obligations si vous distribuez ou modifiez des copies de programmes protgs par la Licence. En d'autre termes, il vous incombera en ce cas de :

        • transmettre aux destinataires tous les droits que vous possdez,
        • expdier aux destinataires le code source ou bien tenir celui-ci leur disposition,
        • leur remettre cette Licence afin qu'ils prennent connaissance de leurs droits.

        Nous protgeons vos droits de deux faons : d'abord par le copyright du logiciel, ensuite par la remise de cette Licence qui vous autorise lgalement copier, distribuer et/ou modifier le logiciel.

        En outre, pour protger chaque auteur ainsi que la FSF, nous affirmons solennellement que le programme concern ne fait l'objet d'aucune garantie. Si un tiers le modifie puis le redistribue, tous ceux qui en recevront une copie doivent savoir qu'il ne s'agit pas de l'original afin qu'une copie dfectueuse n'entache pas la rputation de l'auteur du logiciel.

        Enfin, tout programme libre est sans cesse menac par des dpts de brevets. Nous souhaitons tout prix viter que des distributeurs puissent dposer des brevets sur les Logiciels Libres pour leur propre compte. Pour viter cela, nous stipulons bien que tout dpt ventuel de brevet doit accorder expressment tout un chacun le libre usage du produit.

        Les dispositions prcises et les conditions de copie, de distribution et de modification de nos logiciels sont les suivantes :

        Stipulations et conditions relatives la copie, la distribution et la modification


        • Article 0
          La prsente Licence s'applique tout Programme (ou autre travail) o figure une note, place par le dtenteur des droits, stipulant que ledit Programme ou travail peut tre distribu selon les termes de la prsente Licence. Le terme Programme dsigne aussi bien le Programme lui-mme que tout travail qui en est driv selon la loi, c'est--dire tout ouvrage reproduisant le Programme ou une partie de celui-ci, l'identique ou bien modifi, et/ou traduit dans une autre langue (la traduction est considre comme une modification). Chaque personne concerne par la Licence Publique Gnrale sera dsigne par le terme Vous.

          Les activits autres que copie, distribution et modification ne sont pas couvertes par la prsente Licence et sortent de son cadre. Rien ne restreint l'utilisation du Programme et les donnes issues de celui-ci ne sont couvertes que si leur contenu constitue un travail bas sur le logiciel (indpendemment du fait d'avoir t ralis en lanant le Programme). Tout dpend de ce que le Programme est cens produire.


        • Article 1.
          Vous pouvez copier et distribuer des copies conformes du code source du Programme, tel que Vous l'avez reu, sur n'importe quel support, condition de placer sur chaque copie un copyright appropri et une restriction de garantie, de ne pas modifier ou omettre toutes les stipulations se rfrant la prsente Licence et la limitation de garantie, et de fournir avec toute copie du Programme un exemplaire de la Licence.

          Vous pouvez demander une rtribution financire pour la ralisation de la copie et demeurez libre de proposer une garantie assure par vos soins, moyennant finances.


        • Article 2.
          Vous pouvez modifier votre copie ou vos copies du Programme ou partie de celui-ci, ou d'un travail bas sur ce Programme, et copier et distribuer ces modifications selon les termes de l'article 1, condition de Vous conformer galement aux conditions suivantes :
          • a) Ajouter aux fichiers modifis l'indication trs claire des modifications effectues, ainsi que la date de chaque changement.
          • b) Distribuer sous les termes de la Licence Publique Gnrale l'ensemble de toute ralisation contenant tout ou partie du Programme, avec ou sans modifications.
          • c) Si le Programme modifi lit des commandes de manire interactive lors de son excution, faire en sorte qu'il affiche, lors d'une invocation ordinaire, le copyright appropri en indiquant clairement la limitation de garantie (ou la garantie que Vous Vous engagez fournir Vous-mme), qu'il stipule que tout utilisateur peut librement redistribuer le Programme selon les conditions de la Licence Publique Gnrale GNU, et qu'il montre tout utilisateur comment lire une copie de celle-ci (exception : si le Programme original est interactif mais n'affiche pas un tel message en temps normal, tout travail driv de ce Programme ne sera pas non plus contraint de l'afficher).

          Toutes ces conditions s'appliquent l'ensemble des modifications. Si des lments identifiables de ce travail ne sont pas drivs du Programme et peuvent tre raisonnablement considrs comme indpendants, la prsente Licence ne s'applique pas ces lments lorsque Vous les distribuez seuls. Mais, si Vous distribuez ces mmes lments comme partie d'un ensemble cohrent dont le reste est bas sur un Programme soumis la Licence, ils lui sont galement soumis, et la Licence s'tend ainsi l'ensemble du produit, quel qu'en soit l'auteur.

          Cet article n'a pas pour but de s'approprier ou de contester vos droits sur un travail entirement ralis par Vous, mais plutt d'ouvrir droit un contrle de la libre distribution de tout travail driv ou collectif bas sur le Programme.

          En outre, toute fusion d'un autre travail, non bas sur le Programme, avec le Programme (ou avec un travail driv de ce dernier), effectue sur un support de stockage ou de distribution, ne fait pas tomber cet autre travail sous le contrle de la Licence.


        • Article 3.
          Vous pouvez copier et distribuer le Programme (ou tout travail driv selon les conditions nonces dans l'article 1) sous forme de code objet ou excutable, selon les termes des articles 0 et 1, condition de respecter les clauses suivantes :
          • a) Fournir le code source complet du Programme, sous une forme lisible par un ordinateur et selon les termes des articles 0 et 1, sur un support habituellement utilis pour l'change de donnes ; ou,
          • b) Faire une offre crite, valable pendant au moins trois ans, prvoyant de donner tout tiers qui en fera la demande une copie, sous forme lisible par un ordinateur, du code source correspondant, pour un tarif n'excdant pas le cot de la copie, selon les termes des articles 0 et 1, sur un support couramment utilis pour l'change de donnes informatiques ; ou,
          • c) Informer le destinataire de l'endroit o le code source peut tre obtenu (cette solution n'est recevable que dans le cas d'une distribution non commerciale, et uniquement si Vous avez reu le Programme sous forme de code objet ou excutable avec l'offre prvue l'alina b ci-dessus).

          Le code source d'un travail dsigne la forme de cet ouvrage sous laquelle les modifications sont les plus aises. Sont ainsi dsigns la totalit du code source de tous les modules composant un Programme excutable, de mme que tout fichier de dfinition associ, ainsi que les scripts utiliss pour effectuer la compilation et l'installation du Programme excutable. Toutefois, l'environnement standard de dveloppement du systme d'exploitation mis en oeuvre (source ou binaire) -- compilateurs, bibliothques, noyau, etc. -- constitue une exception, sauf si ces lments sont diffuss en mme temps que le Programme excutable.

          Si la distribution de l'excutable ou du code objet consiste offrir un accs permettant de copier le Programme depuis un endroit particulier, l'offre d'un accs quivalent pour se procurer le code source au mme endroit est considr comme une distribution de ce code source, mme si l'utilisateur choisit de ne pas profiter de cette offre.


        • Article 4.
          Vous ne pouvez pas copier, modifier, cder, dposer ou distribuer le Programme d'une autre manire que l'autorise la Licence Publique Gnrale. Toute tentative de ce type annule immdiatement vos droits d'utilisation du Programme sous cette Licence. Toutefois, les tiers ayant reu de Vous des copies du Programme ou le droit d'utiliser ces copies continueront bnficier de leur droit d'utilisation tant qu'ils respecteront pleinement les conditions de la Licence.


        • Article 5.
          Ne l'ayant pas signe, Vous n'tes pas oblig d'accepter cette Licence. Cependant, rien d'autre ne Vous autorise modifier ou distribuer le Programme ou quelque travaux drivs : la loi l'interdit tant que Vous n'acceptez pas les termes de cette Licence. En consquence, en modifiant ou en distribuant le Programme (ou tout travail bas sur lui), Vous acceptez implicitement tous les termes et conditions de cette Licence.


        • Article 6.
          La diffusion d'un Programme (ou de tout travail driv) suppose l'envoi simultan d'une licence autorisant la copie, la distribution ou la modification du Programme, aux termes et conditions de la Licence. Vous n'avez pas le droit d'imposer de restrictions supplmentaires aux droits transmis au destinataire. Vous n'tes pas responsable du respect de la Licence par un tiers.


        • Article 7.
          Si, la suite d'une dcision de Justice, d'une plainte en contrefaon ou pour toute autre raison (lie ou non la contrefaon), des conditions Vous sont imposes (que ce soit par ordonnance, accord amiable ou autre) qui se rvlent incompatibles avec les termes de la prsente Licence, Vous n'tes pas pour autant dgag des obligations lies celle-ci : si Vous ne pouvez concilier vos obligations lgales ou autres avec les conditions de cette Licence, Vous ne devez pas distribuer le Programme.

          Si une partie quelconque de cet article est invalide ou inapplicable pour quelque raison que ce soit, le reste de l'article continue de s'appliquer et l'intgralit de l'article s'appliquera en toute autre circonstance.

          Le prsent article n'a pas pour but de Vous pousser enfreindre des droits ou des dispositions lgales ni en contester la validit ; son seul objectif est de protger l'intgrit du systme de distribution du Logiciel Libre. De nombreuses personnes ont gnreusement contribu la large gamme de Programmes distribue de cette faon en toute confiance ; il appartient chaque auteur/donateur de dcider de diffuser ses Programmes selon les critres de son choix.


        • Article 8.
          Si la distribution et/ou l'utilisation du Programme est limite dans certains pays par des brevets ou des droits sur des interfaces, le dtenteur original des droits qui place le Programme sous la Licence Publique Gnrale peut ajouter explicitement une clause de limitation gographique excluant ces pays. Dans ce cas, cette clause devient une partie intgrante de la Licence.


        • Article 9.
          La Free Software Foundation se rserve le droit de publier priodiquement des mises jour ou de nouvelles versions de la Licence. Rdiges dans le mme esprit que la prsente version, elles seront cependant susceptibles d'en modifier certains dtails mesure que de nouveaux problmes se font jour.

          Chaque version possde un numro distinct. Si le Programme prcise un numro de version de cette Licence et toute version ultrieure , Vous avez le choix de suivre les termes et conditions de cette version ou de toute autre version plus rcente publie par la Free Software Foundation. Si le Programme ne spcifie aucun numro de version, Vous pouvez alors choisir l'une quelconque des versions publies par la Free Software Foundation.


        • Article 10.
          Si Vous dsirez incorporer des lments du Programme dans d'autres Programmes libres dont les conditions de distribution diffrent, Vous devez crire l'auteur pour lui en demander la permission. Pour ce qui est des Programmes directement dposs par la Free Software Foundation, crivez-nous : une exception est toujours envisageable. Notre dcision sera base sur notre volont de prserver la libert de notre Programme ou de ses drivs et celle de promouvoir le partage et la rutilisation du logiciel en gnral.

          LIMITATION DE GARANTIE

        • Article 11.
          Parce que l'utilisation de ce Programme est libre et gratuite, aucune garantie n'est fournie, comme le permet la loi. Sauf mention crite, les dtenteurs du copyright et/ou les tiers fournissent le Programme en l'tat, sans aucune sorte de garantie explicite ou implicite, y compris les garanties de commercialisation ou d'adaptation dans un but particulier. Vous assumez tous les risques quant la qualit et aux effets du Programme. Si le Programme est dfectueux, Vous assumez le cot de tous les services, corrections ou rparations ncessaires.


        • Article 12.
          Sauf lorsqu'explicitement prvu par la Loi ou accept par crit, ni le dtenteur des droits, ni quiconque autoris modifier et/ou redistribuer le Programme comme il est permis ci-dessus ne pourra tre tenu pour responsable de tout dommage direct, indirect, secondaire ou accessoire (pertes financires dues au manque gagner, l'interruption d'activits ou la perte de donnes, etc., dcoulant de l'utilisation du Programme ou de l'impossibilit d'utiliser celui-ci).


        FIN DES TERMES ET CONDITIONS

        Comment appliquer ces directives vos nouveaux programmes

        Si vous dveloppez un nouveau programme et dsirez en faire bnficier tout un chacun, la meilleure mthode est d'en faire un Logiciel Libre que tout le monde pourra redistribuer et modifier selon les termes de la Licence Publique Gnrale.

        Pour cela, insrez les indications suivantes dans votre programme (il est prfrable et plus sr de les faire figurer au dbut de chaque fichier source ; dans tous les cas, chaque module source devra comporter au minimum la ligne de copyright et indiquer o rsident toutes les autres indications) :


        ((une ligne pour donner le nom du programme et donner une ide de sa finalit))
        Copyright (C) 19xx ((nom de l'auteur))

        Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Gnrale GNU publie par la Free Software Foundation (version 2 ou bien toute autre version ultrieure choisie par vous).

        Ce programme est distribu car potentiellement utile, mais SANS AUCUNE GARANTIE, ni explicite ni implicite, y compris les garanties de commercialisation ou d'adaptation dans un but spcifique. Reportez-vous la Licence Publique Gnrale GNU pour plus de dtails.

        Vous devez avoir reu une copie de la Licence Publique Gnrale GNU en mme temps que ce programme ; si ce n'est pas le cas, crivez la Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, tats-Unis.


        Ajoutez galement votre adresse lectronique, le cas chant, ainsi que votre adresse postale.

        Si le programme est interactif, faites-lui afficher un court avertissement du type de celui-ci chaque invocation :


        ...(nom du programme) version 69, Copyright (C) 19aa nom de l'auteur

        ...(nom du programme) est fourni sans AUCUNE GARANTIE.
        Pour plus de dtails, tapez `g'.

        Ce programme est libre et vous tes encourag le redistribuer sous certaines conditions ; tapez `c' pour plus de dtails.


        Les commandes hypothtiques `g' et `c' doivent afficher les sections appropries de la Licence Publique Gnrale GNU. Bien entendu, vous pouvez implanter ces commandes comme bon vous semble : options dans un menu, ou bien accessibles d'un clic de souris, etc., tout dpend de votre programme.

        Si vous officiez en tant que programmeur, n'omettez pas de demander votre employeur, votre tablissement scolaire ou autres de signer une dcharge stipulant leur renoncement aux droits qu'ils pourraient avoir sur le programme :


        ...((employeur, cole...)) dclare par la prsente ne pas revendiquer de droits sur le programme (nom du programme) ralis par ...((nom de l'auteur)).
        ((signature du responsable)), ...((date)), ...((nom et qualit du responsable)).

        La Licence Publique Gnrale ne permet pas d'inclure votre programme dans des logiciels sous licence commerciale spcifique. Si votre programme est une fonction de bibliothque, vous jugerez probablement plus judicieux de le faire relever de la Licence Gnrale de Bibliothque GNU (LGPL) plutt que de la prsente.



        Last modified: Tue Sep 29 22:41:45 MET DST 1998 transcriber-1.5.1.1/doc/img/0000755000175000017500000000000010605162351013347 5ustar rtrttranscriber-1.5.1.1/doc/img/inter_font.gif0000644000175000017500000000734207510315720016214 0ustar rtrtGIF87a @X@X%@0DLz @|)@PD\z @_@x,af@̯H &@Ai@@>% @0&@DAz @ %>%@@蠴LDDzz @@1@`,AL?DP%@؀L #.pDz @e৓lp,, $Dz)R@t$paf@,Dz @ n)@ 8_@,H*\ȰÇ#JHa3jȱG.@ɓ(S\ɲ˗0cʜIM!ɳϟ@9R@ȣH*]ʴӧPJJիX%JRCÊK6#XZeZpʝۭkŹ߿V^'Nip`"e唗!OY9㙃[Xb6yYfw^-34yNDZ;vMⓅLr)3?5mՄ޻゚+||s/Oyӯph޿OY^I{wo*շx᧟|_f=tW^{V7c |!fڄUҁ(.g ]="IaGq]h#'~%tjb]qi`1¨asb!mX4[U[:R8c<#|g୴f gs ReTAդVj饘B%T駠*ꨢvڕkꪬ*무j뭯j+k&6쳿kBkf2+mv+knjg_nnk[իo,*/7F]Lmq$1Zr#'2/r8s oekBc{sο rD+ tսpӽ.RMtQS=B}VJǝf=7{{2gMvhCݫ'۶7>qC.i/]PG^'.; 8od.(s7N98[.}k>NxeWw/o[/vك:Ҙ9+3[4 bɀ("^FL"&NbxFТҬ;b_hE$ň6ˌ<۶2-QςcEǍс#!ƚǡuZ}!?呑{4ٞ#N  rg<' I?Rsx7aґtV'JP{uC%kwzt+Kdud3C:uf.I:lQ3YARai,vbf:Ibv KDj~ j@KFPia'`Fy ]BIŠ.y(HG,})JW*f'5)Lgj>S)NG*ӝT>bO ҡkUβ0W*d)RQ˥X{5Q%*!VEիֺͳՐ6}]=Ϯi+#eY8`rti=E(Yx 5Fز_ե^=՗X{_diRj {Bp-jm6m+ =tG:_FKZaEr1.xY(*Ш%[KSlI'|K_ nozIiΑtݴӸ+D02w /9KXNp5 2 ~pJ \߁Pa +{o[q)`oocq8^5¹[1>ꥯ3Yܨ3|&cy{ S1q%8=1udc"e`>sLKqnpdJ=:+f_̐7|)h^BɬTԲ,J.֫髳||HsEkev-f-ݻ>ZPX_~sfݳg} n*&{?Փ#w=+{÷n/:g=U;]WC396o o›wW:~3%>Q'nfCxZr2Zӗln؎6 koZ 챓TQ#P=yT'sx~,0x{]O}|=r+i6[^=籭5_,ɋ޲Nv,<׾7;qg?Mp^lizi x$w -T8噇虇+쟗J>-}rş嫝ryvvQ~7J_vby_7~>wm]aPoxpv_7.6yއt,2Wywpϔmy'-m8.7KInvU}@AzwtuI5Cu]TaZ7(QzGCׅ(`(vH8:D/Еjl\u]pr81|f(Yr^hz(Z|؇(ȅQbEmO`](./uv/HvXӕ5 E-QYV^5P8G3yGOQh.w׉HxWs΢؋XR8؉qhxy(.1%?(Hd7UP8X/kuXbl>qMwEd%ŏ^XuU鑶(>IؘW[6먉.Y3Nȓ,،$y1 . ) ChhA.= ?JSUiXÒ&oҕR B)buSZBiØ5喯%4ӈ.8]rťp5{I~Cԧ W.R92rٚPr9Yy9);transcriber-1.5.1.1/doc/img/trans.gif0000644000175000017500000000111507510315717015172 0ustar rtrtGIF87a00Ȩ``00ȘPPP```ppp̘```0000,00 dihj/+pms{i 3`H,y&A& F0 Z4E  hλ_@x8%  no7GL`y6z3@ y/z8> H\'b *$|(&@,w4o'>d"&Jbȳ# J 4'#֢K,JnNp0m2>'Gȕx_ w!-2",2H<| E"%W-P2w<2$͟ {T$oϘԊJP1zqhT8PaZDXSM\*n ̦N-q.]Ce6b]K WyDRSN9CCQpfC63Z3 -/dѿW-ő7u}Ko[H ë;transcriber-1.5.1.1/doc/img/trans.xpm0000644000175000017500000000603507510315717015237 0ustar rtrt/* XPM */ static char * trans_xpm[] = { "48 48 26 1", " s None c None", ". c #CF3CCF3CFFFF", "X c #DF7DDF7DDF7D", "o c #000000000000", "O c #BEFBBEFBBEFB", "+ c #CF3CCF3CCF3C", "@ c #AEBAAEBAA699", "# c #AEBAAEBAAEBA", "$ c #61856185CF3C", "% c #30C230C2CF3C", "& c #9E799A69FFFF", "* c #CF3CC71BCF3C", "= c #514451445144", "- c #618561856185", "; c #71C671C671C6", ": c #9E799E799E79", "> c #965896589658", ", c #CF3CCF3C9E79", "< c #FFFF00000000", "1 c #C71BC30BC71B", "2 c #8E388E388E38", "3 c #9E799A696185", "4 c #000061856185", "5 c #104010401040", "6 c #30C230C230C2", "7 c #30C200000000", " ", " ... ", " ...... ", " ...... ", " .XX.... oooooooooooo ", " OO...X oooooooooooooooo ", " +.@#$%. ooooo ooooo ", " X+&.OO#.X ooo ", " *...=-;X ooo ", " XX.+O:;O. oo ", " ..XO++#;@X oo ", " oo ...X;>+& o ", " oo ....X.+% oo ", " oo ..X++>$$#& oo ", " o .O,+%%O o ", " oo ..X%O$@ oo ", " o X...+;O. o ", " o <.X..+,,>#. < o ", " o < OO.O+;>.1 < < o ", " o < *OOO,--. < < o ", " o < 1>:>O2;% < < < < o ", " o < NRUvw~_}v]Sю;n+oyyݺO|رc!9rXnFK˓?}n'54 !#ۿC>rUk7m4wԩuֽSoo7k|.9z!V?\6_l1!(0W}#Ï߾qy ѣG<"?{_6>-K:5a<0Ga4a~>;W~{`:uԾ׾v0 'N8uԙ3g6lذqoزe˖-[=id<>Fh__;߹aNhƣdoC8^wS[}GƧx\nݺӧO8p =}iWեӷ<}4Jid4Z ٮ뗗Gёcν9[W;{*g}/_z>r;GgG^™3׾JC !{[*5e<k_;| :tg=Y~mڴiiiWW?}_ϸ_6qHh4Z!9v\9I'5 ȃ}[_zMO;x׭?7ډp*#;oBoxF%(Ёۿo(靌8Y=gٳ׾?s?MM5X$'O6)G紖`|}}g`EdI63fBx*=qƹӛCN䪿ݿK7ʌ եxك|sg?{<YnݕW^y/~OySΜ>}豋.j#O۲ <7_8_~KN#!<B8z2L.L\̻w5lk_S?˶7>W?1ΑSU G\>(3uz]/o~x$z+>~Ӱee,aZk9E !qFx__;/ԃ`Ξ=iӦGߴi3̓'O={&8,-N al/×>gϜ'Fޏ/cGF_|?Ʌ~n[yd]g?՜HB,Ǐ=rjOwIuC7Its4~vշ<[[??ys ,6nZ>}̦M---;v,^%FN:~'O<{S';oәӧyfV#᣿=Fo?yOwݺ̆K>K_RN$!g_,sg>E.t=쑯>?^>;~slRƛ [QR9[=T;~TzŽE:zFN`by+=kxd$>)sp~Fa||[{wOdx``ׯ_nÆ gΜ9y3ٳgO8zĉh~ׯ߰qƓQXNkĉFVRey/}w筻h~$3B8~"jғOLywOэ ./~?}h'd53Czh!vpzĴ?GOywfW|9M( M'Hx}Hw??~tGGoSc'N?}m8;{_җt,k 7_gN Ϟ={'O0^~}aݺuxݺu6n 8gf6ZaN9{降Mj!'OsySM0?|G-<^s=~ 5[z|K.ټyh4:uy䑋/kK{{,sٳo~s^7Bwu2/ զMN?|e<FӧO///_zW]uh4:tЁNOSTسgϮ]ܔN>7[~/{ЊՇ~/袋<9!?iiɓ5y }n5a\!,-J޹fe8]fJm]ۇhZls BMd-O/Eͭ/O7Eޔtj"'Mϟ$ۈt~^L5R%: /`5S~/ƴ C`bIrfZ}иqHǯB0n聼Q|=De$MWfx3U\0H̉sl6?/Y'^ǜħ3-8 ҆d4t#3L)j.Ά[%ւgWDլ_M;0--Z:6Z"Fp#%&`65HwB~f5SI{W-F"/V@@ֹVr_fl U5[۬pž|O+O|?Tk5OZjɘvEhK5Uh]8"Τ 6Qg{K&+xu&ff/=LzR*Y/2Zg+T.n0`+$ g.,;Iqf2Gh5xό9Fb\ El3oy_.?Mifj`ؙرo3y<V48 Y gQlٽ{wn߿#;岭tfMm.J!#/[z-Ts衹i3ޅHi"Pa?3ո+ʟM0D#xޢdgg, s$`d a0L2^I 0e?wʨsWq@2jz[q@Mv{O0F][gQeg!;NgPP&;wf}sE5;qr\}Չ!ݻwg߶u[N32^(kEssy姵9d4o>;^1ie_~C`*x/C#'sݻw-SʾjxXngx裚 `Q-x `*z:p wi2$b>4R 2^(NN }Pټ2^($^~/άKqIwם7:^($Qg&QNuo 3UN@}+3OW.H ,Jw`Y͍@+$ж]wrF@ܧ h"@&7dj@EڙdPTt# dHzTU7L?fz`D!u%@NKJy`4́-ߚ9U'(,&FPX5މDSD۔sVƛNYgU,-ޯt`:x׻Fmt"t'NkSғtTmB業7q g5'L -g?0'`8yNK3L9'6f"aOX1K/W3S^cj.~dtJ{i<hV鳚w6fnٷr7 4D{fy:4g<8Xkկھ/xmOu3|؋f 楓y/CUD9IRFo&M%ijW1㍧Uz㤻R:tq\WWӷr-mG@DKm/v&񑧵 1-"g 0o0Mݧ5޴)TxD7UujYk{+ ^㝖ֶWM߃*̪o֬NF;yP\CjK@6+qܵ9qWs{Y|`[mC٩Mx+gY9W[~] M0L2^I 0;sWf0L}:w鮥:BއKWa䇓VƛHw'CIz[fj`~o&Rt ݫJoZg5g._ ~9rzMғǜ;XNH#3ᄏ`-=ɤ3洩2Ct4|2?afHo"I/uӞ7 72ަE/B"f}fof޹N`4fƣӹ/\TNKk;fJm'[EʹיOk<ё`j՜NnN2;<'Yt]9n<KwxC')n ҹ\wZ9H#@u]ZZп9X;x0,~ @x{ּ U` W+RV֯x)2^I 0x&/$`J0N6*w+ xӥ(;JsN($M]TD-n77ɩB:g"(:Kࣘ*h`w&Eiml$>ڤn[dtEoi6{gx,҅oeZ 9rZiEny(GWZL],fj3;EK%Z IDATEb4WK29CSYkRB OyʹMN<~̛*S9jW)OrT799q 1ӗ+7Z5MLD3!wjN^Vdcǎo+'<C;!\Ѩ/m!>@~5B:nO37Te̟*W)^JEne5o,̳$j3fb43ZZ_N0sG ̯^~G3+aWMC|l0wvZx6muLyz "eE8}ӓҸi4s+#Û 2:@?{6si|!T,7jv2H,nZscI2׍:N##?˭U@qq}y04j aj,knZ~4T f2I:wׇo,I/@ܹ*_&x?0L2$Μ0R5iIi<ƙ90[3%ڂʼk;Hs꜓8HzvUu`x)kTp*WGozHTN.b^<`Q<"i|Oz򜎪M&T?9z=Ę31f^~Ҹ]g5Oib柉 73y$X$ ?f Uj&| k^OT^,Ux=*}V[^FЬr5-VBx:^,O'`d ajy7pn!ngg6rtn{|ɥϫ`B{fED7N4KԷZk2~o&RtgXJo:,eauVsf۸-ܦiⷳtD֚o(_w} 7o-3c&ZH @1&F3o,Exi# *CQD\(&iFOߝy\`*x'euɛN;$pz5{`<-x97JԄ hD]9Ii$M߿*1Ztγ.`xC)nÊ'*g9_jN\*VHGF`Qԭ!qmmyUf ,~e VSm\]`+m`-u/$`d a0L%N>tx!k]>u[Kq0$[;g5Ӵ]n!P;q߇h<3Q`d Svuׄ]6;y7.3g6?03 gS:0k,nt֚?/d/!hl`rf|[j_%J9ueH뮉fNGpJRƛSTv3fvoyxQ̍gm 0 \;InIW"6 6mR-2mآ4Y܎3^(sfȍ3S9#L@Ry+g0fv.H:-jRxUw뤻 \s~rWoE/Hx+gZ N47LI-rZ9 *%?YdYo0'_A߂2mNT; [jMX'o"wT Wq'AVb⭙uX#޹ac:zwf&Y~::@Ox{ aK{5@x&/$`d {5аmwCyx&/$`d a0L2^h⼣5G 0-;I w)b w)s9c{: D j31'/,W S'J̋I$55U$M 4H :HAe*@ăj~=$jmC^9cf6 ]rV3dd9i⭂u{j arV3dX8j a0L2^ɝh{>yijͿyuj4oWw; `аÇ; Pnhs{qQhDٺ8زoe! {d-wQU}3Ea0L D@AU2>pOq@Jռ׵4\w˾;oPA%2Ç4˽&/$`<}na 7ܐnDZО?%>fo>ygϞRNf'y/P+M!m'۷o/&*!+MT7Jw)n: n֞E^HJo){bs۷oo5CއTtu+vI콩 X0/C~:QDEC55k͢D3Uu_!Y2)<1'ggLtnu^s# /5##g[yA5d7290H p "f 3㝘ֿisS$fƛ_]7gX#j=zK 0x&/$`d a<{~(K.}^jt7sEoܾ{~~w{)5EX13Fzk4Gٶu[SMUNKwVVvW~Ϟ=oj.f}(v"3|wf]=gvfeJ1wݹ+Zf@B I}wBعsg~ u\ՆO-`џN+ǟagʯ1Ɍ0gki䄑Zw PVb_P };Loem۶n+^njXG"󙜒r9^23: ֑r"g馦-ÜԴFPSD,5 oׅ6`1*to-vNGL5]Ҕ ';Gk[+ܖKy{xY>ZS*^ =(3ݭt . >f5{I1-4GiO՞id1^4yXhǎ7xW^O3y<FwBs&n#M_Y˄ue6h6qi}2')W" / 1-~_iiSev7-jJȋ3_g*sAskVeChtvF'60yn߿#;NT[o-?.A*gӚ`1l[ڻ͞\өr@j^[U tIET މ J bTw'nY2^Cos+`-w'nBSy5׿ZjeL ox`OcΝ/͔e[U{Pwݹnc5fOn~?32fOϋ<^i꽚3TJV>:V_i#x'TZk}h-G˶]Bػm]TGp/3D$X2^i5^~*{EW; qo=G J$ѕ guz{} /bzkN֩6E?m L8^a:(HG=Frf? 3(=>@)j[BD-w⚪p(_YQςlӂ&-$j崙~TYj1@)2~fnmx{f2@&N5'O^͞|૝9"XT%2lx罽]DkW3@oQ 27ٍs RN|Esv73^s%HM жeiͶeݛ3gJwNmnο`M}}g',XkfkMu^!j-xz%{謣[BYmSy7 jmJ\!!Vo6f55g6ۘ]Ǜ9| Ox{wo#nXt7~T3~T3[B3GnjYęm+<މomx֩tX8jE9fq6NDwF^ 5xvY5ђDWل)/nGUf֔xk,5ݻw7ؙZ޲-oĿPG^wםIk}htccǎo+'<W;*(gݷvCaʸU @F{ۭutmx] ϿĐ9v9nxnmm,ޕM>i[?`m붕}+۶n63rL򩂩SNOJ/vYS9ޕt:SN Ӊmݶm]w']&&ּB7g5GC"MpI0@)˳QY|`fbd=G7~MdXwZ&aXXt ^,r\m 潙ig(ٓ[Rh+RSyo:Vw sf߹*~ʾ.@gYXZZ9~d̂a&x7hcyYٷOn-DDB\p`QA8qiL0~dNtZ=2:F3 9-Rf_+QU^.u+t"y/@ۛ; IDATJײU.7{Z]7sm[[Iy3)MM_%㝈qr`:jK;I wݹkN ޽{g:qw"sW֦(Gx6&6y4x?8zTBjSu㢼7ԌW }WL}ZܹsXtMT;䌌[}]zM当\wlֽs~S0ם,]׵&MfG ܆)Gˮ=cm@)nÔoi@+d S),5^I 0x/6f0L2^ɽ&5^I 0W3ä 0x&j`x&/^ /$`ܫaR`d {50Lj arfIa0L ˮ7fQE%|2^H# ,]&7^Ұ(zbj00byi^C ̵=s#kP6y-" u%C5k}=^ԫ`Ji/vkY8WjYk^|5ĺNGҟڴTiP+esՃRj.dFSG[?y.FOM`_+{i0x]jÓn'_H l34=˚P9jh3?ymM/l:=~sFaN?;t#Va'WqPpcl#hǙ+26~H#F]rԖ@i6Sxrz/Hܫ߈NkFtX2,8)OoYrvK }ם)\mԒ^+m,_GfO>h' 9.AUpx[jp?5}ZsS e!Fxh5k pj@TX%7=RG&xM~3UH-gUZvZ$\Yq_o[J!c"m|j*l$eY(FbxMUSa_"gvU(l$59uS:Fv;*Ow:h̥4X|FA h{ƗFǻ5NZeĪm99Kn^{9\νP~;w~_ Gm! &Bl27̩;p:n7Mgl| Jަ!- 0^5opxAmݫy|".E߾Z[<;*qKJFGXB֧Wƿ_VK{'vCFT5ߢXчxef :ubh\K{oɐ_Ύs[xvW9m< ZZ͊l 7K~Gs(F{uYw `{8 = )2kc OkT3[i!U.;BY ~{G͚V^N3dfMӫK~ܒDHr흰PG{h#feK[hjETgܫVL~!K{k$YFDvI[MԁF8֏f=~Ѡj["=@_*,hD 5fY힛oqαG҆Dқpu4a_U*(^jTz;ϟĦV)k}*3ދ.։׷ 7u=<<*J3&W` r4fn|rfU'#o+Uj=Ow (uUW%SxXr5C{?v|4Y6c9k^j(h`ֱK{_"_O&~eV &ڕό RV%8jhR^L5nt[]/2sQdkp5sH~ߢh#_bX2/E^|G2ߥW/mIMشѺS:ox_}~FW߇0mS#~j?2^TݯEKV?oT=\!Lws~H? *^8U:1ߙ @-VTR<";a}of%*(l]Ӭʹ_7{9{Q_OCˀE#R6;aݤyZn?)Hsq5CSi;4ݝv(WЫ n&C|5ufkʩ~\lYVtyb,@{W4LQԁ䂛m6Z*rcMml4٥ԟH]vגG[Dy!]l|Z!k37v_hV "oBe'N+Zi?\}SgMH5!4Qj j4&77=ȴ=9F۷! w6`P$9dQ^l˭U!)v9 OE;@Z*55X2۬QOXܧih̴ ϱ敜T. vT'0-jǘڮL65mftX.q:mgnmne7^ۼnM羢nBmQ*'櫰ïj YkgkCG6[yև:sZhwzRGjH{GZ3fnsWG7G' n/ĘEA/CfkPaܫyPQ˜斬/Qv:ޟ K0h۴]834O7df˳"]7>Gs/_{xvp+PAK僃[$coځT.AY?Mbmg=YCVYm _ԙZG^㙻,9Fv:kn%T_Ӳj;SUh93RMl ŏ'Mzx6!M_mӓ-0/-xV|FkY\zҒ!g,[V9]f#~?=/= #G?5w'~ƴINY!œ6Ȗfmq k[ViFzGr,VKUlOKqm{3upDW\-!Sj,p^r~|.׬W/"ڮ4U"A.ܵ9SvtTl=jB}Xs\9Gɿ_vmYwsf}+Q|4i{WHg)_w'=di欜g0JV!Ij wE{|NXUZJLmt?<;>J8헤7-NO>5w5}ejꗓ9f*A5F3>!64ݞ:;j6̔sEz`ʽ7BXܹkj Meqѵ7;-x@7zuHOXi:ȥ}TZZvY cl,p܈55-|[?4x~U8;1Yhӕ,x!':;x*̂̌4b-,Eޫȷ(?RqOMK zHCD (VCJZ(>8Om\RK1ZPD)lE&BZIM؊brIl۝tǵbxV3i4 xH4yV3i2 @DɳH1^$ M @&/ifd4xHg5&cI @<4 M"^Y/i&j MxH4yV3iک|| w@!wnZvBqbsZ}I @DI @DI @DI @DI @DI @DI @Di6gΞk=C@#R{+ /.EFe*#c8j`/qx1?`/q"^`(fld!B_J @DI @勗Z0ZvwuC`^z1`+`?S?/gfҨ9i@z뻏4xH7'>򁵧VVIrv랚\ޯugQDP,V>}kUO*My6OIEU3mKJ7 O;h8Z>t;hQ粴4 ꎧ{lxƋAoYȢR~i(Ţ̌EX1^`tj+7/]ʶ2DzhHus }j~Sˡqkq^~N\)T+Wcrl|B_׹@C7-[mV$oQ,~oBE "4==m]o9^, HWV,/0PN-CK*SΪֆy>Eڸ+V]e|pDV1ݵ[RK4"]Q+@ȕk%bVs{.4ېq9b~Fj/P,*:[g Jdi4lxw~~ۚS=.'zu1rpWyᄎX.o]˃V"ޑjKV[ ._tfϢhM)^}*Ӫh 8LaTyvKCAc eM8,8]dq\گ&5XVKyk]NWT7ۑ5w,cHKJ6zPz^X}?poVfiܭUխ?~ѣ߾'=eٍ#C^{,N߹?V{N~ϯ;#SZrM* NJM3O=u: 3}V:O ."iӅTxD5ݣ(<xrl]'w?ys=kB߸/~xc,-iKW`>V6D[{/JӁRʺYڦWǻ*QnzcRDԫuY]SY޽S}5 2 +R{-8y֕VsҊ"MfDV 0h a=O0yU̼Xtk_YTs2sr6\XX -IE\'^JDTO!z],2ƻTG7ϖL/K/Xg)f?wgh91 U|Fڃ44.C?F"%ۥ0vxL.VIͶ;Ȼ- U'] eœbRy**+,H߼VN [n$Y^ŭV)U/Đ*>Ym[?*${$Mku#B`Zd7t44h*n[bbxjnAuL]i+.JMQj[7Z @RRjP+n.,*7Yn>j͚R5.p\X#uT7}p'/ͽNz>-=}+ӟuхjc|cx*? -F y&Fk՟+^GvM׉v] =kU\-i]1R!vuyb8Ǎt;XFW[EE5jQ^=z>㳚Uju]wh3/̰Z婵ŠYXG6\Z/.|.'ù5]Dҩ4huo_FǏ=K/}ѓYݸz1>t l O;'?0Ϝ?ifAqt wW+HpXNM&?"9{ǟvZ*Ƣ8IDAT/|ެfHEIPdV30>)k6&ǧy(iիtV+fSfAI(F0-SFoT6z4f$ M"^$eGGƐxH4xHS4} =z6 =z6 = z6cI @DI @vzȱٲg!Н|M *ݘVڥ ʦ zgkMFZ٪F #9~Źk^+[Ѷ|5ljQe z6:JVcV,!H^Hg]*CPg1zc 6=](/3wO)X@brtGu7)z6Z4ܸFyV3ҦEb zl!R#MT(>:'Sh,)},_uhlQe˯o8z\xhhӵ^rZrthݴR>\FU6=](l5Uq釚F1u֕V*5֙_Jo\CS+}I @DI @DI @J~sU~?Xc?$qb_v',4xHSɬ96[~ʋmdYfJs$5x9Y~Ŝ UMf5|H_-3s@u;!g?~nfArd!\LN>G/$.at.u/?Bu߁sŮn7{NÇ}q23[ovkB_*n?)>bjC< ? 1+ޜL۷k //|'Mc_d!L$dЁBvB&ow,L&,d!܋izlqvχ:x`CrN$;0 Y6,OBھg.Dβ0w=m^ ھ׽ڻEj'pve!LmB8$MI;[o/w;p7bm6f܍xwapfsSs7lM._ہvv`!ݸuÆ wB%Щ8FeWIENDB`transcriber-1.5.1.1/doc/img/inter_find.gif0000644000175000017500000000706507510315720016170 0ustar rtrtGIF87a0 @X@X%@0DLz @|)@PD\z @_@x,af@̯H &@Ai@@>% @0&@DAz @ %>%@@蠴LDDzz @@1@`,AL?DP%@؀L #.pDz @elp,, $Dz0)R@t$paf@,Dz @ 0n)@ 8_@,0H*\ȰÇ#JHŋȱǏ CI`\ɲ˗0cʜI͛8sɳϟ@O JѣH*]ДNJJիXjʵׯ`ÊKٱPDmɷpʅa݅wn\r-Ԛ{ LaqھQl|˘eR,C# 0@K3<5k}Ɩ}@1q <~\4Kԩm}?+ge+y6xTȉ#t_.`K*ǯ=Ǿ6}yyǝZɍVyhSz_-W7kmh_rH u5`v-2HYi"zɧZh|=c+W7fnT`O#xFIDaC9=#FffɤRN9dV>aɥ',#_#N.i]-=٘dQ.Hq+w'I膁cz᧞v)1 ƙe%?ٟ>Z6NتrWkjJGmPP-&V1 9ZKnO"h|E^ٹJ/O:og,lT]1U",Wl_q v ,$l(,ˮm|@4l8<@-DmH'-42+PG-TWmuL Ww`-vYWlp-tmx|]s2r6`'7G.WnMNx标.褗nlN3 yԅ׎4kpێtj.ιkNЃm{|w_Woc{~=__t }ݝfG90\@i|̠ (:m`BUwԠ UAEEy% sCD w9_ȷ!F!{C:1z> )ZqyQlx..bHׁN]hFQυ#`F:xcrg=pz IB\aF:򑐌'E6Za#1NNMq(Gy4P*L%VҔ+a)Z%'q <.EKyLv9T3gY"qH` =xMnvlh 7L'Fx*QLYClS9WNvSI\"ywӟ̦=9|lͅVT4?5Pf2kĂ͛%_=hBhCJ,N8MsS@)+JHEQԯ-P%PJծ=XMUUm`N} MUCkX7֎I4?3Y-4թS9jS䓠6Me)Jּt-,<#RYֆh'Ntl W-Am̀.*s YRulVԤL,P*;;iu+x=/Uӫ^L}/|*j[;BQ,aY}=ny\R]-nRzQSǯ~<4QScR+mYO6$m'{?s|xP@WŅxuHb!6Z׀oMFQWI[(gȃՅp&q'zbj6.WMq7(t(eXo[e7|aTf$|fhmKs6|3GH|reHNF<4}ȋCI86d&'5 ؋h(8{7<8sHz(sxW8'#Ekp86ZxV"ESNhux3478wTw 錦gt:i7Tyl㴑y2"9$93(*,9.t/0%2/16y81<ٓ>@B9DYFyX;transcriber-1.5.1.1/doc/img/foot_motif.gif0000644000175000017500000000012707510315720016204 0ustar rtrtGIF89aooo!,(ἜfNvk)"@)@"-kk$RrP;transcriber-1.5.1.1/doc/img/inter_color.gif0000644000175000017500000001273207510315720016363 0ustar rtrtGIF87aK( @X@XXXXpxXthXhxx|x, TPxȐL@c/img/inter_coalfor@.gif'H?% @i@@Dz ݧ 0,Dz H%L%@@ȰLXDD%zz @@@ذ1@`,Dz LDz @x,$%@L Dz @#,Dz @#T%@Dz @ #@@K(T%#@@POver>_wXr i@tXe ex_i2st@i`ng f_ile@ ,K( H*\ȰÇ#JHŋ3 Ǐ CI$ Xɲ˗0cʜI͛8sɳϟ@ ]RУH*]ʴӧ?իXjʵׯ`ÊKٳhӪM;U*Q)MʝKݻ 6H4[| L4 ŏKLek2Xϟaj|ht> 5aץKgNܖs`С[&k5Nxo˳gn6n,)\ꕬN<{j_o<y]w`Ka7)(! {Xlǟ; ^x"Ta08!|'R>}4Z#∓6B|n`DZ`ZȒBn%U#nAf5(eIFy.iF#yn,Ǜ3$qNk)'Zƽh[6s+t &EX1 bJieRza'nƺTT` h)PlRDka.TzVv)ku+mXzUkVTQi,lKoPG,Wlgw ,$ ,0,'a3<@mH'}ЖPG-B̴mNO\w Xdmv٧]j3W}t]tl6 8ɂ[{=vԃ>Ǔ\9+xލ;SKNGnÅ^8驗^KçgnΛ9wҰ~^{17-۞?o.Co>ҷM=__|_<~%D=-y{ H&{5aY3U(V|L \H4nˡA(C@XvH6-HLb.;%:A !HU".z` H2hL6pF%x̣> D&H4$"YCE2&t$$IJZ򒕜&NzFĚ&KRo$* J2dL^Y2NBeXCΐ ,7L2e+W3bVHDŽ9̳I\59d&V#6˖eS|;Ǩ)˹t;3vLo*G'y\:@S ǧrÜ'f@ϠUA/Tvӛg81/x'}?O2ԠhJajчF4[)jR4LM\IPᏘ ?ӖiD)UNq1Ҩ'XU'<^~Q(BkVc$DjM*ū_ 2~s,SVUrc';;ƵhؙehX63.yTqbcBUZlwYp;SmHY֌9kUZm+A&Mhd116m.wcr[►.]"+_۱ t'y׫޲Is/| 4;"E)S7qalj>!ؕ,3Ȍ2*'cKG(nU:11TWo$=2`J44=T撵Y:2,ZU fZ>Dӵ,3 .koߡ||7qL̔>s6-gԳsn=j䉵Y*2-[l}~1gCXO`WKR4ue^M>{KVJ,u<]{'瘎}vjzŇz]u5c}W۵y{ཪvh'?XKy$՝<U΋򝽼;IڙvNX{<-Xʒf96rC&hGZcG7Mu_eͿ{}ߊu/^ˋpF+ɷ~9]kc~)'pVp7H]n؁fo"8$X&xxEp*J,؂08I28J wI*:< 8_7K9؃=?xfЄN؄ `8^ G_LNGs}2L]3f1YSb1gR3V5~sz#Z膡G|Gc6}%wE}Zgu u#CekWguO'z~y3g;sWOGwgt{3H{hz1RpHZ%wxHGuNEK8~UW{1}UP`&Řivrw5g1؆[ħ}xM7Y(}h{J8%vs׈O̸|lH]=(~ZӎX^s?#ť>CŤ ^"a:*"wSʸ^4Y3\y:IH<ٓZ8DYFyb'LٔN0 REQY;yXZJAI!&b9d)6iAUl9g]'_btYt9n^qy_siuosj u5AwBő ØSQT2{'tzr {[_ƈ׍vYgUHv(2}>_WawwP91iiH9XHy(xwg|U(ɜ1yI+Www%|w7fh\dww$swYhYƊiyhW92)]\8}ϧɏ؊yx蠗1T \ 3y>2z]i'y;/3):U5ia6^b>* *&@z4JDLڤAPCBVzXO٥^`SDR:4TfBh$bUr/ !vEzZp|a~:1JGsN i#jJ*1ԢY|991V |SyبʙvY7DzFx乎yGFuIV踟ٟjhz*2j5ӊ?zWkz*Dh?شuiՠyݚ1j4'z|ʡ5Jĩ5%dB4꺑ߚA13 7銪:VskZE ^QFJ(fTlD/۳@;AB;SZJLE\ PRKonjgZVXm*\{HE]3+6/ fk;nniKkBm o+6ADB|;jh8mwEHUtSzxe鷵Q窐z YW J;͙۪sǺ{荖0xqxxhz OFiKq'}[}ܨ{RS7z٫KpV ț}:y6uK7[gsr{,^K% jL7\gs\6H۴ ܁O;$\&G*5,[0<52Cp87|@<|/.„tJ !ƲS L_HJwR\[ZV\X~,ſ{=$#V\Ơ:jh 92rtliy,iUzZ1|N ׬T[g{LWzڊ0Lɜfj$c<ڼzɵ ʰ#tX٪P'Hշʅdlˊy#͙SΉ_2:,3\6YllivM 6dÐ =rۡ]ܷMΝ%|ۨ_2t4}3н2ۡ4}aD 2mmp=`-P=<֔J` < KKkGFMG DU(n޿"t..30}='}8p0x>@BCRF~HLE!/PR>T^V~XZ;transcriber-1.5.1.1/doc/img/inter_menu1.gif0000644000175000017500000000670407510315720016274 0ustar rtrtGIF87a@@%@0DLz @|)@PD\z @_@x,af@ͯH &@Si@@P% @0&@DSz @ %P%@@蠴LDDzz @@1@`,SLQDP%@؀L $.pDz @elp,, $Dz)R@t$paf@,Dz @ n)@ 8_@, H*\ȰÇ#JHŋ3jȱ#CI M\ɲF( I͛8sɳϟ@ JL0S 4ʴӧPJ 4XjʵiUl@s,Vf{Zlδk  ׭XBʬIwf\h+wA OW*n<9p[}k|.Y˞1oVqhˤvϙq yŚW^4lw1{va[hU~;hҽ_~\wsw~YvN_8vӬ6es3hkZ'tE_pXZy-G݂M&܀wBgUQ"y%2:!^}(؃sM\e{5j_5V7}^b\:c`>ea ԗfijyp9f}qilީe҇ԟ*蠄j衈&袌6裐bVj饘fV 駠*ꨤjꩨꪬij뭸뫳+쭽k&k6z,:&nlxNiD*Ѳ,+noKK׼apĩX휰iXٍ>^al2 Mc"ۮc5eA)ff\/Xk~s(,η3}=73+AІpJF;ѐ]ZҘΈ;!"Ӽ4#yQsUmhVՀegZWc݊vnpYGQ ?S%*:9s6kEn{bJϱd#6_4'ZXF^y_ۇv}3MXt]JfߚGˑ]qZs 3y+F{šYQճ>fK-_^ױcu_T>Wwoͪe/OjNc[y>:l1ԧc ۸ss"3Bb^njϟF9=ۼQo}htB%n:VmG@eyc:gVZ駤S6flhx}ǨL>Zg[YB)b Rj)"z`5颂x:ک]f$[g *@F +/n@;Uk$al' 7jA@Xfggwg$l(,0,4l8<@,f<`H'L7PG-TWmXg\w`-6 mXclp-oMt|߀nf PYh 7oML xgw褗n邃ހ訷N5_.صݮM;H {M?bG?4j}&;7ݿw}3 n@,/i `2=o|HSq~F U z# (CЄ#!mXⰆ0,!s(␈bg PPLB)F< x&1~@b8( ^-h1aB7bèhXD+*P#"DF$d!XGN Cr|> $=I>Qd' II<6 tg$0I r2YDJ#2?*}?0JM')IЙL3)).$[X5r&4w9QL4w(r&qیf̈FZd;+)O!Ф?Wn'9~=W'S&KFF%=r(0)Rx-IBr˞*7l K8޴" YM/Z4NbPTcVM,jԣt j:KәrP:W :m)[Nvkڊ1t\WsC@_:܎be Zeފz+eAKҚ6r]iWMulgK۬vͭnwK6 pKMr:ЍtKZNFz xKnly^Ŵvq Um9 z o ~ ϰfۄ-s )/&ۆQŶTsnNuApL࣡l^bfEk/CFU =!1: ,``2wwpeZ RSL'OQy;^.2 Y,[e^Ϻx4 :GDg"9FӍS3Ci=Ҭ44m_YC*Wwk~3Mj́ Nf-q2e-]vlg7,[|mW{y=`m5n7܀]$F6_טKlvҤ㮕;=f_n;)+|ozawo/ܪ$5H1V9اLn5؄jթQZQ3c]zNOwv|jKYqVCh;3?5I筒@It~}5ӗss+ u&[֟qքhnOUu u;87 gY{m GyxT4wjU= {vVK╜p&uN2X ox;ȉgXx<᧊Rs07ooVQh~`،Έ`Ҷf6MQ-I1p:hp:1Fh~jRB&e'YȍtavPR(NNRX8|9hPvUU@dt{tK T663pԑAc9k{ Ɇhx**y*6X6$>\P29Wy,i4-ɒ-&&JvyDEiЇ6+SIAB4Oxu4(#)?Y=IC ?EbɄa >KfghyR 9m}ĕ\yxy"IyFuQ;transcriber-1.5.1.1/doc/img/inter_impspk.gif0000644000175000017500000001236707510315720016554 0ustar rtrtGIF87am @X@Xptp%@0DLz @|)@PD\z @_@x,af@ίH &@@i@@=% @0&@D@z @ %=%@@蠴LDDzz @@1@`,@L>DP%@؀L %.pDz @elp,, $Dzm)R@t$paf@,Dz @ mn)@ 8_@,mH*\ȰÇ#JHŋ3jl`Ǐ CIɓ t ˗0cʜI͛8sɳϟ@ JhM*]ʴӧPJJ)K*jʵׯ`ÊKٳhӪ]˶۷p^rC(˷_xvU*^̸M#[ᛒ!k̹ȗm&kYӧe"( †:۵mESNuꗫY߾]iLJ+}7rγc^;{ۿ{.͟^'ѕ3K^=4מ|'_/^ g`=_}Ua0_z G0hakɄoͭ!/w=8x"yɭ#d14#tK>!*fy"M $_VX0=K']9tze@ 'Uhpӵ_řdF֩^rz*蚤%V(mbUꨨUx:v*Qƚ Bj޺kZfq%6Fe+fv۬+k覫+֛.,l' 7GoJlgwFcl(U~$[4l8<@-DmH'Cr13TWmXgSh+>{A|oC`}'n} H?m`?z`AyS78t2[ GBЀ'D!gXBU}3!u=ІBW5.^<Rz+-&(B,~4`6G3&k[":t`cڊG[XGᱏgAma4V]Lwwvn˔ٽkJrNvMzηm`7[7)N<;ܡ\ ML~./O !ƽ\Rt'W3r䍜9hMⲣ[IҬsXސ~Pǹ( =idz^-Wzɇ<$V\yӺ#u YOV^҉(j_{n<pfw^88y+^1σ:vhԹHىy$k }WdǢyn>⻸Er\=[I;W~OJ[gů"}FAp>am]MNlGW8 s3Z6siHBe>F7z5s1L=GxACxu(s\u:tx&sw]?{'pcWF*>"Hsv8z(eyꣃ'XxSJȃ=v&dx.(VM焫SӅCĄr;Ep'F'z'EGWrwsUDy^9kzWwvt*U(D[7'}vFHX98=/dtgXJJo{K8hw3Sm؋ngvRM_#6(Lֆl4ʸNԌxmxzbcUEQg([;eBf\dRdڨ]v[qrXWUEugfJvllViXEfٵeRhth\\uchŋf\F[iL5gOIXa1 v&$yYnOCjMvjgIi[@fSHI(cIfsvkFk8iYjΥ_7y%޶lȏakkid9PnmH7^}xAo~9Yo|ɊM :9*JrX{xGX=Arn3VL cq'GQHp9Gc8I5zmH<7WA\'y=sGI;~E8tVg/s"?y }#|H+'Hi2d@iDž=#7F;Dٞqv;̃rr70xt>I({ǝʃAb_MqÛ9Gz;wng=h砗8vXgh=7LJBQB ]4~£:+YLj9ޥM?YؤTZ9OB)؊إ^`XpIjŦj|H$r:tZv. .y|ڧ~41"UZdIIH:Cz*=j9 E:9:/:/?ʉ.}.?}8p/j:z8yڬyIʬj$WJúzڭ:0Dq뺟 í# TD{y whg<ׯQ818Dگۀr #䗜y Ǟ8BWkdukX Wˮ'*gXSt1Gw؛믤$#gF1kCۇ3'H?{7kk:vj?&ZdK^XKQ{wۧ .F\UȲ8vD+)0>z(KH/>K%El+p*6E{M cKewNs (fh[+s; չ뇔n[Ż+{~Ի{.۱;ohٛ-뽻t7+ 0׫GH{b:~Kr 2i ˹j FL<< \BL ,?|c̩Z\S&|4()\,50<44S&|8„>6B2A 'e0 +{ޥau_%m۰9B~6W+[FZb:߳Zq Ԇ˛hV)mQeV"TJUoTjol' 7G,Wlq_w _q$l(w֏o~埯>E /oKXHL`s&H Z̠7zDGH" WA:yXH-Dw9|!d"p%?T*ZRd&+0H$6a[tbYqp1l/Q\XA=>w$"HQ\d QeRR 4)9@򕰌,gIZs^ 0m˦K2էe4ٽiR3zּq&8Q'qcӞ&5;VuR̞asy2opvcYSQ.j0(Pe SgVWm&솗wQ{^ޚ`$z 궽{ ^wįr9?.Ҿp)Q@+'L W8 7{x3+bo<ÚڻǾ9KŐG31f*RSXc k WeGJSK-v+e-U񎟜e-wY ;(E֩l4dq-CllFqDm^.AІ&82e~t"-Qҙ[4vi}D4>MK#wjMWM:cu9XLs5lm3\USu|hN4#6ZE}je=F޻m2[lU[ǑN+6Hr֜vT_Ӄ{۳ґ&3Moc:5.A98ژvǐ=3Jc8h'Mw8S8[<2N#9L9#m߹]oѭ󄻼AC9<HOX';; ԧN"˺ַ{`ث;transcriber-1.5.1.1/doc/img/traduction.png0000644000175000017500000012552610137467237016257 0ustar rtrtPNG  IHDRH IDATxyW}]=h[2;l1cp5L!. \u HE"G xpy iyyp ΋e.|Lc@ ja%[jI-t.TvSU,/{jpwvU&/`pCBbEGff/9펿KNixK8r:߽NB/x%  :@ݾ}o} !S.um}gBnCEBq8:~ʡN9=/}K-[,v333wuW?rKD"Bɽ]ru@Q7]!F"vEu@oBlҥ#G~/s._G`߁^.^ كNLL;vvSa)jժSO=DQ?ݍ|vt+L~E/zᇟ~ˮ~__M/;{Q$$8qe@EΜGW!zƋߝ~o~_z_<pm&/{ˇBMgg !I?,^oxүW !7e6ӜTLSc]E+'I.v> ŏ/}{'> ^O<199dɒC:g<|ֲeffMM=/~_~9g'X|SWֳIEBGgN ݝtQX*ftӾG244f͚^yw:x7CSNv\otɣNޏ|+7 gk_J]>g2ib+o !W(DW,vO7C8<5gq~;~>d<|}?88x({Zj:롇ZdʕKO^tYISӖ!#3"@c죗\rɒ%Kg?}α[*ĉ٦f=ԉR_'شɋX:gz4TU5|# ,f0]dӖo$&MHq6k3=Bћ^f.k`2c£ݍ_ߔYqtv+.Ÿ? /169 8zl7vOWtjz6Kl,"gRdXjKW#VZf:q+-]{.ޓ$W:' 1#.:+W.Po鲁ٹe˖=z4=E̱cǎM9|tV|SOz|]_g͒x3~_["Bϧ_ W.Ljx-?~|˿?/[st+UJ=%#ɤ$엌<:53/ַ&>B ]z[$3Ki+teh ]_so(Ur8xR25i/~c:OJtOJ}3& %+~5O>z."{=408׿dɒ鹹F?~|zjjQ  .Ytt%I%ozE(<|_<[oDBcwNRM.x;/~˭~qU/~˭R&5HW.[SOnOvUz={,9w;v8.rSo%K <65up~~~vvvzzF?v,]*3LMM*D1u|Vtlf$i8s3'Yz䫞}';4p38p?m'R>ZJ}Kެ*͙y%o~gvnW(:>]ѝ_t㳳JO*B|3?"w%SZo=j>>=''_,ffwn{ֳ߰`Xg_z|͚졟.XJDG^??JW_zor B6nQ[*']C:)H/zeIxo_xGg_tlq r˜“;yOԜC/'mkZ37O<8a_ϛ'E j(ꛟUGL}Koq%ouu8޽{O?N; /<󧦦}}}+V뛞>xC,c5$ 'WU'?y_C:8~}>bŊ˗ѣG;vǏ7$~׉*M>?v:_7W8ajj$晌=095Ro}[|+{ vg-|+"!e[@I~*ċ_^GU?щBe$DV4KEL!3q""!t͵;B>=E@aquȀb+Qro/7 Dt* f@W5G]E<"BHD mrx{-.B(B8ѹkվ{|e~ì M#1.j ֣W\'kPQ-*HsR!D__ Uۮߥ ںekOz>(v.R\8*}+ضm[pC7mڤ}Hq˳c7i 6HhlGGG]R9cZd7K^hVxƻc^WB)Oڴin^BIz]K}ym+oJ)PP&6-ftoӤ=_'q[۲`&Cv~JI}kٻ"FU㡉_6#rߢ,Wa@sۯ^*'W~5}R*RAP2\ӣBjV[bj\|/oJ kIww,;xIEu}-k;B-*q2@_ .r=*a$`$5Qޭ\8m7o޼~y5Ww]!DE۶mBlܸ^^-I1+ ?ӯ-E&%YۜBo݃dJR̻,h x[a.j73uNiv Շ Վ-o?@ea_j)vko3mTh &s)gIf޽!|fn+q-h͌-EλWp L6l h8uy$U"7.u։ !;f8[Z(V Ph$ ŬԌ^K XHw(CȔV|oqɢʎbJ}Psx#pʎb`_PxD h'2^@;ډNdv񦍍%GFF?䕦Vf;Jyu+t @ZWJww$҈Х<$M])U`]Ho*744T +044Ԡ:#S٣Tf6WM!yJUBW5ku.`N::" y7d)+MrY^NSFocqu> 4EC v){dޝM+?,T6I7j]x΂&'CIb_hzNT RJS 4bdCDj^ά-hj{SÖ0kS#7#uIMhJ}oG}߾P;`n F#}زE nbډ37KJުb㡥9gJ%xdl:i_z'f9STO,]>&BIڄr:S<=[OM=9D#xˉP{ߑ:DS¼mK CGmQm7lmodۦS"[J_'V ?kI jtOzKMLsfJ@K7-) { vt9iڥwz4Wv]FoX.ei˲Ei)&xCYz>3.5 &6-.7%ަ1He]z;(a.S IDATa_U,F^fD_aOi& @+?ʔIw 9q)kt5Xz=p5ak4O:="TW"FJ\fO7P!tשjk(޽A{ɺQe'8-jz͛ׯ_;n+h۶mB7Kc]uVu\c6MSK͕$Ɣ[KOzҨ"{_LƙhUYX!S"6,k)eg^DjY+Z y7'}p0nnS8~{."<2 ~% =xZF5a!DEw !6m^|횵B=q٭[NLL!qM7P4 쫚;Da0@pfzVs]t"g@C+㍙r+Nt-^Eu "YLy-!MW>r[qsx88jxD h'2^@;ډNdv{+O[Y^1yh!ȕ !Y[RjxCUlC|cz0xMw:I/|j\uť;7߹3y?~XIfA:s5]R ƒ+.KosgtVW zIECǦdS 694BuHqrby/Ng$71ĕ@ J'sPax' R}Pj )>*VQfyxxٯN\ M,3C07v_ I[P9ҳMmPj'2ɬӽ64BjfPdyCCoܓ,;n a循yu*#7ƻj[*)ʑN,/@9SAh}oCw^!M㏗Zo~/z`r^G)ux?O !2 [sIf֜,KZaw/]yϺL*(ي}/_'2'8Zmf*:3M[wk?hx7`kOj' gyp䝽I3$}s_} uKO) pFz4gƛNwKM ^ k0$Խ?뉄hBOҦ%i:KzթV*MRamIIR[Iϵ}?!ʮz{hU%KU4N'WDʵD|O~ғ4Ւj'ߦ6aȢf3fKdF"{IJeՌ4&R.hA[mU_'rpe|R;Bۄ{)msIH $ S$갰42lo+$aUG2I\הf*oYWגoj/f6iM;+s F[V-VaERDű-2 4Q_'\6i2r5h:vΜeMM[-HRj3yS&9o%Eh"1U'WL^uPydɪPU`y0T[mk;M@ࣾi.W/G͜*=JM{;\ʜ'W2sAS2L?P*W>Vb `Y5Tf5 :e5ɸ2'%OM~NӭkQ+TlZ+9.l''rŐ~ʱ:gbct7$3eS4<|孹xqQS?apX%Zd<\\Mw_v+2Qac)?Z7아ի^ GdSm.ju8QK[jxTŗ =N}a/B5ࡓxI?s}~YݞxG?VAk9xlz`ayotWZ~i-:1U_*nĖ< r/Za޶L1#4m ǵ^Я]w^1H25s*F";n޻}Ԃ166>Qdv( ]`vsa^#$]*sU:V|'*B˧gr&IgNu9R0I}ywsOnC!026P]x eBIzx`U#Zͮ1cqɶZ0NP0XOlZ?g2y'EL8P>^jPs}ݒ(&WMh @8,cbo@0l5  g5Psdv"/-^m (cIۭ^-i4zf v:2Wχ* N[q*We=w"I/j{ɏ\ƎҿNRdmAK[Ԛ.KI.l}?Y( \7‛}󶕹abԸrhr2egl՗k+z5xX=:A:M)pgʙq65f{jƯfj˯7^e.Nz^9J" öaoȲa[C˪>Tv܋HK]} [Z4}J4H2ޘt⫞^b /^_=H=jd|MT/;;66N86@xwݕ V(1eBIz]K}yHǛRT3MڑBAfhAyJA TUt7f0w:Qr144SI[K@uu"]mM:QXH:–KO5يKj-ET$S[l .ݺvLfs^:kDRؖmVc2^\S*NkUj9œ#fĩ#vjgZG&+%3N$0m=ˤMޜE_'V?=f]R %ԅL/cb9Oy nJE{3gcό7ItnuA7MD Q<]J57ׇ*SZ[$ݵUd3j6m ctY&j(Udҽ4y:Qߠtc^4sF IɭJIL&]D~]7bv~ɷ{p<5"қT"K˨pєx E\U^~i"meyFR|cأrdoȻ9M=ފoE5fz\Ȕhsh͜T%^ze[uU~6bPNdv"/xD hzoXzdd$3I^ijűhƻc^WB)O4P6ZP+;A^iDWR_umhhM])U``Y<3t-T8CCC: Dj"m\e)SU@)o[7~'b ]լMwKn/+,n]r5oۜjd._uo/aWm+T\;pQ_'n& } fM 7h\13K,RAK?$ME]ڲiߣBkum^-)MזZT_Cm{޾ȦڤJ<׻7L7*ח 7"#(a%iL[d8Wp?!G(')UreI!V(4gB ^ChY)jIॅM7{,}2P"K vaYdaR.J  UGMRKJY_vTE[yt¤='T,aОh+yhϤ+^.(R .[j2¨l}@Ya|N`m3M]m['y]nЭ&ޚ鮎ԭ2||-\ Fl6a{#xI5Y_n eh'W"鮝`Aozz;*,>nc̱NTNm-ʱK"49pEw¥!{l,k^XK *PWRxDE4<,޼y`\vQm۶MqF{yixߪN>ƛl,yS{k4IX%teѶ.m{8'M"mq2'dZCE2uK.2צ=<ۡi,2#nsyyv^còB>.}|ޝ(/ӡfÆ B(vBlڴɽ5k{[lBܽ㞛nh\}j.eTzmU;)Rj[mw< Q_'2sMwjƙlJm].HGn;[U'PfB!/xD h'2^@;);JJD(ofm:oYӭ[.^vEw[|-ڻN [yҍj'\E5t4T(&ޱ1)JI͂']0,M-kOKYv5)BaMM4e閮fޤjGpC RnjׅH6Ym.C IDAT%l{j +;֖k~K$ֽ;VۄK)KK&3 @{&F}ֽNKYmi3We3\iVMAbM;k^gFFFQ̪J1PEdgc&jTUu-zشbZJ X3dm|-AmzC#@0Զd2m?7lF`ic=ѐ M# aXN4M X>=8vxdc/-B[tRGu> ExL>2(ԏ] C +;YmS[na?|T!jx2V^{Rڣ4b5ׇ=*/7H}|{e?IɽfeՈ-Zu82>Q Sn_'|ݼZI5WCL߷GE,#q}ك/:Q.mlRa\Z)R^vc2A۰)qձX_RL0V|HY_A*ᶍvhhyhAaYݼ>Њ7o޼~y5Ww]!DE۶mBlܸR8xKɏ6dcR'. bP+4P}K0aC{+.iCiRfߺȻٸT-mHz!r(Ma3h4屧XJe& -J*h;K$[ȹ,[T;8HbuW'ٛ0핖,ͅݢ#Vo6.a$2\EeQRUv M7.A߰=*6 R˺mNBLw[KsNB 6!(={ttTi&k׬BnݲubbBq{nBP. >p >LlhΩTMQj[UhoΖ8@sn= + z&坳5]A B 0|V35G h'2^@;ډNx?5YO/`q&N'Z!Rқ;yGPYp{vx$shhHJ`2}dZrt*+R_#̬P%Br2+MR;[^"7КrԼE 0iƫeJaX u`x+[.@I*_%.dH~e U7?%&3[Tӓ7 ͺ[yY=Bm㩒y,m9. ]Y2^{fٯZ)1v)"m92v"2^@;ډNdv"/xD h^`466N86@xwݕ V(1eBIz]K}yHǛRT3MڑBAfhA *Wmv'Ę+V5Je+fm؂Uu:NSV%*'kWI\ƶj'~-oO #ER}dD ;u`W_' +r]RHjzDӱaY6)kMFB Dk=x[d:-u Upj ڭETv.pZ 5om6h;Ma$hj6EvsPDc2^\ӹ:)~'9ѾopP~r\I5EfУiT=a5YKmUi}-rNu,m `6fD0y2w==%eaZd{~ko-{l6~GQusœKvRԊgƛ$tOܠ&^Yi|̏:] /"g6WRCoQu荊UvܨKQ}O^xVr)-yZL&׶%~@Cpދϵ\*l5]c-DLaG9R|K+ɜוD͛ׯ_;n+h۶mB7Kc]u6It7=xs~֬d4:Jr[q]κZU,AWV:[V3uF h'2^@;ډNdv"S~7mll,y=22$4W4ݱwWV+XĔ^ eR$Ft.U oJ)P=1t[Ho u:u/ mlb -k#)o (Ra#o(;Ut7fݞ\\t\gr*zL5Vbh\e:'nfue; Ѿ X D DxŦpn \DAhA;W˱\ί,1H_K"ߥ{7ru}\.*FfRI02[ RrpL[\jkѴbWǢًz)m56"ݫ2qòߞ"vXˑ-8*(Oc2^J13Ӟ.2_ڙNI"uVWx}=3֋7<:ʾ_HLzå$xSZN6^@i,[4s,;`dea'8%') ǍfS{M}[dSlˑ-8o:`u n-'e:~(~Y^m¡˺/{,%2ˏGmh,w/~,=$yfIMw<:v75s+` N Yˍ^)]Zrxc']=/ &xإw[y~d[*SZ[y?h/},Fy㽡 އmٛvı}5^ i"[o|` z&>h9!]jپ .G:Fmã26\M-fݖ}wλFtTϏV͛ׯ_;n+h۶mB7Kc]uVu\c7]VkF*+^ސh-¼[}-[:.Bz%k>5qAf˖7MmVef :7]Ss&mE{%"hKe~ }* SL 8Q| _(@lذAEݣBM6_fb|x\v떭BwsӍ7x ~UsSjimZ5& @5JxVCd@li96Q^o̔zp|O}]Pg(-P>r1",fjxD h'2^@;ډNdv񦍍%GFF?䕦Vf;Jyu+t @ZWJww$҈Х<$M])U`]Ho`hhhhhQZz@IVwe_n`RYt75t-i_ X[:N3vJ{Q}9IHAW{.7Da%C(NghhHЎQ^37M-a)[F{wu'^Ig ؠ n@  &1a؛MtZ(w_ +Yȍғ& 1q;ےaaM`~5k7ޑy일xr>sꜪS~QN}뜪gos~7e _F..GKn]az^-0 y7>LsPX;' <ۺ"?LꛐgL g,uռCըkô5PQ"k8C՘uϩaK5ܴ ή\rڵ˗/?3UU=UU=S1nwt'6")GG&5Yã5U޺V#kVGW9>fi.ehSv3VchkT5"MspCg8jwf81FM{ǫ:;;~֭[UU]z5>G/UUu!7Ҁ φ=5-x%p ΁H_'i翴N; h=ne))NRV5[Wjm"5RO"^I >x'/$`=ަ۷o?Ӈ?vPO}33lf7^h'Iֈnvxpv`XĈΪTIx≵0Y"f52޽{С[o^d%:Q@CDI46ݻW9ans*^&&#Sf£eR185x :ی|biŊBn5<,]&԰3PQ7f-(oݝدl{*}ZYTbL2Pos~7TvGkcRaӚVB䨼] 7W sݰB{\ӄ"&L+kf #sN6-`ĿN5ܝ0{pz =hO6z26&m=(nmo Z޲>Z/]@YG3Col/o"}sU6grUICV)9*i.02iQk,1~wɇxطh(z <dRV͸(`ejTD쓈}O"^I >xا|8_=v^ Tը?z)S=co]eVs2/</='W֮c}OSf5\'[Gfr4adΔJO?7^.-H+YUN|A+IxPZ؂sMX9fY?lɱӡQkU:2lK1@kzɡ7jL\= -Z sM !]RXt=ޣa80<-3lQӼGZ.ȸ桲7W%\{83{F1~ (P:G.3Z>'z zش@fjIݡw 櫌Z|,w3n[nݩC{tvȵڨ:z&Y i2]rڵk/_kg...:;;{竪zꩧYMCf2"'$WUuvvv[zj|K^Cڛ7n>x𠪪o^~_'Llp6DĻCՄƑϯ6Iq[M] Z9kYۢ`sJx+EUU5fI >x'/$`Dӈ_'G>;[o]S7xLؓqv09UƎc~+kWw`DS?yӟ\2m ՜)mo7^![.LysUS3&|㠎Eo[>L.wnѭf@Ac7|k3bQ{&Na7asaQ.F3|gbGs>Ԫo|B% .(ö  ǭ؆y+廚ƴC-Jů% E*^G7Ji[slBA95&UcgCַ)5kVso 04i}sU]oy.?$l}ʳu,+kVGL+τԛPYְնCۨw me^j굾 l士<{[}{SoYw2PpC՘)1{e@Y1#+?*2p[ϡ{zM0|☼;L8n:T|n>TaP{B=z:WV7n2KToq1ykħjXp:V^i,@ l士<ִMy4̬P ^U6@05›rFy]n%ca n`մuC Wc'9 NC5sTOviǍɇʡ g8ʹCJ`'r@<($3^khT3ˍ_rTYFdY.Ao)urNJ{O)7 IV'rjt?d퇁{/c3@qc*|+i>F7CҞ'lCQzCJ*9.afEw~܏7w YAaԉ*Iqr/kUҽp6$,Nұ(xc \.VִT{ԎO7ӔpXL4R`Z`SH]z͗v7v*&awML{jZY%k?GrL􊗼ˍ0)mlʬfO ip5݂or>ie*.#2o=&ߖݬAv eu״zP:CJG{N}9\<'ˬuěX!*o#_<{(wљ5aLvN4ySο:hg( #/*U2h؜oݺUUիW_zRUUo޼qUU}ηK"ު&ݭ.&?Cɮpf}rL5"ʑ5!n@wNr( P8gw5Osʇ1[tvfAC&rpm{ʜ˶Q2`/f(}O"^I >x'/4x?nkWVUG/e>|jN>vqcwغ_U}O"^iʬdWzL&sTљr`] "ރ:8O^'_E%i%xa >h%:OCk[p = #Mu<9v:t3j0\C]mI6hm}^/9[Ɂ'{%sC 5r w6$sK.QК{4g|f-J"Ø~C e5_C DF}EMvf'{D*׉>JzC|f:kƇc(zljLSuVUJ$ EN Y{'q`oY'lˊ,:> wGzGUwW`[Fi*i Jy՜u1+,(oxm?9!ߴǣ2I`&Fu~hցnopHߣw;3UCap7;1xpڧWoVlPj+0-v%unKZv r$>!-]rڵk/_kg...:;;{竪zꩧPC3|f5{ǫ:;;~֭[UU]z5>G/UUu!7f;|AooΆGJb6J6V^$#;0pRüzcL|sP6GO_|r:©aawhnne6y7οM%>播jpCqB8Ů"됪>0*mCV97"3_z3I 1^qs VQ0y;L}5[u܏w#S^ qbIYKrlrC.3PK*'+xXr9;UhltTO3-#Кm8?"pfqVyɆ roDfdc%ie}L[<**I.;UU]rڵk/_kg...:;;{竪zꩧwͣ{cBV1ߛ#L3-28|’ ի~/$,/[NgVs3G]=ciM2n޸gOěv4,;/OjQcr+! XL1޴[ P@1ރiwC/[ t zcUU?إOU<u{~BKH3(ST܋$<Q,PGbp؜#*018}ٱ sKZ'0V|_Po矑 g5VUUܡ-" j/G)'j9>lX=t*JCEsfAusl2.-3r1۔$-jNiv"He5hg|fAuhݺ0p+ȻC}D2"-6f74?-g~̻8)ul{5gԝOwIX5l|8a4F%Gkxfƽ%7czt1O Xg³>3UvcN)3 ܞ݃G^K 0Jl= |2'anK~gf d %'3>FyKX#x֖V7Qx6L'r͘gZc2nVs1[1nUjg Kw[6ߓ?x g|UaG&K[s,}o~{pj|!Cӣ/.зs&Yyt829jTLysUi[1$5״BLXWoLbwhaa݃*G\j4F\N4μ_ `ѳ9ͳlUN'b& JRə3kKVpשؐ#cnJXJ-/Ç_x .S9Bc/B’VBn%+W\v{<k ƹu7{clHo+1G~X5bz@cWIGY,oxd+t՜ <*?xŽk1v7W{$֝oܯ{r6>e 5.mfԌ{oڸnty[_i:lw)A3 gWؐsia /pȧoݺYN<==B^x񅵫qu:G|4QU;4 E?m<ǠC6aecݦ:<D؄}u `#ޫWȍk>mzRq'{"޿uϳd~zoT{u7WPۅwX@ mݷ7kKF`ü)@Ļ<[v-֮d!`Dk2 /$`DkcO]O"^IĻ&jG >x'ثfɗ3?"^I %ɻF9 }Ǟt"5yW3yZ-$$@X̙brQںPtZO"5yW<X%Fgf]z 9]ء8,m/չwAܾe֊&U8-{^9[곽b'ycr93U-|bwJG/_rgº4`0!ۣIzXEN J'/퐛Ju˽ "ޒ:G;,LUL6Wiz>ޙimؚowM=zg$ö@P)'+ dGk5E19cI*ɞQ ] 7!I0'4''C׼A]}L)%sX%r?bͱY[]$x5?m-$I_ IDATʬ/Z݊kUpӤ!UAh1WdL35MydBNlYYYS& V|lBR [3GY d1$C9_vhWشMIwČj֩27B[} z VuoZw%M#bb2Z*Ð%»DgN wT,p%#l%" {|l>I2O%N.k䍒;Zv4ܽwchLkX0v^@/yu[!q1q,U?:Sz J8)i|cNЙ3`V:ɒ.qNeG3[LrYOAA*{Qp>_="W&IXvѲ*I٥L^wVy*XM7s|t# ׭ɜ=k]h`wdJ.Y;Gz0C@gf[΁%UG>K]5LJz(飋-iMpbW g"-wu^-2!"rGEV-Ep庉[w#͵$kf^iaNӴuj#nvÉ\q00m>%ܺ丧S⛫Pȶ_]IƲW-lZi֤ D&>j>XӭR:FQ0a+>cԣr}ouEA1:\Wcmsfl]O/zh؄ {Jhu省 Vu["tr$*VY0]j?b]eGalHlOK:m h3g̿4Z%K)X7'a4_ٗDICzn2uiń4 ~H)12Xr֥e!vNQ hrw5ZU"c9羛D`]i-E5HǺQnr-|%aJ۾c 'b~$yN5Fas.K6NewLCg8tI;ĴʰꊻY{-E˺F9+k573빕ՌVMTxUd´ e*:kV4`|xwR cr(D޷6!&gv%ٚzo>hr.J8 \i=XJ>:<{u \n3;iπe^l_xӒuP 5Mx" gN<76qJJmd&h n!_e d`K7_m#|:m+PڊO9!bnELH?s sGmдoc>99_ӺȅHu\SK;\('A u6q{nt[>m'}$8LEl3ɴ#a5M2b:y FG ߤY&8=9*c ońw Ŷv}$_}vcB.*JXN1[ -!ܖ:uqMLԞvS|{Z;L 3UU&$ή\rڵ˗/?3o7ٖ:[D7^o_s7u_z)ZN9;u/w5,x  l›wWb>oPYաƆZWs-[ѳ erWr dvdHM^dݽJ:㒦ek͵؜ 7t/Md?2YVca(k t$m oem Gs+'\RsYfM>v!hN4hG!fLeFhقov` G= YpY8*IkówPfp4@^#i(G6zNc?. D KY;Ls`!]Zڽ xNOO'7*6Q6TQ *9Z511 yru3WH5FɳjYaQ{av/F-]6 U7vIrZ'x|α-lΈB`OrPxv/&аP*-1fŸQBic22u#;UU:dlj;LYE:NL|f$o|gK]x[ Gu4/ɋX.@K>PfZf5]e yaˆ̶ڊrckbO|*^& +uesDs5Kج26WNm}OGQs 4׳ꤙ>v6EwVI8:Z?W$wY03ͅCG+iݱ X'^­^THSRɬ+ffjLڜ'Tc[9'n%B͵PpMX W]ڍf7|{xUTـZ~#G17g|>9D;[eLuVrN.aN5ʠ|k{sd -'Gy>"ռjM+)G5giMt5̍rR+6Y[uAlxw"gBvӆo Kvvuw|"Ϲ!WlWt~€iG"[2ly[v̨-Kޙi7|[1ϱ7Ӧt̿*{l&4%iɡ;b,y;ኪLbpGuc-b}0ndzWs3]~󯜚7hN&k7+v"1L83$B%%Lͽ"^uw>:<ι߯bm)j{U6dg=gY-)|a *hB&136[d>IW+x|s0V|Ws|rOGg \''I{ɸE 6 q'k|v&Vl_']?x:4lu8*2ajɦ뾌jBBzK7dӞvce o>l<%s%`DU5UsdzW3N=@;CLJ%!9ď9UB?,fDr(F6&* njWv4b/H˭zx'ثS+aF$d" X8T+məRΊr"^I >x]x'/$]w5#`D쓈wM }O"5yW3@>"^I >x]<26G.{9?kWS;g*Z~t;آ/zOݻkWgw?tY쓈}}UvK >~s0^~?xևUcvڇ݂60ϬfhF"y_^oJ*`u"^EN6-:7a6>``x;aɴ0(rrpZa0Y쓈}ˬc`[F?[] "[Cӫo#߽M쵵+F.?:c|Q{}O"^I >x'/$`D쓈}O"^I >x'/$`k9aQˏx+c@7?6 C~+7@6 hӕs`D쓈wϮ5?!dB>LLۉ&yHR'}D:w֪69^o^}ӟN*=g?`n6XLoz:nEwKysNSTݡz?PA$^!F>Wgj832{[,?Z˴V"3臁 ј^M>TP Ї$?&jO ><XPwg޳WGYz gb}ѨCR&u{zeS3:̹0ʕ+׮]|^{3>sqqw n߂d~+7w+Ҷ93e}[t ,o"/z_xAUUߺ/Yͼ˼&8N0`˻L,/9), ݯ}%G=N&-M*6}t]x#_o&!RU}񋿿v-q^z;k hӕQӯM__|ν˱Yŝ?~s_wjMoMWb%Oڨ彫}t~g*4o}7R/>̫ ׺~}7|7<1-$Jla̬I%r3v{`<\ḃw^>oa3=նY#WyY>2m-X&ʹpѭ?.X0wO{<)PgRvه[Dsx7Os|gg{y3\kEut4MAm8lw/*KX@-v۪4S"-]?i~$\Vo >aP5_ eUst5Rz;m^~2ws"zK3pmqoL^lV wjtȴB{w䱕YpG Yl;Uo}mz@p#k5_E6ׄ fÍ Adhdۘ-iQ1cv{CJ5yܦ6'nf?j(ص/dke9kLKuo{Z:qFzb[ Oo-kjL8j5v,HD}䭂 T#^|shbi e;Ѵͬ|j~PhS zZcTLsOvN:ZY =a[++-ݽg.9n˘Ts1{V5f*\$`УMSM޳rl*-/Ycr?{důusY͑嵮#{?IR6\i&uFrӞfmn}t|O ,9csKUz|,YZ2%")xBAG[ zc[} ^N LGMrLx;'UؙijG9'Wk 7F.ș["WySGv{{53 *2UT#>yoLVu+1%w gYLw*ΩP,g2|zͱ/'?ɦ-(*ՙ"fAo-Tg>asvGpqZsנުO-[\+I4ﱵ-}drnnOT1ahQ57T^_5Y'H7' N} َ3׷K9p%4jc3gº9r846I) 溒5c7wls>y{?"7ՆmzC8p9Fk$y.f;Nd|YILrIXTi[؜~5mɱ hOz=4J"2hjoZ=`u4 =LpTQ+=U!;Fzk]}O34z\NۛPr2?Zn$'i+4= 6?]2{uYVw'wݬzwfp3Yɡխ䰼9 IDATƟFcu@9vEuXG]%.tdo5"W?gƜ#Gy-N2i/wo]\kf5Ǎ \NNp3,9z*| '_@%9!d G˘-DY^ܺǜȖj}a=&vvpa38-I63ńg?62;",馭i cjd^2/h̋ Wȫޙ.F٢+bf5[k7aN3g?*;"I,DM^H`WD/}rC"cg(P3/i'i@%eTTOs%5e}M{Į<|@8nVGk~7*|U`I?D /x ,ݑchCdޖ ػv 'xY^j]֢%?{?s,9>H;ZlLO.C-[ɇѻ82$Ug!#Upd}CgcȨW OM0ʕ+׮]|^{3>sqqwSΦ <4K=D-kg4%l٨ell4lCI٨elIl_s7u_z%/{Ѝxj`D쓈}O"^I >=˷^]VO73=w Dow@ ˞`DSϬH}7'EefcOQpzc }Mx[1޺!_3n~XW)َJ7J0eVs7lŚ4 tFƓoN8~{4IL&`TU,9(:Gn>V߼ЁoX3#UUϪwznOe$&US7'?o9xpL\TUw{~좺xW>@8<_~/ޮ.?e0* p_;?;ϻt_15)/7 ÿiuUmngsrop۝Z@ko\|8_ꬪ~EUl1o:yWG?dBXҿ|C/gUY?;/"/d_!ȭoyїo|= v{vvl] G:zOgUUGͿW? ?_|ꄨwW>PU~_ݥj葉Ϊ˿;y?~g?9;./\TYuvqvqv~CrUg^TYuqqvV]\Uջcz6B䋋~ݒ~_J@<+z7BZ/S=RUՇ>pu⢪. n/8YUUggYGkc,像<+|ލX8Dܪ#7ݘx ~xV C#ムbتjV?+WR]lĀ8v8IENDB`transcriber-1.5.1.1/doc/img/inter_seg0.gif0000644000175000017500000001036607510315717016112 0ustar rtrtGIF87aTPXpxxhx, dihlp,t|pH,Ȥrl8JZجvzxL._uiTmn|Rh?9j{k|GPyģvǔλhjϒzW.=;t[$|&D!?C(ҟEI Pqv%M$)q6ofLx' SVǗ IΧM*utPE9CqH5Js*pU#CH]z۹s,XR6Zmt/7dkx Eti#~3'93c .a ?75s 2~ڏi M\i>Yg{УKNسk.K!N;r˗˟O?! Ͽhoփ~` ‡fv (Ä@Tȕ#0&{+ p<@)Di $0#胊TViF*d c;b)d:Ie(sZYgpy&؀;)geH"zI.ɧ~(S'wda J蠞n hZjszjz:(3n몺J꯹נ^饈B{ )b{-_Pɬ ~+j몷f /گJ?vK/}*( c \+f%q2j0y, 10Sr(ۥr<5+H'L7PG-uA#|3<\wUϧ~a}ؼh7\ʪ9 x|߀.n#.@$G.;)7s^._.ꤷ nwXw $.߿߽>|39O|-=C^7;>W]O/g食BǽyO<W? p}|`RЂ`7uP`XI[G>}^@ ~8w?͆6,@NЅ"ao21AX%>3$=Pwѻ'??q?d wqu$#!o \i8+:ΐ\QE1 cI-zvd]$7IN (GI攡$*W9HSr6dc,gBȹGIbZ.6LBW5SxCy[&S`f7xtGp~c@uSo,2qɑpXb|&Xtiԇ45]Rq|>N}hЎⓊ<_YOӃgy҈"+mi@}x~pLfI}i60~j{2J{E?ѧajER*tl(=Z~)= Ii^]5GJpU[eӸ{+I݊׾UmE_׹rM]K׺q5g" e7k5{`59hS:vaQԺ%i_K[vn\mmBo Jn $Qjt%,w /Xn+ݫdNyQ\7=[f^+,l}䗾 nؾu\[d÷ncpo{ֺWp[\ v6?|E4VY6HW(u8 ڍǕL"u@&;y :L*XAv.{`|0hfbTfdL:xγ.2]V0#ȅMBІ&l2'MiD`2J{Ӡ5k/'Yo&05-Vx&qMwmwQ`-uo^ؼ>wᜃSW!FMie#<~6{Mn{[֮BmgN?+_*(D؊0&нzw`-yx-o -wvߧtwQS዆+#n{۝s+c咛(wS򖻼2쀚8Ϲw@ЇnHOqN;Pэ.[]MַuS`zNhC_;N]vտw:C~޵s/VУ|K>o=AϾS[w}'}R~s'tWIGG~hW{7x؀X~G|Gtwx|};G~'ǂ~z(Ȁ8XGA|(wy2h~Mhz{ǃ?(~01(<8Hsw(W`xKzLx'joHWt\$؅s؁8X(qz؈8J$Yȁ(}QXnVX.x h{ 8XjuH헇Xm炌LNJ؂@~(ˆ5cxxH*Ȃ؀،vD#8Exzh~h:hH}8[hHTX^؃߈H:phׄɁwيqg8*('!y{ )tŘt'ȏO切7ǐi"~BɒJhFuݘȔEYt:ɓ5)XuisC7 Xzo uɀwt |~ 9|IxOy@חvُ٘Yz yٙvVG9)uٙPٚ9['yRxٛ9Yyșʹٜ80Yyؙڹٝ9Y 7'湞ٞ뉞6yI5g:Z ڠy :ڟ< y )I%Z&&ɢݹ#:,*j) ɣi58Z3" HzөKzLڤ$ʤA0WFNRz\JZAYJceڥV YYi*l1JZmve:iZzj}ꨏʦʨ}Zz(ڨ`ajʧjZ:*Zک*fڨʩSڪr:ڪw*I|ꨨZk*gJʨ]~Jz*t M ӊ\jNPz:ZT  ٩ɯ-:Z[: ˟ٰ; [= { ; p(*,۲.02;4[6{8.{س>@ȱvvn|iwߗ+ L{vJPAT[vQtYyWsVk`f\uJ'cX۴E;pm˶k+s{x[/صaU붸Ypg{wg`']7jLیqٶKKK}HӧvKv봰k[˕Lg)c˖PGG۸+ۼW;ԫ[ڻ۽;[{蛾껾۾r{c[Ngk[y;8؇t׆K6ٓ>)Lc6);Ȼt| l='ySx☏9L!ɉ3lwéBHJLN;transcriber-1.5.1.1/doc/img/inter_seg1.gif0000644000175000017500000001060607510315717016110 0ustar rtrtGIF87aTPXpxȐxXthhx, dihlp,t|pH,Ȥrl8tJZجvzxLhyn8s?"gxiHijzPyät"yƓyΐDžP V\2Zǯ($s y0CYQC(HlJHRD4o$sMN Je' aY3ΧM}>]Nh +5.BJ)Up~e(~ _m&|ā1(`v ($hV((4Ƙ+8_ˆ@)DiH& $p#q !XfJ: e7%Z#h^~9ZÕB&!{figm Fifg2蒏6 Zti6b螟*iv*Rշᙬ럩ꩫ&JlJep+ij챢D.lΒYe~ F-» )ٟТK-,,r+y/)vJ-N꿬j12,w|g l ɶj*̧- x6-:{q|L7PG-TWmuE0^`u ۳dM=l`/t]i]vA,`'[>Gָ>mp/@LH$蕐G^Bgĵw·>[A覫<<$65:0 SxC ؃Ѕ$;RЃ/G O}3G=Eo{@@'|KD/Jh@^o d &qV#a׹1I޼80ꠍnc|IcB2=!GAƎfd"C'Mp<%H@ҌQD6 J"4{k-$oK;D->y| t no|eY5\2yp΄& i?&¯6!1iL?9$")pnq<Mr#Yy;r*3t3UO gan&Ųt[)`BmahK#{))H5*RA#'#PA4@dJW*4ͩTn,)Ԣԓ,jNJ*Lim@ժZXͪVծz` XJֲBuTֶp\͊Vy">\\׾]6MMbUkWͬfs@Yaz͚ Z.jiQK"VMkj8β p&=!p撵ŌU{\:*tRͮxǻBB'|r^v7E/xW9a#/2_Xm["VQ`[]0Kv7i =LbB("kWd#fH>~򩆬q:Z%봤8Ǎ}G ?vDcK$rw L*[Xr h`<3.NN3 6pL:x~>*PЀ:ЈN B/ѐsh>#ȭ7N{Ӡ R7z4 ,=VհU"DVZͬw^&p魑 ]NZ7uH`vj[ڮ. mLXƶMn`o6 cr^MJSAF5]˻w~783?)dۇp={F9h}?(9N># O'.3/gsK8O4;VӧNԃκ{`NhOpxݮ]uOx{;#O[k<7C^/ʃ;Sӳk_==w~^eOvw&`w~{/vg_>{] <}_ Ox?Nk'_'sG~k'~}fG eg |w u} WvxzWgvvׂqǂ#Xǀ:}ҷz)X+؀~&vIF8v ~*HS}BW4M<r7""h|Yu|}7fWhXcfHv6 ؃X@B򑚌Z9Hy.SC̉RFfэy HGJҒ(MJWҖ0L&8ͩNwS|eԣ(P])ԡۓRԦ`.MRiԪZ) YKw6Ur JdfWU%da=+Z ׹rk+*fEaoVVU kY`հeU?n5@ Rׄ!MZ*b0;Vzi B%ѱ,a H͞ UNb[6Z T[aLJAĽ:+\bf+X6Hw:T.uD;#OnU|YZ/FSfx:7!)on C ^:85s݈H½-p!S|ֻţ|k* %Xx o(/x+U, ~5xf23Tz?:YѠVr/S;t%qkyFj{y'b ?ȍ.i3R ֎N3j_O)VREKT3>qca׉63y]gn6 i"ִѥ}woZ5fܩ{ ṁ4⥤6nCz7}ꅃOmr#5J=]gC|B8tX]uIC-z%\:kJluKz<_ FPnm+|=s Y&g+3@ \wRx^QWK֤kKG{;T~?^|ߏyy5ӍפzԾҽ`P oTO;1:Uo?yxT?u~0" SBs B{#0cH0u}~0>8do!(}eSqb$s.xT0|$?5(4L  c SN0Ox0Q1NX&3 kcbxJ_SU0ZV1i3mx\|nj6voUA3Vcc부khR(gVY舍h8Sxlq؃AXl]6ׇmBj0舫 cj8[1HcZCN&j&vIhsXjh؈Ȍ`؅d^GTbv8p1Ȍho،Ȋ؄((bem7_6d5u[ I88ψ^eY>fD؋i" È4ܘ0LH?ȸ:6t4ق(9Y=9?J4XJANe^TT XXU;9~Pؕ`hb9גf)K7XlɁn?r9hYx9Gw 69YyI,ȕAY9K9z91IR `tDc2ٗ69G)c~bɚvWH8#4tpxsٛH<( &\}Yi4?EE 4YL6i(eۉ2Ye/IY9~`IfIk B1㹟?s)1&I @3 ʟ:1 } R<"z(z$.02:4zdYj:ʡ<*?}Bz6 ՙHJDS)P EDTZCXPW^?]zlU3EkfZjզs0G#b3DQǧw”KCF(:~=/y4j1{j]ٳFӨ#)674J1Ljک@`(é8 3|hƠ?&3%ʉcZj6jnHtVwDcu"3e3#t(N%ڮ Sbî)8b:ڬR孧%dʏE^ʬ<4=j>>6⪱E!<ۻ<{E'{1Z~3A]4۲P+9.[5deJAKWL:RJKIcW+RY'Cô9Aq:lnt v{4zO|۷97a;[X1n۸AK;1{ɒҹ;[{;transcriber-1.5.1.1/doc/img/inter_over.gif0000644000175000017500000000703207510315717016223 0ustar rtrtGIF87aXpxx|xTPȐ@0DLz @|)@PD\z @_@x,af@̯H &@Bi@@?% @0&@DBz @ %?%@@蠴LDDzz @@1@`,BL@DP%@؀L #.pDz @e#lp,#, $#Dz)R@t$paf@,Dz @ #n)@ 8_@, H*\ȰÇ#JHŋ3j1# Iɓ(S\ɲ˗0cʜI͛8s&!{ JѣH*]'ȁLJEիXjʵׯ`ÊuYN]۷pʝkۻHBWh LÈ+^̸cSHʘm}̹ϠAGLҨ_nͺ׋G4&WÆ wX6l#xhCwN=崕cOݼzg҅C;w׷֮tNjo>p%_t~ |}z`_%t>|9]fhUm![xV(FcqW:J@§bRHR?sCN"Tdyw>.ٗ`)dihl%ZZctixE矀j/袌"hF&{Tj饘f馜v駠*ꨤ*8QZꪬ'I뮼+k&llVkfk,v˒چ+˭+Hڶ /뮲K/{ &\L[@ql,OLmoj/+;o( |oko qc\'2|2˿,r$ -DMt.7-5TC]3AW2/1'3Ӿ}ILO/TQ/{7yjٴpY'qWkuU/5Xjkۋ苧nؠMvKŜwi{s婻vS34 Ƞ7z GH(L W0 Ud8̡w@ bkGL!H&:P[HDX4a.z` xC"QX4 CpHF1iLb ٨A> X;1jܣ7Gq|$9JZ^,dH-.R\(9I|L*WDMry$ GiPQD%+w^T#"IFR2iLdЌf]3vr:.IYJHҍboBMiqf5vNT:z2<~!'@JЂnPMBЅ:l(D'JTJ/юzHG*Đ$MM:q*i&GDŽLwEҔ7#e[3mjTՇ:ETӖ撜j-u:NHrS kSP*,3oiM:Գեt) Tur%(Ifޕ+3搬ؔWSW5l7yY:.,4 ҊP$iW;SP+֓-:qB .+bL)榋΍.ZnlhzUӮx{2>+MokO{;ꚯ2l.X;zKf㲘ܼ&\r6k3&f_wH7нNp0w9j|3榫8Gb5NJ 8YF+Y vdʽw |[NrtekY%suf4'w}s`Js>7h~tv-BφN4SFJitM r?ILszH4i|&uZ4K$+5RRMZ/E%Tt=^6@Kk@vYB{$洦MWֶ5J=nD{Sl;y| ɝv~6T$Oon˺浿>oX[x N.['x=̘{?p׻$7rIEk|59_9ͽoFwǕ#=UG*9υ/|0>p\$G{)n?bбt]wyLxM;x<䆏ޏGDv n𝻻OuhKXvA׻Nx}Ao}nsŋsQ޷S:АƢ.O# hU'>R%Q$x~7jϗn0}wm҇(]%wDf/x5wh-!}Շ#x%llqw'(K,aoUu-{E!mVzwƀSXnx7xyxyGzֈȈV''1Xj+m}8u'|gyeuևWws׆{Y(6={؀犌gvx61~tDxɈx'Bs8b8BX6|8|Dž|Hu+y`yz({]x{|4hr~X )'ȁ*!3%i! h"9V&ih(,g. z2fN;transcriber-1.5.1.1/doc/img/transblue.gif0000644000175000017500000000111507510315717016042 0ustar rtrtGIF87a00Ϯaa00ϞQQQaaaqqqϞǎaaa0000,00 dihj/+pms{i 3`H,y&A& F0 Z4E  hλ_@x8%  no7GL`y6z3@ y/z8> H\'b *$|(&@,w4o'>d"&Jbȳ# J 4'#֢K,JnNp0m2>'Gȕx_ w!-2",2H<| E"%W-P2w<2$͟ {T$oϘԊJP1zqhT8PaZDXSM\*n ̦N-q.]Ce6b]K WyDRSN9CCQpfC63Z3 -/dѿW-ő7u}Ko[H ë;transcriber-1.5.1.1/doc/img/trans143.png0000644000175000017500000004564007510315720015446 0ustar rtrtPNG  IHDR0UgAMA abKGD pHYs  ~tIME8v7 IDATx_G~RK?zZ ,R;dad<` 'yXig[w Kƒ0X[W a|Ʊ6#82dm-$:H`w\uw!sWGyIG^"xo>%,`[cՑǎ{gPl6v:l1Bq-(?օηl 5M/B_|kmw=_c &`&To_x_\Ec"w)_x?zx˖-6s:5sĭR^Ko` &`bK^y뵳k^XNo]x)&'<7EgϽxn#Ê۽L-[P>tpPqP.]xEo6s8C&~ 6d״oȉuSw;w71WϊxWE8fS %W~~F-ﯼkNt/uWd#+jIy{=ɻ̿C?g"f`w[7on}OJ7ؾ}Z@Ss{|̭}Br7;t>K|;-5R겷lZF9- Aݜy_lyF ` &`b qKt2LK7on>۷ooU."查'zbϿ,vK[b !V\Blxi=_|_۴au?2LkIvCHz mb\u3gg/2L00l}کڽvovd."lE6|o !#v_{0lǎB-[z7M!7o\힯#+o.W?$j񳇅eOuYR]D-Un]O>6UBk11kl<gYfumLZSRˮUBwX6MPCԍۿҍ_.n ="?l/ykf7xޯ`6hv ?{؜`n]uH= ,,W ZزC+4׮][~bSMq_?k7Ԧ? ǖzl˗2bo>;` &`b'd>F2V|Y=D_KݸzΪ_5uAngr3>nrgb6R:2`\G J~Q(HelյkemP+P+P+P+P+P+P+PxbϮ=WVV6}]Zrӛ7WjX6m{hB\X9]BW,81Ug]ك'ٵgj 7ڨ5UKREǨTЧ5jfNZ?;&ԥ +6OKt[UPvuۂuqZw\PkcC9؁J9)^v7[U^qⅲ> C[۬SM/i6k[&eԪ<D4u21?-k eҙB[1h>vg۴E(rmgT*5㊻]?{+ o)]TEZf2+!"Kcm7>nǴjފ3m#-zj[QUNX޿?F~H}7`n)62GoGKQdbS% K7ԣYMmUeITͺCб՚wG~sH|b#W7yqE|ҽ KBkY=ܷjigP B뿽~cgϽxnc|{>{\B[כ#_Z^6evާC~ڵ3)ry'V4V;L(7;lu׫vJ8{V1V1V1V1V1V1V߻npz>3Fi@(=s㣴ǑǎijhG1[l1`Bkc'z2e5?9!':L@-n4@{`Ylo| #Xqpcc7YkMS[J sMM\2F]Z /`nחR2cdյec@)gWMlѤ$cq (JPJ8#1#x^ Σ'?>Q'iq VD*+h#31Σ'܌VXSt.Vd9R5Q\U9̩zcn)VA{+_- 5B~ q <YaH |Ĩ^yHՌ :^~}]8@+5"愰.D3@q q q q q ]M tM !dv׶o01V1V1Vcn޳v`"iSpN?q|&JJv`\X yC>Ԋ8*{UΫkF bsC@E"h9PfϮ=qmӯ1֬5ܑ57M%eW1AJ7D$iښjЦrfgI|Y3Mw3(>[Ǵ 1:ãL)S|>ϛ2DFF ܈䇵H)ǻ3 W"abXiМ6gѿ%1 ,_-XGsםs Q+ """""8z`^ydͿY$}o" H7*-k 4Z%DG ZTiV34uPQB^D4IOZu5daC6f؜)JZg%1i1f40_-ڈ{8G(V+r#*~%m:Ch$ e-cjRDc<੸8q q q q q q q q UܼgwԝWnE>&'&-w"/qʅ屛ԑ" W,ثyfJ5땭 8F/ػp`w>;P(<|y<3$m sTY (i| d` 6- 2¢)cuR7,5T0P<+Y;j=2ye竎})AӞd ) t +@|#Sc\su ܵ/g1{UUu_/(JV1V1VcV.,PaO1w^]{C5 c@c@:v0sUN>*w ^+Ꟈ㾴TsOm+RDm@c S( !>2sE$Ma͔m6/Ər:l/ E+ F \& dӭSUh۽g o|D9yf%SL1֬Lj|l7Ϩɣ~6a$g~(LY@8lA6iW1YcgSlB>OGg/hJf2n&{!LV8߉.RE0J|^ y8KR@Ս߯0.P+P+P+P畮߸>L;BJn?ض#^}8CrN3m:w<}=IAGC ``q4sC'Ԣ}uO?{vYL3#nCSl>A 08F1lۡ4)L#ʸxd\m4:mX1mA'-kګiize*+s (Üc*ALGg95bW1}P\RP?sś9mqj:A}/rݺ7tfC$v!RsZM )GBtF-ak1m!mUnÌ$-{qֻ^됩F [O<)[ds1v^IܟOY}qq5%ì.={HqCSIivi%t`.*=m5j;Ggt^p/Y{W0w9SI=O:g_]O~(PdRJˮ~9IN懶1اEM g#j𯹳l_W=%_ Y<&qK[J\ F!0|^qmi 9c{J"""""*w"퍱ݵm&| :ufi&@>lvie&G?(gbMpC2@Xs3>!Ä2"Я 'u x"/%  q !{ydaZ{/J1>5bh|Rb| q q q q q ]M tM !dv׶n01V1V1Vcn޳vΫkc7 wc7ҥw?XC"#:7Kp+ `EcڂB:4vl d62vУ^ D>Ԋ8Ԋ8Ԋ8Ԋ8Ԋd}1#jEjEjEjEjEjs@f?jʇ. |=~ޅ{#nEƍ!`(V/KiԬF3qdQR2"m P+iik:ѽ#@򏏑ykz7z61֦Ţʐ̑X9blg >9ϚM IDATHf5bͻ7~kUcfr9* sյ9_S0>Ԋ8Ԋ8Ԋ8*w ޻1S|`ێlسkO3ze5VL Q1}ֽ4́8F b9YB6&j ,W5jv +^u/s,_I1Zb7Hפ=ï]w&&1eeLm mOU9ǽ^kz|mnεk^Q9߯d bޘ2qZߍ#H.6@J PԭplY@cWݺvmmx ,i9a;$Lz ɵl nQZՕ? L6WU9Sǔ|/!umok?uOCdJ8.պc<9 g:'TǸZT6omcܫ66Slq7^+rĤ??4ZslV"q;[1[؄CӰ:;A LJdR[s;.r>w]H׍0I+h_*W1^1V1V1V1V1V55Pݿ1v0BP,.n/"""""n;~YihsJqɱ21@隴ĵ'Fs7˨:JkI #u4in:ߺ:`.ѯA !>%%ud3!Ym]n0C"e,*:@uq Pޜokk\Z^M /{ Ԃ80еX,CpZb1>pr#-ڨGّ[.s8E{^ɳEKi@^CPOaeZWsSK0gZZѯTLP+P+P+M tM !dv׶ | q q UM`;?tݏhGuV.,| q U-ثyfJ5땭 8F/ػp`w>;P(<^~@pFF2P0ojFJaMaՋıb`\|՛}}J*j(D畬DUǾiOJ2c:Xe>̑)V鹺^[rI}z3=c:~%P+P+P1+h@|'P;=ȡ1V1V1V1VIKލvګ5Hi͗-wHENkM{vٳkOzSZ| YضC _޻1Y+2XYǴ1ګdS%Y ]|gSϜr?>Ĥ;CZCdԜ6sϮ=jFT9ۦNkW^Z~}Y}œ!.%jxΔцV8;i\|g#4sםQKN%瓌10(쎮!MSBy&cD9:?1/ _چٚ3?́/j}TWipg1 qL8߶34JX]%?;7g:VZ-h'cDJ x`Iz:=pi˜9!/"(#GҐO-0fL)k0qAJK*PdpI~=69ӭ5sutc1'~rONZ@ǜ\HOVJ9w=1 %;91zP+Ju[y;X_X[[ZŠи7Cv#U%G_l_:+ڳkb]{~<tc| \d48 ->頵; gM P|LA3Ghf>"wP' sY0^qI!1Oєa%Fu U`|1ރ$F0؉| 9nG7|c`ʼI`Ductm>#9mŌԄ}1Yr0vWJ beǤ|hX[J|\KcGA>P~%LP_@9J b`qc__θk{_X[[꿢?=<ӓôNSϜʸk[|~1cm%oi + -Blxfq酥kc7 n뿽~cgϽx1VF?Zq񧏏G;"81XoW?-]ӵ@~_f^qTs(_:z^G{`gߟIL^|Oۮ3sJ2N6fG9o~_ى9z' f|Xg2>+V偬5"j0aXffB`RCQ~J/eq"j ޺"_42f}nu8adfd(cf_g9E+1r?^q  KfX-c'9w; Kiq{+ίZN1͎#`,j}t E:f#qof&߿5ΗhD0V~Qm__v8tYǃZTw9f"*F3`8!E e?1w"ЧSN@$W/_CG@&8Ԫ8f"JSMq 8Ԫ8kM)PZPc@jcx^ jcT1V51<T51*PWq UMq +UMq 8Ԫ8fxLvNjD) ;?D]̛n9s6_VwwZi3}Ju;zPc Gn^OՙUs3]nhNb )y%)^9ybڷ;#k+\ýƶdmmTzG%43k-зv^O ;̫ne1~iawXmX 951q+"q1"WCo+8|dl+NG˭x>ows\mqGTـb516UwK'_:ʸq`ƺxnjn6-(ї.˻Fcܭ}gVd)a~\)WYOr&4XJ[VWd()c҇qTzj{&_q((_O|Jf=1m11[Г{ђqD&;Rj9WaKvN\WO#*I?5c*UH32[QTz2$T;2c4bFoKMqy+sQinX)4S#)~dϻyqXR51c {I=>7j8=CmRoImlJC1yc2+g,G:1M4@cTߑ*@Kf^쮈cژƊ[og1zmIy7 )!v&[ƽNW; O ${K5y0bGl|v/Ï: S&֞ZL-l^Cie t?5J{:j6 Ǖ4>fW "Fs rE,ν/Oۅѯya~.j+ }^Iv2kQOb%2r'>4V9%ĭ=3d cIly8&q[PCÑ-՚kDo To}0!oO\0GZP>fk/~mIkɧΌctYNzz[)KUv 4#16{j9i>rq(ytKPmS8}tHTޞ!SScgF܎=ӫb󤳻sp+=y~n&km5kJ6D$; [|˗[l`[ޱZxDvyi~mZ7߻C6q:]3cGQkUU7>#bOПh){#q}sjg͂2\˾Kf?6k5JQv`)+'#9C7E9y4-Q\,ߒŧlF#S+T=1 hgMH7 ] D[/irB>|7 )؟ᛗR4֭r^XM\ty%1n4%zf<،ָJ݆vuBu[͆Xօx4njucRWW>WK~gܩTi\H3m68fȦ[Um>5nndaĥBw 2*d_9Dp|L{WjeVz?B9_cH}U?9%?)m(to,!B[%I$3*'X}\ 8i~b~鳨t]y\*R᫮Ydyid%2H֞‘jc0qEs-rNhL66cxIqLI6ggٗ}5VZ`ƺkG <(m*jj4c)Ulkt>TF?#.Lqw-^KJhRø(Q c8ۜc`W JJL1c|Xcܑ%TUMt$?}|DwElEwwm;c6FoN\O8޳qλ68W4E0yY\UY.q ;X}cP)iSTV\+df-h[К-$Bhƿ'(pw[K"]܅bn"bݲ$/~M8 hm3jb,h+_DLr+g=, cF촎~^ߗ.į=LE)q#ƚ8JzYQZ"hЊPm 27P}>LqLiJ$rHM^yq* N=z.G}`rm`d3`WJ} q[5ӱ2+`=ٶwn萂t3r9pqhF?:GwD,Sx/G|iw~ 'B4c&]j+})I.hP9޼R{5bme.SqD:m&vn~_?v!W1үjE>,.++ki;ޱ@^~uy/=~lϑ")HTS")}%0jcT1V51<T51*PWq UMq +UMq 8Ԫ88@EjUSJ@uGPܽvx\;V㱛Rï݄pû!WBx}:]}¥[9{T1V1@',x+ sKgnnUq # ?9-[畀9|b{Ȃ6^@^U!a[:|^2:+[:+/[u c0k"WLU'~%yΚvg 4u1aV@OxBEq Up˯.TOt.@K`?-A_2LRi %>L/Gb쓁So?|/P+P+GO4i?s o%H^7'߃yĵ'nP=JȂnc6(?\XNMX˘'ZƱDVB7'wlm ю%HoR}=;ncހJPVF8\ˊޘ,3io.+ c O*n>(QVE>&˹v O=%P+vdcgs;+\"X__fg^X۾7:i!/<?xf܋W" s}UCdTc>p GcܓSsΡ|̥w?vX|SP+qONE`\X>jEj=x 6g(Gcv\͖5K57mh߷AkCڶȺ3Q X|fk368YDw52M\i1()3/j1^R'3XCFk-XVyh2?sA6bxIcФ6h)_*iGSIǵ.{]:wDb`yǔ֖‰֖KZ bkbxG13P]MpsV|-}5q凟^܇Zy?[nܓaȵk=34[[g?_1V1m:v5Z]ETZZEʴ?m[7܄j\c>ez5io;9|c_\W>P_\@-i,P,:i s AFrNm4 3)Җ&TfmD.eݞ5?@S#%A>wvTb`fsCe{s/zdi?m5{q?l;u9vqUu([4네Y\+_a'j| n&.k1Hf6*`*֢K1'|}V珹ⶫX-"Yйc1$q˴LuNg%aD rh{ü7a%ZS֕E b;^-׹K=9~:*R+!0nB22X3>jrɾ9}Xޏ#aND$%GZ<;vJh0=mNwq]i1"JmAK#MН %;Խa.۩5C|ºjk+5Nd8d /okmu9/<?xf܋ͷ7РޥG!AiBgK}oiZ"Q7"t6w.ջE}ul{+ptu._eY,Ym7~.!lۂbb#cHqPG>Feyp-hQ? r0QL#L(! 5..- riV[ -?i6_G@f>7۶ܴ9fa~dž&}Mi#Ou~\g߅/H>'xFpl4z#S,8ZO9{`xRlzv۶pZyhmʍ\'PMcGU$cïEk%󶄻i=SB#C93Yh 秵ccCӍRݧmjM5U{O20INT0im.HI 1q Y*JHÜ4UwWy>bcuD(-񉍠;)Dc[ ~F3 ɩt.v߀yw9Wɺ.%(Si,L8oݷLmB>5)V4{6蘪b ӺY7VkuUkwcٞ耸ylJ<ߡAJ}ײT@\t~_|Te->/C_iZJuz|1ua;:w:e9Uexs~ፙz3ޖ#qO! o8oacn>`x}rZm|Lp>];i81`Ź+N ͘0Ԋ8Ԋ8Ԋ8  BjEjEjУ  AB/c@c@~`P_ ͹Iyh'WH%ȓŀ*Qz@htѠ_ @N}7'81& A yR\=LjW7) Fc>8I91А6q\= i'CE#_S & h sċJV1V1V1V8ߗ_]8؏Gi#zaK8b| q UD?O:2:~A{~{=B*\;pXg-;3h{wj-cK`Wϻk/j9(7ҬT1Yuf ɃУmH[숞bXyl:s8F5z{-?U :ngA'[OH1JGdeJx4GC=KL-n$h+9@s3h+c])0w0?没e2Ͷ>#~:Қumk!!l6[<K; !˯.~űǏ-Y<9go4"/ +}|3yXرc酥ЅNR2 FvD7P;transcriber-1.5.1.1/doc/img/inter_imptop.gif0000644000175000017500000000713107510315717016560 0ustar rtrtGIF87a @X@Xptp%@0DLz @|)@PD\z @_@x,af@ίH &@@i@@=% @0&@D@z @ %=%@@蠴LDDzz @@1@`,@L>DP%@؀L %.pDz @elp,е, $Dz)R@t$paf@,Dz @ n)@ 8_@,H*\ȰÇ#J1ŋ3jȱIɓ(S\ɲ˗0cʜI%H5sɳϟ1oѣH*]ʴӧPJJ*ӡBGtգׯ`*Т֐Z4 ۷pY]-Q-˷oNr+a(2AQF91]l.>ŖMVn;d>lw.υIcۓk?y{ޢo.@QNzױeE]խ-<ݵM=-fX.iر_x7e')^{G~'}~^FTkY`]u6aIy$hGx !q~%]|h#yŧI_8Nڎ%#$yUB(jF%Y6^Ʌa`g9礖kn2צPZ$V|MwYןj衈ZUgo6裐F*餔Vj饘fi駠*ꨤjꩨꪬ)j뭸먲 U+j:4F+Vkffi~ 覫Zl0nk6kKc2;&¡$ 0{2:<1Lp z)rǼ;p$JTL+ DK3<%|Р 5SmG9'O,B_m6[Wt]+nRemYW1L>2t߭yǻ7}{ۋWNz ~mczϫ,堧0͙3;qM.;:ۑߛ6[;v7G/WoL!_ {;@C_~?䟟 ?]*w _^v>k} l  /(Avp |(UxLm+B0`_yXB,&pwbB6K FqT7BltHHE2bdahBq[ bů R A,ڐ+t-A?1r8򑐌dY=F*ϑ̤&IIY~ܤ(G)NNO ӎaTvr4Fgxυ8K'DͅG(eb1H38LVS]4@N7g12HmPWPTJժZXͪVծzW=g0EH+3ZVR5zIjUT₵WJ+(&6b`Z֡d[gXl e1* pqfS>6=U!-la[l@XOM ZܾjxEm5\"w~t-scn{[ΎDW,K˾tuYaA[^V65m*)XIB/SkT0?Wj`' v$\p,\ڕa氅EG*uh嬈AEXĮl^YX\W7~K:mn4T ?n[\Gm.#8m<.J9*cپug͛jy`VVm󑳜MBֽ2owLq͐~XZv rmiJWuojjBzՁ"OM ָε5eV%ܵMl]+Sݫ]1ټr6i)St쵧 oVUnܑ"_𶙺MoHܟt0qpmnfb-o oך x+~o7UV^+[Ti<6ihw wA>rT'waJ87]ٻF^t eTut}}2@7m Y^ȿ~sc3v Yйq]{e|^3UlK7=e{3"OMn ?𒿲!}Gg:~߻t3R/p(-Roxh) habX.'X+*6H+*!V#+%*Sl1 l*8waւ0r8GZ}ZӇ5C(3w,>a@+Bs&%҄S1=j҂Xh8xOȃZ'Bb }EeȅĢ3z`Hf+hWAfv/("scg+na{HD}vt儀eFvy[7p*rvu,a1W8xfvs]ⲈVst0fH5sl8howƈw5j̲gDu8]7{xz ߢ$茰 sі&*ȍ B]h†DDĎ(,xcȂh40(q3 SmI~8Cׅ~93y)x,Xqhx.IW+2Ɏ483yg:y6@B-u"FyH3qҔNR9o(rXZ\ٕ^\;transcriber-1.5.1.1/doc/img/inter_turn.gif0000644000175000017500000001564607510315720016244 0ustar rtrtGIF87a @X@Xptp0`as/trans/Dczu r@re)nt@/Pdoc/imgintexr_tuarfn.@gif'?H% @ti@@Dz @% @0,Dz  %$%@@蠰L0DD%zz @@@1@`,Dz @LDz @P,%@L pDz @h/lp,Dz/ @@,Բ%$/@@DDzz @@)@R|@,t$paf,Dz  /@Over.nwXr ite ex i2sti8ng f_ile@ ,H*\ȰÇ#JHŋ3jȱCIɓ(S\0bʜI͛8sɳϟ@ JѣH*]ԥ@PJJիXj`ÊKٳhӪ]˶۷pʝKݻx5KY LÈ3fK^y6J˘3k:Y2_#켹 ^z5ivm fޭ4oRSN㼓o}36ɶo̭[ƑSՎqOeѩӖI^{U)oߧ|g| MAy{=a| &_Fb1"w('b>aMmb&bM.v$hEߒH{3T#d5冣O>Ȣb.Yb0C~ b2f܄6detXށ'zkʄb@d~y&vLSV&j":(jgbZ x駒BfypRzҹhmb!xk{kº۫n+6d ܩ7)frK+.S:FGl׺+Z~U,0' 7G,Wlgw|p $l(,0,4l8<\=-DmH'+l._!3-TWmXg3Zw`-NKacletmxss߀g 4 xn#_}|p%Onyͣgn/W#zO.>r麟,zS;#/|7:%$?<oorևח_'=>{߽J׾fkD6U/C_ G@ tYR 88@߉/Da cx &v w@L&,<2"HG"0Pbʖ(*ZQT,r`dH2mfLՆ5Yk#HG%0x̣> IBL"F: $'IJZ̤&7I-+@@29 %*QfUR'cJXҲi+UKn%0MaQƄ[.L^24Q&jZv\ ў2n̈Z5I i .$&56$=}~ ᩾Р!BMSH qz)^ m8O6с6 SԇgJ1:u/u`OG r!U_ 5SfE]DUZTlN1ݼ k:SxBg Æ4*Dm1IӮFU L:V+a:Tשx{m*Vљ)VlcjOê,f=()(ԠL^YS ZRC!j-8V֭+dmGoѺn+%\Oۜ"KlTe?*;gv;r_*34It]-m]Zק s);JWzÆndaw̎ח}N[U&˅`t}iO;/GiS5q@TΎwuŪ0 ֶ.?M`ÏppXbR*p|e0QL,ӱcN0J{f\f]6mℤπvJYXfh@Rѐt-dk&Z1Ŋnxoh7 ԡ)iN_ˋT;_R|pjWW`;JCqYL_SsTELDnRžuA^;lZ|dU]+[ePnwbExqìwo`{!w/  .8\˄+%޾ry7{ GN[wI09gq\g-w?+d8aɑvyrN*s?݋4}H8rO)ԑV zܨ(I+kZ8:ֽ^5Q(ܟ`W9F3/S?tGxlL96Q^z-#|~7w\Ix'W~!H~؀ww*}C~ hŇ6ģ|sjf8I6?f284XF·Ah^JYL5GfUN\؅^1r3_Xfx slH6i)6'Wvxxz#7ym5~$?YXL E;ЈPxڤu(FCuh˷6D8XUdGtEӃ<ӉD(ExVtч8㊲Ȉ8rdp8`'ZvaNE\Ɗ+#HhpUǀ6{fx{H3h8B~e(@1j^f@|ӎ؍Thx_n(JhB;cGdy)[Ȍ?eES`DXBG,'g 2y쨒~Ӊ #h]iēCC:$fD%X8ĔGnAS8tzY39tVzÔe䔔gRxftL#Q#THhFddӃBpacaPnxvHnh2hNgk}kp@xFzIQٗ}F#e\ ϵmGmWxa暰i\u8鋖dYәkȗR藀Ti`M<` z2)xTm_VÒ8canx]u4 >'Yl-)~ٖƕ.SJ^(کY5I%9u_84Ygi"~%dkd4v $}⹃b2fdG5?yI\]ِq(Ot66% {d# gF 3Js5"ڑftvÒ馡i>ط}ϸl*H3Y@FhGlZ_j;r<Z87:zb왧ͳy٧jI(Z`dʣ9ʙ:pZ:tȩtiFMǛMYWuW{UZӢlv3O ڌ語y)ئ5}_JUx3J:6*} 欛GɦxA9kC%:Փ{˚3*8n qGH:* ;cOEJð3Z 7`6i{Eӱm;z+jZ)IOj2:<۳>@B۳0xQz3&;85kE:8C; A;9T?[ wzWc3}ִvU\Vۈsv^ʑd{5KuIۓm Q7k@R;Y[Y۶U블u;n{T/J9ujROycN(kg):mkQkۻ˻;[^іZ*RR򨬹fjy{뻓++˸; z7aZ:,Ӏ!֘7G{L˽囻[˻Z kB9ʾ +:aJ.aЋ|Կf{뽷 L”F۷嶫c6G4bƈuzgjeTP9CX>zۦۉ\`< ܿlaЭϽnڧ }֧=]6_ ۍ-6M7-ߤ1k(l1=ޘђdظՍҌD ࡔ;XB޳L~fC(Т}ވH: +N%B5F7{ ߝ-?@ND^F~O65JP=v! 2"^d`>2I~hj XWrގt^xxNz.l1OfߍhZ^Ѝ~>[ R4]a酾J*Eޥ._70M ^FvY†] D`I(A^Ej3L[ [suN஺ Xxjݥc\m}mIk{Z}ٸ2 ׯ͛9}G_{:v؉ѻ-~"QL;q=gbw睪_ /=ȼ˲ ^ /I?OL z:ש$Ϛ2c ;\܌L=zK6t%m{kRH?|dQ]$/c3(+λ}.`J6~:qDKuT\=^WO3 N.t궮 JVSNMnߪ߄N4Lo/ʃR?}/{n}Lz_twtwtQ@@ DPB >QD |RH%MDRJ-]SL5męSfG1P@PEETRM>UTU^ŚUVS 3hWe͞EVZm*3ϱośW^}8ף_… F0b?YdE ZjŊ=ậkZjNG;nmulڵck[h:I֭pqqSo͜3|@i=9Xדg7+^w%N볪g}d_9/? s,L N@=  D,d C<*DPኰCRED$:D:1mL@ACѨt%m$(<rH/D#=K!b2M/‘I)YѸ,?M.lq)1ǬL6k3P7M0R55 3F>5kTG/%(m*Qݲ7JI'' WPt\PND52Q 44PqS{Ws Wd/fsuDevZĪZφ Z0plvc6޼Ռ !M~HN[ `0n>m8c-q6?F ddW4e_ywc g9g?ygoΈ&hF:if遳(jj:kk;l&lF;m˦#߆;n离n;oo_:hǯ&qOٟ%-S歁/=iw:7 'tק[Ʌ\S㧯G~h` D`'{g荦{F!| F(}g" 2"#&_"(4cffaMmvcfٸJ$wOθM2Ya($Mi%8ij)c|­Y*Z|%HSUWtg:YnV's"‌okF夛ef%L^W䆦v:boPvz>ڧJV*Sӆԃښk꧿*Zl.)O%[l6m~(BFV& 6aǯ5@^ 7G,WLk!w ,qi(,0,4l8<  DmH'L7PG-TWtA[\wdmhsulb-tvwa7a{.zM7'G WngDܛ.yܟx鬷>:xzۮn{/N.佣9゚ {t<#{} |T@g{g;=fßL_P_Ïcd̀|[m;&@!pj`{? mGmpp(m/%-3 mHh9JC Q3wxBE< [8< PJa,֐>bVP~MD_ؗ&p\(G.͎Z0qa[xrn# Ҏ~o(+nm< Z҈FcAH?~PDbC OґcL`&Y-E=HJ^ %86Q C+"Qt`/uY.*Қbb4#)J$'mNf))Ih󉅴&咘fN}zsRQQ|c6:4ʬsD(>KӐBͶFf1}(5G)S)JWqΓ1i0Y?P;]iFZH%ζ2VS62X}>ԬJm*JaghL˪ճ5cWVh]k]vW,&^kaA2=c'8R8ff:/h9Ѫ'3j~ulwͭZ[ᶷpmWQ::7t3sz^]_;Z>N.븮nd:ծ]E/k\rպc#%_iֲ|ok_k77lbR ط ̋O,Z=>ӟ5+:d+;p!T#wMbu~‚c0U\w)yJs1/c:kBBg[\ahy򇋬2٠JF 6'yb4k* XY1iO6S{VFrRP:20[xǑopoZ֠L=k)/td)U|B ;g'RfN4^kZ1柜dG1C#ucWV_G/*83'7b-zm_ddwsfJN %kC|=j:Fzg$I{WHPcLTyMhiS{[PFciOf 5|4}^kwkiGbDGDI3}ID&L}Sra'f~icXw~L~'uIN۵uGJ]>`mb>dHNҵfk>3\HXV86`:s9Ç5PrX4@xxoՇ88sYdU.W:uHTxt%fe4\sx\r؋?]{Xmx>oHwuNDhWl\VPf~z5kss&y`^Bg>{GfhfVCX|VgA،v}dÏZaQmǃ§zoVuG8?&-bYajglؐvxw*%{B(F6HjJ6eh}rf{8hzדHÀ$fhylAv"%{(Nc9yzv=jOtgqT~~dG(lt*IuTS0hW5|lgZ|6^z&8/Ug]f[L9?O 8XP 5 wwQAP醔JFT,mi4(zDVeГc7XW^w&LٛDhՍxhF憘x8p4םxuFGHyH4sl)3hAY6#eW 3؞XʈEX zS9):kաs y"$È\+:\/*\_3j;)y-U2I;=jXcJLʤ)6i ФXOʣ u V6'xU(GʍW=J Yj[j]菾3h't/X{ɨW9XqiǜvyyGjJci| rzybٵڤl PS2ɂ`:9{w4 6HFh>9Y8I:m\JCJ}qƕĪ蘓TDTkhɬufҹtWz*S~zLY[jɗٚӖhTʮXjJ* ;kٙ`itkjz~G>ʫUkWJǚ) d"Gk " 7Zʲ:j~8nUjgZ:EiʴM. Ei @`b;NP2S h+[ %1%;Avb~*;>u۸;{;@c۹ٷ[ EۺKr;k2ػ(%4n TZW g>[֋p;^yۋB[6;|竧;+SkZxn5IVK՚M9Ca4VAfKWS_5g6_8ZSKWaQ \ N7P\K+cƋf^ǒ;KǃN<>Ǖ:Lx|K[ɖ!|x\ʾɦlʤʬ9ʲʰ<ˋɶ|˸˺˥c2<eKn, ,&, 7LOi"o,3Ҭ$+or oGs7S+:io>KoC|.[/LL Q95)[(ut-lgqHv݀}2ހrGm*)Z{5B.ΥpL:<)S93)y#y`1j{>"~w;">:k' 6d;**cM=-ü=)zO#?_{ 2 6X7#y WGzD;Q2Ȁ%Bf'Ap[6 }9ox[4]zCWS" H@xHb.ߦSH=1MI\qSY/e"˸Be~XE31rtڈG鉍d(#FڍQ ;%2b򇾀S]F:#7edHIzҊ\(9RK} (zd#ipf3*A`n,cR5.A{!1fǴ n 3/c7 NM"k哋&so4+Һk^D1_uO僙},R3q<8"qxFɀ->zSQֿ~\{_/=eG?Dw2To$k)鷀"ȀueȀ ?uf,TD(}HGTDPL'0F]Ċ" '\؂A&BV(%ȄC^-X蘂ّ> #"99R&y#ǐ,ْ.&294Yp,:J<@` RFyH JLٔN;transcriber-1.5.1.1/doc/img/de.gif0000644000175000017500000000013610122050712014415 0ustar rtrtGIF89a !Created with The GIMP,ڋ޼@扦ʶ ;transcriber-1.5.1.1/doc/img/forward.bmp0000644000175000017500000000044507510315720015517 0ustar rtrt#define forward_width 16 #define forward_height 16 static unsigned char forward_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0c, 0x03, 0x1c, 0x07, 0x3c, 0x0f, 0x7c, 0x1f, 0xfc, 0x3f, 0xfc, 0x3f, 0x7c, 0x1f, 0x3c, 0x0f, 0x1c, 0x07, 0x0c, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/img/fr.gif0000644000175000017500000000013107510315717014447 0ustar rtrtGIF87a,2ob By'-pb' mb.7k2mQv67;transcriber-1.5.1.1/doc/img/backward.bmp0000644000175000017500000000045007510315720015625 0ustar rtrt#define backward_width 16 #define backward_height 16 static unsigned char backward_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0xc0, 0x30, 0xe0, 0x38, 0xf0, 0x3c, 0xf8, 0x3e, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8, 0x3e, 0xf0, 0x3c, 0xe0, 0x38, 0xc0, 0x30, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/img/pause.bmp0000644000175000017500000000043707510315717015177 0ustar rtrt#define pause_width 16 #define pause_height 16 static unsigned char pause_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/img/inter_event.gif0000644000175000017500000001140307510315720016360 0ustar rtrtGIF87a @X@X0`%@0DLz @|)@PD\z @_@x,af@ͯH &@Ji@@G% @0&@DJz @ %G%@@蠴LDDzz @@1@`,JLHDP%@؀L $.pDz @e0)lp,0), $0)Dz)R@t$paf@,Dz @ 0)n)@ 8_@,H*\ȰÇ#JHŋ3j0Ǐ CIɓ(?8@˗0cʜI͛8sɳϟ@ Jѣ8W DʴӧPJJQ-ʵׯ`ÊKٳhӪ]˶۷pʝ 6+V,Mɷ߿ 6G,fyتǐ#KLyfcvk]sN$,:giШSüȖ=lոa޹qϝwoϦ m⸇CR:m"|y/_\hw?o^z{n?Ϗ>ե_~Y7cѴky^xH_'{77!H%hYf z6ۃXv(Ӆ! E&EXӂvEhی529arzfɣ[YiR(4rU雊zob:b'k1>(U8駡hfxJ(#NjK߹ &!M!h֊%FkZqU.wlF+T-lr>;vS"kO%Z+k/\n,wo]& 7G,Wlgw'p$l(,0,4l8co=Ws@) 7<썎tH.`'A/y뢧: y${Fj֬}*!R(Co{G@!:qgB|cD#ήd^C)z1fQʨh+b1u+Ɩ(tpިǒ|ź-L־B̑$!I=| IqG2,]QWJvkrQy;~{l)a,z<|ʫΌe :Np6koLV,pdPL3˗USDm~Tf7sγ|4'6QIoڲ\;c-I|Bk$X(=hpQ$#ѹ}li9֔db[ԩ9j.gժ~ ,^RWU}-EWVsd&VqkI*E =*6)%[~Qjb}bPK~tlh3UJT Ӱ-BHJgQмvXqg~p|Ʌ#n)"7%h]nq +Mz|Kͯ~7d LN/]:Xr} [x} GL&[W\EmgLV8αŸ@rpc &7vݏ*"5Tm69R-: Ry-MifЖ\Wdg:7ZC2 y M. 22fّrwVܠ09ʜ)@T?tz5gB ΏL+ڀ~Jzŏ2gjTrGan̹MuԜg]ެ@iڜřf[ӺLb3;#}/݂n6D^Gfuj{.iB]S[8X޻f `SUTf@y-e 7 ,ISS:v뛱b8ͪq}6g_&h}{n۹T^/s9Xw9TYCy:κ,ުCZ{,䲛e8|ⶻp۽^θ$;O7C;<},[ϼ+w{~h]ћޢ?Vz!|Z<`n)QDۜ('=P7ֳ~(%{OJs2>'~ӣT5j- yC8`0{TWUn>}ASDG[gZ[|ǖYF Yu8´kRJoFrh%ǀ~͇{VCFVXFVf%Vg4iFׂZƂVZVjXTVƁg~HX{d'()HZNfVN]jNY?axnx? (CXJXWׄG7gji~8UWwV>$q#j&L,\ejb4h\siXUP8K8~DBc}M\ocȷ4LTJ(gx|ڷBNzX8(uWx¸wXvha({8sbC`\Us63|gY#KBCKf>|\ka}%LFn2{r8F86h|5F~573uXnr7=7x7w'8sj(Okrni4y{TAȇlsIz p i~n0cIr'i¥RweƇGא"gMq65G<~zEW h9tXGP͘oZ(NY|Zi^ٜ]y9U։]G&9x)9t_T24aIț䉏AcI22y2)30 E998}SS)É#ɟJ5j3z4 3 Ӑ#UY~2CJ %34zjI);Z< 4Az8J1IÒym}."XvY\8[2E:@h]*kZcڦo:LZlX0v!Gɢ`to)r*p ?:_7*:j`JJDuj<&T9O$OqJs[yڣeJ oʩ6(y}ətfJ^5zF:0ZҺ/j&C`zڡ/鉂3C몝٣E*@DߩXکˌ[x ۰^y[{+`X"z[u+sw( a!zӲ"2K8*}f`Z+왋V;K`36$+&BGHML+׳a3Ce[;Z99GkHŵwA8+越$ ec+u^69?+WK}+X'thC|{^~[FW觪Dp) BkAliY֚lk'M{^ĺR2WɕRD`o+e<9&h+muiykdم);vC6ûe{[x EV5V;;KTr< W⋸LDdHܵ |> TgѻrjkhA6p;(sB;EK7+H S6;}WÅb8,8&:@ :<FGHm,PR8Sz`PZ48]KaHaM*jXa0M4@26"WƨW3 X;޸+XPMDbUT``+%Z61nIijb'`$Ι)i&i(Ԝ~Vcv`=%P:8TNbaᩦiQ)NZQRZejӦ"g]RIdWjavhe!*lɪOvN)$qjԱ킊lX- *V n8-W&u)%Pbۭx8-,GK/.'3"ˠ,s;=Lq4꫹1@|S.1we$ܭVAp+3[]WofެcMq=$ `]&joU[M51/nBhbL8;Mq9/QeBZno'TB42(fc5\C(4-\LLe^&NKz4-秎Ce*~FeծZY*XgUzuѪ|V1ldZٻN__{ؾ6cnBv k>.5~+8&Z[Gmn5û]׻޸^s]pL: M pupgx!;yɇ~c8^9ơM͆c~~Νj_ֺ~NFտMj%ngOXpy>}uMX>ɀO.a񐗯Oy&3>Ž>{~Ǘp7OwOq<һ~~OWzgG:O|3@O;ЏO[>{O~@kR[]>iO_TTV7S(U4a+$ xtxL&O!B+ȂCY.3(e}8;ȃ5h?8DV(XH`%J؄NxR3)=8$ӁT$^j$,ҁ>KlqS6OfWRXlxnTpH)1x4kT[{h$`XR@vJxroo1qr+s؂{aK%Qr%x8XO(9jaQDעRH؇/(k)(GhLь8ԸXؘFq؍8p蘎긎؎8Xx؏-y ِ9YyYdHّX" N#W8%4M*+>@0BdHR?d0E8i'ߢ)*.-B6󔽘D8ٓ2Os+>X(YT򓟈$5a&4KN3(EIxe%Rg6m9D+ sLXb)yC)\ayM%xNيԕ8"6wY߸t3PɚA `>o-Ia)NrY@YdyQYᘒyeY)I,;transcriber-1.5.1.1/doc/img/inter_info.gif0000644000175000017500000001047507510315720016202 0ustar rtrtGIF87a @X@X%@0DLz @|)@PD\z @_@x,af@̯H &@@i@@=% @0&@D@z @ %=%@@蠴LDDzz @@1@`,@L>DP%@؀L #.pDz @ep(lp,p(, $p(Dz)R@t$paf@,Dz @ p(n)@ 8_@,H*\ȰÇ#JHŋ3j1b CIɓ(SD0cʜI͛8sɳϟ@ JѣH*RҧPJJիXlR@˯`ÊKٳhӪ]˶۷pʝKݻxv ӥC+ La&^XǾ.vX˘3kL2:=+蜢9^ͺkqƾ9feؽܯ=p'OT.5o:p!;λɼfǫ*}1+S7Ҟ3)' rxr`y"8 VM!vi(dކhן("(+b2ǢҸb8^t'E_|Ao&#3F6>y5V"Kأ*{>]l!e5颍i`VB#h}|9LevwfͩIEi(qG'^{ơ}FSAZhڦNQz)yD~瘓Sz٢o jO?!!κWWn]Vke'vH+bkJ.iBϒbL+[,l^&G,Wlw ,$l(,0,4q8<@-BmH'LLtPG-TWVg\w5^-d2flovp-;1xk {ܷ~Lqyx$7x[xsn9w{=v{<9ˏ,⭷_.޵\۞8㗯GMW/}CG}WS_<O;/>v? y(s짾oeӜ <0~*|7 ƫeع$7̉P&aﲘ /64FFw_U񆰃<ĉ<$]jlb,GױP&}(3:ԣ#7)pG)'2D$#WHH/+a/=eΈ4/EEP48zp3f=3.4Wg0#+F+/e9vꌇk;Iz ̧>I3| ϙd@Ny mY$X2uofD74Tu$_ )G j4scGWҏMDe)j24mNR-RShaŝu=m)ϨVE=TRb' :ծS5$)7gZR.nΚ,DWתOp=}׺5in^*яX Aԩ)\d6) :g=E͡ư|f7rS$-H:K >O%vs,'24jkͭ25Q]8Ғ`BjԪh 9;ԩsdn)}IG0sk:Ȝjt8r?;[AFpE2w4YT3e'[[YNSW(YYh*3k~9Yju=h}AD>VE;l~I[FVM{cC-jO+f6iY8fqjA fVYjo;#-]u3 m8k5z37@]q/[>Wg!kTf;N"vq^bG"݀gev6X`Ӟ+FQx( n)>Wo[czX22} F~,!QLO߾U/aHL&i_%/YbU6&3U!631XsWKMmOY|zw16J4~G{)y_d7Nz̭^Hq4uzEb Um3$e_;Mx]N۫sY*v2:imwKP8cu0X?L+Z{WMWlQooE˲}ڷ1>%ל2ܳ hi|=1gcזs!;6VVVoegX EYwo_~&e4{tXu^f6y7pErwj2'zfE_wFrfFC\{7xwsmwцwX;(Iu~@qE6W'YHGzEs#w&}z8oJvE7(MB qf9i8ifw~u~f}~DŽ\ZMSÆ6:QSY{Top\fQؕRWWēsJŒ4DXD@ؓHtsUONxntfJdyTiYakٖApycKȆ}N9^Sk]ǗaS|Ŋqh950q5K E96F)3&RL1ՙ}AXI9x6y9鏳y59xEWuXN|grҩ`Yv9^ڹ՝޹Y5[ybfI^ٞXY#YyaٟqÞ/ZIi  72a5РM3*VcTơKm-R#fIkC,PâG#i+CLc Eãe*kH;9FvHZ5:ZM+ӤE/cT jQk2\*\`!s]#)4Ts*2nYrڃtz#im#uzA {1X{W:f6p2jzaFXn&өVS' ]${1 XZRR*Tڢ^:5J>?㫒R3ºWƊ6j2*4ɪWѺ3h5 4jWۚ3 6ګ`Z3ڜ63 W:3W 51گ[{4Z2˟; z`1q(*,0աz2;4{8Yӳ>@B;D[F{HJ+;transcriber-1.5.1.1/doc/img/inter_editevent.gif0000644000175000017500000001035707510315720017235 0ustar rtrtGIF87a @X@Xptp%@0DLz @|)@PD\z @_@x,af@ѯH &@@i@@=% @0&@D@z @ %=%@@蠴LDDzz @@1@`,@L>DP%@؀L (.pDz @e%lp,а%, $%Dz)R@t$paf@,Dz @ %n)@ 8_@,H*\ȰÇ#JHł.jȱǏ C: q(S\ɲ˗0cʜI͛8sy@@ Jѣ1}@ӧPJJիXjʵׯ^* ȳhӪ]ؒdifDJݻxWΝw,ӥ2LaWǏY"h|3|q.r䔓)Y@ VNxthǦQV-pk5u_ݼM<,^mv?vwm'}"~`)s\H HAx"z`u(P)$_h&\3cK{-_r5$%J2 e?שJBrb)Q;nTcG"EiIiXN<;:SW'&9SsS9$*FJΣsJ)SԩZ5+yծZ0PWǪֶzʬ-!NSNEխ+i\ũS-t" uC0Т=h(iJVzdDҡ6\,LO[Zϖ8?U)k{WRR= Kf֢?oNpeYO4mo )NJ6U>5o?ɛK}o+_ҷ/~ kz *nep ? <_"Ndo: Ѐ6U)aQ!-8A*RIwĩr[ڤX 1&+r7Fnu9ljJbwDnQZB9n__\P,tl2Z+晚\hNf6,jL:eg=[Ϟsy?n#hm𡐎'MJ[Ҙδ7N{:ԪOlԨNDZհO-|VEk[ѵ \FjG>틣iW)8%A'CE6;֬aDt:6۝k{Mncnz[^^R8@x<pb/הtEgv-`;7Qhr3w6])c\ȍ \'@Э|HO:ZRPԧN:/ʳs=[:?.vr`:ڗyvhp7s5k};5rsvSCx53!?[e˩w{:nG/arޗK {Nrb3j\dm[z~MzћG]Z4]GRdx|uYė{+S`T%xzy:`u|7dDx!gl-Jׂ-Hv.8I|vi'n8wjv>L@?؃DhKCxJXKL؄Ywb(RsgMVhSKu4H'|Bur[(nh'Yrm'ohgn&C(H(suH|3ԇQ2TkHr(FXH舴c$yx{BLI,hglX&4I-Dh'*#~fH[6p|rW[m zc؋ȇˆ^Xn:ĀȈmkxn'}|Xzz*Hhqܧ{tX~9ċEo{Dp{2 zwog|4 }[d~x'q8j(')q Y$ y:>eBI6x(#$QxdSpvQXR){`9i Iz_9̴؋dȒIhGtF!ٌX{y|Ęىɍ(is@وITH,2Y,6)x29-Ò;wĊiRpuiv tyGȅ&Yy&ҹ칞)Lɇ9Xs)A:֞Y):)nKڜGݥfP@) *)*)e**eҡW D fM9:2Q,*@.z*(0 yxڣ̘~Eꅮ8!Dm;z:p%iMhqΗnd9HjLO|22ť 2ᘥT/ħgj'v"w*w{J~v*4rL^㵕i Pj~UcBzzB?zڢoAҨ>n*jq6ꤳ**J4 x?ɨZA:*z(jN͚B:ZJڭɭફ:*蚮캭?ZzB"lگ:S2~QDlҰ;[{Q;transcriber-1.5.1.1/doc/img/inter_cursor.gif0000644000175000017500000000456207510315720016564 0ustar rtrtGIF87a [PTPptp%@0DLz @|)@PD\z @_@x,af@ίH &@Mi@@J% @0&@DMz @ %J%@@蠴LDDzz @@1@`,MLKDP%@؀L %.pDz @`e!lp,`!, `$!Dz )[R@t$paf@,Dz @` ! [n)@ 8_@, [H*\ȰÇ#JHŇ.jȱǏ Cj (S\ɲ˗0cʜI͛8s@@ Jѣ;}$@ӧPJJիXjʵׯ`.UzC"Ӫ]˶Y˖,Tf\x˗]c2ۓpÈ+ܟ <%ȋ3|üK3)/cI׬c࿧UKFI[6^؛=pMsg;^<ᄑ[چ8nކ#qa7\,5L:vz;'Ϝx#JttY{~\}7e4iBX|ʧ߃ݑa~FaYWBW~yߋ 8*QJhMhx!ל?cݥ[j-TxB2uqY`&geh99IV%tixZgVnj矀*蠄zg $袌6裐F*餔Vj饘f馜v  ꨤjꩨꪬ*무j+z뮼+>6V&6jIVkfkjMR:k覫nnor{ 6*pklYp Wl#HBL$XF s$IZR&Mz\V I8ҌՊ f2YHYIX2òe"E%R`r%#sCr X0o9La28<ezf.Ejj̚f&Ln>ћ',+rfӜNDMa,S-ef>!M>34_<:8RT\bD|\IhkrBWRc zwԦ- K%TU7Gwz΃ :ώsxgHWK5;`ŝX?Q VuJj7a.u撝*j\˰ՙpuBKkL:Nΐ[D\}U]WƊ,2Sld6e]!GE̴]iR:ͭpҋ +B Mne:Ѝt{(Xͮv#2;5y) xK^PMz|;transcriber-1.5.1.1/doc/img/URL_split.png0000644000175000017500000007534310137467237015761 0ustar rtrtPNG  IHDRz" IDATx}^G}7K_$[݀n$ XL; sqIX26'^gHO^L;fa9gćE`[e'&C!@@Ԓ[qRUݺu}yn?G~޺U{_}Yݾ@U@}[*^It׽uY>uxh5:vf=! 7k;@nݺDN_~6! !?p6lxׯ]_\]s3 !X\8uMBN$NGDQGorl׿~͚5u DZc>|رŕןwy7ov.̷/׼_8{s|ϟy͛7;vlꮿ0Vt?uկ/-N_GQϡs_?nݺW_]grZ^^>|s=wĉNӑ 6lٲ马nx{/HNx;K ~k_ҡ+n|ǿTɏMo]sQ\| @GtHNԉDo]߳~_?{~w~^+,ZկN8yҩ5kزe˖-[o*޵"uD'RV.- 7_vheaS߁ˮv[<,VNe.ҍxgxhD#$N]57|s7K.;f6+++/:EˇpٰaCooC_tqOo/˞-G;QIEcccg˙:BuUO}??po {Vn#gg?BCB\x;K B x~M|cKZ6̷m$^(q$k6?Ć >t:tD$9|K^򒗾ek׮Y^Y>?OK6owXA%};'8z|9'55LV}m<_{BW\tok';)\e6 ǝ6/_87P}߼8/O2%^C=o|5WrmE舳sKGO]>ݙ'?ѫ_jTԩS  }ի~/yph˖]tO?v``Ɓ G׮Y+?JtOqؒOP=w^ӻ2gkx;\w#3ӿ~??rbg-;_< !&J"Y%Ui(Ҫ_|߼i$іʛLWIIx8gȿ0[:MaRq[yG/ڻRrf!u[n+gя~+t @e{N/~_җ,..ez{{;ӟ .XY^>vMK-ۂt0/7n'Yoyyeu===Ǐg(ZZ^:qĉN:}֭]Y^tv^\|Mbq j9ݳwfV=S#:R'>|sF\0'֮]tbOO˶ߴGlҾޓB'$!z{{{DL8q±S+A'X^9m\rsyKEǮ|7o / ˨䍿⽳e@pk]O !~y&XvE]~'/:NE}}}[n+(:rȡCS)c\xQ+/-ַX!矿iӦޥE!DOO{zzN:u#G 喹ڏ_"{M7M&8y=~u9O8qѓ'OV\InrK+ կ~o pj> :ԐJ #E 6 } oxCݱh-2^ԠЧKx/qN3!Doo A h>!D_ot~|LF!"&y-'N$$ @C !z"!xE3]Ⳛ" h>!DoO$"69<޺ sK''2.WIR)m`=җZ8w2[+H >!DOOUWߥ2UfJkB [APYJkh<T6\WQ$rLj9e^׾q6B-qvPSo+\3S2':*ijy\#~AV/B!N&J&!2eYNZ#4vʝ<1(Һ%ΰLSV^cVz이2rU hdP1-_'8-:4odBYLӦB b=eZ1% #$6e 6Tg+ -ބ0BA>ꭋdV>cljmzh* !=<<ē{aŪ.'-vEhIeUl '2M2S' ,P$L;NR\v6h_g~}]\ReNXʍgl*gZlq3 5_ U̬Nr 9SEcccSSSYw~[B [,x 2զ}OnShO^>rM5TsjIrg]tE"~2\ކꊳ^nZr/-cYWjFdv"/xD h'2^@;;==]qeݵ{Wqa>}OJNx(8j67?Ns+عsgw}(sV3NGJ9u76>>^R(K&''wNg5hff&y=11811a\[ql+>v`[(X"-y/BK$ʌ0z&鮒i0xt8[(&;UWFϪ#mxx5{% 2j6%rlBmN"1nU^jj^ 799ZrigA4DDxv}:Qggg'N*ocm"QR&F}4GI1{CyG^Yִ= c2wJ{r#H?o/r 4g?,Xƶ2;rl[(wqR Z~L)a ~| m4D"+DcccSSSO2PY ޼Uox[Uv( N7'qȴk x^ǛPxƋx\sTL:W\qyfIa=yƵaXF#lyeYLeސ>&eǡW}p_$x}GXAoHܸ1g)-umNO rYs<1iyʣdYhZcAJ\x 3^+*^yь7g5-(v(ě6fz:Q/)4\2XZNqoSb{;Ʊ\yox3|w1@iojxD h'2^@;کYjMY8Pw;`fGs߬;To0`Ndv"/xD h'N@KD4d"$ݽ?Μѕ2LP=If&IN+*P xTRsIw/ v\ @.돹vXr*n @8Wrߺٸֲ9^@;ډNdv"/xxeǟ;1 (Gv›vd, hs7m,/ dwVm%w[tj2;ܹjϣO.<`!@`NUg;n޾7 XfG%uPK( E?mΥ{mqHNWE92`[_+/MkHV~I>7WDc=4U*KJTrbv`_s.L\ESX<;H[ySqAff 9;oɱE.[uYYș.[gq_H7{Vό7It M,ʶeo3î@fOP˻6TDzj\IwOH)k,QsВZcWyh7|zygzKmeM1|4.QWǶ)F[=EW4dV-wR. MJo_Z^^diLnye c$Bd/.#x d1{~,Ѵ8ReTM-!e}diW#'{u:!DE;wB!JT gڶ$M )-۬+Φ*422"hn~nzzZ199)*^yC 4_W$K iw@t"'4odM4d{$dYnq*5$%ꇮ@5x0D5!3踎Ndv"/xD hO'ڸicyq # uMy m?_w8޺Co7ѧ{~kdd0Uռ;n^qU(^KɴM+ ިvٸ=N6`g5)ߎs%r.g4.l%Ė+:$S^Č3zmr1%o7t)PS:[Hڽ+H=^+'B+' JUhj2.\,"j RU9^e413X^,R[J)J% AײP{O)7긕{.96U]Mˊ{s1^8~YY4or 1]jbbj/䀍䒖X%iYc/DV6^&_SqENAJ)d{29$UR\fzjT3m /όWNw3B1::vѳ7}ôhO S<Хd4OK]JԮYtFk ǾU5FGG¨=xeG8O\&>:_SrZ莌W-=ySORPY+[+T:e ϾVYnrcZ"okJyK.[eo=BZXΤ-R g.PrSO/=2aBi}l3~Zѧ5RUhiGmފT7[ӵrIgV]Ve.}lm: Ɛ Ziev\5<3$5?7lZdqų6GL"_LO:";w !EU0jڶ$M {ִtkI!DEssBI!PjVH^IVnWkD#4oIȅri=uDfd2>V4vG񵩵T0m Ea495jBl1 }@]Ndv"/xD hO'ڸicyq‘C<ރK쟯;h.jVJN-# ,U$"f,k)颾˴`+-Rur)rz0DZVl)D,q$f_e 0x 6ǫL&?fqJ-Qy$`eS8ײP0NdMúp*WRgDYeiƓ/-=#@pU?W{jUsxox.'*w{ZefV+_*I?GJ-@+EcccSSSOO'Zlff&y=11Qc$333qlrB XRRĸK eKxw1c2 ^_W X͊>v`_MLL4뻜j/䀍䒖X.)vDSJ8\[F WF*:B=+O$ޑ&wG-1nj߻T?M^a\ T uwl9=T3ݒfz= 7I;o]\[R Yלƚ?/=5ի7bʒڇ2zk0*t*c[#x&Ukttԯڿ*C '\n%XA dovPz䙗*_k\b6Ya{-ѥcIZAn3V-h轚Ll3TFeI;( C7F_3=ysyC"o$Uκi!RdK2ˈyK:A/x?Cjhƫ嫿K)cqPk%i /2ivZ)+Zl%mcX=R<Ƥ.-hڲ3)JM!r^Z뙭7wˈU/ϜHO@ڶEuG+=9)e(V_94[)cU[ytM)o eK쭧UhC{|I\1XKYGm ̭=M5V^pE~e.\+pTߡx;9f&B=j+cX~sFv0gƺpLSde+q4_Zd KLP92Jn &1UWT'[U@5G1_WX='{u:!DE;wB۷Wxi~aM ,[ X}΀ w\_a6 e{E%Lݖ̒蹢^_ 'h4V=0vϧqO{mrܧYz֊i\k.C+mK v###B(禧Bx̻[mKҴ_߻j5mWzkMG@JxjZ+7*R/jEWw @w<L7\Uw.Br4Qy]|h!5!أ] V'2^@/M 1t/FJ\ h'2^@;ډNdv"Smܴ8bB!<ރK 쟯;@0|Ʈ;;@Hxc{}*xu9^@;f7oB^.5ˌza2$)qv#/%l7HXe\G/!6:^%5x#{)emZiu鮽u@+M$$YV抙U+r睻2 Sѳӆ'+M r.@T&gS9)L'<'h^Ǜm-QZVٗgky6³d"u{~0x{wםaݲ~=;J rd GʋsxD h';OƭW *q xVmf;::j_,c V*l!aQ0˛q5y6VX7l]:qp*rGAh8⎏JrmU^Hg5qf}zԣ{hթJMK2# +x[ -CԐ 3*nvvHlUl8eL %  \5dž=겱K:J%i(a?k@.7jG+r5|*^|Cn=+`aC_tʲ@ӥ=>7Uk5) >4"VU=LfvJ_6n(/7I[k LХ;iaؿ{,/a GòJ;$kx#Wb0cXmZ/o<Ɲ|߇pƯI JҫP0HKr:os٩0~YaޮDaպKhcW:"m(W«k a5gx_ ,hJbܰ+DcccSSSOm?R2_+ɖyY*|gdJi/K}{B/_7Q)U~=hK(w%Da!(BLNN !W9^eB!]pr٪Δu$%Bw*#:CԲ}& ߛ~]O]}1uYV8LC/<~mdCȌ6/\}FY2{[ ?6D7̓ۗ}Y*.@ȽnQ(PU͙?%Vhf_Y?c׻\ܕ*#SYƿ+l?7D/|څ^w/eشOS&[\ql4KE*iVV+睫)͊\?ys}8~DZk QUo\ΣBw&L7odJ܊u)a$i׻;P/ mW"sSOe2R{]tlG][_e*5*lU3Άʂ<OwAI8N X>j3 ˘["T³kϴ q{y#tiG+ԫuٕUƮYc|;Lk7-ONޑ:wYdƮ}8؏(.75~@Ze{nf\~!|;d 3z?\*78-8P cNos9"_Bv=r7eEWU tߤx eBKzCB+x&W4O}*R\~ h+~Eptd+nR1joqdbr < @ÑډNdv"/x$'&&'&&k+ |E3q+Ter9@V(UxIWW/@:$UR\= zgz $m]|FϪjîllLw9소fgg+U_5)J|o!fgg~9ެ2 oawYg\͝4`[tP|)N~7Tgn.[UIqH޾U 34$rH/帵_ByRr<za>G{Grl}eVR<_R8Ba:,owy8E&U?~BbJiθ]Үs*KmBRIZM/9H{ ^6[1NM~o"qw'u-,~ch9D*YK2=ʬ0RKiW7]lG[)@}:Qגicճ=>o(iJU83KKsvJ8E("@+T_HwA;%H$gVrk jgxfIkLw<ݖ]>?i4ل?>&M*1VTU4a5$†/}j!.bs˼.F} fNdv"/xԬVmʑnܴ1THpdNC%xK۲=)vyo!@#wϣOi=?Xw6ډN27oqP?`$*{p0o O<2$P%;W%ٯ}6}e+{I}܊DOY37GPsiI&e2kWene/y#%uU 0  ?S`V[[P9ޑyz;?wgtQ{´rqnkЛ< n UU4666555<<ē{N#hΝGnBy)CzBaBk[DQ47?7==}]w'KW:{}w}.Nn499L9]wl\\E hYi"! {4(y+^#S[j!LYsaoEmM 9ޘ456 !!P= p/2$n@ ㅍ@39ewk[][~/v?Z~Ɖ..qQE5r{ uhҰ"K>X7ז΂ v7O lXg57-B$i2]cCePĉMc iJ6WJ7wxCAN6{jx1+ 6s2ɧ4B8;R*غqs l(I -*zjl;w92lʊ罍4W3c5šfai<۹HC._IJl~,5mrV`a4JfwZB&ݭ8tdc`jӉ]͘VI[[S ׌x͌wakrۋhoߙ.Ul6{-KcZ5ss]/t)n14];9[ss]ԡso9^Nnr c n^g\9.L]_ "Ajr6mn]!6ty,L[[cq :bz鸹k{%[s窦oe׍5m%J9U4e՘ ֦- ƪ2Rx`u2f\%i~CAt$ͫ?%KzȿeWKV>𻢡6W"rmx/J%E2x6FmMͽXc>[M<Pmw][&քO:jAnYuv2\U0dwuwq{Wbxqb34d!4]x t]wgxn~.Tq+,-u p4XcdIrR:48*GsyzŀX}:mvﲔ (PYnPZo\ O&Bcdrg}cCyd8]B38 dZvнieUZOxΗ@ƴS7IAͿ%#׌\*Փ޴yW=7av}*P9 󾯕նqI07T1|)m u?/'hwuw^%MNcv\(5KZ^l.*sUK TRGYAϠvx{.{[띫{J{:y/-W+"_^@q~ƒ+vs=+xcr+#" KgvIvS]wV$G-"Nwh.Tà< )r]]jK ] 1ga|)y̐iq:,yMޫ+z*@sOY!uX1jI/t1nd;4t ndSwN3^NitxD h說ˈ/W38{q3(%s榽(I{k$5Wj=z~cH[]Xc_ho3P3Pmt ޭڍO2VeY|7?Bt#+\S䏲E&ك.1\p0|]#RsKN="ey˫h~iGы"bVHxuޝx`p9 u!K #l޴ci@.]c^MUIXu 3ޮD誟Z%UͶrejM;Os02aO<{դyצ>yn9?lIbs;[=+Ҿ%:jBattk9Xk:C  ³YbYA~Tiag0@I?yds:45*ٔN_?s⟜JMAFVw߽iô$rjDłï;j{>lnևZ6:Ǜv?:*ҋ́IT>Ui+p<0A%YB̃H"[$tEJBd4zo*biZDZJHOr:.ݔC~$_b0v0%)Bd=n<+JLhOwQL;VZ:yX֊4\2]jjUbS7ZfJҬ!injul>aIumb-AjBnnJY~C>a}a )U勖K6[{|X8tJ@gIt5K3mVxWsKRIïVlh- I3#e erUod)!vRY(C y󉌫/S ]wJ$.fF1"V]/H(D-Mqp:(vOݜrcCW6,.e2EW FBZgI93Tx36ꍅ*Yk :DiOxWPPBj # 56f$5ZQ Ww7%0kCbNh%Xf%ȟܮ2֔gTL8b.kf(w7w͘i-xWS[LjW>Ϋ<.n{2Xl~MilUY 2Hi%Cap2O^FNQʎ$`L=ALe&[[N!P3]f,)235!bI%جnV5RRT<Jm| E]G8kB'/ˠk̉xцnpiK3k4폩jS'~oj@P+ͣ5mN[d\荫R"5J8I2ĕkxu[~*{7y|QEՖj1RsvyR?mZe{9^.pR;VTij@AزjRHآ FZ1SzC<=Ww9{>fg4_זUͫ/b6`hЧ9wo욨zfU͌R ^7-m 7.l?({j4xF@ TihN~P@;\+j1CnamAf9J71[h¬a@ m U@ff1VcD)THKʵ*t3nu䃦H sNNl/ԫpeХm҄Fl"E: %l}e P5<eM/p7oA_j.rjNp8Bbl%)ZVӹx0 Io,\IL$->**jџk4RhL-QX+G 1֞XȞNxZ8v?X``0;Xwg3ft/P㫼`#թӌv4jsaұ_b$zL.V (|S6~9lǬk,lhbxԢM{nz%&-:EJ_e$(S1>,h_ᘴ0mnV=uVπgyĻAM9竪G7fik*8gN4 {Xr` ,S~_LI5Za<xFYSZcV4Bw5wzR:e'-4.ڬ?<ߙْZK޷RnԊI,E;+TMFV< Jn?|!:Y3o۪WBrz:W!U˧G0{ᆚoK$-B!yNN\Zsx~F=֙@IDAT M3xݗٓ'X^8쀯TRii*3S"y=| qF Pe''GӸ.Q,OYIJOˈ,sFd/ze-҇T6[1j݁*xYXb!'u=w*S%Pt/_ %EcA+zV9Ů˿.L/ kf!:kY "hЅrV zWs~/rhnMltL_RR>hȬZ&+K {>2'E dGijv81=n\R?L efK zp#2qF zxE˳PAB ;&x+M~)wy NsEg@вcotY&3:D&Wz)?JW|#4mDԘVT:"\KGӾ~^vBn`\K W55yR]o<u@l$;ӊV~E.`hj<& o,MS d:`U1 >/;wʬ'cR# 0MG ጏtSlCV!ga3WC}cU)k$S 5.es&.*,ٱ!|Bx),x ͩOf@' IJYs@'"^@x}"'"^@x}"'"^@x}"'"^@Nx>{?JdWIo`_u~B=^@x}" })'>|ڹ 0;ϖypD$fwWxFA/B ]{`2J#Pӹ(U*c0 @!D#Xn.%,V5D /O)Go":'~g%nH?0`k_/R!J)kZ~b& /ЃD,(dD3-SCN:ZqӟxwI? 94u2l*ӎ\ |ou;F^aƆui5Ç9{A;V7mpzzأ)7ғta{ܒXڱ5]|G37۞`.%ҌfGBien ݬŋ09^WPE\OGɃ'(pXel 1J/ j4?+>9vggg׮]r۷<~-o|G-xu_}hJw_]Phdž,lZj"Y DƲY X 6 X*D3#:I@u\$;\vDE.U}]<@ETiRaZX#UHD V eU:eD@نzVoXy.mp}5](}@ߴP -rf3\>;^櫱d)gu桥N&g?Zr5 '=^`SZl-_ ( 9ЖL%A%[*Eph hOJyB@E+^ӆrS!?~s)<͓ᴱf;S-MHNo7rO<|ȴ];3ibգ{ސC\?DFymC0M|O_ ɰ= Ө˥OcQ ?(Uf[b\VɘJ>\3Wki .&^ȎDBzi%+ev,ۺvfeBM1s&"RV7U4g a) Ÿ 'Rh% $Wwml=j>Ӭ)Tb1 y*- %887lv flvP09<ЍZ~ES(C7|lPhAB-rRN聘T-ۘu%6[:\x=-A𽌗6p:/+w H)ttd62s5ijt>~r^jO Jg \SnڤЎ kWFK3@u'.[D팇Tґm,4Si9L)OC*ZW:DV5w3_=pMB"!Ӷ2U59KM(Cͻ`J-<\6+@T$L5sJnTDMvj_=.XK^m;]w5!f ?/pÒM^ˣqi9ۗ>!ZrXJʳSϡ=?tϩ$es8A1Y<Й7i#؆L:W</==i6yw\q鷌+>['d%Ŧmjqeƥ2.1mЁ-kw bgVB$~t(p=['\l M[ew#%&O/J[zB/YjTGcB7׫KN8PȾʧkE÷7Oc/2T\dS!qG0ow(~JCj9ttٽ&O=/?OSӛkK_*~*\7X},2Qxk\L>{V`|6mvNLY:SZBs ~ٳYILI.wn&2ij+TMlޢk,9 XDJC6]̷y,XINп;\T5dūwe> 7V* )d:x5$LF„0#{tgPK~_=Mĥifkol"9?,˹ uQD)D@ڔB<'to>:_s^ Y V5%>HU&jhn@}6i2 MTX%>/`78&<^K O|)lhN=>]zqӌK$7K]d_GMQ7tsU?{箊mJ۝]vʕ+o߾7{<;|o~ϷА7_z;A?_y_RaZX ā6& EG "]#fFʛ|e|` Sjj=@Q pT\uzZH2{M|SR٠5T6A ̶=^@x}"veZ6XF /OD>EG,Z6e/WD>D I](gX e٨vʡieC zEˆf+- xWO/_jJL+BAڰh j9Z6XXD+QV HhNĪf@ KV@h`/}'%X:C+rNPYLSxW3L7Z9"ƀe”Pa*4A Rk-U9|BW5^5{@oGiߡʡF+qJ5VpZ6Zll0+{T\蠦:F݃JEM8֗B P4D /OD>D _'җ_f"}O'2>w+?]{>^zoK<#uZr̶?&f|wޜs4z:f j>X?GSia7.^=f! zt6[M|i2|i3>XB!x]koo><BKӉYix4&(~h1e09o߻pk_݆':ýDH̖(]XMġL3v _NK.`ʉs#wO Gph;!"1W ?&eT1 usw~{ f&wwbEhˉs/\ }osȷsˀapDx)-CҌNĿex+ewvvn~鉏՟~p,I's?w/=Tw{qwEΚ^DJTk*33~>5xw]| 9sn򕯼K;?|sG~뿬O|O9G.8ɏ? m!9۹~._ū+c.woKnwxG.f'ιHɓ(S\ɲ˗0cʜI͛8sɳϟ@$YѣH*]ʴӧPJJիXjʵׯ`:@TٳhӪ]˶۷pX4ݻx˷ع LÈǐLrB#kyϠ;2&ӨL]$沬c˞t5m%Î ~7P{FW:]lשVϮ9SKǺxamԼភ?|׷6rzjr=R-x F؜Nhweha 6!jH:rZ蠉0")آ;^xZUpރ=h#H—$Pnc)U.^eNRd#J%bR{g~b<2I"hI=8'JY&l29Ř&a fh]lTõgʧZ:uN$&畡;雾f+JUgG {[!J%|:iԒ8hzg0ʘe] B_ J Րj{)<;kQv%aG~qgxy eV轧bGs ]ކq!l蝁&قY^n%V`Qh!x(~c"~C6XH9P'I5vBFrI"E}& aL2H^/7ck$wB 8b<d>Ifdh,8{FH1j%hϝx]}yb]vQZ>hphj۫-! 5T:x]hU]mg*VкDlKF5UvKm[ڢ,覫~,V;+k;C%pl' 7G, pSw `l(#j 4l8<@s{0LL7PӜ1I]\E\/--[Yw6hl }71_uqG.8sO\cU#vc֋ݞGNrSᘣ.憛nW>p^鸯˾y7.0-yY>~kpW|>pa.[w儷ѷ=>}.{O|7H^}lW@9}6Mi306ե~Cx?Jv^◻͂I4X!O's!) mi;v1c=/6P$b|< m7E%VBTǸ}ngao1 3'6,lF-tjZ0R~p, @!LG򎀪 7B Fьb$ IyP!QI}\$Y&JG:ُ^HPVA#.@WrL[J=\XCұ)@z:yl*l|Gv̝ -m8OҞ+'nrMz0^ѠYTD&K/k6юzҨEQRj(MJWҖ0K PZTJK'Sl? [P{JԢiEy[t(P8UZX REx:5BjX ժ5<-OVV.pkRkzQP k^ӊҪu< lT*"u9)W Qj+YJʢstlQ|"&eZVV=m^+;6j,g=ԻnSdO Yp&Yu|p\WEAZwt%]z|nWMz|K7I8J e~e? mmf# =-w LtkQ0;laP拼v$qX*x Vβ82"H4 #q8P8B( jd 8J1ec9PV(V5Yֲ##4bad$~,0pfH//iˀ6g:ɉVFBY ʹ7y~pGMRs4fBqWm寲Џ~c-DӺx5Ѭ]g׾N2a[>v 3|(> '0{%Oɨ;w~m$S(LW0bOu/n;~?La&3}e'M@MW?W:w8 L;{Sާ~Lw0KgJrgVyG;>TBt}GH%$Mւaz,s~VJ&26l)Gx}[4XzxyHCjրNyhRN f`y-uKm[mh`pwa8h5z2!}1" *&,ۋHڌ]HBף n 6iVZv$NK^6eiaL4I߄rhe]yښ)٤i7H홨DFZ)aD꩘ffVIZ+ Y2jT+b)v 쐉Z٪#JdA)+L䢭:knsj-Y#VK'R#*>wE -xԚktBleK;)ykN$ñ«l'l.̙ҩv,$l(Liguܘ4l8s̕@-DmH'L7PG-TWmX\w`-Vuplp-tmx|߀.x=p 7G.~vgwmhn騧ꛏ .nꮳߝo'cG/Ugu/~o>o>zo/7[yn#`9B` t#7m48f@ō~E>^P-| B0oT w>υ/s8C,m%pL|"#J1Rt"l.Zm%CްMx(1wK3*orԡE7ڱ|qJc"9=*m #&_%?zp$$XADєz !OJ Qd%)9 HHY\EILW!0:ⲏ4a2Ӑ,"{XKRKT. {C'8ɺQ9gym3I7ڳZfAӹ#R9 P8=>ƇrTLG+OԌdA(LjⲤ2M,bNa  qO<ãŀw@L"H[\X!n$[Xβc,yMqp,f xT1"6pL:xγ݌/gPgl)k޳F;}˜62Ф+N{Ӡs f(RtEP{5G=Z@Gƴbi:Ѳc-GZJe]pաmu Z|l6Mlmoڍ>vh}=27gl_܎E۳fMaC:7n˛\Rma>7yu+w_bxӿ3#*s9 1(tmls6w>g59Qp/:N4Ñ[g59k|^]j[LWwi57W}λO0+=w]\?'O[yO|xO+wm'Wgw6ڧAoSÜ}O;Go7܃{/7CO[O җ]k#|Y{w h6I7v뷀8 ˦{X~C)+&86/-=?xA'Gj#769/h-(>'%HT8O)PV؅NPEhԇ'fnoX(t؃\Xcx^zf8}hyy$tb;qxxqZe7JvHO(舢~}ȇ;lj68؆xvȊux~73\؈:ȈUXΈ~H'jkx樁C؍zzKa88@(긎*֎zHwa~P| ِ9 9|Ȩ}8H iW$cK. <,I/9(:<ٓ>YB9DYFyHJLٔNPR9J 6ɑTA\ٕ^`b9dyViCnGe9tYvyx=yyHeBiry|IioYEYٙB٘Xw擓Yp9陬ٚb 'lٓp) yki ٜ|jɏII9љi8x<שݙ깞]~)#H;yɞiI(&yZٟ()ڝz}Y :9z~*RZ&*!ʕ$z.t!8 6z)58ڣ>: ַgkWK+ ;3l4軿K:ie˼{ɛ˽u˺s=E[?x죑;kKak[uF?5\D(%TNfdr\E3^˱ade̾LJqVdfOƟhS<2'AG.= Dpl|=M &~lUYxG=xm,ɌqǁLn} KJ"캔]% ڙҹV-:]#=-t#Y(ݻHܼ Q6<,,׮ ے]-̝mN|/\gy[ ߌ+L}`ߤJmθe N.m:ޫ'Iik{">$5{Ḫ},.[sCuB37*/:uKN487^>4JLNPR>T>}o]>EPHC;1vIhUlnpS>]nzHq3SDdr~舞芾^tY>נơz6;^f4V>^NiDDB\Dڔmhۧ?ZE|o=8Llc#ñl~~؞~=Į?o.՞~.FtYCaXN~V+;E.Fp:/_ &~3+-*fZxe6Ie"?bUr'x+@?%ZiF0vD ZA_V6W lIo]tZb.ujTnsux'_o;wNOe/bi~J~ϊ9$rrk&v~z%%vP/f'z;:?c j>'"C?_?_O?_ǯ??o_?__AA@ DPB  @%fhQF=~RH%MDRÈ+ĘJ5męSN8YJh1@L3{ETRMmt)AN^ŚUVPVXez}yZmݾ])Zu{Vnڡ Xh%X⼆4 d {Z 3fƝ:{SAɜ5.}9H)NhiWy#wn >uUwٶs-5ʳ3N侳.:}w#S-zƧL;|OB: P[NVk7~ۏ>p!t;7SpmD 5oGr.J!דּ@:T0NsR60 ?Cm0QJi4F8ӜnQL6IMN)+sO<_5ի36KR A X԰O)oeuKs:H?-TeT?[ԴKX]6\qg3G!3 M\W/sYJ,uSul[hO}rVAܐe{ /WV \q'~G^letPxՓ]5#v4b͘OMO X~ su^1yfow螽lNJ\xJBƒ[:윻ZgX֧{z6_ dcwV:l;peb[K!F|m*Lq<ռq1yFhvGG~962|7ܞ{?.[Aw]>ߢIX|_!إobPgNj~WYkWJq.oVbw~c؜&6{R̮ Zu 1^ZU 1hIoC96 w *-iƈ=$#hj`ɘB"b:ܡ.DqDz\+% f@**W{zt5C)SIVcە16 S0 ]Z4嵴Jn).[Av5Ck8;o7+겄i n2ĤdҞLIJDJ5Kʡ&n2IџPaM?.DH*Y|Kћ JJؑ9gK[Ӛ4m(7 \7-J!UTPg-FX +YJ8=5lPKa4mBYvj4֙W J1HSp/ĩgW*k_;XžlaXƶ#mld%;٦ғdYvV1MgE;ڵEmYLZֶV/"ke;XmR6[+-o;܍E]K67}@t;]V׺nv]v׻ox;^׼Eoz;]N& X@|;_׾o~_׿p<`Fp,S ]p%qWx5qw?xA>r'GyUrW\-ye>s-us?y΁>tGgБt7Ooҡ>uW)յuwYz>gG{mnvo9>wr{Nw'{?x[]G|~x7 @ب$t, ?b7 aIA A! A 'A@'tBB- Bs014C3TCJ5tCh7;<=>?@A$B4CDDTEdFtGlDzʀIJKLMNOPQ$R4SDTTUdEU,9ňXEZzE{\E, "Sid# CkɥbzBe`UO1o<lFAn,&_-BcLv̠tL[z]|+|~G0Āȁ$Ȃ4ȃDȄTȅ4pȇȈȉȊȋȌȍȎȏɐɑ$ɒ4ɓPɕdɖtɗɘəɚɛɜɝɞɟʠʡTI#ʣDʤTʥdʦtʧʥtʪʫʬʭʮʯ˰˱$˲4˳D˴T˵d˶t˷˸˹˺˻˼ʀ;transcriber-1.5.1.1/doc/img/inter_creatbg.gif0000644000175000017500000000474407510315717016666 0ustar rtrtGIF87am @X@X0`rrasH/]tr@ans/@Dczu r@re)nt@/Pdoc/img/inexr_craefat@bg.giHf%' ?@ti@@Dz ݧ 0,Dz  %$%@@蠰L0DD%zz @@@1@`,Dz LDz @P,%@L pDz @lp,Dz @,%@Dz @ Dz @ְm|@,tp,Dz @% (Over7_wXr i@t0e ex_i2st@i8ng f_i le@ ,mH*\ȰÇ#JHq`3jȱG.@ɓ(S\ɲ˗0cʜI͐mɳϟ@w) ѣH*]ʴӧPJJթDǯ`Ê]ŭ"}y6۷pl6kڢk]ҕk۲V(Vb~#d[fysJ,#Lm36fra}Kې/-tvs>Ndkח+K&rȹ]z%׶ޙwsһ_מ:O>\oyU;>z~Eןw7w(7^iXb'vr!Jv߁(Hb b4j&ނ1+b"o/aF:(J4hqh"q HٖQ:0ZZg\qimyd8"`6ǧs &^R7eJUGi$Qzdz=yަz٩Q).Y#6`*kD-a:뮼IZkMZX]F+K hQvek覫k,lK 7G,1 c+g\qQ-$l*,r)4p2r {_}w}/?oÏ[ H@ -T#HM43AmdDXB|$Y6vB`-tZ&<.op3wCΆۡ~8l,a\;q=Q{^Cɦ.^51ъaEq1C#G.xlaYD#Ϗ=HAd)"IũMY{ e4)RL%Vs,̥.w^ 0yKL2f&)Mi&6Um#0FX,$5Dsd\>IJgdO2S~=U|?7FJҡS9j6$K=@3Rq4`H:Қit}'}%rvN{t-KQxP4rF]zS>a=G}9Q{vjƆI9;$iHD=t#\VQT}_e=گU1hhVT#XBgݎSmaouHةv5+y(W4-$TVum EɨϪ*b섭7~G WN5x=!VFeᅢeHYj%gO"G2pbRHQ蔌>!X kIN!yJ%VEٔJa#~ i\XS9b4drٖhhoip1UH~:ge*'hfRnpy.Z(gyYXi&Jzp񙢧7z'Z)n߀_*:询JĒ~_䱪*]fN-{ɺT9"+nm k[n*E\Z쾮>:`J؎kh^*0T4/y)ڊ+[{`R1pCq)*Uz,-kŤr*sX29kn|BW):l ݳ:C'4ņ> ("FL&FN(*Vby` A?hLX;..yZ 8E1s!xGqKճչ+Rucڒ1Yad5>叵ٌ 9,!gZ$,Rn͔UR8iIѐ,%bÚT([NJϙ2F&H Q2f1;3) #ʮ`GDŽ̧k`"DZ>r:NIST1y|'+)k*rdU6lCʀɔ( CfRԔ*Ή+ - Kቛ]IJ3+=%NKAT-fDg8TfOM ԨDKhR ҝ^i;ϝt7V/ FAJHM:uW%J굫]tLկbiUѝatgX4T@2"Zsp(Rڰ?9rђOd2t+l&QGԢO9lrk+[v o[юpK':Mno:R#v+ArK.xǛ]Ò/z+!4/|{qA;transcriber-1.5.1.1/doc/img/us.gif0000644000175000017500000000014707510315717014476 0ustar rtrtGIF87a,@˽ BGJ9byf vSpzm 4ځ*mfr 8Y;transcriber-1.5.1.1/doc/img/inter_backup.gif0000644000175000017500000000261607510315720016512 0ustar rtrtGIF87aPTP@@%@0DLz @|)@PD\z @_@x,af@ίH &@Ti@@Q% @0&@DTz @ %Q%@@蠴LDDzz @@1@`,TLRDP%@؀L %.pDz @ذelp,Ѓ, $Dz)R@t$paf@,Dz @ n)@ 8_@,0@*\ȰÇ#JHŋ3jȱǏ  ( `ȓ(S\ɲ˗0cVYR͛8sɳI} JѣH5ӧPJUJ2ԫXjݚr)ׯ`[ KٳhӪ]˶۷pʝװxz˷߿ .˔]SqE;LٰʘB[pa٠dhL3jԬ F:l(ztOMu7TΑQ{ pgۯkwe֮9w˫'@xٿ>vn>~z3]6f՝`wg_!G"߅~8!'a"%bvh-Xw}H2jXНߊ$WcAW"x{!R)e5cN"0xI܇@)' ٹ\xg#69tb*FUA d/nhK'[fY'~>Ȑ-~w~Yݒy6vguN*KDy*īK SjElڄlS- ,ٵfv+knI]+b.o ̄ +&p'H;transcriber-1.5.1.1/doc/img/trans143small.png0000644000175000017500000000564407510315717016505 0ustar rtrtPNG  IHDR-gAMA a8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2).I IDATx_hJ>u< E#T3* "<4b-A V#K4TJ_|)b |H`s:J.RJY܃}ynvfvvvoñΟݙ3/]Ʌϝ~nr!WW<ǜzXN95xG[׾]8|/skFxu_VFc6wZFABuj!ƿh{_W޽RoOΟ?__ZpϧؓZ˿~?x,=J)9՝1CR{֕#D{$:#n$,Me%}oG][?TeG;\&?r*"AҏǛNT:sN#÷R+,RZg&b kok(NBhcY8r,8e|MsY}8,n/r3,Jg?'η2DLsp7:bG#F6č7Pf#sWmm@ _{!G?c߇Ė*&I;sB~[1ko9,ix [ZaұOfEsVRgJi2@:݀) aEΉ7U g|?N?>jokhJ#f:)3>݇tt +#o%wn,y}s=)z]Dg%w`:؎R. 6Q =P:,!:1>q#2179M%4Y%E:_ BviZHJpNQ%WzƠO3vBhN'ig'"vE"ʸ1qr#?wjgUFVzYusˁb{ڔK0 =`rRA.vaNH S-idm6XrA\!{I# >V?|N(:mT*cr9ճgyh*BU}bo^JH*Ǩ%;J)db|W\NSr^ΎǗ/7s= HDg*8Pi[@mT|+ >;#~ğp˴-ѳĐt^ <]덛ę< g2\.LN:g&5`IZ1l_!W#Xl!^xQ{-Ŗ0G @mRx<  00SNKJǠuBl:7$K"F35b;]x1WK/>8zNK'r_ j~Cʒk=uT0tRWb 6,zrYWY:OjEX։E9?%hʴMZ)nL][pөuto;i 8]QqgyG悡=|3ݹPHX餾L$enHǏH8jo9`;m )=ܢD(҉\>__NӼa >O[j-kwU!fFg7)u?tIME #26DIENDB`transcriber-1.5.1.1/doc/img/inter_name.gif0000644000175000017500000000263307510315717016172 0ustar rtrtGIF87a@@%@0DLz @|)@PD\z @_@x,af@̯H &@Ji@@G% @0&@DJz @ %G%@@蠴LDDzz @@1@`,JLHDP%@؀L #.pDz @elp,Ѓ, $Dz)R@t$paf@,Dz @ n)@ 8_@, H*\ȰÇ#JHŋ3jȱ#C Iɓ(S\ɲ˗0cʜI͛8sɳϕ@IѣH*]ʴәAC>JիXj%u֯`ÊK,ʮf ۷pʝKݻx˷߿.Va+^̸ǐ#:.b̹OzMR3ӨS]Zͦ_˞mH>~ioL*#ͼKە]$>z+_5>ݹ&nM=u_>h|1V~}{'`xQwezMށqG!$~8X܇`%UHh]y3'^R߈$ܒPR)(&t6(a9iiZ!IY)6eDr ]|e@y'^b:8fJeUn*YeqFH>2|*θ駜gv;臃.J䣴&i '=ȧ‰ԭTl6k,6lԮ mIM]mQly$kvZ +.'ooL'y/é5 _U@;transcriber-1.5.1.1/doc/img/inter_opensnd.gif0000644000175000017500000001143407510315717016717 0ustar rtrtGIF87a @X@X%@0DLz @|)@PD\z @_@x,af@ϯH &@\i@@Y% @0&@D\z @ %Y%@@蠴LDDzz @@1@`,\LZDP%@؀L &.pDz @e!lp,!, $!Dz)R@t$paf@,Dz @ !n)@ 8_@,H*\ȰÇ#JHŋ3jȱ#CIɓ(S\i2bʜI͛8sɳϟ@ JѣH*]KMJJիXjJ)L.ÊKٳhӪ]˶۷pʝKݻx;ט/fIÈ+^,p0C_2˘3k̹g+ ПS^ͺ뫨uZ[Z۷mgh.8č^9v٤-=s7oصWΕN޳'tק[ L'y6>g~߁Gwy~{!(!Rv7\!NhbO d4a'S"%_:j!)㐢u2"D6;(%aWς`,g/IcqkD'JъZͨF7юz HGJҒ1 jҖ0LgJӚTm1uJӞT2|JԢ`ǯ?3??#ߜOͿ'(21Xh1 1 ؀0v5Xx3<"8$X&xV!1j0284UkbU:<؃>HkPDXFh P(L؄NPJGXSx5Vxk4Q`b8<3ȱE5B^łSjWZhȑIW,(xv8\dć臌H(8xDv7xkޔȀIXhI2Xx]cYHnd/XmĉhxhFiXX$GFʸLjXи4҈x~rUHlH؎58XxlȋJ؏W8ȍ@y 369`ؐO)0I/ّ Y/փ2$l76)Il+ 6-Ik/yqY㄄s4K Փ>@B9DYFyHJ7D78MVyd>q46y3SLUb9UZil\5fA[ 6])ē]Xo1qLjxIzӗrtVn!i4LSkMF2{0yX/)Crzyh9%SNyH$K FE)P M|DEHD֓iȃ I0ɖ2icCf 9hg yK]/əӝ9LwT2yJԹy9_ٚWEc[8y ҹt@hD:ʚdʗB9fP٠jӔ ӞJj20z2;4Z~#5YFj?*N#SGP*5IKꞃĔXZ\ڥ^DVU=j7)egj14^ɦmjo 3q:sjvyʂLZwJר~7:~zՄ JLkzO*A)"ã$Nje檴7~PʫfLZL1ªzCt cmvڪϤӺn= 0sQ$O6{CJzw">ꪬljJABZ{KiCڝK#9dm${px4oƙJ[ uzGl.GFC^?G8J ]E\pFCG+ufW5=CDP˵YjęaTm}4-[]ꙶF;J&ڢ)?-벌CQ1KrK\b+TEsPDgB*HUt{fwI[FT{ ۟k`6$7 4G 5?*kusK ۹[[@70zfG랽9 4zV˾ךc0$0۬r:7M4Mi;e9SejSkJ0  \%2*sJ:Zd,zװc˞ݸ5۸s6 7ȓ+m|УonfG0fo{{tm~_zgW~eZ f߀rQ]7a}byv#ՠ,X }2/*vgbAʈNzP&3n($1)"=Q#rZXb)m %p&]l٤g>9ZTx&|a%h i5VI&'{飑ʕgR埠:~VJiu~w^j+x鮆*) c -5j(Ɋ,]:턌ZʫD[*J'ikf>fo,ҫlzٮ 縓l圂N&Ĝ"o{&SZ[04 .C /$.c%2WZ ,Ź$PG,WlT/A*\jF$l(RWP4l83*@-DmH'L7PG-TWmXe`-Admhv]V tmUv߀.zn'^G.v;NgG[y~.{N⡟w੿.fNNOƟ{ӎ|bC/BϽOK\Fw>ߟDOxW'@sG@ Pi{ h?ρ"(}#@%mD@>jۓ`F>RP׋abx>` }%w©px? P-aH@ P:| (Bqi_b6DR{E;"v9&FaṫA:z/W\HEVэ{! 9=VH1ʑ d"y9d hEpR!X!6pd )C1(FZ>s-!Un2~U f'9 HOҍk#UIc IW>1l5oJ_j5$%)>S Sд%q3T:әK'gϬ;9KI@K'q8ɬRR'<_J4t EOYPzF] L F`#O(%8SrjєF5RT0JTFjRiNT2e*>aZTk ݤ4Zծz` Pʁ*X*ֶvӭ1\J׺ue]׾ `JV 3&,]EK5X˒ +UMyUu!K'iY,qHҜF1mV U׎p 3>kJM+3GǢϥlsSM-oMW,Mm:K攄A=g1[:W`[Mҭ:V?v4(Q32@i2Eo_}ZX5jT^{RXTp 5s ቛysw|ۛ^W!vh*܂\x0$c.]S"'TIf)wDbI6jx(oI'#EwԥX^LORmoL]˫=p;42Ky93<2Xج3.s NiZ޴[gAgЄidmmEnd_i)]<1a=7 Y{iukZW:p[uPz㱌Ljr(9LqW( vl&NwʭP݉c7Ds|[ϼ7/KGOC~hW;Wֻv|gO?ROy~/{;wO[Z{ӿO~g'/wt|{wx7z7|vlWwǀq m')wq1'x&-:؂882v5CW ؄Nx"y$D(6(4ȃx\hWX^g\dxBhahFkyׁO8txYFCme3@hb؅>X%(8;ȂH@8]qȄu؉8vQ(ySȃl9HUYhh(}HhTh}'؋M7dȇAEH.xxh_8i؃ms'بgx䨎(xw؎(~xXȉ8׷׏ vHY|x I{xY")zyx(~9,9z%ix'2 }!ْ6x7:<ٓ>@B9DYFyHJLٔNPR9 VyXZ\ٕ^`by[fyhjU407n8mq9ryjLw?{ɗvx4z ~7tY5yMYsv֗)Cn?my9>):9Y6=FI9=999?y5s r0w9=<7@fhlh$rh Cy6nv_iy_On+d ua3mV6&٩@qk҆?cީZG5bh^+5ęj L0T&Ά쩠I GFi:Yd]牞&jzU ja*(d4 <3Z8;7<*;;ڣ@z:?D9qHJLڤNPR:TZVzXZ\ڥ^`b:I*=shjlڦ41[r:tZvzs '|ڧ~A%ڨi*"^+1*?!0کځF#$"BB$Gb⩴.;"*z$H"#r"rL-R.(jZª"$ $"%qRɺj-%: #zZQ /-:*lr:qZ[$* :ۊ&z":)}! T%J(k'ߺ&jR ;PgүQ$Kb) Z.UB,*#& `ުO<7)B,2b!S!C/YL۵2+r-,+W+X^ R,'jBHn krt-v*gk䒶璲1k/ƚrf{K{"3\k+1+K3 c ⦮1wW+ۻs/!k3ʻۼ,3E:a롆#sԻQ3Wy#6{ 8黾:k8;۾(ۘ8ۿܫ\ɠY ܣ,5<9ZQs\<#rKV!ʟ[4lf%IYTbXE$,T9dlG%`Si%ڝ\\50&c4kFllDA-h1&%Oqqej4d5^oXagvhDHZբa{clVQ$JwŠG;TLKo\oD^DG\[clOG,Ǩƾ5~VIƔbĎ6f}ŀrn.MFZuM꘭$ҭSҌL=A. W&ε _D5!-7OcPݞ*E0oX_.BA rVMg "w+8§\#B<ҭg\Pm˦iʑ׵/efC7y_쉙cӳaO^\(ڵQD-^ĘQƂ QH%MDRJ(=T8AL5męSN=}TPEETR; pU^ŚUV]UXc=[VZmݾWܹO?FE^iW` FXqY0dɅ lYoȓ=WXhҥMomf)M73`®?S}Zn޽ۦ97rןͽu8'/wZ_N[v?ogmn\=y˓-WǏ{^)<#+o4PA%PCE4QEG4RI'RK/4SM7SO?5TQG%TSOERFbW_5VYgV[oE@VqW_{`%XcE6YeefW}`WguXjZ^Ŷ[o7\qVZ\P][UVnmxow[sq}w\}_k-\] uY~u^n/8c x٥ՂCXM>X]vQ8VGn`GwWyq>ՉM9W7&h֐yֹw:j[~ZZgޚ靭^{hF{ߤׅzjKggS~ァ&lyan7ߴGxOW\xZy%>q~w>{qGzw|'r@?}g}߇?~~ǟ`8@ЀJ"@6Ёl`%8A VЂ`5r%`E8BЄ'`BЅ/\!BBІ7!qP# C"pEDb(.щGtb ;(p*aa(*vQPaOxD0Q^ #(Bna81m$!xE-}T8HBQ%4d!hG цD"#iI%RD!%sL1e&)B:ђIc#UfQe"Qd$"s%J҄O9BQ$fi'z,$I& 2m lj20c8JXR2YE:D2B_P1M6js`0IzޓgσӟDhdJIu:4]Bqѕ,'ZQҒo,'Ix6 I QViC9Kݤ=ejPtRBL`"ԩ9d!NVV!%d"R޲F=d==T$$@ԙ3=fOJVmP'>yOLm}j[ ĩrݢY+ˑq$%XҕZQh>׺Vεl}\ ԝTuO<Ҕ܌hSSŎ֪ljXZǪT,=(dwrUP*<)\6&]}4pL'{ڙ}&k˹Q?]6 M-M;_涊bC*ҞzLE$*uOZե/k.׋ܽArD1}q(c$n؜p Alώĝ-y]y}=#6'l0_ld4p$oulo\RdưѼdxIYWn$om cAnK(L2ˋmN^u)qb.yo;N5k6.:[]4\o6Vpd*OٔƵJMdXͳKjS{GT BҊVmMҶ~OLRwQ㎮[)Qb+sfG򲒌u z;5iSҺ{]r6F]cXzf+K k~<,E^&Q/۸-H'NׄҟVc7^cNr֕~#XtNĩ;Z:1b ۰\;w{0x'<x7;#x򎿼5o=;Ϗ֏Tzַ}e?{}u{~Sߒ "19|gͿHׇ}k߿HR?~G?ş~?G_8O;? #@v+@{@S@ D6 ? @c@@@#@ @A@@D4,?Ac>lAdA?$4B"A$B4CDDTEdFtGHIJKLMNĻPQ$R4SDTTUdVtWXYZ[\]EQt?`a4cDƌ(ddftF|kC@Ծ*@\AsDǓ$#*4GrtL{GƃA{tApj\B,{|DHt\yGlHpBdG#LȊH8C-,xBlr@xȒ,e4ɔTICɕtɗ<əɒ OɜɝɞɟʠJF;transcriber-1.5.1.1/doc/img/inter_editlocal.gif0000644000175000017500000001154107510315717017210 0ustar rtrtGIF87a;PTPptp%@0DLz @|)@PD\z @_@x,af@ѯH &@\i@@Y% @0&@D\z @ %Y%@@蠴LDDzz @@1@`,\LZDP%@؀L (.pDz @e$lp,$, $$Dz;)R@t$paf@,Dz @ $;n)@ 8_@,;H*\ȰÇ#JHŋȱǏ CIRb\ɲ˗0cʜI͛8sɳϟ@gѣH*]ʴ)Ρ) JիXjʵׯ`ÊKٳhFƒpʝK.A 7E6jMN L7&Ð#KL|@K)@4ioN-4S֢ZhΞY{4ioqډk{敳d}k .n۵o]y[OK=̖?x~qހzw|ٙz.`|׭%mu6{+%hbXa(K*W2S}7*XKy(_+'6H!Kx3: $rțJ=17d&bKI%kfjN9j(~9ߖt>覑sJ ogd]!sI/X H" w୐s!~ҧ@>GŠy@理E쐈L"F:^bD$ Y&@̤&7Nz (GIR$&) ],? Y̥*5Z,e06LNǤe')KfJ2,@4FPN3e&{_JӔǼyJr>4'139Mu&&!W~0Oi據> Ѐ(>e էB%zqN %h?+ZnDFNx3'ϼЉVhA]zЂV34 KĀj46;[PEG:ӣ6&&JS?_f EE@7:Ӧ 4iLs*wZ )Z;Luc]E3 RI(9ɪvx-&W:םծ]JJ*֬E[#؜vs-keJ;Kdb:pX Y:j^cUJEmfӒrxjӗ Zf:ld ѠuMԸFT]%tkqnmvߎҳJM:Խ|٤w흯w}- NȿUwW'L [ΰ7{ GL|e܃ٛ?řj' lF)h!,s !q1HV^Ɛ01aL~ȠW1(JYC+3L2OG81#ƞYeq &"zT3d%΀ Gg'vv_C*{qby^FzobCiEctImjNo~fv89nMA^9!c:^bl\fZm. k&u m~f-lXh6fgk+.F ]jKS }f|76o.pIes<w,Cw oGwQU`k:ۼdXI{[7dFջBO:UIKJ><1EԷ]RE߸NvyWcAviGo31K:ݕ O_WlZ;񐏼~혷1yqlzlR,Qz=^/Ͻp_Ok;3=|n/]s};<L~ 7gs|ƙ'f;ϟ&g=rCg{?q而^qi$rvgjVg1 @vzf(+gg4mln7S wrmnjw:(1@ d&XVf6pFhvwn`(C X{2Bx1Dhln&gD$'O0gX21Wswx3yh9};i,3fѧ|5y8x{xS؉%|XC-6؊ XXx؊؋X8؉AϷ،lj^8(5Fx;8zG1eW_V=~w2}eWVXv0 426^=$fEQh+Ǧ qqig!Ǝl*ڇAHk&ɏGj jnqC馄n(uh> &rB)&i1kh@$/){MhAדD%y+jDyF9E(Ȕq8_VNЈp?U(Gk`fYpGf/XrV,c(AG3ن$Wnfr"w)B3)lxYFhn'8)8|]^)yИYxiȊɘԷ{Y{Ywzʹל)z7ԉyykIvܩȌݹ1cs97F7HC:HF6t/iHY5ceaCٸ} {6*cZ4viڍy7eá~ x$#u Iآ7&8E*Z9yW-c 1?z4'/p,(}إ5c=Jg\@$UfT$IhãQg&G@ZZepEYk;)^lo 3Y*lIRH9wX0iZCg ZmJKh(ȇ6lp: uYy t`e,zkJrf*[*M֦QiVizz  ʭӠZ8vڡH$F:ъ'<' b;:  {}䊱"[1Z >2{{.x:|۳7 ;D$Dz߈ ⷢXHc: ~ݸ`8c~g9&bye3vi%m&^y 'D.)hD:A ly磌>Jh9ixy~0ciRIJj2j*~i櫫V"F므Yk֪'6ꭚsF*5Šeʸ' fNkkb6J $ԥ;+fֵe,fjp[.£znK5;l(3)$"ڢ:0sjj.RZgf]j?:2-./5X lry./7mh?s[n騧yz~g푥6[p/N;'|Z$|F//h EOwއ/ړo{~_^_of@@;transcriber-1.5.1.1/doc/img/info.bmp0000644000175000017500000000043407510315720015004 0ustar rtrt#define info_width 16 #define info_height 16 static unsigned char info_bits[] = { 0x60, 0x00, 0xb0, 0x00, 0x60, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xd8, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xa8, 0x01, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/doc/img/inter_log.gif0000644000175000017500000000261107510315720016021 0ustar rtrtGIF87aPTP@@%@0DLz @|)@PD\z @_@x,af@˯H &@:i@@7% @0&@D:z @ %7%@@蠴LDDzz @@1@`,:L8DP%@؀L ".pDz @Xelp,XЇ, X$Dz)R@t$paf@,Dz @X n)@ 8_@, @*\ȰÇ#JHŋ3jȱǏ  ɓ(S\ɲ˗0+$90͛8sɳ'ș%} JѣHӧPJ]tիXjMYuדŠKٳhӪ]˶۷pʝKnZ]h߿ LX.Sy*v N rƖ3kF(Ƞasӕ;rBG68!삷MA*FM\jeg{b CzIų=a'-~7Vﺼ㛟~/_{?]&@oGv"kz9_~&_AyZHy |r|a#&O zsX_!8f`-966H~&G]B*/FS4͘ 春8nY]tWc9~_]^eDMR!"g}Ci!|)('{) +'1GKRvj+Y R5CpEzipJkTުGTX+k&6F+Y:%@v+^[gk^+SKTa,,H;transcriber-1.5.1.1/doc/img/inter_epi.gif0000644000175000017500000001116107510315720016015 0ustar rtrtGIF87aj @X@X%@0DLz @|)@PD\z @_@x,af@˯H &@;i@@8% @0&@D;z @ %8%@@蠴LDDzz @@1@`,;L9DP%@؀L ".pDz @e!lp,а!, $!Dzj)R@t$paf@,Dz @ !jn)@ 8_@,jH*\ȰÇ#JHŋ3jT`Ǐ CIɓt ˗0cʜI͛8sɳϟ@ JL*]ʴӧPJ)K*jʵׯ`ÊKٳhӪ]˶۷p^rC(˷ߍxvU*^̸J#[ᛒ!knf?ffbXZԣvihy;sMtӕn5lO}ז=pCol&ϗ;WvCnzۧ͞~{?xo[~͇~՝GeQ^fW _}bx`z`fbm(*u eQ kNRH"v/$?xD-H%&P3VUa1SZ}ebtRIO٣]U%LqYP>6-)$_L*Y(L>'Qw'.shaH搆*P"IwWg[ۚk +`#t)l5\fس:B-ݖ*6ΚQ oTf׾,k/e' 7qWlgw ,$lK,0,4l8<@-C2H'L7PG=׵Xg4\w`-dmhl5TcZmwn|]s ~v7xgp/N/ ԒgԖ.8o.3sc 9@ˬ쯓/]6β; O{7m<{8^n{͋{}?|˯˟OO{#;#<%S , F/KA6~cCx0C! ׾Є( 2= !hawD т9Hq *{ [8Q"¨鯆3F-b%A2qf$>!qvD c1/8Hͯ$$?̆s!x-#( ҌLZ%Hm~| !Aϕ$D\igt&=*^ѓ!jJ&*s_<lZK+z$SH^q4iabߋgΰI-}f,A\Ҥ$@O {3\)φ,t(y4J F78̝Hkё4kmEOQ0Lg1,)hӞirJԢ5j QԦrn!uTJՊBUUͪV/ԭrp` X VΫ-%Zֶά8EC!*Wu']:һ+`7׫Ab爸%p\aobg=$25dž3ߛPWH"4{t-@ԴlYKGk̳mhىSmL:,!5K)\hn%ۿ& | vVerL#Jg5t?'ڳָ-|[On>]2-]DkXiM;qOfЭ`1,õ‡_vq+`yx9v).ĴqJ~8=nNJ"d?fh{&;=JrTL*Xo`Y2hNsڤUpF`5sqdYYc@ZmZ `76FthJ7m%=J3GPӢ^ szҠf٢S}SeNw][gijJ:ײ6QkZgVl_eNQJ :36mic'L&Fm|[=݀tPNyo'Nq'?u3 CNrύ"vqu0w[GZ3wozs*ܨs-73͔#]ius#ul TNz؉=vY=;{ݞq^Rykm^{wdG~nmU{$# *wfs~Yy:fkmo>={B{v#3vw=3}=k>֯>kNz?V;޿Z|%r-fn7xk ~WiFwunzwx{v$NFT?shTdaS"H9Cpwg+H:-^*;f5hR׃:9D8'@H4'LX4ׄP^OT8OSj1ZVGo[`7/g7Ux39hhfx5l83n89"^5hqH3bNUfb{3?DMFE[YM\uDz8.S5_ZG˵GGp3oD9c=\\$JEJl((c8he\xԊ\Xԋ4tZ_`\`vae VU0Ӎv4荧CoXÎs舆qpfe:tKYt<F98Gi8ujdşؠ8_IXywġԦāYy95qBFDIYDU 附ꅟoyj2ędsɪW82ݙ#2OVZZWnʺ֬Zf8К5:46u#Xz7Sig )rhISj y#kיY\R-*Jj;ƯꯎX,Hkg8O1 :ms+dZ`2|Ԯ;P*T$( Z)7Өڲx%Aٱ3_uuJȳJ+3痲 vI:kL5Nj`E Bcz:&U"[ӵE6*IH{zƨŷ&kƸ_:ư*3+cjr+m|4&Cf +غFwVi }kU6 5e[{Fܻ BbzYkeʫ+g{PQ\|E <\|*;transcriber-1.5.1.1/doc/img/inter_dispbg.gif0000644000175000017500000002011607510315720016510 0ustar rtrtGIF87aPTPXXXXpxXthhxx|xTPxȐ@PD\z @_@x,af@ίH &@Bi@@?% @0&@DBz @ %?%@@蠴LDDzz @@1@`,BL@DP%@؀L %.pDz @eЧ$lp,$, $а$Dz)R@t$paf@,Dz @ $n)@ 8_@,4A$(\ȰÇ#JHŊ2LȱǏ C'M\dJYr͛87"@pϟ@Z,უH*%L JUsjJ%M2g, %YhʶۈDPJ7iT D_Y )pٱ w9qǵ#Khݺw;燁;VLڬ鯨n kϕ^9o׸%^-8YV[pƞM{P'vwسI;:?k_ϾSh뗨޽߀ W}IEdӃF(VhfNmA(,` ܈h8ArՇ(DiL6phJ*Xfy#UP`)dihcjGJ)iFBl|9ji[xF6裐F*餔Vj)覜^DhsrwB`^jꩨZiC.e(~K檫ꫫ(.ZҤˢB 쏳&F볐{զe;2-ϒ%/d+nvK +0K_^2oBp[qK?:m$7pÉj챾Kqނv1Ŏ\Cnr۲Lt<k|Ǎ[c83MJ7_t̋JM 5V-v`C,'7oP}.ۄvSn-w6j.y?x 㜧*_p稧 fn{WL' kkW/Qp[a-kmo觯/otGL/ģ۴>XЂ# z @? .}0@dh#̡w P껠X|G\ E%OHEGK!_A"bPQd_A8hL x)pK_XD02 -GXƒ~0c&.Nic;GiF=`>YL rs(: K: H7-97zLg&Tb^@şMӠHP U-&PYZUm*8ծUX ղU`CBֳf\֢xM%x/| }jB{ˈb:d'KZ`ZXZìhGKҚ )urlgMjuk%[B[V#Mr92zܮ%,5NsE'# đ-uKf--\w)=G{D, vC$Ro~ð%~~o8 'L [ΰ2֤4M0Hֲ(NqVᦪ0$Ư9Bb@jQJ\QuX7NM}w!-wL*[Xβ.{`L2hNleQpL:xs>πMBcXTON'Dѐ'Mi5S$_B)DNSvKGMRk,D<-V՝ m̵w^MUDaɲf+n1lW;ӚȬRŪ.MrU)kO!ʖv Vٮ7CMn7ǻ߆nN⺉zi{Wwy ݨ$ Gnl-<ɦGyD4[65'w'Zoh=ۭvtw[<>UsXϺօΐI4늩_ohO{uIarDsxE=VU=GZgwTYqww[U\>?R xǼW~.R nv+#o>m}H?e=OtK ?׍sظ/=s^}W=ξ@B8DXF(YGL؄4NR8TXVxDX[\`b8UdxChl؆nfr8tXvx;x|؇~N8Xx\wh脎HX?xHȃB%Hx;Xd88C8M8X/Ȋ7Qx8؊BȌ6H=h\hKȍ:ظh81h،Pјᘎ؎8hȄ،ߘr踉؊8(HI8ϸ ҸXy(ʸ>G8#HXh)>ɓ0'Y؏H!5-ȒX-0iI_5Al?9L9ZyBuII 8Iϸ2)~3 fgؕ鸌=" 39)YiȒjciiٓEihX{YJyٔ)际y 8 ȘT鑙iX(/YDYimqY=ɗթgiH}sY)p7H列؜Ù͹N ڹ ʟSI㩛 jyhmɞ ʓeɟ١)dY: :eI*)@٘9$y)Hڑ9ۉ&ꞯɌ*j9FwjRhZcVʙMݙYlٞHTNZ)wZYz:5 )yZ١:餣(fziG o*1j*xz٪;)j>[ɗP JYjgƚZJڬ< Y - :*XJأɪ:P *êzi:zqzڦ<ڟ9z~*着)*]꧐JL: [h: ڭJ 5* iKZJ*k!+Qٳ )[Z֊IRkF*S W[۴ 7kv¦nc :[3n or[ja \K>˴9ڶv;: ȞZ:"k4+koym*;[{빶!ۺY *+  V* 3ۻ{K z 'kKʽ+K{cۯ[뽠˻KW;PO*D{;뼫+;+C ۭ*;? {Kz ̫l'i{ٹ[x[[#ڑ:틡+[g[kO5,7Yp;2ND\jʬE:c<|.K |V|+PK M)֛ewʰs괛jZKql b ,ЮLaj+Ȱϲ ZƸLкlm4ظѬOy+ƒʡ pŃJu.:[3C=%$}zpá mۧL*<ˈ)*"kUʴ ELhB\>Ѝ7 Y :I]lt=Vj`חX[a"]4I]Yض=Gf~h.e4n|p.8vku~|Ȃ>>^~舞芾~U=rn  难.禎N.~룾j촘뾞.>.Ȯ Pێھ⾄՞Hޮ.9X^˞۞~ ?o"/&U~#&(!4% <>@B?D_>JLNPRF_VXZ\^W?2'd_fhjlnpbܢ:v*Pw:yi~?)s_8?+-B)++9*ss"O,2.,*/2R)1Sx_?OO42_y81#0_//-,1d#.w/_99`|YpM~snm^2_Ǟ,rΥzx'=_^z9{LAO~k+o$@D0Ad0B |pB #0C 7C??DOD1EWdE_DgFo1GwF2H!$H#DG' 'J+(J.p L1$L3D3M5(@.rK8tsJ9O=sO?%s< ODrMG6RQ.-RC)3SNSQt9;72T*U]Tl4RYgt9YU'qUWK^tX?U5Y,+YeR;Kd9 uVK0i72m[`Qvj̶vtf4T}^TfvW 2}U\%Me,V[y}قb\wchMFXd]ۅv̒=Xe{~rXkۇ4z]uӘwxOhA韯jchi~B:u]i/F:o5VfjwؐƯ9]WZϾnL1fzRGg{ꝫ;sҏ5=׬m'y!g6m5Ϝs!]=eu_e)Ur/]v 9ߘh>9s'VebިtgU ukZ”2Pu Q]%ZMT* 7>6m`kYq'$"Ԩ(0s ]= ~prBv퐇n&mv? &p3a)()"Q;E "R% &{Mr_85pV3W5@ڹ^LGV7`WFJqXKdb60{d8Q`Tri#m6s\HȽɓ$Yx&YIikY(7qPQ(8*]:e[*8'@ȸ3ΚdW/Bv eSөQ5S,4y "yf<9ό%5IlA(w BI,{h7i.֭[ !< j(@M]xDUQ:M3{[9R> )O:]TW?xFRJ9(J5 W.I_ru(X!Pt(Uj@ZS6jGTVu*]WF]o\N:uE c%;YVֲld1Y^mhE;ZҖִEg5Ybv}cc ֶmu[np;\׸Enr\6׹υnt;]V׺g]v׻w;^7EozK׽L{RU'o~_o+` +#}p` ;&\bp5b03ceeqWx5qwE>rho& ;transcriber-1.5.1.1/doc/img/inter_savetrans.gif0000644000175000017500000001157107510315717017261 0ustar rtrtGIF87aPTP%@0DLz @|)@PD\z @_@x,af@ѯH &@bi@@_% @0&@Dbz @ %_%@@蠴LDDzz @@1@`,bL`DP%@؀L (.pDz @e&lp,&, $&Dz)R@t$paf@,Dz @ &n)@ 8_@,H*\ȰÇ#JHŋ3jܸ0Ǐ CIɓ(3x˗0cʜI͛8sɳϟ@ Jѣ4W DʴӧPJJP- ʵׯ`ÊKٳhӪ]˶۷pʝ5+V,Mɷ߿ G,fyتǐ#KLecvk]rϠC-w7@LIO@6SVqĭgm۽e ix楱[ ;pǺ>ԟkwʛy v}m[_~~yۗ_=S|w߀hUՄf7y V{|{߇u>`R)SkR#U&"/'$?XAaٝH8Ӄ:Ry~ HߑyXM)"R>&z#%SVʄw7\w"FLP*&pIZey!%gIȝE 慔>YgnJ*|+*.yۘ ӘÖ8$}` )tR,+L&rVOS~+ ZnP-kM *zt,l'gըG,WlJijw ,$l(,0,4̱ج<@-+LH'L7PG-TWMVw`-dmhhv`p[x|7q?nt/C7Dž=Αp(+wsk*W~"ꬷ^21lzZ;;!oso\2m/33Jo@m";Ooϲԟ.Cn89sa =Kqco7oorkw:/|̣ =vw4UP{bЄ'(-d S *Ԡ uܻim;LM"/8=5q5"EЂZ 12"ɨúA/x@XOaXF%Џ}":qc+~`"ҠVNzҀ> 7GMҎrc$<;ɨ4zQl+/K>JҌ*X-Rt'J14S !DtcbMm*rwEqP̠ Hs~P`=Fsf3'Gitc)4:6q= O=}\?-Ǿmhe8*ЋV1(x F]>iіgʦRU/ͩNeSNwJԢL*P+0PTJժZXͪVծz˔X͕hMZֶs+@gԺ&s\kZVYPKd=bkýd'KZd (f7z m''f2ͩJ˲lgKͭnwvj }Mrz% .놛W .vZ8Wmx[ؖ׼=k;Vw;^zn ҙf^=MiІ+_5JW\w[_w^|% }=,bz9Sbϛeq6\x@cnx1!W-a"gMe{^ι#48:6'PCjxsl¸Ͻw܅ڧEUZ\rOw]s÷iM[}N?bٵRO 8$h4u(*,`Â0284UcP:<ȃ PB8SӃFxHJL؄NPPӄLI@HZQ`b8J(5KXU8eI98T$OjHr8tXRXHF(5ohW|hXxc}xi>hTxxs:z@#HTxO;؉J8:UX؃cH742j膲:xĈI^I  588?VhG-%v;x.59d:ȉ؃R3xԍ; Iz%Ɉ5xU bȆgX8I؆Y&YUQTI9S8\294Yad:<ٓ XBYTFEJٔ'ÔN9"33HRIZCH`ٌą_hLc㕲gX'r G:86Xs9Jm[sf~i5#ue4YØ!xXK3Nc@3V7_3un+`0V NKZ:Ez4qJN4B.Z}QZjf,ZRyW/{vBHIXStH *|'kT&Z$TcʜLsQSVIcC4Y?jz~EWH?5N:s4 `H 6dJE[vɥa23ߣ_2*W^J*|h(ʲFkU v3eC4B*C{OyCb봶iN=$fJL15yj۸Ԝ4`OEdezʤK:qizm w{DGVIEtL$ӵꦋgI˻F$JKk_;@4%ÆOչ]Ƥ1ʹG=+Bm+L}[A#%:ÄKۚPSd+U諺KUI񛤓?$$źļzz:NjI@Q{M􄸆P[T2ܽAzB`g=3us[lc,𓺽ã5^Pƕp -cÍjXVhx.;f髬qe|)ni z Xdž,ZL+uyÍ\6;Zɖ ɜ|ɴ3Qʦ|ʨʪ/ʰL˴\˶J1˼˾<\,0;transcriber-1.5.1.1/doc/img/inter_confsnd.gif0000644000175000017500000002003207510315720016667 0ustar rtrtGIF87a\ (08@HPX`hpx```ppp0`@co nfs@nd.g i@^f' ?$O!@$(#$a0 $@0 @d@f̨\L @$XrX$\D!@:+@ Xm\<4+x+ ܸ 4f@@<* [ <(+d4a<$*@@lD!@4\ OverTwrite existi`ng file '+/pedo+pl/+barr+as/t+rn s+cr i,\/H*\ȰÇ#JHŋ3j BIɓ(S\ɲ˗0cʜI͛8sI  JѣH*]ʴӧPJJիXj:'H`ÊKٳhӚ *pʝKݻx˷߿ LwVe{ƒǐ#K˘3kܠϠC7`@ӨI/Xͺ׫ȞMm rͻwn Nȓ+_~УKw^س O_Ͼ{˟O~|_1UnQ& eXhڂ 栃ExoRX܅2!suءv jވ#g},ߋ07 h#dYe]Nfdyf)_f^ZH ۙf@ڪ[H 9j}"tH@HfЯH к!zZ`;f,fdN+H"G;آ,ۖ H. K;:ϫ3;[v/pI7[Hc {0HqLjs\A%+cJvp-r,s6ӌ>̚@4E#a?uqSsXtWux[ص{_vIaٚ"VAW mn׽-ݷjgx=35/HϭsGVJ7L<9q/w9c9睟97:cT3Ʈ~sm޼y߷|>xЁl<yKK20=U/9דNt{cO72/e# ¶nd_އ;30j?=x,%oHK9"BMz "8 ZY 2 زBN9+vТDB~{!.^!C}zB $*9L|EH BHz)F:lK$nɤ&FTyA(#D 8T%uXWRel KRY$T*91bRv"李dBhiJ@t%,#KmnӖhs8B_<؉w>gozJ&~jm@“(MJWҖ1TLgJӚ8ͩRFӞ@ PEHMRԦ$(ʀJժZXͪVծz` XJֲhMZֵJEm\J׺xͫ^ש͒j_KMbר.d'Kپ66ͬf7FI懪i=ֵֺm`j Xu?fMWuU޾ .bc,m`Ԟu~\BwEoֻݮpK5\ IU{Һ}.|.}^ 0~[X=q׫\׽͍]w+rx>GlvTe/'Z SX}1_ k8u+cn5qqӛ0|]a'yQ,xU/e&Y-U2y26VnV8xsV>Y|@Ј6FV v'ESҘ.1{ӠGMRԨNcSVհ׻ָεIikʒ9bUbl*ۯf-g'v&2{bi#9(FM[bG۳&7V LVUhw[7U]U{kmz~={ w{uw+S ^Us{x+O GNj-8u<>y 7-.򟯻HO-b\&wU.=X]b{}y])?3F?VNnzڷwpgy>gM|ݾjœݖ 7[Gy?7X;G+򮏽Q J,]5wRگ~wO|LwCYЏO[y{O~F/8GO.Ͽ~H-t}V7~hYh}bxogVmv˶{ŁWVZhaxŁy{zjHZVY&Ve\ec#V(xE &cUaDtgń3[=F^;galhcbL慔wq8a_M]McS\C(_/e@9D{`:VK:x0JX :[e|kڡʵ%zesfKi^+o(DiVK95mmjPy Ti*Ev6{qi*d{SڷaZ~jkHJn rHxdKPɷ*ZW ̫[븿ն kJ c{ڨw꽠xx{˨Sk^Kb DWua&ڛI,C٧ |{iZ^kxfmZh:{g ~3lZZ{`F:<å@B<ęYFHyLN~7Lm۴6Ejت.\1]SbVG tŐUdN˹H+Ize J:I ~:go+jDZj: ǜ~\|R8Bٽǝ[ț@%3^~,^$wHoJGALy}%2N+ F~]F[SOdnZI`l+ .Y o*=Vs~i |˼Νۡ:1ڸ:ZԀ~ ŎZꥫcb>~a<>JǞz}״ε.lTnWk^ άge瓶ږ`~ՎV^{mNN_Xv^6$_nBn]'ϫ)Oeʷ;^^*&F:i^`9I>t|>DM~1{šM-j]Οe?h}msU_YFԽ%텕%Y۰i& W/ †~\9;sJzyJc_;םo]%as/׊x+nܮ,PyqxOjߨ?: VZ^]ϕk}h.܎*\ ׼^~V-YIo׀moZi՟ƒ \hĄ-^Ęq %T 3\C-TYQA,QS˙eބrF U)1iŇJq&UѩK#NzOnEj`yuĜ-m ܋F-| 9d1-஁).¿L{MȏikӨr^yTѤb=jd]KMxlߞ-X2bY0lǯf6(O/sߗȎz I|/m__wsP#Ƣ/@/:A\?'P0C8 ?1? C$1@ 1,D0E_̈#fFo1GwG"ap $2I%I'2(DRJ-K 93L1$L3D3M5(>2N9,153O=M3PA%tެPEeQ=QI'R܌RM7tRH4TQGIE5UU54U_5OY;uILA5Wf3Q]_V$V}M٢mYg[vZk7@i5XW @rk\0\Ŗ1ۖ[UK̽]$*Ž K߹╗=z rl'^3/\lJcᄝ[8f.2oXu≽<gs'Rf\~9Bo lBIa[2Æb褽f9n9N.;7-t6[PTP@@%@0DLz @|)@PD\z @_@x,af@ϯH &@Wi@@T% @0&@DWz @ %T%@@蠴LDDzz @@1@`,WLUDP%@؀L &.pDz @He!lp,H!, H$!Dz)>R@t$paf@,Dz @H !>n)@ 8_@,> `*\ȰAJHŋȱLJ?qIO,P@Cr͛YI&ϝ:)bP.aIEbEh@בPVpu]mTJaacV `1[Ohfw$wv֜IFh7yl="*u֠'x+镛nE/GY~%<_Fj*୥銓tWk&,{VKjv$NK.ؒ $ k{+P G,Wlg& ,$l(,0p4l3߬9^O a򩥻sHbQF5~Cr=pb3Ї/29?KTXt1~;<EAm5 wsYЅOVȥ 6)~ GHn P0ul; B#M!h E~)>H-Amn(FY)h%&3WoIܞm8upw#8)=niDchElwAy]d"Upsd 9JVn d< b!N1'\C,JzQKjr.EʥN,d.aZ$0f"%pkbIMA&ޮnz48I=n\)vPƌk*+핻jk>0$p{qƢ$#׼2ӆ/O 3;gRs,|μtPlk ڌ__;tj4<qŞ-!û-3vб3}Cs?KӾN|7V +ro}c|ofzᆪ+oY,p#Տ{ښ(.Ke:;~'9ЀF9qsZhacZ`*WA_WS WBMvێD"%7JKXd($|B7GB)"1 d':ViZRe"/vY,5i'u.i" (vn |*b2hN&:ڣn߅CV!蝎9ffj~J਍ߩ*"a 샵 ʫ8Rz,~ɗN_ІߎmjK]\knx܎.kݥջi*oU Sno PSjl5hgw ,OAɱ1@0,4[Aα@엫LmH'4e(rIJ.-T'մaO\\'-V+'dmhl=vp}`Cxe [Wi/='5v'7Gy~n҂~oH.砇._n:ҙk磷륟.ͩ:J/RK{W>nO|?H;د|WO HGKVB9Q\JSܧL?*K8)DM:Oz&@ e.5$jQ{iS:P&OiPY u+ԭ4JeSJֲ UW*Tv\jM]ֳxT ѵU +LTuFk^سU+G:Z"}lRRV h%YLheG֮NWڶ]lsJ-v µ_J6^lsKB7άvvR x3֨U+/z5F/[VJ]7] 9?w21+9L]`T86NJt85 [3bÔX5'0{q&qeB|78N@~u\ c0)M0dY)-lJ|4:,> 0[hLd&`1Rf'Z>;6yL~٬a7_M<8#%]s"G~h9&/~1Gg/˘4 s2xb49eMk1t3]VC&A6SYZ՛NqWK#9п-M>zTʔaL4׶~2xǣr]eaY֬Vtd`]gpZ!ris5vc[[ډ4mmoը6 n+ qMlvO8'kb/\6s;Z{3oMlX5ƶ>NFKRns?9Bg7ٜt5/Z5/ntDyPO2|h9cn"k V׿n`l;SBy3#fvW~/§؛AěV/ʇ.p {='kRuj{\;ޚ{Ӯz_~_LT~JO]X7:-uF7js'vteusvsrRW'7@7\|W}.7sr7dfn:np~&jd6f5h~&nrgwG|-=xzȶ0}.=fk ׄ悽76m XgYWt((NeW1AHPCJWFփܧ#pPxjkaHdHr2YxoyfQ(h}H}hrXU+Wu&`t&r8u6g}d'{;s@VsfABqs1Gpouoh2){ņG}xa38x"]k4ؘј#Bx؍8X؍蘎ٸ]8aD5!-t[s0 3bՈ]AI =Y5 ِi <I5/RrǓSґ J]׸@$$+x'B*ߢ+y.));")5/$B*B )z"AA=4?$C9&-&+;y:K4Mi#Aٕ"F)`ג 5a9l+dYDY4jI#p'w69.Wi:s4uy A3IiJ+Dh9? Ә@S15ٙ1eyiy)3yQJ)y9W{S778y;yȉ4J`GЉGzĜ>$FIWɶDo 4;c>L:98Y s+FCs)7A-@#EQ>DAOTE>DٝfٚJ:P$>@BBJ@CMП=IZE%T sE<B zC,:A٢BB6JTc::-iE(3*F:IK/M*WT@$;C[ E,$EddWz{*zC*pʟhڒe xڢJ*gϙZ<|j2iIJI:1ι:*Yt JԩH|vH}y(ڪ<Gzjw𷋷^ʫ-憺իj|ĚʪJZϚj^ӚJj k٭H⚪z7*?ڮx:*3z_²FÏ;{9Ds%)C۰KI@2,JQ,Bk@K,ri[b&{6k0(+7*["I $p 3Jǖ)m+=k? 7#(AB3Pb*PIzR]9k=R _X;?\K!(#[̲zYZ^mKoek9c IKsKP F;{._y^wR 1k뱹:01K$+!Q{;ۺ1K"{Q{țʻۼ;[;transcriber-1.5.1.1/doc/img/inter2.gif0000644000175000017500000001610307510315720015243 0ustar rtrtGIF87aXpxXthhxTPxȐDczu r@re|)nt@/Pd\oc/i_mg/@intexr2.gaiff'@?ȯH &@(i@@%% @0&@D(z @ %%%@@蠴LDDzz @@1@`,(L&DP%@؀L .pDz @e%lp,а%@, $%Dz @)R@t$paf@,Dz @ %Over.nwHrite ex i2sti8ng f_i le@ ,'H*\ȰÇ#JHŋ3j1# CIɓ(S\ɲ˗0cʜI͛8s40@ JѣH*]ʴӧPJJU)h SI"yٳhӪ]˶۠=QH7y$߿'((È+^̸ǐ#KLˏ2$ح~h[%UI? K/۸sͻ߉ *,uisM67ixC¶}x`lαkν "&u?+wnzIN>p`Ͽ Wy&_X | XGE߅f}(_kZ^j(| NRqh8Y |ȣN@#A$јH&?8}AFtAdd~Kf5O^J)V9ҕ\暽5_%'0e挴Y|ov䆚S~݉F)H6#FU%q6>yz)%) 呦+5ުpW٢k:ܠ?K!ָmB+e^:lik[`v$k/B*Pf/l'k'"JhcVlgspG: $l(,0,4l8|3r:-DmH'L;s@7-TWmXg=(G`-d=2fl6h-tmwq߭|mw${n8Ҁ,D V$;z'.8KnV5;9T/޴驓z"s2Ӟ::[^4U6w>~;ʶ\d>s3/-#O#{I*CzOO[Bc\o̧@Aov3^G@uؓKGAoDx?LwYW;}~ _7?y B߽x{'"*Єx0"Nӥt9Y28PYQnmi@kL3y_qe@ I&2ИzV[z32OZs DzƳڗ[ u;rsYƿk=: }V|Wlg}ExUrSVm7Po}#'~e.QwϖrnVWJfw_*ET6|emFhv_췃ׁUzTxsn6Nf)hVb W]13}5h`7{6|F+4l{iSUVLa*of}Iąk8~4xו&J WJb\ WVVo+M_ɞ jڡ%EJGLhAHJv?EɹvDe§J5Q(ChAtɐG:$ReHE*[zWHi:'aYzuWՉ78YOlSK>GI:iVUJSLXyɣӨ::89V:64ZzBoBګ$ZJ:z;ڬ:Zzؚںڭ:ZJ"# ڮ:ZZjگ[{ ۯ[۱  %({+*K&k-[6{+'˳+K;{˳1{"HJ[:;[ѳ*E@KORK%W{[k"P˲.{K{hڴ# E>[UR˲S[Z;S nۮs;(˶pTkQkw|ۮ> Kzq۹;{_Zv ۺoeKʻL[#ø̻FKK۹ Kכ;ѻ;{K0[{ۿ+<\{ ܰ P| "<$\&|(*,.L04\6|8:<9 B FȌÏ\Ñ|`\r\zǚɜŁLsƖ3lɥ|mʩ|ȧlę|ɇLʱLò\ʲʶLlʃʻGȴʪǯȜʌß<ą˼ʭ\ D|͒,ql˫̰<ݜ¼E\l,˓,ʪ|<̾LLÕ|˷ },Ϡ|Ll IԜ\,=ؼ4\#-.OLtϒ,ҵ<-]̹l=M=ҺlF)0P2<ԐˌM-M^0`]=֔lIfP-lmej-vz|~׀؂=؄ P؈؊؈}،׎ؒ=ٔ]ٖ}٘} àڢ=ڤ]ڦ}ڨ. ڭ= =۴]۶}۸ ۾ۼ=]ƽ۽}M]}=}]ܬ }-]޷Íݳ޺ߺ m]߶m ߵ ]=߲-อ N @Mṍ-N>N-m.>n,ɝ0],֝N%[DDK6.\>4 >J-՝V>?-Y.cN"^Q-x`lq{n`}|.悎}G]n j.e. .ߖSn.cꪎnY^NO>`볾=^d8^N>n~n(¤;N^~퉮[ߐގ>\^ >ޯnQՎnniiXN_/ ~^> ~tN4s/.C/B>H7GA/GOV?J:.A^O]O2a~e/fC/q_~]~g^Nl/~}~?h䌯uDWz/aON.mD@b…Z4@ #"XqÉ/~X$ɔ'vSƕQtXbJ.g@P&EBL4I6 kV]zʳ*E1a dZV۾H۵PΔ w*F=ޕQB6Mt޸rQܙ[_UN=]nIw hIi9QҵJ]VRePÕ"N|;3W˛//+j٥xᇛ> ;u3o_93o= 6)Cp[0$ L#0&` 7\@?1DG$D;41EQTE_1FcTHFg|GwLQG2H/4#D2I%dI'2J)J+2K-K/$0#L3D3MTM7LM8N933M3PAsPC,PELtQG|t?k4RK)4S*4SN;E'MJTP5CSUPV[UAI%V[o}TV\wL]_{%aEvc vegSUjj]T[n7\sE7U]w߅Vv㥷^{\q- ZWXg% 8[;v}]Z n؇,b5MXc#TJזW4ew^dU^h\5'fybh֨:kzk;ͮ&6;m6߆;n离n;oo[Ͼ|ݷ>e?͇_v۝^/ZXc_(6 ЀWA@'q`%8A VЂ`vЃaE8BЄ'Da UBЅ/a e8CІ2 ;transcriber-1.5.1.1/doc/img/inter3.gif0000644000175000017500000000355507510315720015253 0ustar rtrtGIF87apx @b@arras/trans/Dczu r@re|)nt@/Pd\oc/i_mg/@intexr3.gaiff'@?ȯH &@;i@@8% @0&@D;z @ %8%@@蠴LDDzz @@1@`,;L9DP%@؀L .pDz @(elp,(Є, (hDz @)R@t$paf@,Dz @( Over0nwHrite ex i2sti8ng f _ile@ , H*\ȰÇ#JHŋ3jȑcBIɓ(S\ɲ˗0cʜI͛8sܙSG@ JѣH*#ӊQׯ`o6JQ@։f=+1-Yl#MYqnػx{\~V;l0= $ T"%l//)Ni҇Am4K!!˞sg79jԮGp_$ݶK;볛C;!f>Rx~"` {y'mfUu5^u__yUWzax'JhH!VX!`^*()I9ًJH\{$pzR7^~8Zw*&]#H#X-&bYxQ6H:9 )KXd8$!y}V$q~yG YOa7h(&]u29甜vy4ދAi詨ve#B ZߤlZz) +[;WkPi.{nhFʬ,-wm+=!اZ dHGUn˭I-nJ4tnFJivxk͉pfd"!{0O#k2&WWƀjIa*lN5xs>s٫ -%T|wV-(fWm[/5º#Gь2ʍ~vê[ Mk7)mE[Y7\f5`I8}ؔ~> 1 ^rw%mXKNՔC}6^?9c#7h Yz-<*=뎹tX#䓓r{U>9Zkz|jȧ'%rXCF d"RԪ75iqoӘ}688kW?mЃ_(Yy e<7a sHCpVaSH"V\BSé0хQyb (ETibߌEq` X'DhL?6pH:x̣X;transcriber-1.5.1.1/doc/img/inter_bindevent.gif0000644000175000017500000001345707510315720017230 0ustar rtrtGIF87a @X@Xptp%@0DLz @|)@PD\z @_@x,af@ѯH &@Di@@A% @0&@DDz @ %A%@@蠴LDDzz @@1@`,DLBDP%@؀L (.pDz @elp,, $Dz)R@t$paf@,Dz @ n)@ 8_@,H*\ȰÇ#JHŋ3jȱCIɓ(S\1bʜI͛8sɳϟ@ JѣH*]TKMJJիXjݺ)L.ÊKٳhӪ]˶۷pʝKݻxט/fIÈ+>~ _ zFgy杷`Ğڇ!vn"UL_ +֨݇H'zxL_|?QP=gLkv3k !8LdYmv /ts@.z]ȼq} WX?/:X V: 8DpOh@!Ј:Lb&Vqg‰wCX},`@(zt$"XJц[#EAoDF\dx6^tc )(Ƥt+O p|u|n2l$UK?&rl!HAF~c- xӈ"{(acc'I4Қj44cn3f2oILIp& YVtg/gy*Bdd= KZ3fѪI83x^>7Wq:BLX(8Ybӑm1 RޱtcC)Pj5(LI5(4OD^;Tb!M2D=jK&2OdD+.Hl#oԥë́Yc)ZV))ZMvͫ^q֘PRS^4d'k5ź d)zgԝYSnMjWXtpg]lg*i#޺lp Ln@JnЃDž8iu%n׈Q,LtljW|aNջSM__6va1.}D-zIU?:ǑLl&t`MBu^O]ETV*^fuh!6vkgP{M2a;77s~ersO!mۃ;Skm>ؿqϸ7{ /+p+\(OW0gN8Ϲws +f-HOҗ;?olrú.Z3zskOwf7e}[~].{ۮQBi|7\./f'{Ixoy>yk^|{x^B73w۝vzNy>W]߽r~{ɯ3ط>}g;GO]1?{'ȗ?CO|s}~7'}'·}7~~ǀ(~ X~r;~TWqf~bwv׀g{x{׀)|ׁ~G}8}>h|u28yW}-XDy+8Ah0xW:UwȂ-rFHwdJk8{؆W4ȁx {@.XyXZ(W\؅t[y{c(wx˗(|x7wSy;GXcXX(Si`X{CWLJ|X~hz|{{猿ȃT4H÷M(XuM%gcXs8t(VXC׋؏ˆ9p#Jhx'G ِy36wّ "9$Y&y(*,ْ.029 t)B Iluq<ٓR9dFy9c#Zp!PR9TYVi0ZWٕ^`b)a19_HjY5^hkp4mqYv94syw|Y3y}i4ygY;9Yyٙ9Y[Iٚv=I;)ٛlYsYbɋٜŃ9p˩BYÆ73h9C[f_ɩsm<54YTe3FlTYaL9=i\*m2YAeKV[fnÜ%jTZ*SIn7Ġ\dEZOMQf9` ڢʖ^g'9G\ecӟ+]v8*:JٟMIKSFS٤ԩ` Z_8azbZLzK6npr0jjsz|uڥWZ:ZzIn*YXZWVک:M>|R%e\ F\:eD^:ì4z=*/CNvF浯bjI˯ٞI91fVf Fapfz,L=j %2D_&dCv@HUmvaGJmA_7 dVIf6]Š6=Kbf঴BNM4I^8{ejTO.h!5cFkV\Jckd[b.FREɰڡTU- DGS4ayKT%:EI]Vk$lMϵeKf4j5&5/UgYkZ^|ACNNķj+#di Ui=PNˆhv^5kVhcf_W~fm;{f{aԱKQ 괾t;렄;UX+E>KeԸV\Kb˳ThK m5ISͦPʲ녾`쉟,j&#mScF%?گlջ_k꼈 幩J‡iъV*lmڧ2<4!\U:{z-Y3@Z^ᑺ9V!5* U b$~-JfpsZIEl᫥N~4,,FB~;4.`MӤ廕`C:TX37fz3m~^VoNƩ,U:t/z^j.T-nM?~yy>FL=BzvS=gդW^Y\SДyU3.W.>;N5T?A>=]^kN;q^͞?؞ߞn.}3_@ _.$_(&q*,O002?4_68:<9;transcriber-1.5.1.1/doc/Index.html0000644000175000017500000000034507510315716014540 0ustar rtrt Transcriber's Presentation transcriber-1.5.1.1/doc/IndexDe.html0000644000175000017500000000034410122047605015000 0ustar rtrt Transcriber Dokumentation transcriber-1.5.1.1/doc/IndexFr.html0000644000175000017500000000034607510315716015031 0ustar rtrt Prsentation de Transcriber transcriber-1.5.1.1/etc/0000755000175000017500000000000010605162351012601 5ustar rtrttranscriber-1.5.1.1/etc/local_cs.txt0000644000175000017500000007472210173750260015137 0ustar rtrt# Localization for Transcriber saved on Wed Jan 19 23:31:26 Střední Evropa (běžný čas) 2005 with encoding utf-8 array set local_cs { {} {} %act: {} %add: {} %alt: {} %cod: {} %coh: {} %com: {} %def: {} %eng: {} %err: {} %exp: {} %fac: {} %flo: {} %gls: {} %gpx: {} %int: {} %lan: {} %mod: {} %mor: {} %mov: {} %par: {} %pho: {} %sit: {} %snd: {} %spa: {} %syn: {} %tim: {} * {} 0 {} 1 {} {1 mn} {1 min.} {1 sec} {1 sek.} 2 {} 3 {} 4 {} 5 {} {5 mn} {5 min.} 6 {} 7 {} 8 {} 9 {} 10 {} {10 sec} {10 sek.} 11 {} {19 cent...} {} {30 sec} {30 sek.} @Activities {} @Bck {} @Begin {} @Bg {} @Comment {} @Eg {} @End {} @g {} @Location {} @NewEpisode {} @RoomLayout {} @situation {} @TapeLocation {} @TimeDuration {} @TimeStart {} {[b] bruit indéterminé} {} {[bb] bruit de bouche} {} {[bg] bruit de gorge} {} {[ch] voix chuchotée} {} {[conv] conversations de fond} {} {[e] expiration} {} {[i] inspiration} {} {[mic] bruits micro} {} {[n] reniflement} {} {[nontrans] segment} {} {[p] pauza} {} {[pap] froissement de papiers} {} {[pf] soufle} {} {[pi] inintelligible} {} {[pif] inintelligible/faible} {} {[r] respiration} {} {[rire] rires du locuteur} {} {[shh] souffle électrique} {} {[sif] sifflement du locuteur} {} {[tx] toux, râclement,éternuement} {} {[z] zadrhnutí} {} About... {O programu...} Add Přidat {Add audio file...} {Přidat zvukový soubor} {Adjust playback speed (%)} {Přizpůsobit rychlost přehrávání (%)} Amount Množství amount množství amount.cur {} amount.phy {} amount.phy.age {} amount.phy.dur {} amount.phy.len {} amount.phy.spd {} amount.phy.temp {} amount.phy.wei {} applaude {} applaudissements {} {Apply to next word} {Týká se dalšího slova} {Apply to previous word} {Týká se předchozího slova} {Apply to selection} {Týká se výběru} ar {} Arabic Arabsky {Arabic (ISO-8859-6)} {Arabsky (ISO-8859-6)} {Ask user to save configuration before leaving} {Uložit nastavení před ukončením na vyžádání} {Audio file} {Zvukový soubor} {Audio file options} {Nastavení zvukových souborů} {Audio file...} {Zvukový soubor...} {Audio filename} {Jméno zvukového souboru} {Auto-save interval (in minutes)} {Interval automatického ukládání (v minutách)} Automatic Automaticky {Automatic import from selected file} {Automatický import ze zvoleného souboru} {Automatic selection playback} {Automaticky přehrát výběr} {Automatic space insertion} {Automaticky vkládat mezery} Automatic... Automaticky... Axis Osa b {} background Pozadí {Background attributes} {Vlastnosti pozadí} {Backup extension} {Přípona jména záložních souborů} Backward Zpět {Backward search} {Hledat zpátky} bb {} {Beep at segment boundaries} {Zvukový signál mezi segmenty} {Beep sound file} {Soubor zvukového signálu} bg Pozadí Bindings {Klávesové zkratky} Bindings... {Klávesové zkratky...} Both Obojí Browse... Procházet... Bulgarian Bulharsky {C:\Program Files\Maxthon\Maxthon.exe} {} Cancel Storno {Case sensitive} {Rozlišovat velká písmena} {Central european (Latin2)} {Středoevropský (Latin2)} ch {} Channel Kanál Channels Kanály {Check spelling of capitalized words} {Kontrola pravopisu ve slovech psaných kapitálkami} Chinese Čínsky {Choose first speaker} {Zvolit prvního mluvčího} {Choose font} {Zvolit písmo} {Choose second speaker} {Zvolit druhého mluvčího} {Cleaning up memory...} {Uvolnění paměti...} Close Zavřít Code Kód {Colorize speaker segments} {Obarvit segmenty mluvčího} Colors... Barvy... {Command buttons} {Příkazová tlačítka} Comment Komentář {Compute low-resolution shape for long sound files} {Spočítej "low-resolution shape" pro dlouhé zvukové soubory} {Configure colors} {Nastavit barvy} {Configure events} {Nastavení událostí} {Continuous playback} {Přehrávat od začátku do konce} {Control panel} {Kontrolní panel} conv {} Copy Kopírovat {Create section...} {Definovat novou pasáž...} {Create speaker} {Definovat nového mluvčího} {Create turn...} {Definovat nový obrat...} cs {} {Current segment} {Aktuální segment} Cursor Kurzor Cut Vyjmout {Cyrillic (ISO-8859-5)} {Cyrilika (ISO-8859-5)} {Cyrillic (KOI8-R)} {Cyrilika (KOI8-R)} Czech Česky {Czech for Windows (CP1250)} {Česky pro Windows (CP1250)} {Cílový adresář} {} da {} Danish Dánsky de {} {Debug menu} {Menu pro odstraňování chyb} {Default browser:} {Přednastavený prohlížeč:} {Default scribe's name} {Jméno přepisovače (základní)} {Default settings for raw sound files:} {Základní nastavení pro nezpracované zvukové soubory} {Default text cursor position} {Přednastavená pozice kursoru v textu} Delete Vymazat {Delete breakpoint} {Vymazat záložku} Description Popis {Destination directory} {Cílový adresář} Destroy Zrušit Dialect Nářečí Display Zobrazení {Displaying transcription...} {Zobrazení transkripce...} {Do shape computation in background} {Počítat tvar na pozadí} down Dolů Dutch Holandsky dýchání {} e {} Edit Upravit {Edit episode attributes...} {Upravit vlastnosti přepisu...} {Edit event} {Upravit událost} {Edit language list...} {Upravit seznam jazyků...} {Edit lexical list...} {Upravit seznam lexikálních událostí...} {Edit named entities list...} {Upravit seznam vlastních prvků (VP)} {Edit noise list...} {Upravit seznam ruchů...} {Edit pronounce list...} {Upravit seznam výslovností...} {Edit section attributes} {Upravit vlastnosti pasáže} {Edit section attributes...} {Upravit vlastnosti pasáže...} {Edit translation} {Upravit lokalizaci} {Edit turn attributes} {Upravit vlastnosti obratu} {Edit turn attributes...} {Upravit vlastnosti obratu...} el {} en {} Encoding Kódování {End of event} {Konec události} {End of line} {Konec řádku} English Anglicky {Episode attributes} {Vlastnosti přepisu} es {} {Event foreground} {Popředí události} Events Události {Events display...} {Zobrazení událostí...} {Expand waveform} {Větší grafické zobrazení zvuku} Export Exportovat {Export to Childes format...} {Export do formátu Childes...} {Export to HTML format...} {Export do formátu HTML} {Export to LDC .typ format...} {Export do formátu LDC.typ...} {Export to LIMSI label...} {Export do LIMSI...} {Export to STM format...} {Export do formátu STM...} {Export to Text...} {Export do textu...} Extent Rozsah {External Speakers Database :} {Externí databáze mluvčích:} fa {} fac {} Facilities Zařízení fi {} Fidelity Kvalita File Soubor filler Argumentace Find Najít {Find and replace} {Najít a nahradit} {Find next} {Najít další} {Find speaker} {Najít mluvčího} {Find topic} {Najít téma} Find/Replace Najít/nahradit Finnish Finsky {First segment} {První segment} {First signal view} {Náhled prvního okna zvukového signálu} Fonts Písma Forward Dopředu fr {} French Francouzsky {General options} {Základní konfigurace} General... Obecné... Geo-Soc-Pol {} German Německy {global name} {Globální jméno} {Global speakers database} {Globální databáze mluvčích} Glossary Slovníček {Go back before playing (in seconds)} {Mezera před přehrávaným úsekem (v sekundách)} {Go to...} {Přejdi na...} Greek Řecky {Greek (ISO-8859-7)} {Řecky (ISO-8859-7)} gsp {} gsp.loc {} gsp.org {} gsp.pers {} he {} {Header size} {Velikost hlavičky} Hebrew Hebrejsky {Hebrew (ISO-8859-8)} {Hebrejsky (ISO-8859-8)} Help Nápověda hi {} {Highlighted text bg} {Pozadí zvýraz. textu} Hindi Hindsky {hovor v pozadí} {} hu {} Hungarian Maďarsky i {} {Import from file...} {Import ze souboru...} {Import speakers from file} {Importovat mluvčí ze souboru} {Import topics from file} {Importovat témata ze souboru} indicatif {} Information Informace Informations Informace Insert Vložit {Insert background} {Vložit pozadí} {Insert breakpoint} {Vložit záložku} {Insert event} {Vložit událost} {Insert event...} {Vložit událost...} {Instantaneous event} {Okamžitá událost} {Isolated noise} {Jednotlivý ruch} it {} Italian Italsky ja {} Japanese Japonsky {Japanese (EUC-JP)} {Japonsky (EUC-JP)} {Japanese (ISO-2022-JP)} {Japonsky (ISO-2022-JP)} {Japanese (Shift_JIS)} {Japonsky (Shift_JIS)} jingle džingle Keystrokes Klávesy ko {} Korean Korejsky {Korean (EUC-KR)} {Korejsky (EUC-KR)} {Korean (EUK-KR)} {Korejsky (EUK-KR)} {Korean (ISO-2022-KR)} {Korejsky (ISO-2022-KR)} la {} Language Jazyk lapsus {} {Last modification date} {Datum posledních úprav} {Last segment} {Poslední segment} Latin Latin Latin3 {} Latin4 {} Left Levý Lexical {Lexikální událost} Lists Seznamy {Load configuration file...} {Načti konfigurační soubor...} loc {} loc.addr {} loc.addr.elec {} loc.addr.post {} loc.addr.tel {} loc.geo {} loc.geo.line {} {Localization file} {Lokalizační soubor} {Localization in Czech} {Lokalizace do češtiny} Location Umístění {Log trace in file} {Zapisovat do log souboru} {Loop on segment or selection after a pause} {Přehrávat segment nebo výběr stále dokola} lu {} {Main features} {Hlavní funkce} {mal prononcé} {špatně vysloveno} Message Zpráva Messages Zprávy mic {} Mode Modus {Modifications saved in the file %s} {Úpravy uloženy v souboru %s} Modify Upravit {Modify speaker} {Upravit mluvčího} {Modify topic} {Upravit téma} {mot inconnu} {neznámé slovo} {Move breakpoint} {Posuň záložku} {Move to...} {Přejít na...} music Hudba musique {} n {} Name Jméno {Named Entities} {Vlastní prvky (VP)} {nb. of sections:} {} {nb. of syncs:} {} {nb. of turns:} {} {nb. of words:} {} {NE amount} {VP množství} {NE buttons} {Tlačítka vlastních prvků (VP)} {NE fac} {} {NE gsp} {} {NE loc} {} {NE metonymy} {} {NE org} {} {NE pers} {} {NE prod} {} {NE time} {} {NE unknown} {} neologismus {} nesrozumitelně {} {neurčitá výslovnost} {} New Nový {New language} {Nový jazyk} {New topic} {Nové téma} {New trans} {Nový transkript} Next Další {Next section} {Další pasáž} {Next synchro} {Další segment} {Next turn} {Další obrat} {neznámé slovo} {} nezřetelně {} nl {} no {} {No audio segment selected !} {Nevybrali jste žádný zvukový segment!} {no speaker} {Žádný mluvčí} {no topic} {Źádné téma} Noise Ruch {Noise foreground} {Popředí ruchu} nontrans Vyprávění Norwegian Norsky nádech {} néologisme neologismus OK {} {Open audio file...} {Otevřít zvukový soubor...} {Open segmentation file} {Otevřít soubor segmentací} {Open segmentation file...} {Otevřít soubor segmentací} {Open trans...} {Otevřít transkript} {Open transcription file} {Otevřít soubor přepisu} {Open video file...} {Otevřít soubor videa...} Options Nastavení org {} org.com {} org.edu {} org.edu/gsp.pers {} org.non-profit {} org.pol {} Organization Organizace {orthographe incertaine} {} other Jiné {Overlapping noise} {Překrývající se ruchy} {Overlapping speech} {Překrývající se řeč} pap {} Paste Vložit {Pause at segment boundaries} {Krátké zastávky mezi segmenty} {Pause duration (in seconds)} {Trvání pauzy (ve vteřinách)} pauza {} pers {} pers.anim {} pers.hum {} pers.imag {} Persian Persky Person Osoba pf {} pi {} pif {} pl {} {Play around cursor} {Přehrát bezprostřední okolí kursoru} {Play next segment} {Přehrát další segment} {Play segment} {Přehrát segment} Play/Pause Hrát/Pauza Playback Přehrát {Playback mode} {Způsob přehrávání} {Please, check your Aspell spellchecker installation.} {Zkontrolujte, prosím, svou instalaci jazykového slovníku Aspell} Polish Polsky Port {} Portuguese Portugalsky Position Pozice {Position (in seconds)} {Pozice (v sekundách)} Presentation Prezentace Previous Předchozí {Previous section} {Předchozí pasáž} {Previous synchro} {Předchozí segment} {Previous turn} {Předchozí obrat} {Principal language} {Hlavní jazyk} prod {} prod.art {} prod.award {} prod.award/pers.hum {} prod.printing {} prod.vehicule {} Product Produkt Program Projekt Pronounce Výslovnost pt {} {přeryv řeči} {} přeřeknutí {} Quit Konec r {} Rate Rozsah {Reading transcription file...} {Načítám soubor transkripce...} {Recently used speakers} {Naposledy používaný mluvčí} {Recording date} {Datum nahrávky} {Reduce waveform} {Menší grafické zobrazení zvuku} {Reference manual} {Referenční příručka} {Remove unused speakers} {Odstranit nevyužité mluvčí} {Remove unused topics} {Odstranit nevyužitá témata} Replace Nahradit {Replace all} {Nahradit vše} {Replacement string} {Nahradit řetězcem} {Replay segment} {Přehrát segment} report Popis Resolution Rozlišení {Resolution bar} {Posuvník pro nastavení rozlišení} Revert {Zpět k posledně uložené verzi práce} Right Pravý rire {} {rire en fond} {} ro {} Romanian Rumunsky ru {} {rupture de syntaxe} {} Russian Rusky Save Uložit {Save as...} {Uložit jako...} {Save audio segment(s)} {Uložit audio segment(y)} {Save audio segments options} {Volby pro uložení audio segmentů} {Save configuration} {Uložit nastavení} {Save configuration as...} {Uložit nastavení jako...} {Second signal view} {Náhled dalšího okna zvukového signálu} Section Pasáž {Sections foreground} {Popředí pasáží} seg0 {} seg1 {} seg2 {} Segmentation Segmentace {Segments foreground} {Popředí segmentů} selected Výběr Selected... Vybráno... Server {} shh {} sif {} {sigle lu} {} {sigle épelé} {} Signal Signál {Simplified Chinese (GB)} {Čínsky (zjednodušená - GB)} sl {} Slavonic {} {Smart segmentation display} {Zobrazit segmentaci chytře} smích {} {smích v pozadí} {} {Sorry, couldn't launch spell checker} {Bohužel nelze načíst soubor kontroly pravopisu} {Sort by...} {Třídit podle...} Spanish Špalnělsky {Speaker foreground} {Popředí mluvčích} Speakers Mluvčí speech Mluva {Spell checking} {Kontrola pravopisu (CZ nefunguje)} {spelling checked} {Pravopis zkontrolován} {Start of event} {Začátek události} {Start of line} {Začátek řádky} {Stereo channel} {Stereo kanál} {Stop at next segment boundary} {Zastavit na začátku dalšího segmentu} {Stop before next segment boundary} {Zastavit před začátkem dalšího segmentu} {Store signal shapes in} {Uložit tvary signálu} Suppress Potlačit sv {} Swedish Švédsky Sync {} {Synchronized audio files} {Synchronizované zvukové soubory} Text {} {Text editor} {Textový editor} {Text foreground} {Popředí textu} ticho {} Time Čas time {} time.date {} time.date.abs {} time.date.rel {} time.hour {} {To keep your modifications, please provide a valid localization file name, come back to this edition window and click OK. Save also the configuration for reusing this file automatically in a next session.} {Chcete-li zachovat úpravy, vepište do příslušného políčka jméno lokalizačního souboru, vraťte se sem a potvrďte OK. Aby se tento lokalizační soubor automaticky příště načetl, uložte také Nastavení.} top {} Topic Téma Topics Témata {toux en fond} {} tr {} {Traditional Chinese (Big5)} {Čínsky (tradiční Big5)} {Transcriber's name} {Jméno přepisovatele} {Transcription %s saved.} {Transkripce %s uložena} {Transcription has been modified - Save before closing?} {Přepis se změnil - uložit před ukončením?} Translation Překlad Turkish Turecky {Turkish (Latin5)} {Turecky (Latin5)} Turn Obrat tx {} Type Typ Undo Zpět {Unicode (UTF-8)} {} unk {} Unknown Neznámý {Unzoom selection} {Volba měřítka (zmenšit)} up Nahoru Update Aktualizovat {Use color for NE buton} {Zvolit barvu pro tlačítko VP} {Use color for NE tag} {Zvolit barvu pro VP cedulku} {Use color for NE text} {Zvolit barvu pro text VP} {Use regular expression} {Užít standardní výraz} {User guide} {Uživatelská příručka} v(desc,chosen) {} Value Hodnota Version Verze {Vertical zoom (dB)} {Vertikální měřítko (dB)} {View all} {Zobrazit všechno} {Volby pro uložení audio segmentů} {} Volume Hlasitost výdech {} {Waveform bg} {Pozadí wavefrom} {Western (Latin1)} {Západní (Latin1)} {Western (MacRoman)} {Západní (MacRoman)} {with %d speakers} {s %d mluvčími} {with %d topics} {s %d tématy} Zadrhnutí {} zadrhnutí {} zakašlání {} zh {} {Zoom selection} {Výběr měřítka (zvětšit)} épelé {} šeptem {} {špatná výslovnost} {} {šustění papírů} {} } array set local_fr { {} {} {%s word(s) checked} {%s mot(s) vérifié(s)} 0 {} 1 {} {1 mn} {} {1 sec} {} 2 {} 3 {} 4 {} 5 {} {5 mn} {} 6 {} 7 {} 8 {} 9 {} 10 {} {10 sec} {} 11 {} {19 cent...} {} {30 sec} {} {[b] bruit indéterminé} {} {[bb] bruit de bouche} {} {[bg] bruit de gorge} {} {[ch] voix chuchotée} {} {[conv] conversations de fond} {} {[e] expiration} {} {[i] inspiration} {} {[mic] bruits micro} {} {[n] reniflement} {} {[pap] froissement de papiers} {} {[pf] soufle} {} {[pi] inintelligible} {} {[pif] inintelligible/faible} {} {[r] respiration} {} {[rire] rires du locuteur} {} {[rire] voix avec rire} {} {[shh] souffle électrique} {} {[sif] sifflement du locuteur} {} {[tx] toux, râclement,éternuement} {} About... {A propos de...} {Add to dictionnary} {Ajoute au dictionnaire} {Adjust playback speed (%)} {} {An automatically saved version was found. Rescue from it?} {Une sauvegarde automatique a été retrouvée. Voulez-vous la récupérer?} {Apply to next word} {Appliqué au mot suivant} {Apply to previous word} {Appliqué au mot précédent} {Apply to selection} {Appliqué ? la sélection} Arabic arabe {Ask user to save configuration before leaving} {Propose d'enregistrer la configuration avant de quitter} {Audio file} {Fichier son} {Audio file options} {Options pour fichiers sons} {Audio file...} {Fichier son...} {Audio filename} {Nom du fichier son} {Auto-save interval (in minutes)} {Délai avant enregistrement automatique (minutes)} {Automatic selection playback} {Rejoue automatiquement la sélection} {Automatic space insertion} {Insertion automatique des espaces} Axis Axes background {} {Background attributes} {Param?tres du bruit de fond} {Backup extension} {Entension pour le fichier de sauvegarde} Backward Arri?re {Backward and play} {Arri?re puis démarre} {Backward search} {Recherche arri?re} {Beep at segment boundaries} {Bip aux fronti?res des segments} {Beep sound file} {Fichier son pour le bip} bg {} Bindings {Raccourcis clavier} Bindings... {Raccourcis clavier...} Browse... Parcourir... Bulgarian bulgare Cancel Annuler {Case sensitive} {Distinction majuscules/minuscules} Channel Canal Channels {Nombre de canaux} {Check spelling of capitalized words} {Vérifie l'orthographe des mots capitalisés} Chinese chinois {Choose beep file} {} {Choose first speaker} {Choisir le 1er locuteur} {Choose font} {Choisir la police} {Choose second speaker} {Choisir le 2eme locuteur} {Choose speaker} {Choisissez un locuteur} {Choose speaker...} {Choisissez un locuteur...} {Choose topic} {Choisissez un sujet} {Choose topic...} {Choisissez un sujet...} {Cleaning up memory...} {Nettoyage de la mémoire...} {Clock clicks per second} {Clics d'horloge par seconde} Close Fermer Code Code Colors... Couleurs... {Command buttons} {Boutons de commande} Comment Commentaire {Compute low-resolution shape for long sound files} {Calcule une image basse résolution des longs signaux} {Configure colors} {Configurer les couleurs} {Configure event display} {Configure l'affichage des événements} {Configure events} {Configure les événements} {Continuous playback} {Lecture en continu} {Control panel} {Panneau de contrôle} Copy Copier {Create section...} {Créer une section...} {Create speaker} {Créer un locuteur} {Create turn...} {Créer un tour...} {Current segment} {Segment courant} Cursor Curseur {Cursor position} {Position du curseur} Cut Couper Czech tch?que Danish danois Debug Deboguage {Debug menu} {Menu de déboguage} {Default scribe's name} {Nom du transcripteur} {Default settings for raw sound files:} {Param?tres pour les fichiers sans ent?te:} {Default text cursor position} {Position du curseur par défaut} Delete Supprimer {Delete breakpoint} {Supprimer la fronti?re} Description Description Destroy Détruire Dialect Accent Display Affichage {Displaying transcription...} {Affichage de la transcription...} {Do shape computation in background} {Calcul de l'enveloppe en tâche de fond} down diminue Dutch hollandais Edit Edition {Edit comment} {Modifier un commentaire} {Edit episode attributes...} {Param?tres de l'épisode...} {Edit event} {Modifier un événement} {Edit language list...} {Modifier la liste des langues...} {Edit lexical list...} {Modifier la liste lexicale...} {Edit noise list...} {Modifier la liste des bruits...} {Edit pronounce list...} {Modifier la liste des prononciations...} {Edit section attributes} {Param?tres de la section} {Edit section attributes...} {Param?tres de la section...} {Edit translation} {Modifier les traductions} {Edit turn attributes} {Param?tres du tour} {Edit turn attributes...} {Param?tres du tour...} {End of event} {Fin d'événement} {End of line} {Fin de ligne} English anglais {Episode attributes} {Param?tres de l'épisode} {Event display...} {Affichage des événements} {Event foreground} {} Events Evénements {Events display...} {Affichage des événements...} {Expand waveform} {Agrandir le signal} {Expert mode} {Mode expert} Export Exporter {Export to .stm format...} {Exporter au format .stm...} {Export to .typ format...} {Exporter au format .typ...} {Export to LDC .typ format...} {Exporter au format LDC .typ...} {Export to LDC format...} {Exporter au format LDC...} {Export to STM format...} {Exporter au format STM...} Extent Etendue Fidelity Fidélité File Fichier filler {} Find Chercher {Find and replace} {Chercher et remplacer} {Find next} Suivant {Find speaker} {Chercher un locuteur} {Find topic} {Chercher un sujet} Find/Replace Chercher/Remplacer Finnish finlandais {First segment} {Premier segment} Fonts Polices Forward Avant French français {General options} {Options générales} General... Général... German allemand {global name} {nom global} Glossary Glossaire {Go back before playing (in seconds)} {Recul avant lecture (en secondes)} {Go to...} {Aller ?...} Greek grec {Header size} {Taille de l'ent?te} Hebrew hébreu Help Aide {Highlighted text bg} {} Hindi hindi Hungarian hongrois Ignore {} {Import from file...} {Importer ? partir du fichier...} {Import speakers from file} {Importer des locuteurs du fichier} {Import speakers...} {Importer des locuteurs...} {Import topics from file} {Importer des sujets d'un fichier} Index {} indicatif {} Information Information Informations Informations Insert Insérer {Insert background} {Insérer un bruit de fond} {Insert breakpoint} {Insérer une fronti?re} {Insert comment} {Insérer un commentaire} {Insert event} {Insérer une balise} {Insert event...} {Insérer une balise...} Insert... Insérer... {Instantaneous event} {Evénement instantané} {Instantaneous noise} {Bruit instantané} Interface Interface {Isolated noise} {Bruit isolé} Italian italien Japanese japonais jingle {} Keystrokes Touches Korean coréen Language Langue Language... Langue... lapsus {} {Last modification date} {Date de derni?re modification} {Last segment} {Dernier segment} Latin latin Lexical Lexical Lexical... Lexical... Lists Listes {Localization file} {Fichier de traduction} {Localization in French} {Traduction en français} Localize... Traduction... {Log trace in file} {Enregistre l'activité dans} {Loop on segment or selection after a pause} {Boucle sur segment ou sélection apr?s pause} {Main features} Fonctionnalités {mal prononcé} {} Message Message Messages Messages Mode Mode Modify Modifier {Modify speaker} {Editer le locuteur} {Modify topic} {Editer le sujet} mono {} {mot inconnu} {} {Move breakpoint} {Déplacer une fronti?re} {Move to...} Déplacement... Name Nom New Nouveau {New language} {Nouvelle langue} {New topic} {Nouveau sujet} {New trans} {Nouvelle transcription} Next Suivant {Next section} {Section suivante} {Next synchro} {Synchro suivante} {Next turn} {Tour suivant} {no speaker} {pas de locuteur} {no topic} {pas de sujet} Noise Bruit {Noise foreground} {} Noises... Bruits... nontrans {} Norwegian norvégien {not saved (unsupported output format)} {non sauvé (format non supporté)} néologisme {} OK {} {Open audio file...} {Ouvrir un fichier son...} {Open remote audio file} {Ouvrir le fichier son ? distance} {Open segmentation file} {Ouvrir le fichier de segmentation} {Open trans...} {Ouvrir une transcription...} {Open transcription file} {Ouvrir le fichier de transcription} {Open transcription or audio file} {Ouvrir une transcription ou un signal} Options Options {orthographe incertaine} {} other autre {Overlapping noise} {Bruit superposé} {Overlapping speech} {Parole superposée} Paste Coller {Pause at segment boundaries} {Pause aux fronti?res des segments} {Pause duration (in seconds)} {Durée de pause (en secondes)} {Pause duration between segments} {Durée de pause entre segments} Persian perse {Play around cursor} {Joue autour du curseur} {Play segment} {Joue le segment} {Play with pauses} {Joue avec pauses} Play/Pause Joue/Pause Playback Restitution {Playback mode} {Mode de lecture} {Please open signal for transcription} {Ouvrez le signal correspondant ? la transcription} Polish polonais Port {} Portuguese portugais Position Position {Position (in seconds)} {Position (en secondes)} Presentation Présentation Previous Précédent {Previous section} {Section précédente} {Previous synchro} {Synchro précédente} {Previous turn} {Tour précédent} {Principal language} {Langue principale} Program Programme Prononciation Prononciation Pronounce Prononciation Pronounce... Prononciation... quad {} Quit Quitter Rate Fréquence {Reading transcription file...} {Lecture du fichier de transcription...} Recalibrate Recalibration {Recent topics} {Sujets récents} {Recently used speakers} {Locuteurs récents} {Recording date} {Date d'enregistrement} {Reduce waveform} {Réduire l'enveloppe} {Reference manual} {Manuel de référence} Refresh {} {Refresh list} {} {Remove unused speakers} {Supprime les locuteurs inutilisés} {Remove unused topics} {Supprime les sujets inutilisés} Replace Remplacer {Replace all} {Tout remplacer} {Replacement string} {Chaîne de remplacement} {Replay segment} {Rejoue le segment} report {} Resolution Résolution {Resolution bar} {Barre de résolution} Restart Redémarre Revert {Revenir au fichier} {rire en fond} {} Romanian roumain {rupture de syntaxe} {} Russian russe Save Enregistrer {Save as...} {Enregistrer sous...} {Save configuration} {Enregistrer la configuration} {Save configuration before leaving?} {Enregistrer la configuration avant de quitter ?} {Second signal view} {Deuxi?me vue du signal} Section Section {Sections foreground} {} seg0 {} seg1 {} seg2 {} Segmentation Segmentation {Segments foreground} {} Server Serveur {sigle lu} {} {sigle épelé} {} Signal Signal {Signal name} {Nom du signal} {Sorry, couldn't find %s dictionary} {Désolé, le dictionnaire %s est introuvable} {Sort by...} {Trier par...} Spanish espagnol {Speaker foreground} {} {Speaker menu} {Liste des locuteurs} {Speaker name} {Nom du locuteur} Speakers Locuteurs {Spell checking} {Correction orthographique} {spelling checked} {orthographe vérifiée} {Start of event} {Début d'événement} {Start of line} {Début de ligne} stereo {} {Stop at next segment boundary} {Stop ? la prochaine fronti?re} {Store signal shapes in} {Enregistre les enveloppes des signaux dans} Swedish suédois Synchro Synchro Text Texte {Text foreground} {} top {} Topic Sujet Topics Sujets {Topics menu} {Liste des sujets} {toux en fond} {} {Transcriber's name} {Nom du transcripteur} {Transcription %s saved.} {Enregistrement de %s effectuée.} {Transcription has been modified - Save before closing?} {La transcription a été modifiée - Enregistrer avant fermeture ?} Translation Traduction Turkish turc Turn Tour Type Catégorie Undo Annuler {Unknown format} {Format inconnu} {Unzoom selection} {Supprime le zoom} up augmente Update {} {Use regular expression} {Utilise une expression réguli?re} {User guide} {Guide utilisateur} Value Valeur Version Version {Vertical zoom (dB)} {Zoom vertical (dB)} {View all} {Vue compl?te} Volume Volume {Warning ! All changes will be lost. Really revert from file ?} {Attention! Toutes les modifications seront perdues. Revenir ? la version enregistrée?} {Waveform bg} {} Word Mot {Zoom selection} {Zoom de la sélection} } transcriber-1.5.1.1/etc/local_fr.txt0000644000175000017500000004433510166527066015146 0ustar rtrt# Localization for Transcriber saved on Tue Oct 21 18:20:03 CEST 2003 with encoding iso8859-1 array set local_fr { {} {} { No audio file opened ! This will create an empty audio file ! Really save ?} {Aucun fichier son ouvert ! Ceci gnrera un fichier son vide ! Continuer ?} %act: {} %add: {} %alt: {} %cod: {} %coh: {} %com: {} %def: {} %eng: {} %err: {} %exp: {} %fac: {} %flo: {} %gls: {} %gpx: {} %int: {} %lan: {} %mod: {} %mor: {} %mov: {} %par: {} %pho: {} {%s not saved !!} {%s non sauvegard !!} {%s saved !!} {%s sauvegard !!} {%s word(s) checked} {%s mot(s) vrifi(s)} %sit: {} %snd: {} %spa: {} %syn: {} %tim: {} 0 {} 1 {} {1 mn} {} {1 sec} {} 2 {} 3 {} 4 {} 5 {} {5 mn} {} 6 {} 7 {} 8 {} 9 {} 10 {} {10 sec} {} 11 {} {19 cent...} {} {30 sec} {} @Activities {} @Bck {} @Begin {} @Bg {} @Comment {} @Eg {} @End {} @g {} @Location {} @NewEpisode {} @RoomLayout {} @situation {} @TapeLocation {} @TimeDuration {} @TimeStart {} {[b] bruit indtermin} {} {[bb] bruit de bouche} {} {[bg] bruit de gorge} {} {[ch] voix chuchote} {} {[conv] conversations de fond} {} {[e] expiration} {} {[i] inspiration} {} {[mic] bruits micro} {} {[n] reniflement} {} {[pap] froissement de papiers} {} {[pf] soufle} {} {[pi] inintelligible} {} {[pif] inintelligible/faible} {} {[r] respiration} {} {[rire] rires du locuteur} {} {[rire] voix avec rire} {} {[shh] souffle lectrique} {} {[sif] sifflement du locuteur} {} {[tx] toux, rclement,ternuement} {} About... {A propos de...} {Add} {Ajouter} {Add audio file...} {Ajouter un fichier son...} {Add to dictionnary} {Ajoute au dictionnaire} {Adjust playback speed (%)} {} {Amount} {Montant} {An automatically saved version was found. Rescue from it?} {Une sauvegarde automatique a t retrouve. Voulez-vous la rcuprer?} {Apply to next word} {Appliqu au mot suivant} {Apply to previous word} {Appliqu au mot prcdent} {Apply to selection} {Appliqu la slection} Arabic arabe {Arabic (ISO-8859-6)} {} {Ask user to save configuration before leaving} {Propose d'enregistrer la configuration avant de quitter} {Audio file} {Fichier son} {Audio file options} {Options pour fichiers sons} {Audio file...} {Fichier son...} {Audio filename} {Nom du fichier son} {Auto-save interval (in minutes)} {Dlai avant enregistrement automatique (minutes)} {Automatic...} {Automatique...} {Automatic import from selected file} {Import automatique du fichier choisi} {Automatic selection playback} {Rejoue automatiquement la slection} {Automatic space insertion} {Insertion automatique des espaces} Axis Axes Background {Bruit de fond} background {} {Background attributes} {Paramtres du bruit de fond} {Backup extension} {Entension pour le fichier de sauvegarde} Backward Arrire {Backward and play} {Arrire puis dmarre} {Backward search} {Recherche arrire} {Beep at segment boundaries} {Bip aux frontires des segments} {Beep sound file} {Fichier son pour le bip} bg {} Bindings {Raccourcis clavier} Bindings... {Raccourcis clavier...} Both {Gauche et droite} Browse... Parcourir... Bulgarian bulgare Cancel Annuler {Case sensitive} {Distinction majuscules/minuscules} {Central european (Latin2)} {} Channel Canal Channels {Nombre de canaux} {Check spelling of capitalized words} {Vrifie l'orthographe des mots capitaliss} Chinese chinois {Choose beep file} {Choisir un fichier 'bip'} {Choose first speaker} {Choisir le 1er locuteur} {Choose font} {Choisir la police} {Choose second speaker} {Choisir le 2eme locuteur} {Choose speaker} {Choisissez un locuteur} {Choose speaker...} {Choisissez un locuteur...} {Choose topic} {Choisissez un sujet} {Choose topic...} {Choisissez un sujet...} {Cleaning up memory...} {Nettoyage de la mmoire...} {Clock clicks per second} {Clics d'horloge par seconde} Close Fermer Code Code {Colorize speaker segments} {Colorier les segments des locuteurs} Colors... Couleurs... {Command buttons} {Boutons de commande} Comment Commentaire {Compute low-resolution shape for long sound files} {Calcule une image basse rsolution des longs signaux} {Computing signal shape. Please wait...} {Calcul de l'enveloppe en cours. Patientez...} {Configure colors} {Configurer les couleurs} {Configure event display} {Configure l'affichage des vnements} {Configure events} {Configure les vnements} {Continuous playback} {Lecture en continu} {Control panel} {Panneau de contrle} Copy Copier {Create section...} {Crer une section...} {Create speaker} {Crer un locuteur} {Create turn...} {Crer un tour...} {Current segment} {Segment courant} {Currently computing global shape for signal} {Calcul en cours de l'enveloppe globale du signal} Cursor Curseur {Cursor position} {Position du curseur} Cut Couper {Cyrillic (ISO-8859-5)} {} {Cyrillic (KOI8-R)} {} Czech tchque {Czech for Windows (CP1250)} {} Danish danois Debug Deboguage {Default browser:} {Navigateur par dfaut :} {Debug menu} {Menu de dboguage} {Default scribe's name} {Nom du transcripteur} {Default settings for raw sound files:} {Paramtres pour les fichiers sans entte :} {Default text cursor position} {Position du curseur par dfaut} Delete Supprimer {Delete breakpoint} {Supprimer la frontire} Description Description {Destination directory} {Rpertoire de destination } {Deselect all} {} Destroy Dtruire Dialect Accent Display Affichage {Displaying transcription...} {Affichage de la transcription...} {Do shape computation in background} {Calcul de l'enveloppe en tche de fond} down diminue {Duration:} {Dure :} Dutch hollandais Edit Edition {Edit comment} {Modifier un commentaire} {Edit episode attributes...} {Paramtres de l'pisode...} {Edit event} {Modifier un vnement} {Edit language list...} {Modifier la liste des langues...} {Edit lexical list...} {Modifier la liste lexicale...} {Edit named entities list...} {Modifier la liste des entits nommes} {Edit noise list...} {Modifier la liste des bruits...} {Edit pronounce list...} {Modifier la liste des prononciations...} {Edit section attributes} {Paramtres de la section} {Edit section attributes...} {Paramtres de la section...} {Edit translation} {Modifier les traductions} {Edit turn attributes} {Paramtres du tour} {Edit turn attributes...} {Paramtres du tour...} Encoding Encodage {End of event} {Fin d'vnement} {End of line} {Fin de ligne} English anglais {Episode attributes} {Paramtres de l'pisode} {Error, wave segment(s) not saved !!} {Erreur, segments audio non sauvegards} {Event display...} {Affichage des vnements} {Event foreground} {} Events Evnements {Events display...} {Affichage des vnements...} {Expand waveform} {Agrandir le signal} {Expert mode} {Mode expert} Export Exporter {Export to .stm format...} {Exporter au format .stm...} {Export to .typ format...} {Exporter au format .typ...} {Export to Amities dialog...} {} {Export to HTML format...} {Exporter au format HTML...} {Export to LDC .typ format...} {Exporter au format LDC .typ...} {Export to LDC format...} {Exporter au format LDC...} {Export to LIMSI label...} {} {Export to STM format...} {Exporter au format STM...} {Export to Text...} {Exporter au format texte...} Extent Etendue {Facilities} {Constructions humaines} Fidelity Fidlit File Fichier filler {} Find Chercher {Find and replace} {Chercher et remplacer} {Find next} Suivant {Find speaker} {Chercher un locuteur} {Find topic} {Chercher un sujet} Find/Replace Chercher/Remplacer Finnish finlandais {First segment} {Premier segment} {First signal view} {Premire vue du signal} Fonts Polices Forward Avant French franais {General options} {Options gnrales} General... Gnral... German allemand {global name} {nom global} Glossary Glossaire {Go back before playing (in seconds)} {Recul avant lecture (en secondes)} {Go to...} {Aller ...} Greek grec {Greek (ISO-8859-7)} {} {Header size} {Taille de l'entte} Hebrew hbreu {Hebrew (ISO-8859-8)} {} Help Aide {Highlighted text bg} {} Hindi hindi Hungarian hongrois Ignore {} {Import from file...} {Importer partir du fichier...} {Import speakers from file} {Importer des locuteurs du fichier} {Import speakers...} {Importer des locuteurs...} {Import topic} {Importer des sujets} {Import topics from file} {Importer des sujets d'un fichier} {Importing speakers from %s...} {Importation des locuteurs du fichier %s...} {Importing topics for %s...} {Importation des sujets du fichier %s...} {Importing topics from %s...} {Importation des sujets du fichier %s...} Index {} indicatif {} Information Information Informations Informations Insert Insrer {Insert background} {Insrer un bruit de fond} {Insert breakpoint} {Insrer une frontire} {Insert comment} {Insrer un commentaire} {Insert event} {Insrer une balise} {Insert event...} {Insrer une balise...} Insert... Insrer... {Instantaneous event} {Evnement instantan} {Instantaneous noise} {Bruit instantan} Interface Interface {Isolated noise} {Bruit isol} {Please, check your Aspell spellchecker installation. } { Avez-vous install le correcteur orthographique Aspell ? } Italian italien Japanese japonais {Japanese (EUC-JP)} {} {Japanese (ISO-2022-JP)} {} {Japanese (Shift_JIS)} {} jingle {} Keystrokes Touches Korean coren {Korean (EUC-KR)} {} {Korean (ISO-2022-KR)} {} Language Langue Language... Langue... lapsus {} {Last modification date} {Date de dernire modification} {Last segment} {Dernier segment} Latin latin Latin3 {} Latin4 {} Left Gauche Lexical Lexical Lexical... Lexical... Lists Listes {Load configuration file...} {Charger une configuration...} {Localization file} {Fichier de traduction} {Localization in French} {Traduction en franais} Localize... Traduction... Location Localisation {Log trace in file} {Enregistre l'activit dans} {Loop on segment or selection after a pause} {Boucle sur segment ou slection aprs pause} {Main features} Fonctionnalits {mal prononc} {} Message Message Messages Messages Mode Mode {Modifications saved in the file %s} {Modifications enregistres dans le fichier %s} Modify Modifier {Modify speaker} {Editer le locuteur} {Modify topic} {Editer le sujet} mono {} {mot inconnu} {} {Move breakpoint} {Dplacer une frontire} {Move to...} Dplacement... Name Nom {Named Entities} {Entits nommes} {nb. of sections:} {nb. de sections :} {nb. of syncs:} {nb. de segments :} {nb. of turns:} {nb. de tours :} {nb. of words:} {nb. de mots :} {NE buttons} {Boutons d'entits nommes} New Nouveau {New language} {Nouvelle langue} {New topic} {Nouveau sujet} {New trans} {Nouvelle transcription} Next Suivant {Next section} {Section suivante} {Next synchro} {Synchro suivante} {Next turn} {Tour suivant} {No audio segment selected !} {Aucune slection audio !} {no speaker} {pas de locuteur} {no topic} {pas de sujet} Noise Bruit {Noise foreground} {} Noises... Bruits... nontrans {} Norwegian norvgien {not saved (unsupported output format)} {non sauv (format non support)} nologisme {} OK {} {Ok, %s wave segment(s) saved !!} {Ok, %s segments audio sauvegards !!} {Open audio file...} {Ouvrir un fichier son...} {Open remote audio file} {Ouvrir le fichier son distance} {Open segmentation file} {Ouvrir le fichier de segmentation} {Open segmentation file...} {Ouvrir le fichier de segmentation...} {Open trans...} {Ouvrir une transcription...} {Open transcription file} {Ouvrir le fichier de transcription} {Open transcription or audio file} {Ouvrir une transcription ou un signal} {Open video file...} {Ouvrir un fichier vido...} Options Options Organization Organisation {orthographe incertaine} {} Other Autre other autre {Overlapping noise} {Bruit superpos} {Overlapping speech} {Parole superpose} Paste Coller {Pause at segment boundaries} {Pause aux frontires des segments} {Pause duration (in seconds)} {Dure de pause (en secondes)} {Pause duration between segments} {Dure de pause entre segments} Persian perse Person Personne {Play around cursor} {Joue autour du curseur} {Play next segment} {Joue le segment suivant} {Play segment} {Joue le segment} {Play with pauses} {Joue avec pauses} Play/Pause Joue/Pause Playback Restitution {Playback mode} {Mode de lecture} {Please open signal for transcription} {Ouvrez le signal correspondant la transcription} Polish polonais Port {} Portuguese portugais Position Position {Position (in seconds)} {Position (en secondes)} Presentation Prsentation Previous Prcdent {Previous section} {Section prcdente} {Previous synchro} {Synchro prcdente} {Previous turn} {Tour prcdent} {Principal language} {Langue principale} Product Objet Program Programme Prononciation Prononciation Pronounce Prononciation Pronounce... Prononciation... quad {} Quit Quitter Rate Frquence {Reading transcription file...} {Lecture du fichier de transcription...} Recalibrate Recalibration {Recent topics} {Sujets rcents} {Recently used speakers} {Locuteurs rcents} {Recording date} {Date d'enregistrement} {Reduce waveform} {Rduire l'enveloppe} {Reference manual} {Manuel de rfrence} Refresh {} {Refresh list} {} {Remove unused speakers} {Supprime les locuteurs inutiliss} {Remove unused topics} {Supprime les sujets inutiliss} Replace Remplacer {Replace all} {Tout remplacer} {Replacement string} {Chane de remplacement} {Replay segment} {Rejoue le segment} report {} Resolution Rsolution {Resolution > 30" impossible ! Can't find the signal shape.} {Rsolution > 30" impossible ! Enveloppe du signal non disponible.} {Resolution bar} {Barre de rsolution} Restart Redmarre Revert {Revenir au fichier} Right Droite {rire en fond} {} Romanian roumain {rupture de syntaxe} {} Russian russe Save Enregistrer {Save as...} {Enregistrer sous...} {Save audio segment(s)} {Enregistrer le(s) segment(s) audio} {Save audio segments options} {Options d'enregistrements des segments audio} {Save configuration} {Enregistrer la configuration} {Save configuration as...} {Enregistrer la configuration sous...} {Save configuration before leaving?} {Enregistrer la configuration avant de quitter ?} {Second signal view} {Deuxime vue du signal} Section Section Sections {} {Sections foreground} {} seg0 {} seg1 {} seg2 {} Segmentation Segmentation {Segments foreground} {} {Select all} {} {Selected...} {Slectionn...} {Select your default browser} {Choix du navigateur par dfaut} Server Serveur {Shape: no} {Enveloppe : non} {Shape: yes} {Enveloppe : oui} {sigle lu} {} {sigle pel} {} Signal Signal {Signal name} {Nom du signal} {Signal shape is now available!} {Enveloppe du signal disponible!} {Signal shape not available, sorry...} {Enveloppe du signal non disponible, dsol...} {Signal view} {Vue du signal} {Simplified Chinese (GB)} {} {Smart segmentation display} {Affichage slectif des segmentations} {Sorry, couldn't find %s dictionary} {Dsol, le dictionnaire %s est introuvable} {Sorry, couldn't launch spell checker. Please check Aspell installation.} {Le correcteur orthographique ne peut tre lanc. Vrifiez l'installation d'Aspell.} {Sorry, couldn't find %s dictionary. Please install the Aspell dictionnary that you need.} {Dictionnaire introuvable. Veuillez installer le dictionnaire Aspell %s.} {Sort by...} {Trier par...} Spanish espagnol {Speaker foreground} {} {Speaker menu} {Liste des locuteurs} {Speaker name} {Nom du locuteur} Speakers Locuteurs {Spell checking} {Correction orthographique} {spelling checked} {orthographe vrifie} {Start of event} {Dbut d'vnement} {Start of line} {Dbut de ligne} stereo {} {Stereo channel} {Restitution stro} {Stop at next segment boundary} {Stop la prochaine frontire} {Stop before next segment boundary} {Stoppe avant le prochain segment} {Store signal shapes in} {Enregistre les enveloppes des signaux dans} {Suppress} {Supprimer} Swedish sudois Synchro Synchro {Synchronized audio files} {Fichiers son synchroniss} Text Texte {Text editor} {Editeur de texte} {Text foreground} {} {The text "%s" will be automaticaly tagged - Continue ?} {Le texte "%s" sera automatiquement tiquet - Continuer ?} {The text "%s" tagged with "%s" will be automaticaly untagged - Continue ?} {Le texte "%s" tiquett avec "%s" sera automatiquement dstiquet - Continuer ?} {This file is formated for older version of Transcriber (<1.4.7). Export to new format ? "yes" will export to new format and make your file only usable with Transcriber-1.4.7 or higher (recommended). "no" will keep the original format.} {Ce fichier est au format d'une plus ancienne version de Transcriber (< 1.4.7). Exporter au nouveau format ? "oui" exporte au nouveau format et rend votre fichier seulement utilisable avec Transcriber-1.4.7 ou plus rcent (recommand). "non" conserve le format original.} Time Temps top {} Topic Sujet Topics Sujets {Topics menu} {Liste des sujets} {toux en fond} {} {Traditional Chinese (Big5)} {} {Transcriber's name} {Nom du transcripteur} Transcription {} {Transcription %s saved.} {Enregistrement de %s effectue.} {Transcription has been modified - Save before closing?} {La transcription a t modifie - Enregistrer avant fermeture ?} Translation Traduction Turkish turc {Turkish (Latin5)} {} Turn Tour Turns {Tours de parole} Type Catgorie Undo Annuler {Unicode (UTF-8)} {} {Unknown} {Incertain} {Unknown format} {Format inconnu} {unsupported output format %s} {format de sortie non support} {Unzoom selection} {Supprime le zoom} up augmente Update {} {Use regular expression} {Utilise une expression rgulire} {User guide} {Guide utilisateur} Value Valeur Version Version {Vertical zoom (dB)} {Zoom vertical (dB)} {View all} {Vue complte} Volume Volume {Warning ! All changes will be lost. Really revert from file ?} {Attention! Toutes les modifications seront perdues. Revenir la version enregistre?} {Waveform bg} {} {Western (Latin1)} {} {with %d speakers} {avec %d locuteurs} {with %d topics} {avec %d thmes} Word Mot {You have selected several lines. Confirm their deletion ?} {Vous avez slectionn plusieurs lignes. Confirmez-vous leur suppression ?} {Zoom selection} {Zoom de la slection} {Update global speakers database} {Mise jour de la base de donne des locuteurs globaux} {Global speakers database} {Base de locuteurs globaux} {Global speakers database:} {Base de locuteurs globaux :} } transcriber-1.5.1.1/etc/default.txt0000644000175000017500000002537110203743350014774 0ustar rtrt# Default configuration for Transcriber - read with encoding iso8859-1 # -*-tcl-*- # Personal external speakers database list,ext .speaker # Path to default browser browser "" # Personal configuration will be saved upon request in the following file: options,unix ".transcriber" options,windows "transcriber.pref" options,macintosh "Transcriber Configuration" # defaults scribe's name will be used for initialisation of episode attributes scribe,name "(unknown)" # Version of the user preference file pref,ver "" # does user want shape calculation for rapid display of signal ? shape,wanted -1 # shall we try to compute shape in background as a subprocess ? shape,bg 1 # minimal duration (in sec.) for needing a shape shape,min 30 # directory where to store signal shapes path,shape "" # flag to request for automatic plaback after signal selection play,auto 0 # mode: continuous/pause/beep/stop/loop playbackMode "continuous" # start back playback from duration playbackBefore 0.0 # pause between two segments playbackPause 0.3 #filename of beep sound file to be played between segments playbackBeep "" # multiplying factor for frequency during playback - not yet supported playbackSpeed 1.0 # remote playback settings playbackRemote 0 playbackServer "" playbackPort "" # interval (in min) between automatic save autosave,time 5 # backup extension for automatically saved files backup,ext ~ # file name for work monitoring trace,name "" # interval (in min.) after which a pause is detected trace,time 10 # save configuration before leaving keepconfig 0 # ask for debug options debug 0 # automatic space insertion space,auto 0 # check spelling of capitalized names spell,names 0 # Prefered cursor position when entering another segment (begin/end) preferedPos "end" # Automatic import speakers or topics from last importation file when # opening a new one importSpeakers 0 speakerFile {} importTopics 0 topicFile {} # default format for new topic or speakers newSpeakerFmt "speaker\#%s" newTopicFmt "topic\#%s" # default encoding used for transcriptions (IANA rather than tcl name) encoding ISO-8859-1 # for MacOSX, choose rather: #encoding Macintosh # List of encoding: IANA name/usual name encodingList { {UTF-8 "Unicode (UTF-8)"} {} {ISO-8859-1 "Western (Latin1)"} {Macintosh "Western (MacRoman)"} {ISO-8859-2 "Central european (Latin2)"} {CP1250 "Czech for Windows (CP1250)"} {ISO-8859-3 "Latin3"} {ISO-8859-4 "Latin4"} {ISO-8859-5 "Cyrillic (ISO-8859-5)"} {KOI8-R "Cyrillic (KOI8-R)"} {ISO-8859-6 "Arabic (ISO-8859-6)"} {ISO-8859-7 "Greek (ISO-8859-7)"} {ISO-8859-8 "Hebrew (ISO-8859-8)"} {ISO-8859-9 "Turkish (Latin5)"} {} {EUC-JP "Japanese (EUC-JP)"} {ISO-2022-JP "Japanese (ISO-2022-JP)"} {Shift_JIS "Japanese (Shift_JIS)"} {} {EUC-KR "Korean (EUC-KR)"} {ISO-2022-KR "Korean (ISO-2022-KR)"} {} {Big5 "Traditional Chinese (Big5)"} {GB2312 "Simplified Chinese (GB)"} } # default language for interface (in iso639 code) lang "en" # file for localization (default file if empty) file,local "" # some of iso639 language codes language { {ar Arabic} {bg Bulgarian} {cs Czech} {da Danish} {de German} {el Greek} {en English} {es Spanish} {fa Persian} {fi Finnish} {fr French} {he Hebrew} {hi Hindi} {hu Hungarian} {it Italian} {ja Japanese} {ko Korean} {la Latin} {nl Dutch} {no Norwegian} {pl Polish} {pt Portuguese} {ro Romanian} {ru Russian} {sl Slavonic} {sv Swedish} {tr Turkish} {zh Chinese} } # list of noise events with descriptions noise { {"r" "[r] respiration"} {"i" "[i] inspiration"} {"e" "[e] expiration"} {"n" "[n] reniflement"} {"pf" "[pf] soufle"} {"" ""} {"bb" "[bb] bruit de bouche"} {"bg" "[bg] bruit de gorge"} {"tx" "[tx] toux, rclement,ternuement"} {"rire" "[rire] rires du locuteur"} {"sif" "[sif] sifflement du locuteur"} {"" ""} {"b" "[b] bruit indtermin"} {"conv" "[conv] conversations de fond"} {"pap" "[pap] froissement de papiers"} {"shh" "[shh] souffle lectrique"} {"mic" "[mic] bruits micro"} {"rire en fond" ""} {"toux en fond" ""} {"indicatif" ""} {"jingle" ""} {"top" ""} {"musique" ""} {"applaude" "applaudissements"} {"nontrans" "[nontrans] segment"} } # list of pronounciation events with descriptions pronounce { {"*" "mal prononc"} {"lapsus" ""} {"pi" "[pi] inintelligible"} {"pif" "[pif] inintelligible/faible"} {"ch" "[ch] voix chuchote"} {"" ""} {"lu" "sigle lu"} {"pel" "sigle pel"} {"19 cent..." ""} } # list of lexical events with descriptions lexical { {"?" "orthographe incertaine"} {"^^" "mot inconnu"} {"nologisme" ""} {"()" "rupture de syntaxe"} } # list of Named Entities (NE) events with descriptions entities { {"pers" "Person"} {"pers.hum" ""} {"pers.anim" ""} {"pers.imag" ""} {"org" "Organization"} {"org.pol" ""} {"org.edu" ""} {"org.non-profit" ""} {"org.com" ""} {"gsp" "Geo-Soc-Pol"} {"gsp.pers" ""} {"gsp.org" ""} {"gsp.loc" ""} {"loc" "Location"} {"loc.geo" ""} {"loc.geo.line" ""} {"loc.addr" ""} {"loc.addr.post" ""} {"loc.addr.tel" ""} {"loc.addr.elec" ""} {"fac" "Facilities"} {"prod" "Product"} {"prod.vehicule" ""} {"prod.award" ""} {"prod.art" ""} {"prod.printing" ""} {"time" "Time"} {"time.date" ""} {"time.date.abs" ""} {"time.date.rel" ""} {"time.hour" ""} {"amount" "Amount"} {"amount.phy" ""} {"amount.phy.age" ""} {"amount.phy.dur" ""} {"amount.phy.temp" ""} {"amount.phy.len" ""} {"amount.phy.wei" ""} {"amount.phy.spd" ""} {"amount.cur" ""} {"unk" "Unknown"} {"prod.award/pers.hum" ""} {"org.edu/gsp.pers" ""} } # format strings for event extent (%s is replaced with event description) event,instantaneous "\[%s]" event,begin "\[%s-]" event,end "\[-%s]" event,previous "+\[%s]" event,next "\[%s]+" # format string for event type event,comment "{%s}" event,language "lang=%s" event,scope "%s" event,dependent "%s" event,header "%s" event,pronounce "pron=%s" event,lexical "lex=%s" event,noise "%s" event,entities "ent=%s" # bindings for insertion of events or special chars in text editor # with a list of pairs sequence-string/replacement-char (e.g. ' e => e acute) bindings { { {}} { {}} { {}} { {}} } # example of bindings for French #bindings {{`a } {^a } {'e } {`e } {^e } {\"e } {^i } {\"i } {^o } {^u } {`u } {\"u } {ae } {,c }} # alternate bindings for Italian etc. #bindings {{u\" } {U\" } {o\" } {O\" } {a\" } {A\" } {,c } {n~ } {a~ } {o/ } {O/ } {a/ } {A/ } {a` } {A` } {a^ } {A^ } {e` } {E` } {e' } {E' } {i` } {I` } {i^ } {I^ } {o` } {O` } {o' } {O' } {'o o'} {u` } {U` }} # list of words + comments at user convenience glossary {} # conversion of olds [...] events to XML tags for early .xml format convert_events 0 # Signal and transcription format sig,name "" sig,remote 0 sig,server "" sig,port "" sig,rate 16000 sig,channels mono sig,header 0 sig,map {1 0 0 1} curs,pos 0 sig,gain 0 path,sounds "" trans,name "" videoFile "" multiwav,path {} # list of label files labelNames {} # standard extensions for sounds, transcriptions, labels. ext,snd {".au" ".wav" ".snd" ".sph" ".sig" ".sd" ".smp" ".aif" ".aiff" ".mp3" ".ogg"} ext,trs {".xml" ".trs" ".typ"} ext,lbl {".lab" ".lola" ".lbl" ".phn" ".wrd" ".txt"} # Colors color,bg "#f2e6c8" color,bg-sel "#d0b098" color,fg-sync "black" color,bg-sync "#96c3b6" color,hi-sync "#a8d8c8" color,fg-turn "black" color,bg-turn "#96bacc" color,fg-sect "black" color,bg-sect "#e28c86" color,fg-back "black" color,bg-back "#929496" color,fg-text "black" color,bg-text "#d9d9d9" color,hi-text "#f0f0f0" color,fg-evnt "grey50" color,bg-evnt "#d9d9d9" colorizeSpk 0 color,netag-pers blue color,netag-org red color,netag-gsp orange color,netag-loc "#0007ff3ff" color,netag-fac brown color,netag-prod salmon color,netag-time "#000f0ffff" color,netag-amount purple color,netag-meto grey color,netag-unk grey color,netag-user grey checkNEcolor,tag 1 checkNEcolor,text 1 checkNEcolor,buton 1 # Fonts font,text {courier 12} font,event {times 14 italic} font,axis {courier 10} font,list {courier 12 bold} font,info {helvetica 10 bold} font,mesg {helvetica 10} font,trans {helvetica 10} font,NEbutton {arial 10} # Some geometry to be saved geom,. "" geom,.sect "" geom,.turn "" geom,.evt "" geom,.gain "" # Display view,.edit 1 view,.edit.ne 0 view,.cmd 1 view,.inf 0 view,.snd 1 view,.snd2 0 view,.msg 1 hideLevels 0 # Principal signal configuration .snd.w,height 100 .snd.w,resolution 30 view,.snd.scr.reso 1 view,.snd.seg0 1 view,.snd.seg1 1 view,.snd.seg2 1 view,.snd.bg 1 # Second signal configuration .snd2.w,height 50 .snd2.w,resolution 300 view,.snd2.scr.reso 1 view,.snd2.seg0 1 view,.snd2.seg1 1 view,.snd2.seg2 1 view,.snd2.bg 1 # header for childes chatMode 0 header { {@Begin @Begin} {@End @End} {@Activities @Activities} {@Bg @Bg} {@Eg @Eg} {@Bck @Bck} {@Comment @Comment} {@g @g} {@Location @Location} {@NewEpisode @NewEpisode} {@RoomLayout @RoomLayout} {@Situation @situation} {@TapeLocation @TapeLocation} {@TimeDuration @TimeDuration} {@TimeStart @TimeStart} } # scope for childes scope { {=! =!} {! !} {!! !!} {'' ''} {= =} {: :} {0 0} {:= :=} {=? =?} {%: %:} {% %} {> >} {< <} {<> <>} {/ /} {// //} {/// ///} {/- /-} {/? /?} {* *} {+ +} {+bck +bck} {+trn +trn} } # dependent for childes dependent { {%act: %act:} {%add: %add:} {%alt: %alt:} {%cod: %cod:} {%coh: %coh:} {%com: %com:} {%def: %def:} {%eng: %eng:} {%err: %err:} {%exp: %exp:} {%fac: %fac:} {%flo: %flo:} {%gls: %gls:} {%gpx: %gpx:} {%int: %int:} {%lan: %lan:} {%mod: %mod:} {%mor: %mor:} {%mov: %mov:} {%par: %par:} {%pho: %pho:} {%sit: %sit:} {%snd: %snd:} {%spa: %spa:} {%syn: %syn:} {%tim: %tim:} } # terminator terminator,. 1 terminator,? 1 terminator,! 1 terminator,-? 1 terminator,-! 1 terminator,-. 1 terminator,-'. 1 terminator,-,. 1 terminator,-, 1 terminator,-_ 1 terminator,- 1 terminator,-' 1 terminator,, 1 terminator,; 1 terminator,# 1 terminator,-: 1 terminator,/ 1 terminator,// 1 terminator,/// 1 terminator,+... 1 terminator,+..? 1 terminator,+!? 1 terminator,+/. 1 terminator,+/? 1 terminator,+//. 1 terminator,+//? 1 terminator,+"/. 1 terminator,+", 1 terminator,+" 1 terminator,+^ 1 terminator,+< 1 terminator,+, 1 terminator,++ 1 terminator,[c] 1 transcriber-1.5.1.1/etc/local.txt0000644000175000017500000000020607722631640014442 0ustar rtrt# Localization for Transcriber saved on Tue Aug 26 11:49:06 CEST 2003 with encoding iso8859-1 # kept empty for backward compatibility transcriber-1.5.1.1/etc/trans-14.dtd0000755000175000017500000000401010162012742014641 0ustar rtrt transcriber-1.5.1.1/etc/beep.au0000644000175000017500000001016707510315721014052 0ustar rtrt.snd WLbeep.wavgggggggggggggggg,/<<<#6E#I/'"(۸MA!<ͲME2A8"4Ө&0'>ŭ'(-Mۤ0",͸[08*&(M"%E0! >>S +0:ӗ%2g/-06:+*I8g%.8>ӗ#4(I>#80(8S/86"A.I-+:0ř,6,:>,>&:2,MA.-A E+:8(>,g0062۞,>+8:.E%:20SA-4I$:+SA08-ۡ6A-2<6[&6/:["!<->[):,gI08.ӧA:2/Ag&8.A& <-Mg-4+ūM64+[EE..>E[)24E$$4.S[+ 8-S68-gE#%6-[+6,S62,I>-/AEg!*22E($8-[g,!6-[82-[ME,0Ig$*86E)'$22IES#.64ŲS6&82簼SA&26MMS(/:4g[2*>6Ͷg:):6紼MI)8:ESg+0>:Sg2->8ɺg:+<:績MS,0<>[[0/A:[g6-A8Ӻ[>,>8gŰSI,:ɸSg20A:žgg8.E8ӼSA-AMɴS[06AAŸMg44E[ɴ[S0<>IɺSg46E>ž[:2E<ŶA0I<Ͷ[I0>>[ɸS[2[g<4I>ɺg[E2E>͸[M2A>SͺS[2>EES88IASg<4I>ɺg[E2E>ͺ[M2AASͺS[6ͼgM6EA[ͼ[S8EES[g:>IE[<AIE[gE:MI[I:II[S:EI[[g<>II[gA:MEgE:II[M8IIgS[8EIMS[<:MEg[E8MI[M8EEgӾSS8>ISSS:8IIɾ[[A6II;SI4AIg;SM4>ISS[88ME;SI6EIgɾSM6AE[;SS86IEɼSE6EEɼSM6>ISɾSS8EMɾS[68IIgg<6IAżg[>4AEŸ[I2AA[ɺSM4:EIž[[:8EEžg[A8IE;[I8EEg;[M8>ES;[[8:IEɾ[A6IEͼ[I6AEg;[S4>ESɾSS8MIg[>MMg[EMI[MAMMg[[AMMS[gAMSM[gEISM[gIASMgg[ASM[[[>SSS[gAISM[EE[IggMA[Ig[[>[I[Sg>SMSSAISI[IESIS[I>SIg[SASM[[ES[Mg[IM[ISME[M[gSIgMg[gI[S[gSES[MSIMgSSgMEM[[SESgMgE[S[MgAM[SMgEIgSM[IASSSSA[SMgAM[MMgEEgM[[SESggSgI[gggMgIgg[gMgES[IgII[MSMES[MSAgggIgA[ggIgASSI[EESMSIASSIS>[gE[>[gE[>MSE[AE[ISI>[SIM>ggggIgEggggIgAM[E[IISgISSAS[SS[A[ggIgE[gggIgESSI[IISgMgMISgSSSEgSgSgES[[MgAMgMMgIIgMSgMEgSg[SE[SgS[ESS[SgM[g[S[SI[[S[Ig[ggSgI[g[[[IM[S[MIg[[[SIgSgS[I[[[S[IS[[[gIM[SSgMIg[g[MI[Sg[SIS[g[[IS[[[[II[[[gMI[[g[MISgg[[M[g[[[MSggS[SSg[[SSgg[SSSggSSM[gSSM[[SSM[gg[SM[[gSMM[ggSSS[gg[SM[[g[SS[[ggSSSSgS[[[g[S[Sgg[S[gggg[SSggggS[gg[g[S[gg[[[gg[[[gg[[[[g[[[[[[[[g[[[[ggg[[[[ggg[[[ggg[[[[gg[[[[gg[S[[gg[SS[[gg[S[[gg[[ggggg[[[[gggg[[[ggg[[[gg[[[[[S[[g[S[[ggg[[[[g[[[[[[[[[[[[[[[[g[S[[ggS[[[g[[[[[[[[[[g[gg[g[[g[[[[gg[ggggg[[[[[[[[g[[[[ggg[[[g[[g[[[g[[[[[g[[[[gggg[[[[gg[[[[gg[[[[gg[[[[[[[[ggg[[[[gggg[[[[gg[[[[gg[[[[gg[[[[gg[[[[ggg[[[[gggg[[[gggg[[[[gg[[[[g[[[[g[[[[gggg[[[[ggggg[[gg[g[[gg[[[[ggggg[gggggg[ggggg[[gggg[[gggg[[gggg[[gggggg[[gggg[[gggggggggggggggggggggggggggggggtranscriber-1.5.1.1/etc/trans-cha.dtd0000644000175000017500000000674710162015603015167 0ustar rtrt transcriber-1.5.1.1/img/0000755000175000017500000000000010605162351012602 5ustar rtrttranscriber-1.5.1.1/img/circle2.bmp0000644000175000017500000000044607513032606014634 0ustar rtrt#define circle2_width 16 #define circle2_height 16 static unsigned char circle2_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xc0, 0x05, 0xe0, 0x0e, 0x70, 0x1f, 0x78, 0x3c, 0x18, 0x18, 0x28, 0x28, 0x30, 0x30, 0x38, 0x38, 0x78, 0x3c, 0xf0, 0x1d, 0xe0, 0x0e, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00 }; transcriber-1.5.1.1/img/over1.bmp0000644000175000017500000000043707510315721014344 0ustar rtrt#define over1_width 16 #define over1_height 16 static unsigned char over1_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xf8, 0x3f, 0xf8, 0x3f, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/over2.bmp0000644000175000017500000000043707510315721014345 0ustar rtrt#define over1_width 16 #define over1_height 16 static unsigned char over1_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xf8, 0x3f, 0xf8, 0x3f, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/circle.bmp0000644000175000017500000000044207510315721014545 0ustar rtrt#define circle_width 16 #define circle_height 16 static unsigned char circle_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0xe0, 0x0f, 0x70, 0x1f, 0xb8, 0x3f, 0xd8, 0x3f, 0xd8, 0x3f, 0xd8, 0x3f, 0xd8, 0x3f, 0xb8, 0x3f, 0xf0, 0x1f, 0xe0, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/cut.xbm0000644000175000017500000000043007510315721014104 0ustar rtrt#define cut_width 16 #define cut_height 16 static unsigned char cut_bits[] = { 0x00, 0x00, 0x10, 0x04, 0x10, 0x04, 0x20, 0x02, 0x20, 0x02, 0x40, 0x01, 0x40, 0x01, 0x80, 0x00, 0xc0, 0x01, 0x20, 0x02, 0x38, 0x0e, 0x24, 0x12, 0x24, 0x12, 0x24, 0x12, 0x18, 0x0c, 0x00, 0x00, }; transcriber-1.5.1.1/img/paste.xbm0000644000175000017500000000043607510315721014433 0ustar rtrt#define paste_width 16 #define paste_height 16 static unsigned char paste_bits[] = { 0xe0, 0x01, 0xe0, 0x01, 0xfc, 0x0f, 0xf2, 0x13, 0x02, 0x10, 0xc2, 0xff, 0x42, 0x80, 0x42, 0xbf, 0x42, 0x80, 0x42, 0xbf, 0x42, 0x80, 0x42, 0xbf, 0x42, 0x80, 0x7c, 0x83, 0x40, 0x80, 0xc0, 0xff, }; transcriber-1.5.1.1/img/music.bmp0000644000175000017500000000043707510315721014430 0ustar rtrt#define music_width 16 #define music_height 16 static unsigned char music_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x70, 0x01, 0xd8, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/previous.bmp0000644000175000017500000000045007510315721015157 0ustar rtrt#define previous_width 16 #define previous_height 16 static unsigned char previous_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x82, 0x20, 0xc2, 0x30, 0xe2, 0x38, 0xf2, 0x3c, 0xfa, 0x3e, 0xfe, 0x3f, 0xfe, 0x3f, 0xfa, 0x3e, 0xf2, 0x3c, 0xe2, 0x38, 0xc2, 0x30, 0x82, 0x20, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/forward.bmp0000644000175000017500000000044507510315721014753 0ustar rtrt#define forward_width 16 #define forward_height 16 static unsigned char forward_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0c, 0x03, 0x1c, 0x07, 0x3c, 0x0f, 0x7c, 0x1f, 0xfc, 0x3f, 0xfc, 0x3f, 0x7c, 0x1f, 0x3c, 0x0f, 0x1c, 0x07, 0x0c, 0x03, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/backward.bmp0000644000175000017500000000045007510315721015061 0ustar rtrt#define backward_width 16 #define backward_height 16 static unsigned char backward_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x20, 0xc0, 0x30, 0xe0, 0x38, 0xf0, 0x3c, 0xf8, 0x3e, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8, 0x3e, 0xf0, 0x3c, 0xe0, 0x38, 0xc0, 0x30, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/copy.xbm0000644000175000017500000000043407510315721014267 0ustar rtrt#define copy_width 16 #define copy_height 16 static unsigned char copy_bits[] = { 0x00, 0x00, 0xfe, 0x03, 0x02, 0x02, 0xfa, 0x7f, 0x42, 0x40, 0x7a, 0x5f, 0x42, 0x40, 0x7a, 0x5f, 0x42, 0x40, 0x5a, 0x5f, 0x42, 0x40, 0x7e, 0x43, 0x40, 0x40, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/pause.bmp0000644000175000017500000000043707510315721014425 0ustar rtrt#define pause_width 16 #define pause_height 16 static unsigned char pause_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/next.bmp0000644000175000017500000000043407510315721014263 0ustar rtrt#define next_width 16 #define next_height 16 static unsigned char next_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x04, 0x41, 0x0c, 0x43, 0x1c, 0x47, 0x3c, 0x4f, 0x7c, 0x5f, 0xfc, 0x7f, 0xfc, 0x7f, 0x7c, 0x5f, 0x3c, 0x4f, 0x1c, 0x47, 0x0c, 0x43, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/play.bmp0000644000175000017500000000043407510315721014252 0ustar rtrt#define play_width 16 #define play_height 16 static unsigned char play_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0xfc, 0x00, 0xfc, 0x03, 0xfc, 0x0f, 0xfc, 0x3f, 0xfc, 0x3f, 0xfc, 0x0f, 0xfc, 0x03, 0xfc, 0x00, 0x3c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/info.bmp0000644000175000017500000000043407510315721014240 0ustar rtrt#define info_width 16 #define info_height 16 static unsigned char info_bits[] = { 0x60, 0x00, 0xb0, 0x00, 0x60, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xd8, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0xa8, 0x01, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/musicl.bmp0000644000175000017500000000044207510315721014600 0ustar rtrt#define musicl_width 16 #define musicl_height 16 static unsigned char musicl_bits[] = { 0x00, 0x00, 0x00, 0x18, 0x00, 0x38, 0x00, 0x48, 0x08, 0x08, 0x0c, 0x08, 0x0e, 0x08, 0x0f, 0x08, 0x0e, 0x08, 0x8c, 0x0b, 0xc8, 0x0e, 0xc0, 0x0f, 0xc0, 0x07, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/img/musicr.bmp0000644000175000017500000000044207510315721014606 0ustar rtrt#define musicr_width 16 #define musicr_height 16 static unsigned char musicr_bits[] = { 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0x40, 0x02, 0x40, 0x10, 0x40, 0x30, 0x40, 0x70, 0x40, 0xf0, 0x40, 0x70, 0x5c, 0x30, 0x76, 0x10, 0x7e, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00}; transcriber-1.5.1.1/tcl/0000755000175000017500000000000010605162351012610 5ustar rtrttranscriber-1.5.1.1/tcl/Waveform.tcl0000444000175000017500000005315310152633342015107 0ustar rtrt# RCS: @(#) $Id: Waveform.tcl,v 1.10 2004/11/29 14:49:06 galliano Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ################################################################ proc CreateSoundFrame {f} { global v # embedded frame for optional inclusion of video frame $f; if {$v(view,$f)} { pack $f -fill both -side top } set f $f.1 frame $f -bd 1 -relief raised -bg $v(color,bg) setdef v($f.w,height) 100 set wavfm [wavfm $f.w -padx 10 -bd 0 -bg $v(color,bg) \ -height $v($f.w,height) -selectbackground $v(color,bg-sel)] axis $f.a -padx 10 -bd 0 -bg $v(color,bg) -font axis set g $f.scr frame $g -bg $v(color,bg) set v($wavfm,scroll) [scrollbar $g.pos -orient horizontal -width 15\ -command [list ScrollTime $wavfm]] pack $g.pos -fill x -side left -expand true -anchor n # optional resolution scrollbar frame $g.reso label $g.reso.lab -text "Resolution" -font {fixed 10} -bd 0 -padx 10 -pady 0 set v($wavfm,scale) [scrollbar $g.reso.scrol -command [list ScrollReso $wavfm] -orient horizontal -width 8 -bd 1] pack $g.reso.lab -side top pack $g.reso.scrol -fill x -expand true # Default : display resolution scrollbar setdef v(view,$g.reso) 1 if {$v(view,$g.reso)} { pack $g.reso -padx 0 -pady 0 -side right } pack $g -side top -fill x pack $f.w -fill both -expand true -side top pack $f.a -fill x -side top pack $f -fill both -side top set v($wavfm,sync) [list $wavfm $f.a] lappend v(wavfm,list) $wavfm # Register the bindings at the frame level bindtags $wavfm [list $wavfm Wavfm $f . all] bindtags $f.a [list $f.a Axis $f . all] # Selection/cursor position with B1 bind $f [list BeginCursorOrSelect $wavfm %X] bind $f [list SelectMore $wavfm %X] bind $f [list EndCursorOrSelect $wavfm] bind $f [list ExtendOldSelection $wavfm %X] # Extend selection with B2 bind $f [list ExtendOldSelection $wavfm %X] # Contextual menus with B3 InitWavContextualMenu $f bind $f [list tk_popup $v($wavfm,menu) %X %Y] bind $f [list tk_popup $v($wavfm,menu) %X %Y] return $wavfm } proc InitWavContextualMenu {f} { # JOB: create the contextual menu on wave frame # # IN: f, the name of the wav frame, i.e. snd.1 or snd2.1 # OUT: nothing # MODIFY: nothing # # Author: Claude Barras, Sylvain Galliano # Version: 1.1 # Date: October 20, 2004 global v set wavfm $f.w set g $f.src regsub -all {\.} $wavfm {_} name catch {destroy .menu$name} set v($wavfm,menu) [add_menu .menu$name [subst { {"Audio file" cascade { {"Open audio file..." cmd {OpenAudioFile}} {"Add audio file..." cmd {OpenAudioFile add}} {"Save audio segment(s)" cascade { {"Selected..." cmd {SaveAudioSegment}} {"Automatic..." cmd {SaveAudioSegmentAuto}} }} {""} }} {"Playback" cascade { {"Play/Pause" cmd {PlayOrPause}} {"Replay segment" cmd {PlayCurrentSegmt}} {"Play around cursor" cmd {PlayAround}} }} {"Position" cascade { {"Forward" cmd {PlayForward +1}} {"Backward" cmd {PlayForward -1}} {"Previous" cmd {MoveNextSegmt -1}} {"Next" cmd {MoveNextSegmt +1}} }} {"Resolution" cascade { {"1 sec" cmd {Resolution 1 $wavfm}} {"10 sec" cmd {Resolution 10 $wavfm}} {"30 sec" cmd {Resolution 30 $wavfm}} {"1 mn" cmd {Resolution 60 $wavfm}} {"5 mn" cmd {Resolution 300 $wavfm}} {""} {"up" cmd {ZoomReso -1 $wavfm}} {"down" cmd {ZoomReso +1 $wavfm}} {""} {"View all" cmd {ViewAll $wavfm}} }} {"Display" cascade { {"Resolution bar" check v(view,$g.reso) -command {SwitchFrame $g.reso}} {"Reduce waveform" cmd {WavfmHeight $wavfm [expr 1/1.2]}} {"Expand waveform" cmd {WavfmHeight $wavfm 1.2}} {""} }} }]] } proc SwitchSoundFrame {f} { global v if {![winfo exists $f]} { set wavfm [CreateSoundFrame $f] ConfigWavfm $wavfm CreateAllSegmentWidgets SetCursor [GetCursor] } elseif {[winfo ismapped $f]} { pack forget $f } else { pack $f -fill x } } proc WavfmHeight {wavfm {val 1.0}} { global v set v($wavfm,height) [expr int([$wavfm cget -height] * $val)] $wavfm conf -height $v($wavfm,height) } proc ConfigWavfm {wavfm {mode "reset"}} { global v if {$mode == "reset"} { set v($wavfm,left) 0 set v($wavfm,size) [setdef v($wavfm,resolution) 30] if {$v(shape,cmd)=="" && $v($wavfm,size) > $v(shape,min)} { set v($wavfm,size) $v(shape,min) } } $wavfm config -sound $v(sig,cmd) -shape $v(shape,cmd) if {$mode == "reset"} { SynchroWidgets $wavfm } } proc ConfigAllWavfm {{mode "reset"}} { global v foreach wavfm $v(wavfm,list) { ConfigWavfm $wavfm $mode } } ################################################################ # Synchronize waveform, axis and scrollbars proc SynchroWidgets {wavfm} { global v # Make sure we have : # sig,min <= win,left < win,right=(left+size) <= sig,max=(min+len) if {$v($wavfm,size) > $v(sig,len)} { set v($wavfm,size) $v(sig,len) } if {$v($wavfm,left) < $v(sig,min)} { set v($wavfm,left) $v(sig,min) } set v($wavfm,right) [expr $v($wavfm,left)+$v($wavfm,size)] set v(sig,max) [expr $v(sig,min)+$v(sig,len)] if {$v($wavfm,right) > $v(sig,max)} { set v($wavfm,right) $v(sig,max) set v($wavfm,left) [expr $v($wavfm,right)-$v($wavfm,size)] } # Configure widgets foreach tk $v($wavfm,sync) { set left $v($wavfm,left) if {[winfo class $tk] == "Axis"} { set left [expr $left+$v(sig,base)] } $tk configure -begin $left -length $v($wavfm,size) } set begin [expr ($v($wavfm,left)-$v(sig,min))/$v(sig,len)] set ratio [expr $v($wavfm,size)/$v(sig,len)] $v($wavfm,scroll) set $begin [expr $begin+$ratio] $v($wavfm,scale) set $ratio $ratio } # Horizontal scrollbar callback proc ScrollTime {wavfm cmd {val 0} {unit ""}} { global v if {$cmd=="moveto"} { set v($wavfm,left) [expr $val*$v(sig,len)+$v(sig,min)] } elseif {$cmd=="scroll"} { if {$unit=="units"} { set v($wavfm,left) [expr $v($wavfm,left)+$val*$v($wavfm,size)/100.0] } elseif {$unit=="pages"} { set v($wavfm,left) [expr $v($wavfm,left)+$val*$v($wavfm,size)] } } SynchroWidgets $wavfm } # Vertical scrollbar callback for resolution proc ScrollReso {wavfm cmd {val 0} {unit ""}} { global v if ($v(sig,len)<0) return; if {[winfo exists .noshapemsg]} { destroy .noshapemsg } # Try to keep cursor stable - else center of screen set curs $v(curs,pos) if {($curs >= $v($wavfm,left)) && ($curs <= $v($wavfm,right))} { set ratio [expr ($curs-$v($wavfm,left))/$v($wavfm,size)] } else { set ratio 0.5 } set t [expr $v($wavfm,left)+$v($wavfm,size)*$ratio] if {$cmd=="moveto"} { if {$val>0} {set v($wavfm,size) [expr $val*$v(sig,len)]} } elseif {$cmd=="scroll"} { if {$val>0} { set scale 1.1 } else { set scale 0.9 } set v($wavfm,size) [expr $scale*$v($wavfm,size)] } # Arbitrary max value for zoom if {$v($wavfm,size) < 1e-5} { set v($wavfm,size) 1e-5 } # Min value for zoom if no shape is available if {$v(sig,cmd) != "" && $v(shape,cmd) == "" && $v($wavfm,size) > $v(shape,min)} { NoShapeMessage DisplayMessage "Lower resolution not allowed without signal shape" set v($wavfm,size) $v(shape,min) } set v($wavfm,left) [expr $t-$v($wavfm,size)*$ratio] set v($wavfm,resolution) $v($wavfm,size) SynchroWidgets $wavfm } proc NoShapeMessage {} { set m .noshapemsg if {[winfo exists $m]} { destroy $m } toplevel $m wm title $m "Warning !" wm geometry $m 250x100+500+350 label $m.l -text [Local "Resolution > 30\" impossible !\n\nCan't find the signal shape."] button $m.b -text "Ok" -command {destroy .noshapemsg} pack $m.l -fill both -expand true -padx 3m -pady 2m pack $m.b -padx 3m -pady 2m bell -displayof $m } proc Resolution {reso {win ""}} { global v if {$win == ""} { set win $v(tk,wavfm); # defaults to principal sound frame } ScrollReso $win moveto [expr 1.0*$reso/$v(sig,len)] } proc ZoomReso {dir {win ""}} { global v if {$win == ""} { set win $v(tk,wavfm); # defaults to principal sound frame } ScrollReso $win scroll $dir } proc ViewAll {{win ""}} { global v if {$win == ""} { set win $v(tk,wavfm); # defaults to principal sound frame } set v($win,left) $v(sig,min) set v($win,size) $v(sig,len) if {$v(shape,cmd) == "" && $v($win,size) > $v(shape,min)} { set v($win,size) $v(shape,min) } SynchroWidgets $win } # Change volume gain for waveform display (not for replay) proc NewGain {val} { global v set v(sig,gain) $val set vol [expr exp($val/10.0*log(10.0))] #$v(tk,gain) configure -label "Vertical zoom ($val dB)" foreach wavfm $v(wavfm,list) { $wavfm configure -volume $vol } } ################################################################ # Cursor and selection handling proc SetCursor {pos {hide 0}} { global v if {$pos < $v(sig,min)} { set pos $v(sig,min) } elseif {$pos > $v(sig,max)} { set pos $v(sig,max) } set v(curs,pos) $pos if {$hide == 1} { foreach wavfm $v(wavfm,list) { #$wavfm config -cursor -1 $wavfm cursor -1 } DisplayMessage "\t\t\t$v(sel,text)" } else { foreach wavfm $v(wavfm,list) { #$wavfm config -cursor $pos $wavfm cursor $pos # View cursor set margin 0; #[expr $v($wavfm,size)*0.0] if {$pos > $v($wavfm,right)} { set v($wavfm,left) [expr $pos + $margin - $v($wavfm,size)] SynchroWidgets $wavfm } elseif {$pos < $v($wavfm,left) } { set v($wavfm,left) [expr $pos - $margin] SynchroWidgets $wavfm } } DisplayMessage "Cursor : [Tim2Str [expr $v(curs,pos)+$v(sig,base)] 3]\t\t$v(sel,text)" SynchroToSignal $pos ViewVideo $pos } } proc EditCursor {} { global v dial set f [CreateModal .curs "Cursor"] set w [frame $f.top -relief raised -bd 1] pack $w -fill both -expand true -side top set dial(newpos) [format "%.3f" [GetCursor]] set e [EntryFrame $w.en "Position (in seconds)" dial(newpos)] if {[OkCancelModal $f $e] == "OK"} { if {[regexp {^((([0-9]+):)?([0-5]?[0-9]):)?([0-9]+(\.[0-9]+)?)$} $dial(newpos) all hasm hash h m s]} { if {$h == ""} {set h 0} if {$m == ""} {set m 0} set pos [expr 3600*$h+60*$m+$s] if {$dial(newpos) != [format "%.3f" [GetCursor]]} { foreach win $v(wavfm,list) { set v($win,left) [expr $pos-$v($win,size)/2] SynchroWidgets $win } } SetCursor $pos } else { DisplayMessage "Cursor : invalid position $dial(newpos)" } } } proc GetCursor {} { global v return $v(curs,pos) } # Set selection, put cursor at beginning and display infos proc SetSelection {begin end} { global v set v(sel,begin) $begin set v(sel,end) $end foreach wavfm $v(wavfm,list) { $wavfm config -selectbegin $begin -selectend $end } if {($end > $begin)} { set v(sel,text) "Selection : [Tim2Str [expr $begin+$v(sig,base)] 3] - [Tim2Str [expr $end+$v(sig,base)] 3] ([Tim2Str [expr $end-$begin] 3])" config_entry "Signal" "Zoom selection" -state normal } else { set v(sel,text) "" config_entry "Signal" "Zoom selection" -state disabled config_entry "Signal" "Unzoom selection" -state disabled } SetCursor $begin } # If selection exists, returns true and set begin/end values into vars # else returns false and set all signal into vars proc GetSelection {{beginName ""} {endName ""}} { global v if {$beginName != ""} { upvar $beginName begin } if {$endName != ""} { upvar $endName end } # Test if previous selection exists set begin $v(sel,begin) set end $v(sel,end) if {($begin >= $v(sig,min)) && ($end > $begin) && ($end <= $v(sig,max))} { return 1 } else { set begin $v(sig,min) set end $v(sig,max) return 0 } } # Return position in signal from screen click position # - scroll = -1 or +1 if click is outside window (left or right), 0 else proc GetClickPos {wavfm X scrollName} { global v upvar $scrollName scroll set bd [expr [$wavfm cget -bd] + [$wavfm cget -padx]] set width [expr [winfo width $wavfm] - 2*$bd] set x [expr $X - $bd - [winfo rootx $wavfm]] if {$x<0} { set scroll -1 set pos $v($wavfm,left) } elseif {$x>$width} { set scroll +1 set pos $v($wavfm,right) } else { set scroll 0 set pos [expr $v($wavfm,left)+$v($wavfm,size)*double($x)/$width] } return $pos } ################################################################ # Events bindings for cursor position and selection proc BeginCursorOrSelect {wavfm X} { global v PauseAudio set pos [GetClickPos $wavfm $X scroll] if {$scroll == 0} { set v(sel,start) $pos SetSelection $pos $pos } } proc CancelSelectEvent {} { global v if [info exists v(sel,event)] { after cancel $v(sel,event) unset v(sel,event) } } proc SelectMore {wavfm X} { global v if ![info exists v(sel,start)] return CancelSelectEvent # If out of window : scroll for extending selection and repeat event set pos [GetClickPos $wavfm $X scroll] if {$scroll != 0} { ScrollTime $wavfm scroll $scroll units # Get new position after scroll set pos [GetClickPos $wavfm $X scroll] set v(sel,event) [after idle [list SelectMore $wavfm $X]] } # Selection with right order for $v(sel,start) and $pos eval SetSelection [lsort -real [list $v(sel,start) $pos]] } proc EndCursorOrSelect {win} { global v if [info exists v(sel,start)] { CancelSelectEvent unset v(sel,start) if [GetSelection beg end] { # If selection too short (4 pixels), set only cursor set epsilon [expr 4.0*$v($win,size)/[winfo width $win]] if {$end-$beg < $epsilon} { SetSelection $beg $beg return } # Automatic play selection : optional if {$v(play,auto)} { PlayFromBegin } } } } proc ExtendOldSelection {wavfm X} { global v PauseAudio # Test if previous selection exists if [GetSelection beg end] { set pos [GetClickPos $wavfm $X scroll] if {$scroll != 0} return # Choose side of extension if {[expr abs($pos-$beg)] < [expr abs($pos-$end)]} { set v(sel,start) $end } else { set v(sel,start) $beg } } else { set v(sel,start) [GetCursor] } SelectMore $wavfm $X } # View selection (or given interval) proc ViewSelection {{beg {}} {end {}} {mode "AUTO"} {ratio 0.1}} { global v #set win $v(tk,wavfm); # defaults to principal sound frame foreach win $v(wavfm,list) { if { ($beg != "" && $end != "") || [GetSelection beg end] } { set margin [expr $v($win,size)*$ratio] if {$end-$beg > $v($win,size)} { # If it can't fit completely on screen... if {$end == $v(sig,max)} { # center left side of last segment set v($win,left) [expr $beg-$v($win,size)/2.0] } elseif {$mode == "END" || ($mode == "AUTO" && $end > $v($win,left) && $end < $v($win,right))} { # show end set v($win,left) [expr $end + $margin - $v($win,size)] } elseif {$mode == "BEGIN" || ($mode == "AUTO" && $beg > $v($win,left) && $beg < $v($win,right)) } { # show begin set v($win,left) [expr $beg - $margin] } else { # center set v($win,left) [expr ($end+$beg-$v($win,size))/2.0] } } elseif {$end-$beg > (1-2*$ratio)*$v($win,size)} { # center on the screen with a reduced margin set v($win,left) [expr ($end+$beg-$v($win,size))/2.0] } else { if {$end > $v($win,right)} { # show end plus margin set v($win,left) [expr $end + $margin - $v($win,size)] } elseif {$beg < $v($win,left) } { # show begin plus margin set v($win,left) [expr $beg - $margin] } else { # it's ok continue } } SynchroWidgets $win } } } ################################################################ # Zoom on selection proc ZoomSelection {{win ""}} { global v if {$win == ""} { set win $v(tk,wavfm); # defaults to principal sound frame } if [GetSelection beg end] { set v(zoom,list) [list $v($win,left) $v($win,size)] set v($win,left) $beg set v($win,size) [expr $end-$beg] SynchroWidgets $win config_entry "Signal" "Unzoom selection" -state normal } } # Undo last zoom proc UnZoom {{win ""}} { global v if {$win == ""} { set win $v(tk,wavfm); # defaults to principal sound frame } if [info exists v(zoom,list)] { set v($win,left) [lindex $v(zoom,list) 0] set v($win,size) [lindex $v(zoom,list) 1] unset v(zoom,list) SynchroWidgets $win config_entry "Signal" "Unzoom selection" -state disabled } } proc SaveAudioSegment {{auto ""}} { # JOB: save an audio selection # # IN: nothing # OUT: nothing # MODIFY: nothing # # Author: Sylvain Galliano # Version: 1.2 # Date: November 26, 2004 # # Save Audio Segment in normal or automatic mode # Select the name, format and directory of the file to saved # returns empty string if save failed (or was canceled) global v snack::sound player if { $auto == "" && $v(sel,begin) == $v(sel,end) } { tk_messageBox -icon warning -message [Local "No audio segment selected !"] -title "Warning" -type ok return "" } else { if { $v(sig,cmd) == "" } { set v(sig,name) "empty" set rep [tk_messageBox -icon question -message [Local " No audio file opened !\nThis will create an empty\n audio file ! Really save ?"] \ -title "Warning" -type yesno] if {$rep == "no"} { return } else { set format ".wav" } } else { set format [file extension $v(sig,name)] } set types { { "Wave file" {.wav}} { "AU file" {.au}} { "Sound file" {.snd}} { "SD file" {.sd}} { "SMP file" {.smp}} { "AIFF" {.aiff}} { "RAW file" {.raw}} { "All Files" {*}} } set base [file root [file tail $v(sig,name)]] if {$auto == ""} { set name [tk_getSaveFile -filetypes $types -initialfile "$base\_$zone$format" -initialdir $v(trans,path) -title "Save audio segment"] if {$name == ""} return } if [catch { player conf -file $v(sig,name) PauseAudio # if possible, keep previously open sound file player conf -file $v(sig,name) -channels $v(sig,channels) -frequency $v(sig,rate) -skiphead $v(sig,header) -guessproperties 1 if { $v(sig,cmd) != "" } { set rate [$v(sig,cmd) cget -frequency] if {$auto == "" } { set zone [concat [format "%6.2f" $v(sel,begin)]-[format "%-6.2f" $v(sel,end)]] player write $name -start [expr int($v(sel,begin)*$rate)] -end [expr int($v(sel,end)*$rate)] } else { #Automatic mode set loop "" foreach segment {"Section" "Turn" "Sync"} { if {$v($segment,loop)} { lappend loop $segment } } if {$loop != ""} { set tot 0 foreach segment $loop { set cpt 0 set begin $v(sig,min) set end 0 set max $v(sig,max) SetCursor $begin while {$begin < $max} { set nb $v(segmt,curr) set tag [GetSegmtId $nb] if {$segment == "Section"} { set sec [[$tag getFather] getFather] set id [::section::long_name $sec] } if {$segment == "Turn"} { set tur [$tag getFather] set spk [$tur getAttr "speaker"] set spk [::speaker::name $spk] set id [string trim $spk "_"] } set alnum {[^[:alnum:]]+} regsub -all $alnum $id "_" id TextNext$segment +1 set end [GetCursor] if {$end == $begin || $end == 0} { set end $max } set zone [concat [format "%6.2f" $begin]-[format "%-6.2f" $end]] set num [format "%03.0f" [incr cpt]] set name [file join $v(saveaudioseg,dir) "$base\_$segment$num\_$id\_$zone$format"] regsub -all "__" $name "_" name player write $name -start [expr int($begin*$rate)] -end [expr int($end*$rate)] set tot [incr tot] set begin $end } set v($segment,loop) 0 } } } } else { set time [expr int([format "%6.3f" [expr $v(sel,end) - $v(sel,begin)]]*16000)] set f [snack::filter generator 0.0 0 0.0 sine $time] set s [snack::sound] $s filter $f $s write $name } } res] { tk_messageBox -message "[Local "Error, wave segment(s) not saved !!"] $res" -type ok -icon error return "" } else { if {$loop != "" } { tk_messageBox -message [format [Local "Ok, %s wave segment(s) saved !!"] $tot] -type ok -icon info } else return } } } proc SaveAudioSegmentAuto {} { # JOB: open a dialog box to define the option for saving automaticaly each kind of wave segment (turn, section, sync). # you have to choose the destination directory and the elemnt to save # # IN: nothing # OUT: nothing # MODIFY: nothing # # Author: Sylvain Galliano # Version: 1.0 # Date: November 29, 2004 global v set w [CreateModal .save [Local "Save audio segments options"]] set f [frame $w.top -relief raised -bd 1] pack $f -side top -fill both set i 0 foreach segment {"Section" "Turn" "Sync"} { set b [checkbutton $f.rad[incr i] -var v($segment,loop) -text [Local $segment]] grid $b -row 0 -column "$i" -sticky w -padx 3m -pady 3m } EntryFrame $w.dir [Local "Destination directory"] v(saveaudioseg,dir) 50 set v(saveaudioseg,dir) [pwd] if {[OkCancelModal $w $w {"OK" "Cancel"}] == "OK"} { SaveAudioSegment auto } else return } transcriber-1.5.1.1/tcl/Main.tcl0000444000175000017500000010560610173761201014205 0ustar rtrt#!/bin/sh # -*-tcl-*-\ exec wish "$0" ${1:+"$@"} # RCS: @(#) $Id: Main.tcl,v 1.49 2005/01/20 16:55:29 mantam Exp $ # TRANSCRIBER - a free tool for segmenting, labeling and transcribing speech # Copyright (C) 1998-2004, DGA # WWW: http://www.etca.fr/CTA/gip/Projets/Transcriber/Index.html # Mailing list: transcriber@etca.fr # Author: Claude Barras, DGA/DCE/CTA/GIP # Coordinators : Edouard Geoffrois, DGA/DCE/CTA/GIP # Mark Liberman & Zhibiao Wu, LDC # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with GNU Emacs; see the file COPYING. If not, write to # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ################################################################ set version "1.5.1" proc Main {argv} { global v if {[info commands tk] != ""} { wm title . "Transcriber $::version" wm protocol . WM_DELETE_WINDOW { Quit } } InitDefaults $argv LoadModules InitConvertors if {[info commands tk] != ""} { BuildGUI TraceInit } StartWith $argv } proc Quit {} { global v if [catch {SaveIfNeeded}] return if {$v(keepconfig)} { set answer [tk_messageBox \ -message [Local "Save configuration before leaving?"] \ -type yesnocancel -icon question] if {$answer == "yes"} { SaveOptions } if {$answer == "cancel"} { return } } # Suppress autosave file InitAutoSave # Update log file TraceQuit # Stop ongoing subprocesses ShapeAbort #exit destroy . } ################################################################ # Global settings defaults # Meaning of global variables $v(...) : # ----------------------------------- # .snd.w,* principal signal configuration # .snd2.w,* second signal configuration # autosave,name name under which current transcription is auto-saved # autosave,next flag on if autosave handler is registred # autosave,time time before autosave after a modif (in minutes)/ 0:disabled # backup,ext extension for backup (default to ~) # bgPos,chosen chosen position for background selection # bindings pairs of key/inserted string # browser path to the default browser (needed to launch it) # browser,but button tk widget to choose the default browser # color,bg background color # color,bg-back background color for background noise # color,bg-evnt background color for events # color,bg-sect background color for section # color,bg-sel background color for selected signal # color,bg-sync background color for synchro # color,bg-text background color for text # color,bg-turn background color for turns # color,fg-back foreground color for background noise # color,fg-evnt foreground color for events # color,fg-sect foreground color for section # color,fg-sync foreground color for synchro # color,fg-text foreground color for text # color,fg-turn foreground color for turns # color,hi-sync current synchro color # color,hi-text current text color # convert_events convert strings [i] to events for old .xml files # curs,event next event for cursor move # curs,fast callback for fast fwd/bwd auto repeat # curs,max maximal cursor position during play (end of signal or sel.) # curs,min start of play for repeat (begin of signal or selection) # curs,pos current position of cursor in signal # curs,start playback start time # debug flag for debug menu display # demo switch to demonstration mode # encoding if a different encoding is to be used # encodingList list of IANA encoding names/usual names # event,* format strings for events type and extent # entities list of Named Entities (NE) events with descriptions # ext,lbl list of extensions for importable label files # ext,snd list of known extensions for sound files # ext,trs list of extensions for importable transcription files # file,default default configuration file # file,dtd DTD file for transcriptions in XML format # file,local user localization file # file,user user configuration file # find,case case sensitiveness for find ("-nocase" or "") # find,direction search direction for find ("-forward" or "-backward") # find,mode mode for find ("-exact" or "-regexp") # find,replace replacement string # find,what string to look for # font,axis font used for axis # font,event font used for events # font,info font used for infos # font,list font used for fixed length lists # font,mesg font used for messages # font,text font used for text editor # font,trans font used for transcriptions in segments # geom,$w default geometry for window $w # glossary value/comment word pairs of user glossary # img,$name bitmap image # keepconfig ask to save configuration before leaving # lang language for menus ("fr" for french, default to english) # language list of pairs iso639-code/language-name for localization # lexical list of lexical events with descriptions # list,ext personal external speakers database # multiwav,file stores the current MultiWav menu file selection # multiwav,files list of all the files in the MultiWav menu # multiwav,path list of the full pathnames of the MultiWav menu files # newtypes list of supported import formats with description # noise list of noise events with their descriptions # options,file default file for user configuration # options,list values to be saved in user configuration # options,linux personal configuration file on Linux # options,macintosh personal configuration file on Macintosh # options,windows personal configuration file on Windows # path,base base directory of Transcriber # path,doc directory for help files # path,etc path for default config values and DTD # path,image directory for GIF or bitmap images # path,shape default directory for centi-second sound shapes # path,sounds last directory used for sound files selection # path,tcl directory for Tcl scripts # play,after callback after sound playback is over # play,auto automatic play new selection or signal (1 or 0) # play,no-fast temporary inhibition of fast forward/backward # play,state currently playing or not # playbackBeep beep sound file # playbackBefore go back before playing # playbackMode continuous/pause/beep/stop/loop playback mode # playbackPause pause duration between segments # playbackSegmt set if playing a single segment # playbackSpeed speed playback factor (unsupported) # preferedPos cursor insertion pos in text editor (start/end of line) # proc,id id for numbering of socket connections to file server # pronounce list of pronounciation events with descriptions # scribe,name default transcriber's name # segmt,curr id of current segment # segmt,move id of segment whose boundary is currently being moved # sel,begin begin of selected area of signal # sel,end end of selected area of signal # sel,event next event for automatic extension of selection # sel,start position of initial click for selection # sel,text text describing selection limits # shape,bg request shape calculation in background # shape,cmd sound command containing shape of signal # shape,min minimal duration for shape request (else max for display) # shape,wanted if user wants shape calculation # sig,base header size for raw files # sig,channels channels for raw audio files # sig,cmd sound command for signal access # sig,desc variable containing signal description to be displayed # sig,gain scale tk widget for volume gain change # sig,header raw sound file header size # sig,len length of signal (in seconds) # sig,max = sig,min + sig,len # sig,min beginning of signal (should be 0) # sig,name file name of audio signal # sig,port socket port for audio file server # sig,rate sound rate for raw audio files # sig,remote access to files through audio file server or not # sig,server audio file server # sig,shortname short file name of audio signal # space,auto automatic space insertion # spell,* related to spell checker # tk,dontmove flag to freeze once the cursor update inside text widget # tk,edit text tk widget # tk,play button tk widget for play # tk,stop button tk widget for stop # tk,wavfm main waveform tk widget # trace,* related to performance monitoring # trans,desc description of transcription for info window # trans,format file format of the transcription # trans,list ordered list of tags for segments in text widget # trans,modif flag "transcription modified" # trans,name file name of transcription # trans,path default path for open/save transcription dialog boxes # trans,root id of transcription root tag # trans,saved flag if transcription has been saved at least once # trans,seg? list of transcription segments at level ? # type,chosen section type chosen in dialog or menu # pref,ver version of the user preference file # undo,list infos for undo # undo,redo flag on if undo is in fact redo # var,msg variable for selection infos and other messages # view,$win flag for frame/window display # $wav,height height of waveform widget (in pixels) # $wav,left left position of window in signal (in sec) # $wav,resolution initial resolution for signal # $wav,right = $wav,left + $wav,size # $wav,scale scrollbar tk widget for scale change # $wav,scroll scrollbar tk widget for horizontal move # $wav,size length of window # $wav,sync list of tk widgets to be synchronized # wavfm,list list of all waveform views # zoom,list infos for unzoom proc InitDefaults {argv} { global v env catch {unset v} # Set paths relative to script path set v(path,tcl) [file dir [info script]] set v(path,base) [file dir $v(path,tcl)] set v(path,image) [file join $v(path,base) "img"] set v(path,doc) [file join $v(path,base) "doc"] set v(path,etc) [file join $v(path,base) "etc"] set v(file,dtd) [file join $v(path,etc) "trans-14.dtd"] # Read values from default configuration file set v(file,default) [file join $v(path,etc) "default.txt"] LoadOptions $v(file,default) 1 # correct some default values for Mac OS X if {[info tclversion] >= 8.4 && [info commands tk] != "" && [tk windowingsystem] == "aqua"} { set v(font,text) {courier 14} set v(color,hi-text) "white" set v(color,bg-text) "#f0f0f0" set v(color,bg-evnt) "#f0f0f0" } # Override default values with user values # (default name for user configuration file can be # overriden with environnement variable $TRANSCRIBER) if {[llength $argv] > 0} { for {set i 0} {$i < [llength $argv]} {incr i} { set val [lindex $argv $i] if { $val == "-cfg"} { set v(file,user) [lindex $argv [incr i]] break } } } if {![info exists v(file,user)] } { if {[info exists env(TRANSCRIBER)]} { set v(file,user) $env(TRANSCRIBER) } else { switch $::tcl_platform(platform) { "windows" { if {[info exists env(USERPROFILE)]} { set v(file,user) [file join $env(USERPROFILE) $v(options,windows)] } else { set v(file,user) [file join $env(HOME) $v(options,windows)] } } "unix" { if {$::tcl_platform(os) == "Darwin"} { set v(file,user) [file join $env(HOME) Library Preferences $v(options,macintosh)] file mkdir [file dir $v(file,user)] } else { set v(file,user) [file join $env(HOME) $v(options,unix)] } } } } } LoadOptions $v(file,user) # Migration of old user preferences to Transcriber 1.5.1 # This code is executed at the first run after the installation of Transcriber 1.5.1 # The event widget size is reset because it changed since the previous versions # of Transcriber if { [ string compare 1.5.1 $v(pref,ver) ] == 1 } { set v(pref,ver) "1.5.1" set v(geom,.evt) "" } # Test of the presence of the global speaker database # Indeed, due to problems with the global speaker database management, # it is temporarily disabled # set speakerFile $env(HOME)/[file tail $v(list,ext)] # if { ( [ file exists $speakerFile ] == 1 ) && ([string length [string trim $v(list,ext)]] != 0 ) } { # set choice [tk_messageBox -type yesno -default no -message "Due to a bug of Transcriber 1.5.0, the speaker database $speakerFile has to be removed. May I do it ?" -icon question] # if { ($choice == yes) } { # file delete $speakerFile # } else { # exit # } # } # Init user name if {$v(scribe,name)=="(unknown)"} { if {[info exists env(USER)] && $env(USER) != ""} { set v(scribe,name) $env(USER) catch { regexp "Name: (\[^\n]*)" [exec finger $env(USER)] all Name if {$Name != ""} { set v(scribe,name) $Name } } } elseif {[info exists ::tcl_platform(user)] && $::tcl_platform(user) != ""} { set v(scribe,name) $::tcl_platform(user) } } # Init beep file if {![file readable $v(playbackBeep)]} { set v(playbackBeep) [file join $v(path,etc) "beep.au"] } # Shape enabled set v(shape,wanted) 1 # If shape path is not defined by user, look for a writable path if {$v(path,shape)==""} { if {$::tcl_platform(os) == "Darwin"} { set v(path,shape) $env(HOME)/Library/Caches/Transcriber file mkdir $v(path,shape) } else { set testpaths {} if {[info exists env(TMP)]} { lappend testpaths $env(TMP) } if {[info exists env(TEMP)]} { lappend testpaths $env(TEMP) } if {$::tcl_platform(platform) == "unix"} { lappend testpaths "/var/lib/transcriber" "/var/lib/trans" "/var/tmp/trans" "/tmp/trans" "/var/tmp" } lappend testpaths "/tmp" "/temp" foreach path $testpaths { if {[file isdir $path] && [file writable $path]} { set v(path,shape) $path break } } } # We could pop-up a dialog box to the user and inform of the choice } # Localization file (local.txt kept for backward compatibility with modified files) LoadLocal [file join $v(path,etc) "local.txt"] LoadLocal [file join $v(path,etc) "local_$v(lang).txt"] LoadLocal [format $v(file,local) $v(lang)] # We could use env(LC_MESSAGES) and LANG for default value of v(lang) UpdateLangList UpdateDepList UpdateHeaderList } proc LoadConfiguration {} { global v env SaveIfNeeded set base [file dirname $v(file,user)] set types { { "configuration file" {.cfg}} { "All files" {*}} } set fileName [tk_getOpenFile -filetypes $types -defaultextension .cfg -initialfile "$v(scribe,name)" -initialdir $base -title "Load configuration file"] if {$fileName == ""} return CloseTrans LoadOptions $fileName ChangedLocal set pos $v(curs,pos) set gain $v(sig,gain) if {$v(trans,name) != "" && [file readable $v(trans,name)]} { ReadTrans $v(trans,name) $v(sig,name) $v(multiwav,path) } elseif {$v(sig,name) != "" && [file readable $v(sig,name)]} { NewTrans $v(sig,name) $v(multiwav,path) } SetCursor $pos NewGain $gain } proc LoadOptions {fileName {keep 0}} { global v readEncoding $fileName catch { set f [open $fileName r] while {[gets $f oneline]>=0} { append wholeline $oneline if {![info complete $wholeline]} { append wholeline "\n" continue } set var [lindex $wholeline 0] if {($var != "") && ([string index $var 0] != "\#")} { set val [lindex $wholeline 1] set v($var) $val if {$keep} { lappend v(options,list) $var $val } } set wholeline "" } close $f } restoreEncoding } proc SaveOptions {{mode ""}} { global v if {$mode != "as"} { set fileName $v(file,user) } else { set base [file dirname $v(file,user)] set types { { "configuration file" {.cfg}} { "All files" {*}} } set fileName [tk_getSaveFile -filetypes $types -defaultextension .cfg -initialfile "$v(scribe,name)" -initialdir $base -title "Save configuration file"] if {$fileName == ""} return } # write options using default system encoding set f [open $fileName w] set v(geom,.) [wm geom .] puts $f "\# Options for Transcriber saved on [clock format [clock seconds]][writeEncoding]" set old "" foreach {var def} $v(options,list) { if {$v($var) != $def} { puts $f [list $var $v($var)] } else { append old [list $var $v($var)]\n } } # prepend all lines with comment char for default values regsub -all "\n" $old "\n\# " old puts $f "\n\# following options use default values\n\# $old" close $f # also save localization file - now rather done after edition # SaveLocal } ################################################################ # Use encoding informations for reading/writing configuration # and localization files # switch system to encoding used for saving a file # (necessary for sourcing a file, where fconfigure is not possible) # need to call restoreEncoding after saving proc readEncoding {fileName} { catch { if {![info exists ::defaultEncoding]} { set ::defaultEncoding [encoding system] } set f [open $fileName] set line [gets $f] close $f if {[regexp "encoding (\[^ \]+)" $line all enc]} { encoding system $enc } } } # switch system to chosen encoding for saving a file # return a string message to put in the header of the file # need to call restoreEncoding after writing if encoding not empty proc writeEncoding {{enc ""}} { set msg "" catch { if {$enc != ""} { if {![info exists ::defaultEncoding]} { set ::defaultEncoding [encoding system] } encoding system $enc } set msg " with encoding [encoding system]" } return $msg } # restore default system encoding proc restoreEncoding {} { catch { encoding system $::defaultEncoding } } ################################################################ proc LoadLocal {fileName} { global v if {![file readable $fileName]} return readEncoding $fileName catch { uplevel \#0 [list source $fileName] } restoreEncoding } proc EditLocal {{only_empty 0}} { global v if {$v(lang) != "en"} { upvar \#0 local_$v(lang) local if {![catch { foreach nam [lsort -dictionary [array names local]] { if {$only_empty && $local($nam) != ""} continue lappend new [list $nam $local($nam)] } set new [ListEditor $new "Localization in $::iso639($v(lang))" \ {"Message" "Translation"}] unset local array set local [join $new] }]} { # Update menus if needed ChangedLocal # SaveLocal - formerly done within "Options / Save configuration" if {$v(file,local) != "" && [set fileName [SaveLocal]] != ""} { set m [format [Local "Modifications saved in the file %s"] $fileName] } else { set m [Local "To keep your modifications, please provide a valid localization file name, come back to this edition window and click OK. Save also the configuration for reusing this file automatically in a next session."] } tk_messageBox -type ok -icon warning -message $m } } } proc ChangedLocal {} { global v # try to read language-specific localization file if necessary upvar \#0 local_$v(lang) local if {![array exists local]} { set fileName [format $v(file,local) $v(lang)] if {$fileName != $v(file,local) && [file readable $fileName]} { LoadLocal $fileName } else { LoadLocal [file join $v(path,etc) "local_$v(lang).txt"] } } SetBindings InitMenus if { $v(view,.snd) } { InitWavContextualMenu .snd.1 } if { $v(view,.snd2) } { InitWavContextualMenu .snd2.1 } UpdateLangList UpdateDepList UpdateHeaderList } # Save in user localization file proc SaveLocal {} { global v if {$v(file,local) == ""} { return } set fileName [format $v(file,local) $v(lang)] if {$fileName == $v(file,local)} { set langs [info globals local_*] } else { if {[info globals local_$v(lang)] == {}} return set langs local_$v(lang) } if {[llength $langs] > 1} { # save localization file for multiple languages using UTF-8 encoding set enc [writeEncoding "utf-8"] } else { # save language specific localization file using default system encoding set enc [writeEncoding] } set f [open $fileName w] puts $f "\# Localization for Transcriber saved on [clock format [clock seconds]]$enc" foreach locvar $langs { puts $f "\narray set $locvar \{" foreach nam [lsort -dictionary [array names ::$locvar]] { puts $f "[list $nam]\n\t[list [set ::${locvar}($nam)]]" } puts $f "\}\n" } close $f restoreEncoding return $fileName } # Usage: Local "Message in english" # Returns : translation of the message in the language given in # the global variable v(lang) if it exists in the local_* array; # else the original message. proc Local {message} { global v if {$v(lang) != "en"} { upvar \#0 local_$v(lang) local if {[catch { set translation $local($message) if {$translation != ""} { set message $translation } }]} { # register undefined message for edition set local($message) "" } } return $message } # Called at startup, and when language list or localization language changes proc UpdateLangList {} { global v # Sort language list in right order for given language set v(language) [lsort -index 1 -command CmpLocal $v(language)] # create array for iso639 language codes catch {unset ::iso639} array set ::iso639 [join $v(language)] } # Called at startup, and when language list or localization language changes proc UpdateDepList {} { global v # Sort dependent list in right order for given dependent set v(dependent) [lsort -index 1 -command CmpLocal $v(dependent)] } proc UpdateHeaderList {} { global v # Sort header list in right order for given header set v(header) [lsort -index 1 -command CmpLocal $v(header)] } proc UpdateScopeList {} { global v # Sort header list in right order for given header set v(scope) [lsort -index 1 -command CmpLocal $v(scope)] } proc CmpLocal {str1 str2} { return [string compare [Local $str1] [Local $str2]] } ################################################################ proc LoadModules {} { global v auto_path env pwd; # for Linux Debian 2.0 (else there was an error later with 'pwd') lappend auto_path [file dir $v(path,base)] # use the whole snack package for Windows rather than sound package if {[info commands tk] != ""} { # Snack 1.7 or 2.0 should both work set vsnack [package require snack] if {[package vcompare $vsnack 1.7] < 0} { error "Found Snack package version $vsnack; needs 1.7 or higher" } catch { # in Snack 1.7, snackSphere package was renamed snacksphere package require snacksphere } catch { package require snackogg } package require trans 1.5 } # Install QuickTime if available catch { package require QuickTimeTcl } # Source tcl libraries at global level foreach module { About Debug Dialog Edit Episode Events Interface Menu Play Segmt Signal Speaker Spelling Synchro Topic Trans Undo Waveform Xml MultiWav } { if {$module == "Xml" && [info commands ::xml::init] != ""} continue uplevel \#0 [list source [file join $v(path,tcl) $module.tcl]] } # Take Tcl/Tk 8.4 text library name changes into account if {[info tclversion] >= 8.4 && [info commands tk] != ""} { foreach cmd { tkButtonInvoke tkEntryInsert tkTextInsert tkTextNextWord tkTextPrevPos tkTextSetCursor tkListboxUpDown } { if {![llength [info commands $cmd]]} { tk::unsupported::ExposePrivateCommand $cmd } } } } ################################################################ # Calibration of "clock clicks" (no more in use) proc ClockCalibrate {{time 5.0}} { #DisplayMessage "Calibrating clock for $time seconds. Please wait..." update set clock0 [clock clicks] after [expr int(1000*$time)] set clock1 [clock clicks] set val [expr ($clock1-$clock0)/double($time)] #DisplayMessage "Calibration done ($val clicks per sec.)" return $val } # Convert time in second to printable string # precision defaults to 2 digit for durations less than 60 seconds proc Tim2Str {tim {digit 2}} { #set sec [expr int($tim)] foreach {sec rem} [split $tim .] {} if {$tim>3600} { set str [clock format $sec -format "%H:%M:%S" -gmt 1] } elseif {$tim>60} { set str [clock format $sec -format "%M:%S" -gmt 1] } else { set str $sec #set str [format "%.${digit}g sec" $tim] } if {$rem != ""} { append str [string range ".$rem" 0 $digit] } return $str } ################################################################ # Miscellaneous proc min {a b} { expr $a>$b ? $b : $a } proc max {a b} { expr $a>$b ? $a : $b } # Suppress first occurence of a value in a list proc lsuppress {varName val} { upvar $varName list set i [lsearch -exact $list $val] if {$i >= 0} { set list [lreplace $list $i $i] } } # improved incr procedure proc incr2 {varName {amount 1}} { upvar $varName var if {[info exists var]} { set var [expr $var + $amount] } else { set var $amount } return $var } # Set default value if variable is undefined proc setdef {varName val} { upvar $varName var if {! [info exists var]} { set var $val } return $var } ################################################################ # Open audio file and transcription from command line else from defaults proc StartWith {argv} { global v set sig "" set multiwav {} set video "" set trans "" set lbls {} set pos 0 set gain 0 if {[llength $argv] > 0} { set ext_tr [concat $v(ext,trs) $v(ext,lbl)] set ext_au $v(ext,snd) for {set i 0} {$i < [llength $argv]} {incr i} { set val [lindex $argv $i] switch -glob -- $val { "-set" { # set a global variable to a given value, overrinding configuration file # (names with special chars e.g. "shape,wanted" need to be quoted at shell level) # syntax: trans -set varname value ... set varname [lindex $argv [incr i]] set value [lindex $argv [incr i]] set v($varname) [subst -nocommands -novariables $value] } "-debug" { set v(debug) 1 } "-demo" { set v(demo) 1 } "-noshape" { set v(shape,wanted) 0 } "-notext" { if {$v(view,.edit)} { SwitchTextFrame } } "-sig2" { if {!$v(view,.snd2)} { CreateSoundFrame .snd2 set v(view,.snd2) 1 } } "-patch" { set path [lindex $argv [incr i]] if {![file exists $path]} { set path [file join $v(path,base) $path] } if {[file isdir $path]} { set path [file join $path *.tcl] } foreach file [glob $path] { uplevel \#0 [list source $file] } } "-lbl" - "-lab*" { # open a segmentation layer for followings lbl file name(s) while {1} { set name [lindex $argv [expr $i+1]] if {$lbls != {}} { if {[string index $name 0] == "-" || ![file readable $name] || [LookForLabelFormat $name] == ""} break } else { if {![file readable $name]} { puts stderr "could not read label file $name" exit } if {[LookForLabelFormat $name] == ""} { puts stderr "$name is not a valid label file with extension in: $v(ext,lbl)" exit } } incr i lappend lbls $name } } "-socket" { # launch socket facility for external scripting of Transcriber # (see tcl/Socket.tcl code for more details) # optional socket server and client ports set val [lindex $argv [expr $i+1]] if {[string index $val 0] != "-"} { set v(socket,server) $val incr i set val [lindex $argv [expr $i+1]] if {[string index $val 0] != "-"} { set v(socket,client) $val incr i } } uplevel \#0 {source [file join $v(path,tcl) Socket.tcl]} } "-export" - "-convertto" { # convert a set of trs files to given format, if export filter available # syntax: trans -convertto {stm|html|...} *.trs # resulting files are stored in current directory if {[info commands tk] != ""} { wm withdraw . update } set format [lindex $argv [incr i]] if {$format == "trs"} { # re-exporting to .trs allows automatic normalization set nsformat ::trs } else { set nsformat ::convert::${format} } if {[info command ${nsformat}::export] == ""} { if {$format != ""} { puts stderr "Conversion to format $format unsupported." } puts stderr "List of supported formats for exporting .trs files:" foreach format [namespace children convert] { if {[info command ${format}::export] != ""} { puts stderr "\t[namespace tail $format]" } } exit } #CloseTrans -nosave set ext [lindex [set ${nsformat}::ext] 0] puts stderr "Converting transcription files to $format format ($ext):" set nb 0 ::speaker::init InitModif while {[set name [lindex $argv [incr i]]] != ""} { if {![file readable $name]} { puts stderr "(skipping non readable file $name)" continue } set format "" if {[trs::guess $name]} { set format "trs" } else { foreach ns [namespace children convert] { if {[info command ${ns}::guess] != "" && [${ns}::guess $name]} { set format $ns break } } } if {$format == "" || [info command ${format}::import] == ""} { puts stderr "(skipping non transcription file $name)" continue } puts stderr "converting $name ($format)" if {[catch { ${format}::import $name set v(sig,min) 0 set v(trans,format) $format if {[set msg [NormalizeTrans]] != ""} { puts -nonewline stderr $msg } ${nsformat}::export [file tail [file root $name]]$ext incr nb } err]} { puts stderr "error with $name: $err ($::errorInfo)" } ::xml::init ::speaker::init ::topic::init set v(trans,root) "" set v(trans,name) "" #CloseTrans -nosave } puts stderr "$nb file(s) processed." exit } "-cfg" { # The -cfg option is used and detailled in the InitDefault procedure # but has to be declared here just to avoid any option problem. # Increment "i" to avoid interpreting the configuration file as an argument incr i } "-psn*" { # id sent by Mac OS X, to be ignored } "-v" - "-version" { puts stderr "Transcriber version $::version" exit } "-h" - "-help" { puts stderr { Transcriber - a free tool for segmenting, labeling and transcribing speech. Syntax: trans \[options\] filename(s) ... with command line options: -cfg filename Override default configuration file -debug Add debug options in the help menu -h/-help Display this message, then exit -lbl/-label filename Display labels under the signal (may be repeated) -noshape Disable signal shape mechanism -notext Disable display of text editor -patch filename Execute tcl script at startup -set option value Override an option of the configuation file -sig2 Enable display of second signal view -socket Enable external scripting through sockets -v/-version Display version, then exit filename(s) may be either a transcription, a signal file or both files. If several signal files are given, the multiwav mode is activated. Alternative syntax: trans -export format filename ... converts a set of transcription files in the .trs format to the format given, then exits. Type 'trans -export' for a list of supported formats. Further documentation available online (Help menu) or on the Web site: http://www.etca.fr/CTA/gip/Projets/Transcriber/ } exit } "--" { # should not be passed by wish } "-*" { puts stderr "unsupported command line option $val (try -help)." exit } default { # Audio and transcription given on command line set ext [string tolower [file extension $val]] if {[lsearch -exact $ext_tr $ext] >= 0} { set trans $val } elseif {[lsearch -exact $ext_au $ext] >= 0 || [SoundFileType $val] != "RAW"} { if {$sig == ""} { set sig $val } else { lappend multiwav $val } } else { puts stderr "unknown format for file $val" exit } } } } } # Default values if none was given on command line if {$sig=="" && $trans == "" && $lbls == {}} { if {[file readable $v(sig,name)]} { set sig $v(sig,name) set multiwav $v(multiwav,path) } if {[file readable $v(trans,name)]} { set trans $v(trans,name) } if {[file readable $v(videoFile)]} { set video $v(videoFile) } set pos $v(curs,pos) set gain $v(sig,gain) set lbls $v(labelNames) } set v(videoFile) "" EmptySignal # Load trans and associated audio #set v(trans,path) [pwd] if {$::tcl_platform(os) == "Darwin"} { set v(trans,path) [file dir [file dir [file dir $v(path,base)]]] } else { set v(trans,path) [file join $v(path,base) "demo"] } if {$trans == "" || [catch { ReadTrans $trans $sig $multiwav SetCursor $pos NewGain $gain if {$video != ""} { catch { OpenVideoFile $video } } } error]} { if {$trans != ""} { #global errorInfo; puts $errorInfo #bgerror $error tk_messageBox -message $error -type ok -icon error } if {$sig != ""} { NewTrans $sig $multiwav } else { if {$lbls != {}} { set v(trans,path) [file dir [lindex $lbls 0]] } OpenTransOrSoundFile } } foreach lbl $lbls { OpenSegmt $lbl } } ################################################################ # Let's go ! Main $argv transcriber-1.5.1.1/tcl/SoundServer.tcl0000555000175000017500000002406507513007220015600 0ustar rtrt#!/bin/sh # -*-tcl-*-\ exec wish8.0 "$0" ${1:+"$@"} # RCS: @(#) $Id: SoundServer.tcl,v 1.3 2002/07/10 10:38:08 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) # Sound file server through sockets # # Syntax : # SoundServer.tcl [server_port] # # Action : # Open sound file and dialog with client through sockets, returning # result of sound commands along with error flag. # Get libraries set base [file dir [file dir [file join [pwd] [info script]]]] lappend auto_path $base [file dir $base] set vsnack [package require snack] if {[package vcompare $vsnack 1.7] < 0} { error "Found Snack package version $vsnack; needs 1.7 or higher" } catch { # in Snack 1.7, snackSphere package was renamed snacksphere package require snacksphere } #package require trans 1.5 # Default port set port 8032 # Default path for storing shapes set shp_path "/var/tmp" # Authorized signal base pathname set basename "/data/sounds" # List of authorized sound extensions set exts {".au" ".wav" ".snd" ".sph" ".sig" ".sd" ".smp" ".aif" ".aiff" ".mp3" ".raw"} # Debug mode set debug 0 # For header dump sound header # Socket server proc SocketServer {port} { Msg "Sound server port $port" if [catch { set ::servsock [socket -server SocketAccept $port] #vwait forever } error] { puts $error exit } } # Connection to server proc SocketAccept {sock addr port} { # We could reject here foreign hosts or have some restricted list Msg "Accept $sock from $addr port $port" fconfigure $sock -buffering full -translation binary fileevent $sock readable [list FirstCmd $sock] } # First command has to be "sound [options]" proc FirstCmd {sock} { Busy $sock "" set line "" if {[catch {gets $sock line} error] || ([string length $line]==0)} { #Msg "in $sock line $line error $error" Close $sock } else { set line [string trimright $line \r] Msg $line switch [lindex $line 0] { "sound" { # Test that access is authorized for this file array set opt {-file "" -load "" -channel ""} array set opt [lrange $line 1 end] # Join with basename set opt(-file) [file join $::basename $opt(-file)] # Test that pathname/extension for soundfile is authorized if {$opt(-load) != "" || $opt(-channel) != "" || [lsearch -exact [file split $opt(-file)] ".."] >= 0 || ![string match $::basename/* [file dirname $opt(-file)]/] || [lsearch -exact $::exts [file extension $opt(-file)]] < 0 || ![file exists $opt(-file)]} { ExecCmd $sock [list error "Can't open remote file $opt(-file)"] Close $sock } else { unset opt(-load) unset opt(-channel) set snd [ExecCmd $sock [concat "sound" [array get opt]]] if {$::debug} {puts "[$snd info]"} fileevent $sock readable [list NextCmd $sock $snd] } } default { ExecCmd $sock [list error "Wrong command: $line"] Close $sock } } } Free } proc NextCmd {sock snd} { Busy $sock $snd set error "eof $sock" if {[catch {fconfigure $sock} error] || [eof $sock] || [catch {gets $sock line} error]} { Close $sock $snd } else { set line [string trimright $line \r] if {[string length $line]!=0} { Msg "$line" switch -glob -- [lindex $line 0] { "dump" { global v set v(-start) 0 set v(-end) -1 set v(-byteorder) $::tcl_platform(byteOrder) array set v [lrange $line 1 end] if {$v(-end)<0} { set v(-end) [$snd length] } if {$::debug} {puts "$snd dump -start $v(-start) -end $v(-end) -byteorder $v(-byteorder)"} puts $sock "CODE ok LEN -1" # puts empty header with informations on signal set b 2; # samplesize for lin16 set c [$snd cget -channels] set f [$snd cget -frequency] set nb [expr $b*$c*($v(-end)-$v(-start)+1)] #header conf -frequency $f -channels $c -format lin16 #puts -nonewline $sock [header data -fileformat WAV] puts -nonewline $sock [binary format a4ia8issiissa4i "RIFF" [expr 36+$nb] "WAVEfmt " 16 1 $c $f [expr $b*$c*$f] [expr $b*$c] [expr 8*$b] "data" $nb] flush $sock fconfigure $sock -blocking 0 fileevent $sock writable [list PlayHandler $sock $snd] } "rshape" { ExecCmd $sock "CompShape $snd" } "shape" - "datasamples" - "cget" - "order" - "info" - "length" - "stop" { ExecCmd $sock [concat $snd $line] } "play" { # filter playback command set v(-start) 0 set v(-end) -1 set v(-devicerate) "" array set v [lrange $line 1 end] if {$v(-end)<0} { set v(-end) [$snd length] } ExecCmd $sock [concat $snd "play" "-start" $v(-start) "-end" $v(-end)] } "elapsedTime" - "active" - "play_gain" { ExecCmd $sock [concat "audio" $line] } "destroy" { catch {shp$snd destroy} ExecCmd $sock "$snd destroy" } default { ExecCmd $sock [list error "Non authorized sub-command [lindex $line 0]"] } } } } Free } # Execute command and write result to the socket channel in the format : # CODE $code LEN $len $result proc ExecCmd {sock cmd} { if {$::debug} {puts "$cmd"} if [catch {eval $cmd} res] { set code "error" } else { set code "ok" } set len [string length $res] puts $sock "CODE $code LEN $len" puts -nonewline $sock $res flush $sock if {$::debug} { if {[lindex $cmd 1] == "shape" || [lindex $cmd 1] == "datasamples"} { puts " => ($code) ..." } else { puts " => ($code) $res" } } return $res } proc PlayHandler {sock snd} { global v Busy $sock $snd Msg "playing" if {$v(-start) >= $v(-end) || [catch { set end $v(-end) if {$end > [expr $v(-start) + 10000]} { set end [expr $v(-start) + 10000] } #puts "playing $snd $v(start) $end => $sock" puts -nonewline $sock [$snd datasamples -start $v(-start) -end [expr $end-1] -byteorder $v(-byteorder)] flush $sock set v(-start) $end }]} { Close $sock $snd } Free } # Taken from Signal.tcl proc LookForShape {sigName} { global v set base [file root [file tail $sigName]] set ext "shape" # Search for an existing matching shape # (in default dir, shp sub-dir or signal dir) foreach path [concat $::shp_path "shp ../shp ."] { # Relative paths are relative to signal path set path [file join [file dirname $sigName] $path] set shape [file join $path $base.$ext] # Verify that the shape is newer than the signal if {[file isfile $shape] && [file readable $shape] && [file mtime $shape] >= [file mtime $sigName]} { return $shape } } # Return new shape name in default shape path set shape [file join $::shp_path $base.$ext] file delete $shape return $shape } proc CompShape {snd} { set shapeName [LookForShape [$snd cget -file]] set shp [sound shp$snd -file $shapeName \ -frequency 100 -channels 2 -format LIN8] if {![$snd shape $shp -check 1]} { Msg "computing shape $shapeName" $snd shape $shp $shp write $shapeName -fileformat WAV } return $shp } proc Busy {sock {snd ""}} { set ::busy 1 if {[catch { set ::peer [lindex [fconfigure $sock -peername] 1] }]} { set ::peer "" } if {$snd == "" || [catch { set ::name [$snd cget -file] }]} { set ::name "" } update idletasks } proc Close {sock {snd ""}} { Msg "closing connection" catch {shp$snd destroy} catch {$snd destroy} catch {close $sock} } proc Msg {txt} { set ::msg $txt update idletasks } proc Free {} { set ::busy 0 } proc Quit {} { catch {close $::servsock} exit } proc Restart {} { catch {close $::servsock} SocketServer $::port } proc Interface {} { wm title . "Transcriber's Sound Server" wm protocol . WM_DELETE_WINDOW {Quit} set w [frame .top -relief raised -bd 1] pack $w -side top -fill both -expand true foreach i {1 2 3} n { "Port" "Shape storage" "Authorized signal paths" } var {port shp_path basename} { pack [frame $w.$i] -side top -fill x label $w.$i.l -text "$n:" -width 20 -anchor e pack $w.$i.l -side left -padx 1m -pady 1m entry $w.$i.e -textvariable $var -width 30 pack $w.$i.e -side left -padx 1m -pady 1m -fill x -expand true } set w [frame .mid -relief raised -bd 1] pack $w -side top -fill both -expand true pack [frame $w.1] -side top -fill x label $w.1.l1 -text "Client:" -width 10 label $w.1.l2 -textvariable peer -width 20 -relief sunken -anchor w pack $w.1.l1 $w.1.l2 -side left -padx 1m -pady 1m pack [frame $w.2] -side top -fill x label $w.2.l3 -text "Sound:" -width 10 label $w.2.l4 -textvariable name -width 40 -relief sunken -anchor w pack $w.2.l3 $w.2.l4 -side left -padx 1m -pady 1m pack $w.2.l4 -fill x -expand true pack [frame $w.3] -side top -fill x checkbutton $w.3.c -text busy -var busy -anchor w pack $w.3.c -side left -padx 1m -pady 1m label $w.3.m -textvariable msg -width 40 -relief sunken -anchor w pack $w.3.m -side left -padx 1m -pady 1m -fill x -expand true set w [frame .bot -relief raised -bd 1] pack $w -side top -fill x button $w.r -text Restart -command Restart button $w.q -text Quit -command Quit pack $w.r $w.q -side left -expand true -padx 3m -pady 2m } # Parse line arguments foreach {option value} $argv { switch -- $option { "-shape" { set shp_path $value } "-port" { set port $value } "-base" { set basename $value } "-debug" { set debug 1 } default { puts "unsupported command line option '$option'" puts "Syntax: $argv0 ?-shape $shp_path? ?-port $port ?-base $basename? ?-debug?" exit 1 } } } # Start file server; if port already in use return else loop Interface SocketServer $port transcriber-1.5.1.1/tcl/XmlItem.tcl0000444000175000017500000006176107512762005014711 0ustar rtrt#!/bin/sh #\ exec wish "$0" "$@" # RCS: @(#) $Id: XmlItem.tcl,v 1.2 2002/07/10 07:36:37 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) # WWW: http://www.etca.fr/CTA/gip/Projets/Transcriber/Index.html # Author: Claude Barras ################################################################ # Methods for XML data management in memory as objects # - access through object-oriented procedures # - dynamic validation of attribute values/... when DTD is activated # Object oriented syntax for XML items (elements, data ...) # # ::xml::$class # => creates and returns an object of given class # # $o $method $args # => executes given method on object $o # # $o $class::$method $args # => executes given method on object $o as if it were from $class # # $o delete # => destroy the object with its associated data # Object can be of one of the predefined classes # - item = independant object with a string value associated # and methods for get/put this value # - node = an item linked inside a tree structure with methods # for accessing the tree and linking nodes # - element = a node with a list of attribute name/value and methods # for managing the attributes # - data = a node (i.e. with a string value) # - comment = a node # Exemple of utilisation for creation of an HTML title : # set body [::xml::element "BODY"] # set h1 [::xml::element "H1" {} -in $body] # set a [::xml::element "A" {"HREF" "demo.html"} -in $h1] # set txt [::xml::data "Demonstration" -in $a] # $body dump # $body deltree # For a stand-alone use (without XmlDtd.tcl file), uncomment following lines : # namespace eval xml { # namespace eval dtd { # proc init {} { } # proc active {} { return 0 } # proc check {args} { } # } # } ################################################################ namespace eval ::xml { variable xml [namespace current] # init proc init {} { initItem dtd::init } #----------------------------------------------------------------------- # Item objects with an associated value # # Create an item object from the given class: # ::xml::item ?$class? ?$value? # # Methods available on item object: # $o delete # $o class # $o setValue $value # $o getValue # # Initialization of all item objects (of any class): # ::xml::initItem # # List of all item objects (of any class): # ::xml::listItem # # Create a new item with an associated private data array and # a procedure with the same name for methods access proc item {{class "item"} {value ""}} { # Check that the class exists if {[namespace children [namespace current] ::*::$class] == ""} { error "Class $class doesn't exist" } # Get new item id variable id if {![info exists id]} { set id 0 } set item "[namespace current]::$class$id" incr id # Create object data upvar ${item}_priv t set t(value) $value # Create object proc proc $item {method args} "[namespace current]::CheckEval $class \$method $item \$args" return $item } # Destroy all items and initialize id counter proc initItem {} { variable id 0 foreach item [listItem] { # Don't use virtual del, because we know there is nothing else to do $item item::delete } } # Returns the list of all existing items proc listItem {} { # all procs in xml namespace ending with a number should be an item info commands "[namespace current]::*\[0-9]" } # Test the beeing of a method before its real evaluation # (called from item procs) # We should use the 'unknown' function instead to manage errors # and speed up valid method access proc CheckEval {class method item lst_args} { # Try method inside current class set cmd [namespace current]::${class}::$method if {[info commands $cmd] == ""} { # Try method from specified class set class2 [namespace qualifier $method] set cmd2 [namespace current]::$method if {[info commands $cmd2] != "" && [namespace children [namespace current] ::*::$class2] != "" } { set cmd $cmd2 } else { set lst "" foreach cmd2 [info commands [namespace qualifiers $cmd]::*] { lappend lst [namespace tail $cmd2] } error "$item error - method '$method' not in: [lsort $lst]" } } eval $cmd $item $lst_args } # Methods for item objects namespace eval item { namespace export * proc delete {myself} { # Delete object data catch {unset ${myself}_priv} # Delete object proc rename $myself {} } proc class {myself} { return [namespace tail [namespace current]] } proc setValue {myself value} { upvar ${myself}_priv t set t(value) $value } proc getValue {myself} { upvar ${myself}_priv t return $t(value) } } #----------------------------------------------------------------------- # Items structured as nodes of a tree # # Creation of a node object: # ::xml::node $class ?-in/-begin/-before/-after $item? # # Available methods for a node object $o: # $o delete ?-recursive? # $o deltree # $o class # $o getFather # $o getChilds ?$class? ?$value? ?-recursive? # $o getBrother ?$class? ?$value? ?+1/-1? # $o link -in/-begin/-before/-after $item # $o unlink # $o unlinkChilds # $o setChilds $list # $o addChilds $list ?$pos? # # Methods inherited from item object: # $o setValue # $o getValue # # List of all orphans nodes (i.e., with no father) # ::xml::orphanNodes # Create a new node; can be linked relative to another node. proc node {{class "node"} {position ""} {node ""}} { # Create empty item set item [item $class] upvar ${item}_priv t set t(childs) {} set t(father) {} # Insert in tree structure if {$position != "" && $node != ""} { if {[catch { node::link $item $position $node } err]} { # In case of error in linking, destroy object before leaving node::delete $item return -code error $err } } return $item } # Check consistency of links (but doesn't check for cycles) # Returns orphan (i.e. root) nodes proc orphanNodes {} { set orphans {} # All items (commands ending with a number) foreach item [listItem] { upvar ${item}_priv t # Select only node items or derivatives if {[info exists t(father)]} { if {$t(father) == {}} { lappend orphans $item } else { # Verify father still exists if {[info command $t(father)] == ""} { error "Item $item lost father $t(father)" } # Verify item is declared in the childs of its father upvar $t(father)_priv u if {[lsearch -exact $u(childs) $item] < 0} { error "Item $t(father) lost child $item" } } } } return $orphans } # Definition of node methods namespace eval node { namespace export * set xml [namespace parent] namespace import ${xml}::item::setValue namespace import ${xml}::item::getValue proc delete {myself {mode ""}} { upvar ${myself}_priv t set childs [$myself node::getChilds] # Suppress from tree structure unlink $myself unlinkChilds $myself # Optionnal recursive delete if {$mode == "-recursive"} { foreach child $childs { catch { $child delete $mode } } } # Delete item [namespace parent]::item::delete $myself } proc deltree {myself} { $myself delete -recursive } proc class {{myself ""}} { return [namespace tail [namespace current]] } proc getFather {myself} { upvar ${myself}_priv t return $t(father) } proc getChilds {myself {class ""} {value "*"} {mode ""}} { upvar ${myself}_priv t set childs $t(childs) # Trivial case: all direct childs if {$class=="" && $value=="*" && $mode==""} { return $childs } # Recursive case and/or selection upon class/value lock $myself -on set list {} foreach child $childs { # Selection upon class and value if {($class=="" || [$child class] == $class) && ($value=="*" || [string match $value [getValue $child]])} { lappend list $child } # Recursive search mode ( if {$mode == "-recursive"} { eval lappend list [getChilds $child $class $value $mode] } } lock $myself -off return $list } proc getBrother {myself {class "*"} {value "*"} {dir +1}} { set fath [$myself getFather] if {$fath == ""} { error "$myself has no father" } set bros [$fath getChilds] set pos [expr [lsearch -exact $bros $myself] + $dir] set tag [lindex $bros $pos] while {$tag != "" && (($class != "*" && ![string match $class [$tag class]]) ||($value != "*" && ![string match $value [getValue $tag]]))} { set tag [lindex $bros [incr pos $dir]] } return $tag } # Locking mechanism to prevent cycles: lock $item ?-on/-off/-reset? proc lock {item {mode "-on"}} { variable lock switch -exact -- $mode { "-on" { if [info exists lock($item)] { unset lock error "Circular tree for item $item" } set lock($item) 1 } "-off" { unset lock($item) } "-reset" { catch {unset lock} } } } proc unlink {myself} { upvar ${myself}_priv t if {$t(father) != ""} { upvar $t(father)_priv u set pos [lsearch -exact $u(childs) $myself] set u(childs) [lreplace $u(childs) $pos $pos] set t(father) "" } } proc unlinkChilds {myself} { upvar ${myself}_priv t foreach child $t(childs) { upvar ${child}_priv u set u(father) "" } set t(childs) "" } proc link {myself mode item} { # Get father and insert pos switch -exact -- $mode { "-begin" { set father $item set pos 0 } "-in" { set father $item set pos "end" } "-after" - "-before" { set father [$item getFather] upvar ${father}_priv u set pos [expr [lsearch -exact $u(childs) $item]] if {$mode == "-after"} { incr pos } } default { error "linking mode '$mode' unknown" } } $father addChilds $myself $pos } # Add new childs at requested position inside node # (the only one proc which really adds childs to a node) proc addChilds {myself childs {pos "end"}} { upvar ${myself}_priv t foreach child $childs { # Unlink from previous father and link to new one unlink $child upvar ${child}_priv u set u(father) $myself if {$pos != "end"} { set t(childs) [linsert $t(childs) $pos $child] incr pos } else { lappend t(childs) $child } } } proc setChilds {myself childs} { # Unlink previous childs unlinkChilds $myself # Add new childs $myself addChilds $childs } # Dump recursively the element and its content proc dump {myself {varName ""}} { if {$varName != ""} { upvar 3 $varName var } set sep "\n" append var [getValue $myself] foreach child [getChilds $myself] { append var $sep $child dump var } return $var } } #----------------------------------------------------------------------- # XML elements # # Creation of an element object: # ::xml::element $type ?{attribute value ...}? \ # ?-in/-begin/-before/-after $item? # # Available methods for an element object $o: # $o class # $o setType # $o getType # $o listAttr # $o setAttr attribute value # $o getAttr attribute # $o dumptag ?-start/-end/-empty? ?var? # $o dump ?var? # $o getElementChilds # $o getDataChilds # # Methods inherited from node object: # $o delete ?-recursive? # $o deltree # $o getFather # $o getChilds ?$class? ?$value? ?-recursive? # $o setChilds $list # $o addChilds $list ?$pos? # proc element {type {attr_pairs {}} {position ""} {node ""}} { set xml [namespace current] set item [node "element"] if {[catch { $item setType $type # Link after setting the type, so we can check validity of types if {$position != "" && $node != ""} { node::link $item $position $node } # Clear attributes upvar ${item}_priv t set t(attr-list) "" set t(valid-elem) 0 set t(valid-attr) 0 foreach {attr value} $attr_pairs { # Well-formedness: attribute can only be defined once if {[$item setAttr $attr $value] != ""} { error "Non unique attribute specification for '$attr'" } } } err]} { global errorInfo $item delete return -code error $err } return $item } namespace eval element { variable validate 0 variable xml [namespace parent] namespace import ${xml}::node::deltree namespace import ${xml}::node::setChilds namespace import ${xml}::node::getChilds namespace import ${xml}::node::getFather namespace import ${xml}::node::getBrother proc delete {myself {mode ""}} { variable xml # Suppress from id structure if {[${xml}::dtd::active]} { ${xml}::dtd::id::suppress $myself } # Delete node [namespace parent]::node::delete $myself $mode } proc class {myself} { return "element" } proc setType {myself value} { upvar ${myself}_priv t variable xml # Keep well-formedness ${xml}::dtd::check Name $value # Keep validity if {[${xml}::dtd::active]} { # Can't change existing type (or we should re-check everything) if {$t(value) != ""} { error "Sorry, can not change type of already declared element" } ${xml}::dtd::element::exists $value } # Then set the new type set t(value) $value } proc getType {myself} { upvar ${myself}_priv t return $t(value) } # Return list of all defined attributes # At user request, returns the list of all possible attributes proc listAttr {item {mode ""}} { upvar ${item}_priv t variable xml # List of defined attributes set type $t(value) set list $t(attr-list) if {[${xml}::dtd::active]} { switch -- $mode { "-all" { # Defined attributes and with default value foreach name [${xml}::dtd::attribute::defaultList $type] { if {[lsearch -exact $list $name] < 0} { lappend list $name } } } "-default" { # Attributes with default value set list [${xml}::dtd::attribute::defaultList $type] } "-declared" { # Declared attributes set list [${xml}::dtd::attribute::declared $type] } } } elseif {$mode != ""} { error "No active DTD" } return $list } # Set new value for the attribute of the element and return previous one # Check if the attribute is defined and the value is valid proc setAttr {item attr value} { upvar ${item}_priv t variable xml # Verify well-formedness of attribute name ${xml}::dtd::check Name $attr # Verify validity of attribute and value if {[${xml}::dtd::active]} { # For implied tokenized or enumerated types, empty value # imply 'unsetAttr $attr' instead of 'setAttr $attr ""' if {$value == "" && [${xml}::dtd::attribute::implied_nonull $t(value) $attr]} { unsetAttr $item $attr return } ${xml}::dtd::attribute::authorized $t(value) $item $attr $value } # Then set new value if [catch {set t(attr,$attr)} oldval] { set oldval {} lappend t(attr-list) $attr } set t(attr,$attr) $value return $oldval } # Unset a (potentially existing) attribute # no error if attribute doesn't exist or even is not defined in DTD proc unsetAttr {item attr} { upvar ${item}_priv t variable xml catch {unset t(attr,$attr)} lsuppress t(attr-list) $attr # Suppress from id structure if {[${xml}::dtd::active]} { ${xml}::dtd::id::suppress $item $attr } } # Return value of given attribute of a tag # (or else default value if it is declared in DTD) proc getAttr {item attr} { upvar ${item}_priv t variable xml if {[catch { set val $t(attr,$attr) }]} { if {[${xml}::dtd::active]} { # no error for undefined implied types: returns empty string set val [${xml}::dtd::attribute::default [$item getType] $attr 1] } else { error "$item: attribute $attr not defined" } } return $val } # The method addChilds is superseded by a new method # checking the validity of children types (but not their order) proc addChilds {myself childs {pos "end"}} { upvar ${myself}_priv t variable xml if {[${xml}::dtd::active]} { set type [$myself getType] foreach child $childs { ${xml}::dtd::element::authorized $type [$child getType] } set t(valid-elem) 0 } ${xml}::node::addChilds $myself $childs $pos } # Return element childs of given type proc getElementChilds {myself {type "*"}} { getChilds $myself "element" $type -recursive } # Return data childs proc getDataChilds {myself} { getChilds $myself "data" "*" -recursive } # Return tag with element type and attributes formated upon $mode : # -start : " # -end : " # -empty : " proc dumpTag {myself {mode "-start"} {varName ""}} { if {$varName != ""} { upvar 3 $varName var } append var "<" if {$mode == "-end"} { append var "/[getType $myself]" } else { append var [getType $myself] foreach attr [listAttr $myself] { set val [getAttr $myself $attr] # Dump as entities some special chars regsub -all "&" $val {\&} val regsub -all "<" $val {\<} val regsub -all \" $val {\"} val append var " $attr=\"$val\"" } if {$mode == "-empty"} { append var "/" } } append var ">" return $var } # Dump recursively the element and its content # Elements are separated with "\n" (should probably be handled with DTD) proc dump {myself {varName ""}} { if {$varName != ""} { upvar 3 $varName var } set sep "\n" set childs [getChilds $myself] if {[llength $childs] > 0} { $myself dumpTag -start var append var $sep foreach child $childs { $child dump var append var $sep } $myself dumpTag -end var } else { $myself dumpTag -empty var } return $var } # Validation of XML elements according to DTD proc validate {myself} { variable xml # Do only necessary part of validation #${xml}::dtd::attribute::validate $myself #${xml}::dtd::element::validate $myself valid-attr $myself valid-elem $myself foreach child [getChilds $myself "element"] { validate $child } } # Do xml::dtd::attribute::required only once proc valid-attr {myself} { upvar ${myself}_priv t variable xml if {[${xml}::dtd::active] && !$t(valid-attr)} { ${xml}::dtd::attribute::required $myself set t(valid-attr) 1 } } # Do xml::dtd::element::rightOrder only once proc valid-elem {myself} { upvar ${myself}_priv t variable xml if {[${xml}::dtd::active] && !$t(valid-elem)} { ${xml}::dtd::element::rightOrder $myself set t(valid-elem) 1 } } } #----------------------------------------------------------------------- # XML data item # # Creation of a data object: # ::xml::data $value ?-in/-begin/-before/-after $item? # # Available methods for a data object $o: # $o class # $o dump ?var? # $o setData # $o getData # # Methods inherited from node object: # $o delete ?-recursive? # $o getFather # proc data {{value {}} {mode {}} {relative {}}} { set item [node "data" $mode $relative] $item setData $value return $item } namespace eval data { set xml [namespace parent] namespace import ${xml}::node::delete namespace import ${xml}::node::getFather namespace import ${xml}::node::getBrother namespace import ${xml}::item::setValue namespace import ${xml}::item::getValue rename setValue setData rename getValue getData proc class {myself} { return "data" } proc getType {{myself ""}} { return "\#PCDATA" } proc dump {myself {varName ""}} { if {$varName != ""} { upvar 3 $varName var } set val [$myself getData] # Dump as entities some special chars regsub -all "&" $val {\&} val regsub -all "<" $val {\<} val regsub -all ">" $val {\>} val append var $val } } #----------------------------------------------------------------------- # XML comment # # Creation of a comment object: # ::xml::comment $value ?-in/-begin/-before/-after $item? # # Available methods for a comment object $o: # $o class # $o dump ?var? # $o setComment # $o getComment # # Methods inherited from node object: # $o delete ?-recursive? # $o getFather # proc comment {{value {}} {mode {}} {relative {}}} { set item [node "comment" $mode $relative] if {[catch { $item setComment $value } err]} { $item delete return -code error $err } return $item } namespace eval comment { set xml [namespace parent] namespace import ${xml}::node::delete namespace import ${xml}::node::getFather namespace import ${xml}::node::getBrother proc class {myself} { return "comment" } proc setComment {myself value} { upvar ${myself}_priv t if {[regexp -- "--" $value]} { error "Comment can not contain '--' sequence" } set t(value) $value } proc getComment {myself} { upvar ${myself}_priv t return $t(value) } proc dump {myself {varName ""}} { if {$varName != ""} { upvar 3 $varName var } append var "" } } #----------------------------------------------------------------------- # XML processing instruction # # Creation of a processing instruction object: # ::xml::pi $target ?$value? ?-in/-begin/-before/-after $item? # # Available methods for a pi object $o: # $o class # $o dump ?var? # $o setPI $target $value # $o getPI # # Methods inherited from node object: # $o delete ?-recursive? # $o getFather # proc pi {target {value {}} {mode {}} {relative {}}} { set item [node "pi" $mode $relative] if {[catch { $item setPI $target $value } err]} { $item delete return -code error $err } return $item } namespace eval pi { variable xml [namespace parent] namespace import ${xml}::node::delete namespace import ${xml}::node::getFather namespace import ${xml}::node::getBrother proc class {myself} { return "pi" } proc setPI {myself target pi} { upvar ${myself}_priv t variable xml ${xml}::dtd::check Name $target if {[string tolower $target] == "xml"} { error "Processing instruction target '$target' reserved" } if {[regexp "\\?>" $pi]} { error "Processing instruction can not contain '?>' sequence" } set t(value) $target set t(pi) $pi } proc getPI {myself} { upvar ${myself}_priv t return [list $t(value) $t(pi)] } proc dump {myself {varName ""}} { if {$varName != ""} { upvar 3 $varName var } append var "" } } #----------------------------------------------------------------------- # XML cdata # # Creation of a cdata object: # ::xml::cdata ?$value? ?-in/-begin/-before/-after $item? # # Available methods for a cdata object $o: # $o class # $o dump ?var? # $o setCData $value # $o getCData # # Methods inherited from node object: # $o delete ?-recursive? # $o getFather # proc cdata {{value {}} {mode {}} {relative {}}} { set item [node "cdata" $mode $relative] if {[catch { $item setCData $value } err]} { $item delete return -code error $err } return $item } namespace eval cdata { variable xml [namespace parent] namespace import ${xml}::node::delete namespace import ${xml}::node::getFather namespace import ${xml}::node::getBrother proc class {myself} { return "cdata" } proc setCData {myself value} { upvar ${myself}_priv t if {[regexp "]]>" $value]} { error "CDATA can not contain ']]>' sequence" } set t(value) $value } proc getCData {myself} { upvar ${myself}_priv t return $t(value) } proc dump {myself {varName ""}} { if {$varName != ""} { upvar 3 $varName var } append var "" } } } transcriber-1.5.1.1/tcl/Segmt.tcl0000444000175000017500000007025607723143153014411 0ustar rtrt# RCS: @(#) $Id: Segmt.tcl,v 1.7 2003/08/27 14:55:39 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ################################################################ proc CreateSegmentWidget {wavfm seg name args} { global v set f [winfo parent $wavfm].$seg if ![winfo exists $f] { eval {segmt $f -seg v(trans,$seg) -bd 1 -padx 1m -pady 1 -font trans -bg $v(color,bg) -time ::Synchro::time} $args setdef v(view,$f) 1 if {$v(view,$f)} { #pack $f -fill x -padx 10 -after $wavfm pack $f -fill x -padx 10 -before [winfo parent $wavfm].a } # Segment selection with B1 bind $f [list SegmentSelect $wavfm $seg 0 %X %y] bind $f [list SegmentSelect $wavfm $seg 1 %X %y] bind $f [list EndSegmentSelect $seg %X %y] bind $f [list SegmentSelect $wavfm $seg 1 %X %y] # Segment boundary move with B2 or Control-B1; forced move with Shift- foreach F {0 1} S {"" "Shift-"} { bind $f <${S}Button-2> [list SegmentMove $wavfm $seg 0 %X %y $F] bind $f <${S}B2-Motion> [list SegmentMove $wavfm $seg 1 %X %y $F] bind $f <${S}ButtonRelease-2> [list EndSegmentMove $seg] bind $f <${S}Control-Button-1> [list SegmentMove $wavfm $seg 0 %X %y $F] bind $f <${S}Control-B1-Motion> [list SegmentMove $wavfm $seg 1 %X %y $F] bind $f <${S}Control-ButtonRelease-1> [list EndSegmentMove $seg] } # Contextual menu with B3 bind $f [list tk_popup $v($wavfm,menu) %X %Y] set menu [$v($wavfm,menu) entrycget [Local "Display"] -menu] add_menu $menu [subst { {"$name" check v(view,$f) -command {SwitchSegmtView $wavfm}} }] lappend v($wavfm,seglist) $f lappend v($wavfm,sync) $f SynchroWidgets $wavfm } } proc SwitchSegmtView {wavfm} { global v foreach f $v($wavfm,seglist) { if {$v(view,$f)} { #pack $f -fill x -padx 10 -after $wavfm pack $f -fill x -padx 10 -before [winfo parent $wavfm].a } else { pack forget $f } } } proc UpdateSegmtView {{mode initial}} { global v if {$v(hideLevels)} { foreach lvl {seg1 seg2 bg} { foreach s [array names v view,*.$lvl] { if {[llength $v(list,$lvl)] > 1} { if {$mode == "initial" || [llength $v(list,$lvl)] == 2} { set v($s) 1 } } elseif {$mode == "initial"} { set v($s) 0 } } } catch { foreach w $v(wavfm,list) { SwitchSegmtView $w } } } } proc CreateAllSegmentWidgets {} { global v foreach wavfm $v(wavfm,list) { CreateSegmentWidget $wavfm bg "Background" -fg $v(color,fg-back) -full $v(color,bg-back) -empty $v(color,bg) CreateSegmentWidget $wavfm seg2 "Sections" -fg $v(color,fg-sect) -full $v(color,bg-sect) CreateSegmentWidget $wavfm seg1 "Turns" -fg $v(color,fg-turn) -full $v(color,bg-turn) -tiny {fixed 8} CreateSegmentWidget $wavfm seg0 "Transcription" -fg $v(color,fg-sync) -full $v(color,bg-sync) -height 2 -high $v(color,hi-sync) } } proc DestroySegmentWidgets {} { global v foreach wavfm $v(wavfm,list) { foreach f $v($wavfm,sync) { if {[winfo class $f] == "Segmt"} { destroy $f lsuppress v($wavfm,sync) $f } } } } proc DestroyLabels {} { global v # destroy label segment widgets and associated list foreach seg0 [array names v trans,lbl*] { set seg [lindex [split $seg0 ,] 1] foreach wavfm $v(wavfm,list) { set f [winfo parent $wavfm].$seg if [winfo exists $f] { destroy $f lsuppress v($wavfm,sync) $f lsuppress v($wavfm,seglist) $f catch {unset v(view,$f)} } } unset v(trans,$seg) } set v(labelNames) {} # destroy menu entries foreach wavfm $v(wavfm,list) { catch { set menu [$v($wavfm,menu) entrycget [Local "Display"] -menu] set index [$menu index [Local "Transcription"]] $menu delete [incr index] end } } } ################################################################ # Empty segmentations proc InitSegmt {args} { global v foreach segmt $args { set v(trans,$segmt) {} set v(list,$segmt) {} } } proc AddSegmt {segmt begid endid txt id} { global v set beg [Synchro::GetTime $begid] set end [Synchro::GetTime $endid] if {$end <= $beg} { error "Size of segment \[$beg $end] must be positive" } lappend v(trans,$segmt) [list $begid $endid $txt "" $id] lappend v(list,$segmt) $id } # Replace old segment field by new value # After that, the whole list is automatically reparsed by the segment widgets # (this could be optimized to reparse only the modified segment) proc SetSegmtField {segmt nb field value} { global v if {$nb < 0 || $nb>=[llength $v(trans,$segmt)]} return set seg [lindex $v(trans,$segmt) $nb] set seg [lrange [concat $seg {{} {} {} {} {}}] 0 4] set list "-begin -end -text -color" set index [lsearch -exact $list $field] set seg [lreplace $seg $index $index $value] set v(trans,$segmt) [lreplace $v(trans,$segmt) $nb $nb $seg] } proc GetSegmtField {segmt nb field} { global v if {$nb < 0 || $nb>=[llength $v(trans,$segmt)]} return set seg [lindex $v(trans,$segmt) $nb] switch -- $field { -beginId { return [lindex $seg 0] } -endId { return [lindex $seg 1] } -begin { return [Synchro::GetTime [lindex $seg 0]] } -end { return [Synchro::GetTime [lindex $seg 1]] } -text { return [lindex $seg 2] } -color { return [lindex $seg 3] } } } proc GetSegmtNb {segmt} { global v if ![info exists v(trans,$segmt)] { return -1 } return [llength $v(trans,$segmt)] } proc SearchSegmtId {segmt tag} { global v return [lsearch -exact $v(list,$segmt) $tag] } proc GetSegmtId {nb {segmt "seg0"}} { global v return [lindex $v(list,$segmt) $nb] } # Called from : JoinTransTags (<-DeleteSegment, ChangeSegType); DeleteSegment proc JoinSegmt {segmt nb1 {mode ""} {txt ""}} { global v set nb2 [expr $nb1+1] if {$nb1 < 0 || $nb2>=[llength $v(trans,$segmt)]} return set seg1 [lindex $v(trans,$segmt) $nb1] set seg2 [lindex $v(trans,$segmt) $nb2] if {$mode == "-first"} { set txt [lindex $seg1 2] } elseif {$mode == "-last"} { set txt [lindex $seg2 2] } elseif {$mode == "-join"} { set txt [concat [lindex $seg1 2] [lindex $seg2 2]] } set seg [list [lindex $seg1 0] [lindex $seg2 1] $txt] if {$segmt == "seg1" && $v(colorizeSpk)} { lappend seg [ColorMap $txt] } set v(trans,$segmt) [lreplace $v(trans,$segmt) $nb1 $nb2 $seg] set v(list,$segmt) [lreplace $v(list,$segmt) $nb2 $nb2] } # Called by: SplitTransTags (<- ChangeSegType), InsertSegment proc SplitSegmt {segmt nb pos txt1 txt2 id} { global v if {$nb < 0 || $nb>=[llength $v(trans,$segmt)]} return set seg [lindex $v(trans,$segmt) $nb] if {$txt1 == "-keep"} { set txt1 [lindex $seg 2] } if {$txt2 == "-keep"} { set txt2 [lindex $seg 2] } set seg1 [list [lindex $seg 0] $pos $txt1] set seg2 [list $pos [lindex $seg 1] $txt2] if {$segmt == "seg1" && $v(colorizeSpk)} { lappend seg1 [ColorMap $txt1] lappend seg2 [ColorMap $txt2] } set v(trans,$segmt) [lreplace $v(trans,$segmt) $nb $nb $seg1 $seg2] set v(list,$segmt) [linsert $v(list,$segmt) [expr $nb+1] $id] } proc CountWordSegmt {segmt} { set w 0 set c 0 for {set i 0} {$i < [GetSegmtNb $segmt]} {incr i} { set txt [string trim [GetSegmtField $segmt $i -text]] if {$txt != ""} { incr w [expr [regsub -all { +} $txt {} ignore]+1] incr c [string length $txt] } } return $w } ################################################################ # Events bindings for selection of segments # If segment exists at time $pos, returns segment nb and set begin/end values # else returns -1 and begin/end values are set to $pos proc GetSegmentFromPos {seg pos {beginName ""} {endName ""} {overName ""}} { global v if {$beginName != ""} { upvar $beginName begin } if {$endName != ""} { upvar $endName end } if {$overName != ""} { upvar $overName ov } # Dichotomic search for efficiency... set min 0 set max [expr [GetSegmtNb $seg]-1] while {$max >= $min} { set i [expr ($max+$min)/2] set begin [GetSegmtField $seg $i -begin] set end [GetSegmtField $seg $i -end] if {$pos >= $end} { set min [expr $i+1] continue } if {$pos < $begin} { set max [expr $i-1] continue } # Verify overlap set ov 0 # set ov [Overlapping $i $seg $pos] # if {$ov >= 0} { # if {$ov != $i} { # set begin [GetSegmtField $seg $ov -begin] # set end [GetSegmtField $seg $ov -end] # } # set i $ov # set ov 1 # } else { # set ov 0 # } return $i } set begin $pos set end $pos set ov 0 return -1 } proc GetPosAfterScroll {wavfm X} { global v set pos [GetClickPos $wavfm $X scroll] if {$scroll != 0} { ScrollTime $wavfm scroll $scroll units # Tempo for smooth scrolling after 50 # Get new position after scroll set pos [GetClickPos $wavfm $X scroll] } return $pos } proc SegmentSelect {wavfm segmt extend X y} { global v set pos [GetPosAfterScroll $wavfm $X] set nb [GetSegmentFromPos $segmt $pos beg end ov] if {$nb < 0} return if {$ov == 1} { set f [winfo parent $wavfm].$segmt set nb [expr $nb + ($y > [winfo height $f]/2)] set beg [GetSegmtField $segmt $nb -begin] set end [GetSegmtField $segmt $nb -end] if {!$extend} { if {$segmt == "seg0"} { SetCurrentSegment $nb } elseif {$segmt == "seg1"} { } } } PauseAudio set newbeg $beg set newend $end set mode "BEGIN" if {$extend && [GetSelection oldbeg oldend]} { if {($oldbeg < $beg) && ($oldend > $end)} { if {$oldend-$beg < $end-$oldbeg} { set newbeg $oldbeg set mode "END" } else { set newend $oldend } } elseif {$oldbeg < $beg} { set newbeg $oldbeg set mode "END" } elseif {$oldend > $end} { set newend $oldend } # else # SetCurrentSegment $nb } ViewSelection $beg $end SetSelection $newbeg $newend ViewSelection $beg $end $mode } proc EndSegmentSelect {segmt X y} { global v if {$v(play,auto)} { PlayFromBegin } } ################################################################ # Events bindings for modification of segment boundaries proc SegmentMove {wavfm segmt extend X y {force 0}} { global v set reso 0.001 set pos [GetPosAfterScroll $wavfm $X] set epsilon [expr 10.0*$v($wavfm,size)/[winfo width $wavfm]] if {$epsilon < $reso} {set epsilon $reso} if {!$extend} { # Be sure we start close enough from existing boundary (10 pixels) set nb [GetSegmentFromPos $segmt $pos beg end ov] if {$nb < 0} return if {$ov == 1} { set f [winfo parent $wavfm].$segmt set nb [expr $nb + ($y > [winfo height $f]/2)] set beg [GetSegmtField $segmt $nb -begin] set end [GetSegmtField $segmt $nb -end] } if {abs($pos-$beg) > $epsilon && abs($pos-$end) > $epsilon } return # Choose the right side of segment if {$pos-$beg < $end-$pos} { incr nb -1 } set v(moved_id) {} } else { if {![info exists v(segmt,move)]} return # Keep moving same boundary during mouse motion set nb $v(segmt,move) } set nb1 $nb set pos1 $pos set moves {} set id "" while {1} { # Be sure we are not the first or last segment if {$nb < 0 || [expr $nb+1] >= [GetSegmtNb $segmt]} return # Get boundaries if {$id == ""} { set id [GetSegmtField $segmt $nb -endId] } if [catch {expr double($id)}] { Synchro::GetBoundaries $id center left right leftIds rightIds if {$left == "" || $right == ""} return } else { set center $id set left [GetSegmtField $segmt $nb -begin] set right [GetSegmtField $segmt [expr $nb+1] -end] set id "" set rightIds [set leftIds {}] } lappend moves [list $nb $id $pos $center $left $right $leftIds $rightIds] #puts "$nb $id $left $center $right => $pos" # Keep minimal apparent size for both segments if {$pos < $center && $pos-$left < $epsilon} { if {!$force} return if {$id != ""} { set pos [expr $pos - $epsilon] set id $Synchro::value($left) continue } } elseif {$pos > $center && $right-$pos < $epsilon} { if {!$force} return if {$id != ""} { set pos [expr $pos + $epsilon] set id $Synchro::value($right) continue } } break } # Really do it if {!$extend} { PauseAudio set v(segmt,move) $nb1 # Register old position and floating state for undo if {$id != ""} { DoModif "MOVE $id $center [Synchro::getElastic $id]" } else { DoModif "MOVE" } } foreach move $moves { foreach {nb id pos center left right leftIds rightIds} $move break if {$id == ""} { SetSegmtField $segmt $nb -end $pos SetSegmtField $segmt [expr $nb+1] -begin $pos } else { Synchro::ModifyTime $id $pos Synchro::setElastic $id 0 Synchro::ModifyElastic $leftIds $center $pos $left Synchro::ModifyElastic $rightIds $center $pos $right # Keep the list of all moved boundary ids foreach i [concat $id $leftIds $rightIds] { if {[lsearch -exact $v(moved_id) $i] < 0} { lappend v(moved_id) $i } } } } SetSelection $pos1 $pos1 } proc EndSegmentMove {segmt} { global v catch { foreach id $v(moved_id) { Synchro::UpdateTimeTags $id } unset v(moved_id) unset v(segmt,move) } } ################################################################ # Highlight current transcription and segment and register his number # (called from : SynchroToText, SynchroToSignal, DeleteSegment, # InsertSegment, UpdateTextFrame) proc SetCurrentSegment {nb} { global v if {$nb < 0 || $nb >= [GetSegmtNb seg0] || [info exists v(demo)]} return set v(segmt,curr) $nb # Highlight current segment in text editor set t $v(tk,edit)-bis set bp [GetSegmtId $nb] foreach {first last} [$t tag nextrange "sync" "$bp.first"] {} $t tag remove "hilight" 1.0 end $t tag add "hilight" "$first" "$last+1c" # Highlight current segment under waveforms (level 0) foreach wavfm $v(wavfm,list) { set i [lsearch -glob $v($wavfm,seglist) "*seg0"] set s [lindex $v($wavfm,seglist) $i] catch {$s conf -current $nb} } # If necessary, set text cursor at end of transcription, and view around if {[$t compare insert <= "$first"] || [$t compare insert > "$last"]} { set t $v(tk,edit) catch { if {$v(preferedPos) == "begin"} { $t see "$last" tkTextSetCursor $t "$first linestart" } else { $t see "$first" tkTextSetCursor $t "$last lineend" } } } ViewAroundText # If necessary, set signal cursor at beginning of segment set beg [GetSegmtField seg0 $nb -begin] set end [GetSegmtField seg0 $nb -end] set pos [GetCursor] if {$pos<$beg || $pos>=$end} { # Select corresponding part of signal set play [IsPlaying] if {$play} {PauseAudio} SetSelection $beg $beg ViewSelection $beg $end "BEGIN" if {$play} {Play} } } # Synchronize text cursor position to signal cursor, if signal cursor # moved out of current segment (called from SetCursor) proc SynchroToSignal {pos} { global v if {[GetSegmtNb seg0]<=0} return # Did we move out of current segment ? if [info exists v(segmt,curr)] { set beg [GetSegmtField seg0 $v(segmt,curr) -begin] set end [GetSegmtField seg0 $v(segmt,curr) -end] if {$pos>=$beg && $pos<$end} return } # Get new current segment set nb [GetSegmentFromPos seg0 $pos {} {} ov] if {$nb < 0} return # For demo purposes only if {[info exists v(demo)]} { set txt [GetSegmtField seg0 $nb -text] .demo.txt insert insert "$txt " .demo.txt see insert set v(segmt,curr) $nb return } SetCurrentSegment [expr $nb+$ov] } # Synchronize signal cursor to text cursor position, if we moved out of # current transcription # (called from text widget after "mark set insert") proc SynchroToText {bp} { global v # Really change of segment ? if {[info exists v(segmt,curr)] && ($bp == [GetSegmtId $v(segmt,curr)])} { return } # Get real nb of segment set nb [SearchSegmtId seg0 $bp] if {$nb < 0} return SetCurrentSegment $nb } # Goto next/previous segment depending on $dir # (or begin of signal) proc MoveNextSegmt {dir} { global v set play [IsPlaying] if {[GetSegmtNb seg0] <= 0} { if {$dir < 0} { set pos $v(sig,min) SetSelection $pos $pos #ViewSelection $pos $pos } } elseif {[info exists v(segmt,curr)]} { set nb $v(segmt,curr) set beg [GetSegmtField seg0 $v(segmt,curr) -begin] set end [GetSegmtField seg0 $v(segmt,curr) -end] set pos [GetCursor] if {$dir == -1 && (($pos-$beg>0.6 && $play) ||($pos>$beg && !$play) || $nb==0)} { SetCursor $beg } else { if {$play} {PauseAudio} SetCurrentSegment [expr $v(segmt,curr)+$dir] } } if {$play} {Play} } ################################################################ # Join transcription tag with previous one, updating XML transcription # editor display and segmentation widgets. # Allows: # - Turn->Sync or Section->Sync (level=1 / tag=turn) # - Section->Turn (level=2 / tag=section) # Called by: DeleteSegment, ChangeSegType, and itself. proc JoinTransTags {level tag2} { global v # Verify we are not the first segment set segmt "seg$level" set nb2 [SearchSegmtId $segmt $tag2] set nb1 [expr $nb2-1] if {$nb1 < 0} return set tag1 [GetSegmtId $nb1 $segmt] # Verify if propagate to upper level set fath1 [$tag1 getFather] set fath2 [$tag2 getFather] if {$fath1 != $fath2} { set answer [tk_messageBox -message [Local "You will also destroy the current section. Continue?"] -type okcancel -icon question] if {$answer != "ok"} { return -code error cancel } } # Propagate new overlapping state if {$level == 1} { if {[OverlappingTurn $tag1]} { if {![OverlappingTurn $tag2]} { DoWho $tag2 } } else { if {[OverlappingTurn $tag2]} { NoWho $tag2 } } } # Join two segments in segmentation set timeOld [GetSegmtField $segmt $nb1 -endId] JoinSegmt $segmt $nb1 -first set time [GetSegmtField $segmt $nb1 -endId] # Suppress turn or section button in editor set t $v(tk,edit)-bis $t delete "$tag2.first" "$tag2.last" $t tag delete $tag2 # Update ML transcription and keep time synchro if {$fath1 != $fath2} { JoinTransTags [expr $level+1] $fath2 } $tag1 addChilds [$tag2 getChilds] $tag1 setAttr "endTime" [$tag2 getAttr "endTime"] Synchro::TagToForget $tag1 "endTime" $timeOld Synchro::TagToForget $tag2 "startTime" $timeOld Synchro::TagToForget $tag2 "endTime" $time Synchro::TagToUpdate $tag1 "endTime" $time $tag2 delete #DoModif "JOIN" } ################################################################ # Split transcription tag, updating XML transcription # editor display and segmentation widgets. # Called by: ChangeSegType proc SplitTransTags {level child vals} { global v # Level-dependent settings set atts "" if {$level == 1} { set insertButton InsertTurnButton set type "Turn" set atts "" set speaker [lindex $vals 0] if {$speaker != ""} { lappend atts "speaker" $speaker } set mode [lindex $vals 1] if {$mode != ""} { lappend atts "mode" $mode } set fidelity [lindex $vals 2] if {$fidelity != ""} { lappend atts "fidelity" $fidelity } set channel [lindex $vals 3] if {$channel != ""} { lappend atts "channel" $channel } set name [::speaker::name $speaker] } else { set insertButton InsertSectionButton set type "Section" set sectype [lindex $vals 0] set topic [lindex $vals 1] set atts "type $sectype" if {$topic != ""} { lappend atts "topic" $topic set name [::topic::get_atts $topic] } else { set name $sectype } } # Get child position set segmt "seg[expr $level-1]" set nb [SearchSegmtId $segmt $child] set time [GetSegmtField $segmt $nb -beginId] # Get tag position set segmt "seg$level" set tag1 [$child getFather] set nb1 [SearchSegmtId $segmt $tag1] if {$nb1 < 0} return if {$time == [GetSegmtField $segmt $nb1 -beginId]} { return $tag1 } set timeEnd [GetSegmtField $segmt $nb1 -endId] # Update transcription set tag2 [::xml::element $type "$atts startTime [Synchro::GetTime $time] endTime [$tag1 getAttr endTime]" -after $tag1] $tag1 setAttr "endTime" [Synchro::GetTime $time] Synchro::TagToForget $tag1 "endTime" $timeEnd Synchro::TagToUpdate $tag1 "endTime" $time Synchro::TagToUpdate $tag2 "startTime" $time Synchro::TagToUpdate $tag2 "endTime" $timeEnd set childs [$tag1 getChilds] set pos [lsearch $childs $child] $tag1 setChilds [lrange $childs 0 [expr $pos-1]] $tag2 setChilds [lrange $childs $pos end] # Split segmentation at child begin position SplitSegmt $segmt $nb1 $time -keep $name $tag2 # Insert turn or section button in editor set t $v(tk,edit)-bis $t mark set "memo" insert $t mark set insert "$child.first" $insertButton $tag2 $t mark set insert "memo" # Update overlapping state if {$level == 1} { if {[OverlappingTurn $tag1]} { if {[llength $speaker] <= 1} { NoWho $tag2 } } else { if {[llength $speaker] > 1} { DoWho $tag2 } } } #DoModif "SPLIT" return $tag2 } ################################################################ # Split data field at requested position in two contiguous area # before inserting some locked field (icon, etc.) - the last char # of which should be tagged with the data id returned by this proc. proc SplitData {{pos "insert"}} { global v set t $v(tk,edit)-bis set data1 [GetDataFromPos $pos] if {$data1 == ""} return set text1 [$t get "$data1.first+1c" $pos] set text2 [$t get $pos "$data1.last"] $data1 setData $text1 set data2 [::xml::data $text2 -after $data1] $t tag add "$data2" "$pos" "$data1.last" $t tag remove "$data1" "$pos" "$data1.last" return $data2 } proc JoinData {tag} { global v set t $v(tk,edit)-bis # Tags for data set data1 [GetDataFromPos "$tag.first"] set data2 [GetDataFromPos "$tag.last"] # Join contiguous data if possible if {$data1 != "" && $data2 != ""} { # Tag data2 as data1 and destroy data2 if {[$t tag ranges $data2] != ""} { $t tag add $data1 "$data1.last" "$data2.last" } $t tag delete $data2 $data2 delete } elseif {$data2 != ""} { # Expand data2 $t tag add $data2 "$tag.first-1c" } # Suppress object tag in editor and transcription $t delete "$tag.first" "$tag.last" $t tag delete $tag # ...and in transcription $tag delete # Update data1 if {$data1 != ""} { $data1 setData [$t get "$data1.first+1c" "$data1.last"] } } ################################################################ proc InsertSegment {} { global v if {![info exist v(segmt,curr)]} return set nb $v(segmt,curr) set beg [GetSegmtField seg0 $nb -begin] set end [GetSegmtField seg0 $nb -end] set pos [GetCursor] if {$pos - $beg < 0.001 || $end - $pos < 0.001} { tk_messageBox -message "New segment boundary must be at least 1ms from existing boundaries" -type ok -icon error return } # Verify that sync and background are in right order set t $v(tk,edit)-bis set nbg [GetSegmentFromPos bg $pos] set back0 [GetSegmtId $nbg bg] set back1 [GetSegmtId [expr $nbg+1] bg] if {($back0 != "" && [$t compare $back0.last > insert]) || ($back1 != "" && [$t compare $back1.first < insert])} { tk_messageBox -message "Please check background position inside segment before" -type ok -icon error return } # Simplified insertion on overlapping segments: don't split text set over [Overlapping $nb] if {$over} { set bp [GetSegmtId $nb] set last [lindex [$t tag nextrange "sync" "$bp.first"] 1] $v(tk,edit) mark set insert "$last" } # Update transcription and editor SpaceMagic set data2 [SplitData "insert"] set id2 [::xml::element Sync {} -before $data2] set pos [Synchro::NewTimeTag $id2 "time" $pos] InsertSyncButton $id2 $v(tk,edit)-bis tag add "$data2" "insert-1c" if {$over} { CreateWho $id2 } # Update segmentation set id1 [GetSegmtId $v(segmt,curr)] SplitSegmt seg0 $nb $pos [TextFromSync $id1] [TextFromSync $id2] $id2 DoModif "INSERT" # let cursor move further inside segment if playback in course update SetCurrentSegment [incr nb] tkTextSetCursor $v(tk,edit) "insert linestart" } ################################################################ proc DeleteSegment {{nb2 ""}} { global v if {$nb2 == ""} { if {![info exist v(segmt,curr)]} return set nb2 $v(segmt,curr) } if {$nb2 <1} { tk_messageBox -message "Can not destroy first segment" \ -type ok -icon error return } set nb1 [expr $nb2-1] set beg [GetSegmtField seg0 $nb1 -begin] set mid [GetSegmtField seg0 $nb1 -endId] set end [GetSegmtField seg0 $nb2 -end] if {$end <= $beg} { error "Problem with segment boundaries" } set bp1 [GetSegmtId $nb1] set bp2 [GetSegmtId $nb2] # Suppress section and turn boundaries if necessary set turn1 [$bp1 getFather] set turn2 [$bp2 getFather] if {$turn1 != $turn2} { JoinTransTags 1 $turn2 } # Deletion between overlapping segments if {[Overlapping $nb2]} { set wh0 [$bp2 getBrother "element" "Who" -1] set wh1 [$bp2 getBrother "element" "Who"] set wh2 [$wh1 getBrother "element" "Who"] set t $v(tk,edit)-bis $t mark set "insert" "$wh0.first" for {set tag [$wh1 getBrother]} {$tag != $wh2} {set tag $nexttag} { if {[$tag class] == "element"} { switch [$tag getType] { "Background" { InsertImage $tag "music" } "Event" - "Comment" { InsertEvent $tag } } } elseif {[$tag class] == "data"} { InsertData $tag } set nexttag [$tag getBrother] ::xml::node::link $tag -before $wh0 } $t delete "$wh1.first" "$wh2.first" $wh1 delete #JoinData $wh1 JoinData $wh2 } # Suppress synchro button in editor and in transcription JoinData $bp2 # Modify segmentation JoinSegmt seg0 $nb1 -text [TextFromSync $bp1] Synchro::TagToForget $bp2 "time" $mid DoModif "DELETE" SetCurrentSegment $nb1 } ################################################################ proc ChangeSegType {category {nb {}}} { global v if {$nb == ""} { if {![info exist v(segmt,curr)]} return set nb $v(segmt,curr) } set sync [GetSegmtId $nb] set turn [$sync getFather] set section [$turn getFather] switch $category { "Section" { if {[$section getAttr "startTime"] != [$sync getAttr "time"]} { if [catch { set sec_atts [::section::choose "report"] }] return if {[$turn getAttr "startTime"] != [$sync getAttr "time"]} { set type [lindex $sec_atts 0] if {$type == "nontrans"} { set tur_atts "" } else { set spk [lindex [lindex [::turn::get_atts $turn] 0] 0] if [catch { set tur_atts [::turn::choose $spk] }] return } set turn [SplitTransTags 1 $sync $tur_atts] } set section [SplitTransTags 2 $turn $sec_atts] } else { #::section::edit } } "Turn" { if {[$turn getAttr "startTime"] != [$sync getAttr "time"]} { set spk [::speaker::second_one] if [catch { set tur_atts [::turn::choose $spk] }] return #puts $tur_atts set turn [SplitTransTags 1 $sync $tur_atts] } else { #::turn::edit #if {[$turn getAttr "startTime"] == [$section getAttr "startTime"]} { # JoinTransTags 2 $section #} } } "Sync" { #if {[$turn getAttr "startTime"] == [$sync getAttr "time"]} { # JoinTransTags 1 $turn #} } } DoModif "TYPE" UpdateSegmtView modified } ################################################################ transcriber-1.5.1.1/tcl/MultiWav.tcl0000444000175000017500000000570607744000772015102 0ustar rtrt# RCS: @(#) $Id: MultiWav.tcl,v 1.2 2003/10/17 14:51:38 barras Exp $ # multiwav extension - intended for meeting recordings management # from an original proposal by David Gelbart and Dan Ellis from ICSI # management of contextual menu proc MW_AddMenuEntry {basename} { global v foreach wavfm $v(wavfm,list) { set menu [$v($wavfm,menu) entrycget [Local "Audio file"] -menu] $menu add radio -label $basename -variable v(multiwav,file) -command MW_Switch } eval_menu "Synchronized audio files" add radio -label $basename -variable v(multiwav,file) -command MW_Switch } proc MW_RemoveMenuEntry {{index "all"}} { global v foreach wavfm $v(wavfm,list) { set menu [$v($wavfm,menu) entrycget [Local "Audio file"] -menu] if {$index == "all"} { $menu delete 3 end $menu add separator } else { $menu delete [expr 3+$index] } #$menu configure -tearoff 1 } if {$index == "all"} { eval_menu "Synchronized audio files" delete 2 end eval_menu "Synchronized audio files" add separator } else { eval_menu "Synchronized audio files" delete [expr 2+$index] } eval_menu "Synchronized audio files" configure -tearoff 1 } # reset to empty list proc MW_Reset {} { global v set v(multiwav,files) {} set v(multiwav,path) {} MW_RemoveMenuEntry } # add basenames found in transcription header proc MW_Update {} { foreach basename [GetFilename] { MW_AddBase $basename } } # add given basename proc MW_AddBase {basename} { global v if {[lsearch -exact $v(multiwav,files) $basename] < 0} { lappend v(multiwav,files) $basename lappend v(multiwav,path) {} MW_AddMenuEntry $basename } } # proc MW_AddFile {args} { global v foreach filename $args { set basename [file root [file tail $filename]] if {$basename == ""} continue set pos [lsearch -exact $v(multiwav,files) $basename] if {$pos < 0 } { lappend v(multiwav,files) $basename lappend v(multiwav,path) $filename MW_AddMenuEntry $basename } else { set path [lindex $v(multiwav,path) $pos] if {$path == ""} { set v(multiwav,path) [lreplace $v(multiwav,path) $pos $pos $filename] } } } set v(multiwav,file) [file root [file tail $v(sig,name)]] # UpdateFilename need to be done later } proc MW_Switch {} { global v # look for basename chosen in v(multiwav,file) set pos [lsearch -exact $v(multiwav,files) $v(multiwav,file)] if { $pos >= 0 } { set file [lindex $v(multiwav,path) $pos] if {$file != ""} { Signal $file "switch" } else { LookForSignal $v(trans,name) "" $v(multiwav,file) "switch" if {$v(sig,name) == ""} { set rep [tk_messageBox -type okcancel -icon warning -message \ [concat [Local "Please open signal for signal"] $v(multiwav,file)]] if {$rep == "ok"} { OpenAudioFile "add" } if {$v(sig,name) == ""} { EmptySignal "switch" } } #set v(multiwav,path) [lreplace $v(multiwav,path) $pos $pos $v(sig,name)] } } }transcriber-1.5.1.1/tcl/About.tcl0000444000175000017500000000656510152633637014407 0ustar rtrt# RCS: @(#) $Id: About.tcl,v 1.12 2004/11/29 14:52:15 galliano Exp $ # Copyright (C) 1998-2004, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ####################################################################### proc ViewHelp {{name "Index"}} { global v array set arr { "Presentation" "present_local.html" "Main features" "functions.html" "User guide" "user.html" "Reference manual" "reference.html" } set Lg [string toupper [string index $v(lang) 0]][string range \ $v(lang) 1 end] set arr(Index) [file join [pwd] $v(path,doc) Index$Lg.html] set dir [file join [pwd] $v(path,doc) $v(lang)] if {![file exists $arr(Index)] || ![file exists $dir]} { set arr(Index) [file join [pwd] $v(path,doc) Index.html] set dir [file join [pwd] $v(path,doc) "en"] } set url [file join $dir $arr($name)] OpenURL file:$url } proc OpenURL { URL } { # # Job Open an url with the default browser # If it doesn't work, it asks the user to define the new default browser # If you want to open a file, add file: prefix to URL (ex: file:c:\tmp\try.html) # # In A valid URL # Out # Modify If v(browser) is not set, it is set to the default browser (except on Mac) # # Mathieu MANTA - DGA # V 1.0 # July 27, 2004 # global v if {$::tcl_platform(os) == "Darwin"} { if { $v(browser) == ""} { exec open $URL &} else { exec $v(browser) $URL &} } if {$::tcl_platform(os) == "Linux"} { if { $v(browser) == ""} { if { [catch {exec mozilla $URL &}] == 0 } { set v(browser) mozilla } elseif { [catch {exec firefox $URL &}] == 0 } { set v(browser) firefox } else { tk_messageBox -type ok -icon error -message [format [Local "Please define your default browser."] ] set v(browser) [SelectBrowser] catch { exec $v(browser) $URL &} } } else { catch { exec $v(browser) $URL &} } } if {$::tcl_platform(platform) == "windows"} { if { $v(browser) == ""} { set v(browser) [FindWinDefaultBrowser] } catch { exec $v(browser) $URL &} } } proc FindWinDefaultBrowser {} { # # Job Find Windows default browser in the registry # # In # Out Path to the default browser # Modify # # Mathieu MANTA - DGA # V 1.0 # July 27, 2004 # set BrowserKey [registry get HKEY_CLASSES_ROOT\\http\\shell\\open\\command ""] if { [string equal [string index [string trim $BrowserKey " "] 0] "\""]} { set BrowserPath [string trimleft $BrowserKey "\""] set BrowserPath [string range $BrowserPath 0 [expr { [string first "\"" $BrowserPath ]-1}]] } else { set BrowserPath [string range $BrowserKey 0 [string first " " $BrowserKey ]] } return $BrowserPath } proc SelectBrowser {{parent "."}} { # # Job Select default browser through selection box # # In # Out Return the path to the file selected # # Mathieu MANTA - DGA # V 1.0 # July 27, 2004 # global v set name [tk_getOpenFile -title [Local "Select your default browser"] -initialdir $v(trans,path) -parent $parent] return $name } transcriber-1.5.1.1/tcl/BgShape.tcl0000555000175000017500000000244410064306562014635 0ustar rtrt#!/bin/sh # -*-tcl-*-\ exec tclsh "$0" ${1:+"$@"} # RCS: @(#) $Id: BgShape.tcl,v 1.3 2004/06/17 12:24:18 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ############################################################### # Syntax: BgShape.tcl $signal_name $shape_name # returns $shape_name if it succeeds, else the error message # This script is launched as a background sub-process and computes a # min/max shape at a centi-second scale of the whole signal in order # to make signal display at low resolutions go faster within Transcriber. # load snack and trans packages. set base [file dir [file dir [file join [pwd] [info script]]]] lappend auto_path $base [file dir $base] set vsnack [package require snack] if {[package vcompare $vsnack 1.7] < 0} { error "Found Snack package version $vsnack; needs 1.7 or higher" } catch { package require snacksphere } catch { package require snackogg } proc Main {sigName shapeName {rate 16000} {channels 1} {header 0}} { sound s -file $sigName -guessproperties 1 -frequency $rate -channels $channels -skiphead $header sound shp s shape shp -format MULAW shp write $shapeName -fileformat WAV puts $shapeName catch {destroy .} exit } eval Main $argv transcriber-1.5.1.1/tcl/Dialog.tcl0000444000175000017500000003721710152633342014523 0ustar rtrt# RCS: @(#) $Id: Dialog.tcl,v 1.6 2004/11/29 14:49:06 galliano Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) # procedure CenterWindow taken from tk_messageBox : # Copyright (c) 1994-1997 Sun Microsystems, Inc. # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. proc CenterWindow {w} { wm withdraw $w update idletasks set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 \ - [winfo vrootx [winfo parent $w]]] set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2 \ - [winfo vrooty [winfo parent $w]]] wm geom $w +$x+$y wm deiconify $w } proc FrontWindow {w} { set geo [wm geometry $w] wm withdraw $w wm deiconify $w wm geometry $w $geo } ################################################################ proc CreateModal {w title} { catch {destroy $w} toplevel $w -class Dialog wm title $w [Local $title] #wm iconname $w $title wm protocol $w WM_DELETE_WINDOW { } if {[info tclversion] < 8.4 || [tk windowingsystem] != "aqua"} { # transient setting did not seem to work correctly on Mac OS X + aqua wm transient $w . } return $w } proc OkCancelModal {w e {names {"OK" "Cancel"}}} { global dial OkCancelFrame $w.bot dial(result) $names WaitForModal $w $e dial(result) return $dial(result) } proc WaitForModal {w e varName} { global v if {[info exists v(geom,$w)] && $v(geom,$w) != ""} { FrontWindow $w update wm geom $w $v(geom,$w) } else { CenterWindow $w } set oldFocus [focus] grab $w update focus $e tkwait variable $varName catch {focus $oldFocus} if {[info exists v(geom,$w)]} { set v(geom,$w) [wm geom $w] } destroy $w } proc OkCancelFrame {w varName {names {"OK" "Cancel"}}} { # JOB: create an OkcancelFrame # # IN: w, name of the window created # varName, variable associated to the frame # names, names of the buttons, default OK and Cancel # OUT: nothing # MODIFY: nothing # # Author: Claude Barras # Version: 1.0 # Date: 1999 frame $w -relief raised -bd 1 set t [winfo toplevel $w] foreach name $names { set but [string tolower $name] button $w.$but -text [Local $name] -command [list set $varName $name] switch $name { "OK" { $w.$but config -default active bind $t "tkButtonInvoke $w.$but" } "Cancel" { bind $t "tkButtonInvoke $w.$but" } } pack $w.$but -side left -expand 1 -padx 3m -pady 2m } pack $w -side bottom -fill both } proc ListFrame {f list} { # JOB: create a listframe # # IN: f, name of the window created # list, list associated with to listframe # OUT: name of the window created # MODIFY: nothing # # Author: Claude Barras # Version: 1.0 # Date: 1999 frame $f set l $f.lst listbox $l -yscrollcommand [list $f.ysc set] -exportselection 0 scrollbar $f.ysc -orient vertical -command [list $l yview] eval $l insert end $list pack $l -side left -expand true -fill both pack $f.ysc -side right -fill y pack $f -side top -fill both -expand 1 -padx 3m -pady 2m return $l } proc EntryFrame {w title varName {width 20} {OKbutton no}} { # JOB: create an entryframe with an optional "OK" button associated # # IN: w, name of the window created # title, label of the entryframe # varName, associated variable to the entryframe # OKbutton, variable for an optional OK button, default no button # OUT: name of the window created # MODIFY: nothing # # Author: Claude Barras, Sylvain Galliano # Version: 1.1 # Date: October 20, 2004 frame $w set l [label $w.lab -text "[Local $title]:"] set e [entry $w.ent -text $varName -width $width] $e select range 0 end $e icursor end $e xview end pack $l -side left -padx 3m -pady 2m pack $e -expand true -fill x -side left -padx 3m -pady 2m if {$OKbutton=="yes"} { set b [button $w.but -text "Ok"] pack $b -side left } pack $w -side top -fill x -expand true return $e } proc ListEntryFrame {w title varName list} { frame $w -relief raised -bd 1 set l [ListFrame $w.un $list] set e [EntryFrame $w.deux $title $varName] pack $w -side top -fill both -expand 1 bind $l "$e delete 0 end; catch {$e insert insert \[%W get \[%W curselection]]}; $e select range 0 end" return $e } # Length of longest string in list proc maxlength {list} { set m 0 foreach s $list { set l [string length $s] if {$l > $m} { set m $l } } return $m } proc MenuEntryFrame {w title varName list} { frame $w set title [Local $title] menubutton $w.b -text "$title:" -menu $w.b.menu -relief raised -bd 2 -highlightthickness 2 -anchor c -width [maxlength [concat $list $title]] menu $w.b.menu -tearoff 0 foreach i $list { $w.b.menu add radiobutton -label $i -variable $varName } pack $w.b -side left -padx 3m -pady 2m set e [entry $w.ent -textvar $varName] pack $e -expand true -fill x -side left -padx 3m -pady 2m pack $w -side top -fill x -expand true return $e } proc MenuFrame {w title varName list {list2 {}}} { frame $w label $w.lab -text "[Local $title]:" menubutton $w.b -indicatoron 1 -menu $w.b.menu -relief raised -bd 2 -highlightthickness 2 -anchor c -direction flush -width [maxlength $list] if {$list2 == {}} { $w.b configure -textvariable $varName } else { upvar \#0 $varName var $w.b configure -text $var } menu $w.b.menu -tearoff 0 foreach txt $list val $list2 { if {$list2 == {}} { $w.b.menu add radiobutton -label $txt -variable $varName } else { set txt [Local $txt] if {$var == $val} { $w.b conf -text $txt } $w.b.menu add radiobutton -label $txt -value $val -variable $varName -command [list $w.b conf -text $txt] } } pack $w.lab $w.b -side left -padx 3m -pady 2m pack $w -fill x -expand true } proc RadioFrame {w title varName list {list2 ""}} { if {$list2 == ""} {set list2 $list} frame $w -relief raised -bd 1 pack $w -side top -fill both set ww [frame $w.left] set l [label $ww.lab -text "[Local $title]:"] pack $l -side left -padx 3m -pady 2m -expand true pack $ww -side left -fill x -expand true set rad_lst {} set ww [frame $w.right] for {set i 0} {$i < [llength $list]} {incr i} { set text [lindex $list $i] if {$text == "\t"} { pack $ww -side left -expand true -fill x set ww [frame $w.right$i] continue } set value [lindex $list2 $i] radiobutton $ww.rad$i -var $varName -value $value -text [Local $text] pack $ww.rad$i -side top -anchor w lappend rad_lst $ww.rad$i } pack $ww -side left -expand true -fill x return $rad_lst } proc FrameState {w state} { if {[catch { $w conf -state [lindex {"disabled" "normal"} $state] }]} { catch { $w conf -foreground [lindex {"\#a3a3a3" "Black"} $state] }} foreach ww [winfo children $w] { FrameState $ww $state } } proc ScrolledText {w} { set t $w.txt set s $w.scr frame $w -bd 5 text $t -padx 5 -pady 5 -wrap word -width 80 -height 25 \ -yscrollcommand [list $s set] -bg white scrollbar $s -orient vertical -command [list $t yview] pack $t -side left -fill both -expand true pack $s -side right -fill y pack $w -expand true -fill both return $t } proc ColorFrame {w title varName} { # JOB: Create the color frame to configure the desired colors. Called by ConfigureColors # # IN: w, name of the subframe corresponding to the element to configure # title, label that appears in the subframe # varName, variable associated with the subframe # OUT: nothing # MODIFY: nothing # # Author: Claude Barras # Version: 1.0 # Date: 1999 upvar $varName var frame $w set l [label $w.lab -width 20 -anchor e -text "[Local $title]:"] set b [ColoredButton $w.col [subst { ChooseColor $varName; $w.col conf -bg $$varName -activebackground $$varName }] -bg $var -activebackground $var -width 2] pack $l -side left -padx 3m pack $b -side right -padx 3m pack $w -side top -fill x -expand true return $b } proc ColoredButton {w cmd args} { if {[info tclversion] >= 8.4 && [tk windowingsystem] == "aqua"} { eval {label $w -relief raised} $args bind $w $cmd return $w } else { eval {button $w -command $cmd} $args } } ################################################################ # General list editor proc ListEditor {list {title "Edit list"} {fields {"name" "value"}} {new {}} {callback {}}} { global lst set lst(val) $list set lst(nb) [llength $fields] set w [CreateModal .lst $title] # set w1 [frame $w.top -relief raised -bd 1] pack $w1 -side top -fill both -expand true set lst(wdg) [ListFrame $w1.lst ""] $lst(wdg) conf -font list -width 40 bind $lst(wdg) "EditList" set lst(stat) {} for {set i 0} {$i < $lst(nb)} {incr i} { set lst(e$i) [EntryFrame $w1.f$i [lindex $fields $i] lst(f$i)] lappend lst(stat) $w1.f$i } set w2 [frame $w1.but] pack $w2 -side top -fill both -expand true button $w2.new -text [Local "New"] -command {NewList} button $w2.del -text [Local "Delete"] -command {DelList} button $w2.mod -text [Local "Modify"] -command {ModifList} -default active menubutton $w2.sort -menu $w2.sort.menu -relief raised -bd 2 -highlightthickness 2 -anchor c -text [Local "Sort by..."] menu $w2.sort.menu -tearoff 0 for {set i 0} {$i < $lst(nb)} {incr i} { $w2.sort.menu add command -label [Local [lindex $fields $i]] -command [list SortList $i] } pack $w2.new $w2.sort $w2.del $w2.mod -side left -padx 3m -pady 2m -fill x -expand true # if {[llength $list] == 0 || [llength $new] > 0} { NewList $new } else { UpdatList } OkCancelFrame $w.bot lst(result) $w.bot.ok conf -default normal -command "ModifList; [$w.bot.ok cget -command]" bind $w "tkButtonInvoke $w2.mod" if {$callback != ""} { eval $callback } WaitForModal $w $lst(e0) lst(result) if {$lst(result) != "OK"} { return -code error cancel } return $lst(val) } proc SortList {i} { global lst ModifList set lst(val) [lsort -index $i $lst(val)] UpdatList 0 } proc NewList {{new {}}} { global lst set idx [$lst(wdg) curselection] if {$idx == ""} { lappend lst(val) $new UpdatList [expr [llength $lst(val)]-1] } else { ModifList incr idx set lst(val) [linsert $lst(val) $idx $new] UpdatList $idx } } proc DelList {} { global lst set idx [$lst(wdg) curselection] if {$idx == ""} return set lst(val) [lreplace $lst(val) $idx $idx] if {$idx > 0} { incr idx -1 } UpdatList $idx } proc EditList {} { global lst set idx [$lst(wdg) curselection] if {$idx == ""} { set v "" } else { set v [lindex $lst(val) $idx] } for {set i 0} {$i < $lst(nb)} {incr i} { set lst(f$i) [lindex $v $i] } } proc ModifList {} { global lst set idx [$lst(wdg) curselection] if {$idx == ""} return set v {} for {set i 0} {$i < $lst(nb)} {incr i} { lappend v $lst(f$i) } set lst(val) [lreplace $lst(val) $idx $idx $v] UpdatList $idx } proc lformat {list len {sep ":"}} { set res "" foreach a $list l $len { if {$l == ""} continue if {$res != ""} { append res $sep } append res [format "%-${l}s" [string range $a 0 [expr $l-1]]] } return $res } proc UpdatList {{idx 0}} { global lst set res "" set s [expr [llength $lst(val)] > 0] foreach w $lst(stat) { FrameState $w $s } set len {} for {set i 0} {$i < $lst(nb)} {incr i} { set l$i 1 if {$i < $lst(nb)-1} { set max 20 } else { set max 999 } foreach v $lst(val) { set l$i [min $max [max [set l$i] [string length [lindex $v $i]]]] } lappend len [set l$i] } foreach v $lst(val) { lappend res [lformat $v $len " : "] } set pos [lindex [$lst(wdg) yview] 0] $lst(wdg) delete 0 end eval $lst(wdg) insert end $res $lst(wdg) selection set $idx $lst(wdg) yview moveto $pos $lst(wdg) see $idx EditList return $res } ################################################################ # General font chooser # Input: font in the format "family size style" or font name # Output: # -if "OK", returns new font value in the format "family size style" # and configure named font to the new value # - if "Cancel", returns initial font value in the same format # and reconfigure named font to initial value proc ChooseFont {font} { global fontsel-family fontsel-size fontsel-weight fontsel-slant fontsel-nam # Analyse input font set fontsel-nam $font set init-conf [font actual $font] foreach {attr val} ${init-conf} { set fontsel$attr $val } set initial [ChooseFontVal] # Create top window and frames set f .fontsel CreateModal $f "Choose font" set g [frame $f.top -relief raised -bd 1 -width 25c] pack $g -fill x -side top # Family menu button set h [frame $g.fam] pack $h -side top label $h.lab -text "Family:" eval tk_optionMenu $h.men fontsel-family [lsort [font families]] $h.men conf -width [maxlength [font families]] pack $h.lab $h.men -side left -padx 3m -pady 3m # Size menu / entry set h [frame $g.siz] pack $h -side top menubutton $h.b -text "Size" -menu $h.b.menu -relief raised -bd 2 -highlightthickness 2 -anchor c menu $h.b.menu -tearoff 0 foreach i {7 8 10 12 14 18 24 36} { $h.b.menu add radiobutton -label $i -variable fontsel-size } entry $h.ent -textvar fontsel-size -width 5 pack $h.b $h.ent -side left -padx 3m -pady 3m # Bold/Italic checkboxes set h [frame $g.opt] pack $h -side top checkbutton $h.wgh -text "Bold" -variable fontsel-weight -onvalue "bold" -offvalue "normal" -anchor w -padx 3m checkbutton $h.sln -text "Italic" -variable fontsel-slant -onvalue "italic" -offvalue "roman" -anchor w -padx 3m pack $h.wgh $h.sln -expand true -fill x -side left # Font sample set l [label $f.msg -relief raised -bd 1 -padx 10 -pady 10 -font $font \ -justify left -wraplength 0 -text " ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 !@#$%^&*()_+-=[]{};:\"'` ~,.<>/?\\| "] pack $l -expand true -fill both -side top # For real-time updating of sample foreach var {family size weight slant} { trace variable fontsel-$var w [list ChooseFontUpdate $l $var] } # Wait for answer and return new font or initial value set answer [OkCancelModal $f $f] set value [ChooseFontVal] unset fontsel-family fontsel-size fontsel-weight fontsel-slant fontsel-nam if {$answer != "OK"} { if {[lsearch [font names] $font] >= 0} { eval font configure $font ${init-conf} } return $initial } return $value } proc ChooseFontVal {} { global fontsel-family fontsel-size fontsel-weight fontsel-slant set style "" if {${fontsel-weight} == "bold"} { lappend style "bold" } if {${fontsel-slant} == "italic"} { lappend style "italic" } set font [list ${fontsel-family} ${fontsel-size}] if {$style != ""} { lappend font $style } return $font } proc ChooseFontUpdate {w field n1 n2 op} { global fontsel-nam if {[lsearch [font names] ${fontsel-nam}] >= 0} { global fontsel-$field font configure ${fontsel-nam} -$field [set fontsel-$field] } else { $w conf -font [ChooseFontVal] } } transcriber-1.5.1.1/tcl/Xml.tcl0000444000175000017500000000515707512762005014067 0ustar rtrt#!/bin/sh #\ exec wish "$0" "$@" # RCS: @(#) $Id: Xml.tcl,v 1.2 2002/07/10 07:36:37 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) # WWW: http://www.etca.fr/CTA/gip/Projets/Transcriber/Index.html # Author: Claude Barras ################################################################ # XML parsing and management, version 0.2a # What it does: # - parsing of XML documents # (should be rather strict about well-formedness of documents) # - access through object-oriented procedures # - dynamic validation of element content (except element order) # - dynamic validation of attributes values (including ID/IDREFS) # - full support for Unicode (only available for Tcl/Tk 8.1 or higher) # Yet lacking: # - declaration/use of parameter references # - use of external entities (but external DTD subset is recognized) # - use of references containing markup # - correct white space handling, attribute-value normalization, etc. # ... but perhaps in the future ? ################################################################ package provide xml 1.0 package require tcLex # join parts of xml library set name [info script] catch {set name [file readlink $name]} foreach part {XmlItem.tcl XmlDtd.tcl XmlParse.tcl} { source [file join [file dirname $name] $part] } xml::dtd::init ################################################################ proc xml_tst1 {} { namespace eval xml { initItem set e1 [element "Section" {"Type" "Report" "Topic" "politic"}] set e2 [element "Turn" {"Speaker" "Smith"} -in $e1] element "Sync" {"Time" "1.3"} -in $e2 set d1 [data "Hello" -in $e2] element "Sync" {"Time" "2.7"} -after $d1 data "and we will discuss today about the economy" -in $e2 element "Sync" {Time "3.2"} -in $e2 comment " This is a comment " -begin $e1 $d1 setData "Hello, I am Smith" $e1 setAttr "Topic" "economy" puts [$e1 dump] $e1 deltree } } proc xml_tst {file args} { set root [eval ::xml::parser::read_file [file join "xmltest/not-wf/sa" $file] -valid 0 -debug 1 $args] puts [$root dump] $root deltree } proc xml_chk {{name "toto"}} { if {$name != ""} { set chn [open $name w] } else { set chn stdout } cd "xmltest/not-wf/sa" foreach file [glob *.xml] { if {[catch { set root [::xml::parser::read_file $file -valid 0] puts $chn "OK $file:" puts $chn [$root dump] $root deltree } err]} { puts $chn "ERR $file: $err" } } if {$chn != "stdout"} { close $chn } } transcriber-1.5.1.1/tcl/Play.tcl0000444000175000017500000002720410064531260014222 0ustar rtrt# RCS: @(#) $Id: Play.tcl,v 1.9 2004/06/18 09:15:28 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ################################################################# # Play current video or audio file # begin/end : segment to play (in seconds); defaults to all signal # script : callback after non-interrupted playback proc PlayRange {{begin 0} {end 0} {script {}}} { global v PauseAudio if {$v(videoFile) != ""} { set scale [lindex [$v(qtvideo) gettime] 5] $v(qtvideo) time [expr int($begin*$scale)] $v(qtvideo) callback [expr int($end*$scale)] StopVideo $v(qtvideo) play CursorStart $begin $end IsPlaying 1 # Callback after playback set v(play,after) $script return } set wavename $v(sig,name) if {$wavename == ""} return if {$v(playbackRemote)} { if {[info commands rplayer] != "" && [rplayer cget -file] != $wavename} { rplayer destroy } if {[info commands rplayer] == ""} { OpenSound $wavename 1 } } elseif {[info commands player] == ""} { snack::sound player if {[info commands snack::filter] != "" && ![info exists v(sig,filter)]} { set v(sig,filter) [snack::filter map] } } if {$v(playbackRemote)} { set rate [$v(sig,cmd) cget -frequency] rplayer play -start [expr int($begin*$rate)] -end [expr int($end*$rate)] } elseif {$v(sig,remote)} { set snd [OpenSound $wavename] set rate [$snd cget -frequency] set chan [$snd dump -start [expr int($begin*$rate)] -end [expr int($end*$rate)] -byteorder $::tcl_platform(byteOrder)] player conf -channel $chan player play -command [list close $chan] } else { # if possible, keep previously open sound file if {[player cget -file] != $wavename} { player conf -file $wavename -channels $v(sig,channels) -frequency $v(sig,rate) -skiphead $v(sig,header) -guessproperties 1 } # Apply multiplying factor to frequency - does not work with current # snack version. #player conf -frequency [expr int([$v(sig,cmd) cget -frequency]*$v(playbackSpeed))] set rate [$v(sig,cmd) cget -frequency] if {[$v(sig,cmd) cget -channels] == 2 && [info exists v(sig,filter)]} { eval $v(sig,filter) configure $v(sig,map) player play -start [expr int($begin*$rate)] -end [expr int($end*$rate)] -filter $v(sig,filter) } else { player play -start [expr int($begin*$rate)] -end [expr int($end*$rate)] } } # Callback after playback set v(play,after) $script IsPlaying 1 CursorStart $begin $end } # Stop current play and freeze cursor proc PauseAudio {} { global v if {$v(videoFile) != ""} { $v(qtvideo) stop foreach cb [$v(qtvideo) callback info] { $v(qtvideo) callback cancel $cb } } if {[info commands player] != ""} { catch {close [player conf -channel]} player stop } if {[info commands rplayer] != ""} { if {[catch {rplayer stop}]} { catch {rplayer destroy} } } catch {beeper stop} CursorStop IsPlaying 0 after cancel Play } ################################################################# # Automatic cursor management # called from: PlayRange proc CursorStart {pos max} { global v set v(curs,pos) $pos set v(curs,start) $pos set v(curs,max) $max # Ask for cursor events every 20 ms CursorEvent 20 # Permit fast forward/backward catch {unset v(play,no-fast)} } # called from: PauseAudio proc CursorStop {} { global v if {[info exists v(curs,event)]} { after cancel $v(curs,event) unset v(curs,event) } } # Update cursor position in waveform widget proc CursorEvent {inc} { global v if {$v(videoFile) != ""} { set scale [lindex [$v(qtvideo) gettime] 5] set pos [expr [lindex [$v(qtvideo) gettime] 1]/double($scale)] set active [expr {[$v(qtvideo) rate] != 0}] } else { if {$v(playbackRemote) && [info commands rplayer] != ""} { set audio rplayer } else { set audio audio } set pos [expr $v(curs,start)+[$audio elapsedTime]*$v(playbackSpeed)] set active [$audio active] } if {$pos>$v(curs,max) || !$active} { PauseAudio # Command to be launched after signal playback (rewind by default) eval $v(play,after) return } foreach win $v(wavfm,list) { set margin [expr 0.05 * $v($win,size)] if {($pos<$v($win,left))|| ($pos>$v($win,right)-$margin && $v(curs,max)>$v($win,right))} { set v($win,left) [expr $pos-$margin] SynchroWidgets $win } } SetCursor $pos if {[info exists v(socket,client)]} { TransClient SetCursor $pos } set v(curs,event) [after $inc [list CursorEvent $inc]] } ################################################################# # Stop playing and reset cursor to beginning of selection or file proc StopAndRewind {} { global v catch {unset v(playbackSegmt)} PauseAudio if [GetSelection beg end] { SetCursor $beg hide } else { SetCursor $v(sig,min) hide } } # Start new play at cursor pos in current playback mode proc Play {} { global v # Default behaviour: start from current position ($pos) up to # end of selection or end of signal ($end), then rewind to # start of selection or elso to current position ($script) set pos [GetCursor] set sel [GetSelection beg end] if {($pos<$beg) || ($pos>=$end)} { set pos $beg } if {$sel} { set script "SetCursor $beg" } else { DisplayMessage "" set script "SetCursor $pos" } # Detect current playback mode: continuous/pause/beep/stop/loop/segmt set mode $v(playbackMode) if {[info exists v(playbackSegmt)]} { set mode "segmt" } set scriptPause "IsPlaying 1; after [expr int(1000*$v(playbackPause))] Play" if {$mode != "continuous" && [info exists v(segmt,curr)]} { set n $v(segmt,curr) set begSeg [GetSegmtField seg0 $n -begin] set endSeg [GetSegmtField seg0 $n -end] incr n if {$mode == "segmt"} { set pos $begSeg set end $endSeg SetSelection $pos $pos set script "SetCursor $pos" } elseif {$mode == "loop" && !$sel} { set end $endSeg set script "SetCursor $begSeg" } elseif {$endSeg < $end && $n < [GetSegmtNb seg0]} { set scriptStop "SetCursor $endSeg; SetCurrentSegment $n" if {$mode=="beep" && [file readable $v(playbackBeep)]} { set end $endSeg set script "$scriptStop; PlayBeep" } elseif {$mode=="pause" && $v(playbackPause)>0} { set end $endSeg set script "$scriptStop; $scriptPause" } elseif {$mode=="stop"} { set end $endSeg set script $scriptStop } elseif {$mode=="next"} { set end [expr $endSeg-0.001] while {$end <= $pos + 0.1 && $n < [GetSegmtNb seg0]} { set end [expr [GetSegmtField seg0 $n -end]-0.001] incr n } set script "SetCursor $end" } } } # loop on current selection or segment after a pause if {$mode == "loop"} { append script "; $scriptPause" } else { append script "; catch {unset v(playbackSegmt)}" } PlayRange $pos $end $script } proc PlayBeep {} { global v catch {snack::sound beeper} beeper conf -file $v(playbackBeep) beeper play -command "IsPlaying 0; after 0 Play" IsPlaying 1 } proc IsPlaying {{state {}}} { global v if {$state != ""} { if {$state} { $v(tk,play) config -state disabled $v(tk,stop) config -state normal } else { $v(tk,play) config -state normal $v(tk,stop) config -state disabled } #update set v(play,state) $state } else { if ![info exists v(play,state)] { set v(play,state) 0 } return $v(play,state) } } ################################################################# # Stop current play, keeping current pos # or restart play at previous pos proc PlayOrPause {} { global v catch {unset v(playbackSegmt)} if {[IsPlaying]} { PauseAudio } else { # Start back playback from requested duration SetCursor [expr [GetCursor] - $v(playbackBefore)] Play } } proc PlayBut {} { global v if {[info exists v(play,state)]} { if {$v(play,state) == 0} { if {[info exists v(curs,event)]} { PauseAudio } else { Play } } update } } proc PauseBut {} { global v if {[info exists v(play,state)]} { if {$v(play,state) == 1} { if {[info exists v(curs,event)]} { PauseAudio } else { Play } } } } proc PlayFromBegin {} { global v StopAndRewind Play } proc PlayCurrentSegmt {} { global v set v(playbackSegmt) 1 Play } proc PlayNextSegmt {} { global v TextNextSync +1 set v(playbackSegmt) 1 Play } ################################################################# # Play a little part of signal before and after cursor position proc PlayAround {{len 1.0}} { global v set pos [GetCursor] SetCursor [expr $pos-$len]; set left [GetCursor] SetSelection $left $pos PlayRange $left $pos "after [expr int(1000*$v(playbackPause))] PlayAround2 $len $pos" } proc PlayAround2 {len pos} { global v SetCursor [expr $pos+$len]; set right [GetCursor] SetSelection $pos $right PlayRange $pos $right "SetSelection $pos $pos" } ################################################################# # Fast forward/backward (depending on direction) # move with 1/2s step and restart playing proc PlayForward {dir} { global v set play [IsPlaying] if $play { if [info exists v(play,no-fast)] return set v(play,no-fast) 1 } set pos [expr [GetCursor]+$dir*0.5] SetCursor $pos #ViewSelection $pos $pos if $play Play } # Fwd/bwd from button press with auto-repeat proc BeginPlayForward {dir} { global v catch {after cancel $v(curs,fast)} set v(curs,fast) [after 200 [list BeginPlayForward $dir]] PlayForward $dir } # button release : unregister event proc EndPlayForward {} { global v catch {after cancel $v(curs,fast)} } ################################################################# # Video management using QuickTimeTcl proc OpenVideoFile {{file ""}} { global v if {[info commands movie] == ""} { tk_messageBox -type ok -icon error -message [Local "Sorry, QuickTime Video support not available in this configuration (currently available for Mac OS X)"] return } if {$file == ""} { set file [tk_getOpenFile -filetypes {{"Video files" {".mov" ".mpg" ".avi"}} {"All files" {*}}} -title "Open video file"] #set file [tk_getOpenFilePreview] } if {$file != ""} { if {![quicktimetcl::canopen $file -type movie]} { tk_messageBox -type ok -icon error -message [format [Local "File %s does not seem to be supported by QuickTime"] $file] return } set v(videoFile) $file if {![info exists v(qtvideo)]} { set v(qtvideo) [movie .snd.qt -file $v(videoFile) -controller 0] pack .snd.qt -side left pack .snd.1 -side right -expand true } if {[$v(qtvideo) cget -file] != $v(videoFile)} { $v(qtvideo) configure -file $v(videoFile) } foreach {w h} [$v(qtvideo) size] break if {$h > 400} { $v(qtvideo) configure -width [expr int($w/2)] -height [expr int($h/2)] } else { $v(qtvideo) configure -width 0 -height 0 } } } proc EmptyVideo {} { global v if {[info exists v(qtvideo)]} { destroy $v(qtvideo) unset v(qtvideo) } set v(videoFile) "" } proc ViewVideo {time} { global v if {$v(videoFile) != "" && [$v(qtvideo) rate] == 0.0} { set scale [lindex [$v(qtvideo) gettime] 5] $v(qtvideo) time [expr int($time*$scale)] } } proc StopVideo {name video time} { $video stop } transcriber-1.5.1.1/tcl/XmlDtd.tcl0000444000175000017500000004303307512762005014516 0ustar rtrt#!/bin/sh #\ exec wish "$0" "$@" # RCS: @(#) $Id: XmlDtd.tcl,v 1.2 2002/07/10 07:36:37 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) # WWW: http://www.etca.fr/CTA/gip/Projets/Transcriber/Index.html # Author: Claude Barras ################################################################ # Library for checking of XML well-formedness and validity # Constraint: only one DTD in memory namespace eval ::xml::dtd { #variable state 0; 0: disabled; 1: type active; 2: type+ids active #variable name "" # Empty current DTD proc init {} { variable state 0 variable name "" element::init attribute::init entity::init id::init notation::init } # set/return state of DTD for dynamic validation: 1=active, 0=inactive proc active {{new_state ""}} { variable state if {$new_state != ""} { set state $new_state } return $state } # set/return name of current active external DTD proc name {{new_name ""}} { variable name if {$new_name != ""} { set name $new_name } return $name } # read new external DTD and switch to dynamic validating mode proc xml_read {fileName args} { init eval ::xml::parser::read_file [list $fileName] $args -type dtd active 1 } #======================================================================= # Element types management namespace eval element { proc init {} { variable contents catch {unset contents} array set contents {} } proc declare {type content} { upvar ::xml::parser::rgS rgS upvar ::xml::parser::Name Name if {[info exists contents($type)]} { error "Element '$type' already defined" } if {$content == "EMPTY" || $content == "ANY"} { # Empty/Any type } elseif {[string first "\#PCDATA" $content] >= 0} { # Mixed type regsub -all -- "\[()$rgS*]" $content "" content set content [split $content "|"] } else { # Element content type # We should verify that $content really matches $children regsub -all -- "$Name" $content "(\\0;)" content regsub -all -- "\[,$rgS]" $content "" content } # Content can be: a word (EMPTY/ANY), a list (beginning with #PCDATA) # or a regular expression for a list of sub-elements variable contents set contents($type) $content } # Check if $type is declared proc exists {type} { variable contents if {![info exists contents($type)]} { error "Element type '$type' was not declared in DTD" } } # Check if $child type can occur inside element of $father type proc authorized {father child} { variable contents if {[catch {set content $contents($father)}]} { error "Element type '$father' was not declared in DTD" } # Any type if {$content == "ANY"} { return } # Empty type if {$content == "EMPTY"} { error "Element '$father' should be empty" } # Mixed type if {[lindex $content 0] == "\#PCDATA"} { if {[lsearch -exact $content $child] < 0} { error "Element '$father' should not contain '$child' element" } return } # Element content type if {$child == "\#PCDATA"} { error "Element '$father' should not contain data" } if {![regexp $child $content]} { error "Element '$father' should not contain '$child' element" } } proc rightOrder {element} { set type [$element getType] variable contents set content $contents($type) # Verify elements order for element content type if {$content == "ANY" || $content == "EMPTY" || [lindex $content 0] == "\#PCDATA"} { return } set types "" foreach child [$element getChilds "element"] { append types [$child getType] ";" } #puts "^$content$\n$types" if {![regexp "^$content$" $types]} { error "Element content doesn't match order for '$type'" } } # Validation of element childs proc validate {element} { set type [$element getType] foreach child [$element getChilds "element"] { authorized $type [$child getType] } rightOrder $element } } #======================================================================= # Attributes list management namespace eval attribute { proc init {} { variable atts catch {unset atts} array set atts {} } proc declare {type content} { upvar ::xml::parser::AttDef AttDef upvar ::xml::parser::rgS rgS variable atts if {![info exists atts($type)]} { set atts($type) {} } while {[regexp "^($AttDef)(.*)$" $content all attdef name attype notation enumeration default v0 fixed value v1 r1 r2 r3 v2 r4 r5 r6 content]} { # If attribute is already defined, keep initial declaration if {[lsearch -exact $atts($type) $name] >= 0} { continue } lappend atts($type) $name # Attribut type: if {$enumeration != ""} { # Enumaration regsub -all -- "\[()$rgS]" $attype "" names set names [split $names "|"] set attype "ENUMERATION" } elseif {$notation != ""} { # Notation regsub -all -- "\[()$rgS]" [string range $attype 8 end] "" names set names [split $names "|"] set attype "NOTATION" # Validity: Notation Attributes - (declaration of notations) foreach not $names { ::xml::dtd::notation::get $not } } else { # String or Tokenized set names {} } # Default value: if {$value != ""} { set value [::xml::dtd::entity::replace \ [::xml::dtd::unquote $value] -char] if {$fixed != ""} { # Fixed default value set default "\#FIXED" } else { # Default value set default "\#DEFAULT" } } set atts($type,$name) [list $attype $names $default $value] # Default value must be legal if {$default == "\#FIXED" || $default == "\#DEFAULT"} { authorized $type "" $name $value } } } # Return list of declared attributes for type proc declared {type} { variable atts if {[catch {set attnames $atts($type)}]} { error "Attributes for type '$type' not declared in DTD" } return $attnames } # Return list of declared attribute with default value for $type proc defaultList {type} { variable atts set defs "" foreach name [declared $type] { foreach {attype list def val} $atts($type,$name) {} if {$def == "\#FIXED" || $def == "\#DEFAULT"} { append defs $name } } return $defs } # Check if attribute/value pair authorized for type element proc authorized {type element name newval} { variable atts if {[catch { foreach {attype list def val} $atts($type,$name) {} }]} { error "Attribute '$name' for type '$type' not declared in DTD" } if {$def == "\#FIXED" && $newval != $val} { error "Attribute '$name' for type '$type' can't be modified" } # Validity: Notation Attributes / Enumeration if {$list != "" && [lsearch -exact $list $newval] < 0} { error "Attribute '$name' for type '$type' must be in {$list}" } # Verify Tokenized and String Types too # - has to check for IDs consistency switch $attype { "CDATA" { } "ID" { ::xml::dtd::check Name $newval ::xml::dtd::id::new $element $name $newval } "IDREF" { ::xml::dtd::check Name $newval ::xml::dtd::id::refs $element $name $newval } "IDREFS" { ::xml::dtd::check Names $newval ::xml::dtd::id::refs $element $name $newval } "ENTITY" { ::xml::dtd::check Name $newval ::xml::dtd::entity::is_unparsed $newval } "ENTITIES" { ::xml::dtd::check Names $newval foreach ent $newval { ::xml::dtd::entity::is_unparsed $ent } } "NMTOKEN" { ::xml::dtd::check Nmtoken $newval } "NMTOKENS" { ::xml::dtd::check Nmtokens $newval } } # Entities references in default value have to be expanded !!! } # Returns 1 for implied tokenized or enumerated types # (for them, an empty value is forbidden but can be simulated by # unsetting the attributes) proc implied_nonull {type name} { variable atts if {[catch { foreach {attype list def val} $atts($type,$name) {} }]} { error "Attribute '$name' for type '$type' not declared in DTD" } if {$def == "\#IMPLIED" && $attype != "CDATA"} { return 1 } else { return 0 } } # Check if all required attributes for $type are in $names list proc required {element} { variable atts set type [$element getType] set names [$element listAttr] # Verify required attributes are defined foreach name [declared $type] { foreach {attype list def val} $atts($type,$name) {} if {$def == "\#REQUIRED" && [lsearch -exact $names $name] < 0} { error "attribute '$name' required for $element" } } } # Validation of attribute/value pairs for an element proc validate {element} { # Verify elements attributes are declared and valids set type [$element getType] foreach name [$element listAttr] { authorized $type $name [$element getAttr $name] } # Verify required attributes are defined required $element } # Return default value of $type element if it exists, else raise error # (at user option, returns empty string for implied types) proc default {type name {impty 0}} { variable atts if {[catch { foreach {attype list def val} $atts($type,$name) {} }]} { error "Attribute '$name' for type '$type' not defined in DTD" } if {$def != "\#FIXED" && $def != "\#DEFAULT"} { if {$impty && $def == "\#IMPLIED"} { return "" } else { error "No default value of attribute '$name' for type '$type'" } } return $val } } #======================================================================= # Entities management namespace eval entity { # Reset to default entity values proc init {} { variable entities catch {unset entities} foreach {name value} { lt "&\#38;\#60;" gt "&\#62;" amp "&\#38;\#38;" apos "&\#39;" quot "&\#34;" } { declare "&" $name $value } } # Define value for internal entity proc declare {type name value} { variable entities # Check name syntax ::xml::dtd::check Name $name # Expand entity chars in value set value [replace $value -char] # Accept only first declaration if {![info exists entities($type$name,val)] && ![info exists entities($type$name,ext)]} { set entities($type$name,val) $value } } # Define new external entity proc external {type name pubid sysid ndata} { variable entities # Accept only first declaration if {![info exists entities($type$name,val)] && ![info exists entities($type$name,ext)]} { set entities($type$name,ext) [list $pubid $sysid $ndata] } } # Check for declaration of an unparsed entity proc is_unparsed {name} { variable entities if {[info exists entities($type$name,ext)]} { foreach {pubid sysid ndata} $entities($type$name,ext) {} if {$ndata != ""} { return $ndata } } error "$type$name; should be defined as an unparsed entity" } proc getVal {name {type "&"}} { variable entities if {[info exists entities($type$name,val)]} { set value $entities($type$name,val) } elseif {[info exists entities($type$name,ext)]} { foreach {pubid sysid ndata} $entities($type$name,ext) {} if {$ndata != ""} { error "Can't include unparsed entity $type$name;" } # Should not include external entities inside att values error "Sorry, can't include external entity $type$name;" } else { error "entity $type$name; not defined" } return $value } # Replace character and internal entities # -all: all entities / -char: char entities only proc replace {val {mode "-all"}} { upvar ::xml::parser::Reference Reference upvar ::xml::parser::Char Char set done "" # Manual parsing (if not efficient enough, another lexer can be used) while {[regexp "^(\[^&]*)($Reference)(.*)$" \ $val all before entity name decimal hexa after]} { append done $before if {$hexa != ""} { #scan $hexa "%x" decimal set decimal 0x$hexa } if {$decimal != ""} { set char [format {%c} $decimal] # Test if $char is in the range of valid chars if {$decimal >= 65536 || ![regexp "\[$Char]" $char]} { error "forbidden character entity &\#x[format %x $decimal];" } append done $char } else { if {$mode == "-all"} { # Recursive internal entities replacement append done [replace [getVal $name] $mode] } else { # Keep entity as is (process only character entities) append done "&$name;" } } set val $after } return [append done $val] } } #======================================================================= # IDs management # Information about ID definition and references are kept up-to-date # (in dynamic validating mode), but consistency between both # is only verified when 'xml::dtd::id::validate' is called. namespace eval id { # Reset all ID definitions and references # called from xml::dtd::init proc init {} { variable prefix "" foreach name {def_val def_elem ref_vals ref_elems} { catch { variable $name unset $name } } } proc set_prefix {new_prefix} { variable prefix $new_prefix } # (Re)define ID for element/attribute # called from xml::dtd::attribute::authorized proc new {element name value} { # Specific prefix for different documents (ad-hoc) variable prefix set value $prefix$value variable def_val variable def_elem if {[info exists def_elem($value)]} { error "ID $value defined twice" } # Detect if we change an existing value if {![catch {set oldval $def_val($element,$name)}]} { unset def_elem($oldval) } set def_val($element,$name) $value set def_elem($value) $element } # Set or modify ID refs from element/attribute # called from xml::dtd::attribute::authorized proc refs {element name values} { # Specific prefix for different documents (ad-hoc) variable prefix foreach value $values {lappend newvals $prefix$value} set values $newvals variable ref_vals variable ref_elems # Detect if we change an existing value if {![catch {set oldvals $ref_vals($element,$name)}]} { foreach oldval $oldvals { lsuppress ref_elems($oldval) $element } } foreach value $values { lappend ref_elems($value) $element } set ref_vals($element,$name) $values } # Update ID infos when an attribute or a whole element is deleted # - it could slow down applications # called from xml::element::delete and xml::element::unsetAttr proc suppress {element {name *}} { # Suppress id of element variable def_val variable def_elem foreach {elemname value} [array get def_val $element,$name] { unset def_elem($value) unset def_val($elemname) } # Suppress references from element variable ref_vals variable ref_elems foreach {elemname values} [array get ref_vals $element,$name] { foreach value $values { lsuppress ref_elems($value) $element } unset ref_vals($elemname) } } # Verify that all referenced IDs are really defined # called from xml::parser::parse_doc proc validate {} { variable ref_elems foreach {value refs} [array get ref_elems] { if {[llength $refs] > 0} { get $value } } } # Return item referenced by ID value # called by client application proc get {value} { variable def_elem if {[catch {set def $def_elem($value)}]} { error "Reference to undefined ID $value" } return $def } # Return item references to ID value # called by client application proc get_refs {value} { variable ref_elems if {[catch { set refs $ref_elems($value) }]} { set refs "" } return $refs } } #======================================================================= # Notations management namespace eval notation { # Reset to default values proc init {} { variable notations catch {unset notations} } proc declare {name pub sys} { variable notations if {![info exist notations($name)]} { set notations($name) [list $pub $sys] } } proc get {name} { variable notations if {![info exist notations($name)]} { error "Notation $name not defined" } return $notations($name) } } #======================================================================= # General procedures # Check for well-formedness: value must match regexp of given name proc check {re_name value} { upvar ::xml::parser::$re_name name if {![regexp "^$name\$" $value]} { return -code error "Value '$value' is not well-formed" } } # Normalize public identifier proc normPubId {public} { upvar ::xml::parser::S S set public [string trim [regsub -all $S $public " " public]] } # Strip quotes around value proc unquote {val} { if {$val == ""} return if {![regexp "^(\[\"'])(.*)(\[\"'])$" $val all sep1 val sep2] || $sep1 != $sep2} { error "Wrongly quoted string $val" } return $val } } ################################################################ transcriber-1.5.1.1/tcl/Socket.tcl0000444000175000017500000002261410064271261014547 0ustar rtrt#!/bin/sh # -*-tcl-*-\ exec wish8.3 "$0" ${1:+"$@"} # RCS: @(#) $Id: Socket.tcl,v 1.2 2004/06/17 10:30:09 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) # Server: launch Transcriber with # % trans -patch Socket.tcl # # Client (within Tcl code): # source Socket.tcl # TransClient command args # # where command is currently one of: # NewTrans [$sig] # ReadTrans $trans [$sig] # Signal $sig # EmptySignal # SetCursor $pos # GetCursor => $pos # SetSelection $begin $end # GetSelection $beginVar $endVar => 1 if selection, 0 else # GetSelectionBoundaries => {begin end} / {} # ViewSelection [$begin $end] # Play # PlayCurrentSegmt # PlayAround [$len] # PauseAudio # IsPlaying => 0/1 # SetCurrentSegment $nb # MoveNextSegmt +1/-1 # GetSegmtNb seg0 # GetSegmtField seg0 $v(segmt,curr) -begin/-end/-text # GetCurrentSegmt => {begin end text} # InsertSegment # DeleteSegment # PasteAll $v(tk,edit) $text # # and args doesn't contain newline, ] or ; chars. ###################################################################### # Sending Tcl command through sockets - Client side # # socket::Send $server $port $cmd # returns result of $cmd execution on $server/$port. # # Protocol: # 1/ open socket $port on $server # 2/ send "CMD $id ENC $enc LEN $len $cmd" on socket # where $id is a random ID, encoding should be 'binary', len is $cmd length # 3/ get back string "RES $id CODE $code ENC $enc LEN $len $res" # where $id is same ID, code is 'ok' or 'error', encoding is 'binary' # and len is $result length namespace eval socket { # send Tcl command to server:port socket proc Send {server port cmd} { set channel [Client $server $port] set id [expr int(65536*rand())] set enc [fconfigure $channel -encoding] set len [string length $cmd] puts $channel "CMD $id ENC $enc LEN $len" puts -nonewline $channel $cmd if {[catch { flush $channel set res [gets $channel] }]} { # connexion seems closed; reopen and retry CloseClient $server $port Send $server $port $cmd return } if {[regexp {^ *RES +([^ ]+) +CODE +([^ ]+) +ENC +([^ ]+) +LEN +(-?[0-9]+) *$} $res x rid code enc len]} { if {$len > 0} { set res [read $channel $len] if {[string length $res] < $len} { CloseClient $server $port return -code error "socket error on $server:$port - missing chars" } } else { set res "" } if {$rid != $id} { CloseClient $server $port return -code error "socket error on $server:$port - wrong command ID" } return -code $code $res } else { CloseClient $server $port return -code error "socket error on $server:$port - $res" } } # At first call, connect to server with given port, and keep connection # channel in an array for further calls. proc Client {server port} { variable chan if {![info exists chan($server,$port)]} { if {[catch {socket $server $port} channel]} { error "Couldn't open command server $port on $server\n($channel)" } fconfigure $channel -buffering full -translation binary set chan($server,$port) $channel } return $chan($server,$port) } proc CloseClient {server port} { variable chan catch { close $chan($server,$port) } catch { unset chan($server,$port) } } } ###################################################################### # Sending Tcl command through sockets - Server side # # socket::Server $port $interface # start socket command server on port $port, with optional interface # for monitoring socket use (0=disabled, 1=enabled (default)). # # Restrictions: # - only accepts connexions from local host # - don't accept multiple commands (sequence or embedded) # - limited to a list of commands (transAPI) namespace eval socket { variable transAPI { NewTrans ReadTrans Signal EmptySignal SetCursor GetCursor SetSelection GetSelection GetSelectionBoundaries ViewSelection Play PlayCurrentSegmt PlayAround PauseAudio IsPlaying SetCurrentSegment MoveNextSegmt GetSegmtNb GetSegmtField GetCurrentSegmt InsertSegment DeleteSegment PasteAll } variable servsock variable servport variable peer variable busy variable msg # Socket server proc Server {port {interface 1}} { Msg "Sound server port $port" if [catch { variable servsock [socket -server socket::Accept $port] variable servport $port #vwait forever - needed only for tclsh case if {$interface} Interface } error] { puts $error exit } } # Connection to server proc Accept {sock addr port} { # We reject here foreign hosts - we could have some restricted list set local [lindex [fconfigure $sock -sockname] 0] if {$addr != $local} { Msg "Reject $sock from $addr port $port" close $sock return } Msg "Accept $sock from $addr port $port" fconfigure $sock -buffering full -translation binary fileevent $sock readable [list socket::Get $sock] } proc Get {sock} { Busy $sock set line "" if {[catch {gets $sock line} error]} { #Msg "in $sock line $line error $error" Close $sock } else { set id -1 if {![regexp {^ *CMD +([^ ]+) +ENC +([^ ]+) +LEN +(-?[0-9]+) *$} $line x id enc len]} { Error $sock $id "Wrong header: $line" return } set line [string trim [read $sock $len]] Msg $line # prevent multiple/embedded commands (also restricts parameter values) if {[regexp "\[;\n\[]" $line]} { Error $sock $id "Wrong content: $line" return } variable transAPI if {[lsearch $transAPI [lindex $line 0]] >= 0} { Exec $sock $id $line } else { Error $sock $id "Wrong command: $line" } } Free } # Execute command and write result to the socket channel in the format : # CODE $code LEN $len $result proc Exec {sock id cmd} { if [catch {uplevel \#0 $cmd} res] { set code "error" } else { set code "ok" } set enc [fconfigure $sock -encoding] set len [string length $res] puts $sock "RES $id CODE $code ENC $enc LEN $len" puts -nonewline $sock $res flush $sock return $res } proc Error {sock id msg} { Exec $sock $id [list error $msg] Close $sock } proc Close {sock} { Msg "closing connection" catch {close $sock} Free } proc Msg {txt} { variable msg $txt update idletasks } proc Busy {sock} { variable busy 1 if {[catch { variable peer [lindex [fconfigure $sock -peername] 1] }]} { variable peer "" } update idletasks } proc Free {} { variable busy 0 } proc CloseServ {} { variable servsock catch {close $servsock} exit } proc Restart {} { variable servsock variable servport catch {close $servsock} Server $servport } proc Interface {} { #wm title . "Transcriber's Socket Server" #wm protocol . WM_DELETE_WINDOW {Quit} set w1 [toplevel .sock -relief raised -bd 1] #pack $w -side top -fill both -expand true foreach i {1} n { "Port" } var {socket::servport} { pack [frame $w1.$i] -side top -fill x label $w1.$i.l -text "$n:" -width 20 -anchor e pack $w1.$i.l -side left -padx 1m -pady 1m entry $w1.$i.e -textvariable $var -width 30 pack $w1.$i.e -side left -padx 1m -pady 1m -fill x -expand true } set w [frame $w1.mid -relief raised -bd 1] pack $w -side top -fill both -expand true pack [frame $w.1] -side top -fill x label $w.1.l1 -text "Client:" -width 10 label $w.1.l2 -textvariable socket::peer -width 20 -relief sunken -anchor w pack $w.1.l1 $w.1.l2 -side left -padx 1m -pady 1m pack [frame $w.3] -side top -fill x checkbutton $w.3.c -text busy -var socket::busy -anchor w pack $w.3.c -side left -padx 1m -pady 1m label $w.3.m -textvariable socket::msg -width 40 -relief sunken -anchor w pack $w.3.m -side left -padx 1m -pady 1m -fill x -expand true set w [frame $w1.bot -relief raised -bd 1] pack $w -side top -fill x #button $w.r -text Restart -command socket::Restart #button $w.q -text Close -command {socket::CloseServ; destroy .sock} #pack $w.r $w.q -side left -expand true -padx 3m -pady 2m } } ###################################################################### # if launched from within Transcriber, automatically start server # else create client facility procedure if {[info exists v(trans,name)]} { # default value for client and server socket port if {! [info exists v(socket,server)]} { set v(socket,server) 8033 } socket::Server $v(socket,server) # New procedures for more easy external use proc GetCurrentSegmt {} { global v return [list [GetSegmtField seg0 $v(segmt,curr) -begin] \ [GetSegmtField seg0 $v(segmt,curr) -end] \ [GetSegmtField seg0 $v(segmt,curr) -text]] } proc GetSelectionBoundaries {} { if {[GetSelection a b]} { return [list $a $b] } else { return {} } } # may also use client if {[info exists v(socket,client)]} { proc TransClient {args} { socket::Send localhost $::v(socket,client) $args } } } else { proc TransClient {args} { socket::Send localhost 8033 $args } } transcriber-1.5.1.1/tcl/Speaker.tcl0000444000175000017500000014173510173756650014732 0ustar rtrt# RCS: @(#) $Id: Speaker.tcl,v 1.11 2005/01/20 16:34:48 mantam Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ################################################################ # speakers management namespace eval speaker { variable list_atts {"name" "check" "type" "dialect" "accent" "scope"} variable list_chat {"name" "check" "type" "dialect" "accent" "scope" "role" "age" "birth" "education" "group" "language" "ses" "sex"} variable id_test 0 proc init {} { variable nb 1 variable nbg 1 variable recent {} variable list variable listg variable list_globale catch {unset list} catch {unset listg} catch {unset list_globale} } # Register speakers from all already existing "Speakers" sub-trees proc register {} { variable list variable nb global v global env init foreach speakers [$v(trans,root) getChilds "element" "Speakers"] { foreach speaker [$speakers getChilds "element"] { set name [$speaker getAttr "name"] set id [$speaker getAttr "id"] set list($name) $id incr nb } } ::speaker::importg $env(HOME)/[file tail $v(list,ext)] } # Replace all references to one speaker with another proc replace {id1 id2} { foreach turn [::xml::dtd::id::get_refs $id1] { $turn setAttr "speaker" $id2 ::turn::update $turn } } # Suppress speaker ids without reference proc purge {} { variable list variable recent foreach {name id} [array get list] { if {[llength [::xml::dtd::id::get_refs $id]] == 0} { [::xml::dtd::id::get $id] delete unset list($name) lsuppress recent $id } } DoModif "PURGE" } # Find id for existing speaker name or returns "" proc search_id {name} { variable list if {[catch { set id $list($name) }]} { set id "" } return $id } proc search_idg {name} { variable listg if {[catch { set id $listg($name) }]} { set id "" } return $id } # Create a new speaker with the given name inside "Speakers" sub-tree # and returns its id, or find an already existing speaker with this name proc create {name {check ""} {type ""} {dialect ""} {accent ""} {scope ""} {role ""} {age ""} {birth ""} {education ""} {group ""} {language ""} {ses ""} {sex ""} } { variable nb variable list variable listg # Avoid empty name => empty ID if {$name == "" || $name == ([Local "no speaker"])} { return "" } # If a speaker with the same name already exists, returns its id if {![catch { set id $list($name) }]} { ::speaker::set_atts $id [list $name $check $type $dialect $accent $scope] return $id } # Search for a free speaker id while {1} { set id "spk$nb" incr nb if {[catch {::xml::dtd::id::get $id}]} break } # Create new speaker inside speakers sub-tree global v set speakers [lindex [$v(trans,root) getChilds "element" "Speakers"] 0] if {$speakers == ""} { set speakers [::xml::element "Speakers" {} -begin $v(trans,root)] } if {$::v(chatMode)} { ::xml::element "Speaker" [list "id" $id "name" $name "check" $check "type" $type "dialect" $dialect "accent" $accent "scope" $scope "role" $role "age" $age "birth" $birth "education" $education "group" $group "language" $language "ses" $ses "sex" $sex] -in $speakers } else { ::xml::element "Speaker" [list "id" $id "name" $name "check" $check "type" $type "dialect" $dialect "accent" $accent "scope" $scope] -in $speakers } # Keep list of speaker names with associated id set list($name) $id return $id } proc create_glob {name {check ""} {type ""} {dialect ""} {accent ""} {scope ""} {role ""} {age ""} {birth ""} {education ""} {group ""} {language ""} {ses ""} {sex ""} } { variable nbg variable listg variable list_globale global env global v # Avoid empty name => empty ID if {$name == "" } { return "" } # If a speaker with the same name already exists, returns its id if {![catch { set id $listg($name) }]} { ::speaker::modify_dbg [list $name $name $check $type $dialect $accent "global"] ::speaker::set_atts [::speaker::search_idg $name] [list $name $check $type $dialect $accent $scope] ::turn::maj_liste_globale return $id } # Search for a free speaker id while {1} { set id "importg_store_$nbg" incr nbg if {[catch {::xml::dtd::id::get $id}]} break } # Create new speaker inside speakers sub-tree global v set speakers [lindex [$v(trans,speakerg) getChilds "element" "Speakers"] 0] if {$speakers == ""} { set speakers [::xml::element "Speakers" {} -begin $v(trans,store)] } if {$::v(chatMode)} { ::xml::element "Speaker" [list "id" $id "name" $name "check" $check "type" $type "dialect" $dialect "accent" $accent "scope" $scope "role" $role "age" $age "birth" $birth "education" $education "group" $group "language" $language "ses" $ses "sex" $sex] -in $speakers } else { ::xml::element "Speaker" [list "id" $id "name" $name "check" $check "type" $type "dialect" $dialect "accent" $accent "scope" $scope] -in $speakers } # Keep list of speaker names with associated id set listg($name) $id set list_globale([lindex [get_atts $id] 0],id) $id set list_globale([lindex [get_atts $id] 0],name) [lindex [get_atts $id] 0] set list_globale([lindex [get_atts $id] 0],check) [lindex [get_atts $id] 1] set list_globale([lindex [get_atts $id] 0],type) [lindex [get_atts $id] 2] set list_globale([lindex [get_atts $id] 0],dialect) [lindex [get_atts $id] 3] set list_globale([lindex [get_atts $id] 0],accent) [lindex [get_atts $id] 4] set list_globale([lindex [get_atts $id] 0],scope) [lindex [get_atts $id] 5] return $id } # Returns name string for a list of speaker ids proc name {ids {join " + "}} { set speaker "" if {$ids == ""} { lappend speaker ([Local "no speaker"]) } else { foreach id $ids { lappend speaker [[::xml::dtd::id::get $id] getAttr "name"] } } if {$join != ""} { set speaker [join $speaker $join] } return $speaker } # set/returns attributes for given speaker as a list proc get_atts {id} { set item [::xml::dtd::id::get $id] if {$::v(chatMode)} { variable list_chat set lst $list_chat } else { variable list_atts set lst $list_atts } foreach attr $lst { lappend vals [$item getAttr $attr] } return $vals } proc set_atts {id vals} { set item [::xml::dtd::id::get $id] # Register old turn attributes for undo before setting new values DoModif [list "SPEAKER" $id [get_atts $id]] # Unregister previous speaker name variable list set previous [$item getAttr "name"] set new [lindex $vals 0] if {$new != $previous} { if {$new != ""} { if {[info exists list($new)]} { tk_messageBox -message "This name already exists" -type ok -icon error error } set list($new) $id } if {$previous != ""} { unset list($previous) } set upd 1 } else { set upd 0 } # Really change attributes if {$::v(chatMode)} { variable list_chat set lst $list_chat } else { variable list_atts set lst $list_atts } foreach attr $lst val $vals { $item setAttr $attr $val } # Update new name in editor and segmentation after changes if {$upd} { foreach turn [::xml::dtd::id::get_refs $id] { if {[$turn getType] == "Turn"} { ::turn::update $turn } } } } # Sorted list of all registred names proc all_names {} { variable list return [lsort -dictionary [array names list]] } proc global_names {} { variable listg return [lsort -dictionary [array names listg]] } # Keep 5 most recently used speaker ids proc most_recent {ids} { variable recent foreach id $ids { lsuppress recent $id set recent [lrange [concat $id $recent] 0 4] } } # Lastly used speaker (after the most recent one) - best guess ? # and try to avoid the given speaker id proc second_one {{excl ""}} { variable recent set spk [lindex $recent 1] if {$spk == $excl} { set spk [lindex $recent 0] } return $spk } # Find speaker from list proc find {} { variable id1 "" variable occur "" set w .spk catch {destroy $w} toplevel $w wm title $w [Local "Find speaker"] if {$::tcl_platform(platform) == "windows"} { wm attributes $w -topmost 1 } # set w1 [frame $w.top -relief raised -bd 1] pack $w1 -side top -fill both -expand true variable lst [ListFrame $w1.lst [find_names]] label $w1.lab -textvariable ::speaker::occur -font $::v(font,mesg) pack $w1.lab -side top -padx 3m -fill x bind $lst "::speaker::find_lst" $lst conf -font list # set w2 [frame $w.bot -relief raised -bd 1] pack $w2 -side bottom -fill both button $w2.fin -text [Local "Find next"] -command {::speaker::find_next} -default active #button $w2.pur -text [Local "Remove unused"] -command {::speaker::purge; ::speaker::find_refr} button $w2.clo -text [Local "Close"] -command "destroy $w" pack $w2.fin $w2.clo -side left -padx 3m -pady 3m -fill x -expand true bind $w "tkButtonInvoke $w2.fin" bind $w "tkButtonInvoke $w2.clo" # Toplevel windows do not inherit '.' bindings bind $w "PlayOrPause; break" bind $w "::speaker::find_next; break" bind $w "::speaker::find_next -1; break" variable idx "" CenterWindow $w } # Sorted list of all registred names proc find_names {} { variable list set spklst {} foreach {name id} [array get list] { set l [concat $id [get_atts $id]] lappend spklst $l } set spklst [lsort -dictionary -index 1 $spklst] set n {} variable ids {} foreach l $spklst { lappend n [lformat [lrange $l 1 end] {30 1 1 3 10 3}] lappend ids [lindex $l 0] } return $n } proc find_refr {} { variable lst #purge $lst delete 0 end eval $lst insert end [find_names] } proc find_next {{dir 1}} { variable id1 if {$id1 != ""} { TextNextTurn $dir $id1 } } proc find_lst {} { variable lst set idx [$lst curselection] if {$idx == ""} return variable ids #variable id1 [search_id [$lst get $idx]] variable id1 [lindex $ids $idx] if {$id1 == ""} { $lst delete 0 end eval $lst insert end [find_names] } else { set nb [llength [::xml::dtd::id::get_refs $id1]] variable occur "$nb reference(s)" } } # Import speakers from another XML file proc import {{filename ""} {auto 0}} { # Get filename through dialog box if {$filename == ""} { global v set types { {"XML format" {.xml .trs .spk}} {"All files" {*}} } set filename [tk_getOpenFile -filetypes $types \ -initialdir $v(trans,path) \ -title [Local "Import speakers from file"]] if {$filename == ""} return } DisplayMessage [format [Local "Importing speakers from %s..."] $filename]; update # Read speakers file (with complex trick to avoid collision of ids) set pref "import_" ::xml::dtd::id::set_prefix $pref if {[catch { set spktree [::xml::parser::read_file $filename -keepdtd 3] } err]} { ::xml::dtd::id::set_prefix "" return -code error -errorinfo $::errorInfo "Couldn't import speakers from $filename" } ::xml::dtd::id::set_prefix "" # Transform into list set spklst {} foreach speaker [$spktree getElementChilds "Speaker"] { if {[search_id [$speaker getAttr "name"]] == ""} { set id [$speaker getAttr "id"] if {$auto} { eval create [get_atts $pref$id] } else { lappend spklst [get_atts $pref$id] } } } $spktree deltree if {$auto} return set spklst [lsort -dictionary -index 0 $spklst] set spknam "" set glblst {} set nb 0 foreach l $spklst { lappend spknam [lformat $l {30 1 1 3 10 3}] if {[lindex $l 5] == "global"} { lappend glblst $nb } incr nb } # Select items from list set f .imp CreateModal $f "Import speakers" set w1 [frame $f.top -relief raised -bd 1] pack $w1 -side top -fill both -expand true variable lst [ListFrame $w1.lst $spknam] $lst selection set 0 end #set w2 [frame $w1.but -relief raised -bd 1] #pack $lst $w2 -side left -fill both -expand true button $w1.glb -text [Local "Select global speakers"] -command "$lst selection clear 0 end; foreach i {$glblst} {$lst selection set \$i}" button $w1.all -text [Local "Select all"] -command "$lst selection set 0 end" button $w1.no -text [Local "Deselect all"] -command "$lst selection clear 0 end" pack $w1.glb $w1.all $w1.no -side left -padx 3m -pady 3m -fill x -expand true $lst conf -selectmode multiple -font list -width 40 global dial OkCancelFrame $f.bot dial(result) $f.bot.ok conf -command "set dial(sel) \[$lst curselection]; [$f.bot.ok cget -command]" WaitForModal $f $f dial(result) if {$dial(result) == "OK"} { foreach i $dial(sel) { eval create [lindex $spklst $i] } set ::v(speakerFile) $filename } return } proc Maj_bdg {{filename ""}} { variable listg # Get filename through dialog box if {$filename == ""} { global v set types { {"XML format" {.xml .trs .spk}} {"All files" {*}} } set filename [tk_getOpenFile -filetypes $types \ -initialdir $v(trans,path) \ -title [Local "Import global speakers from file"]] if {$filename == ""} return } # Read speakers file (with complex trick to avoid collision of ids) set pref "maj_" ::xml::dtd::id::set_prefix $pref if {[catch { set spktree [::xml::parser::read_file $filename -keepdtd 3] } err]} { ::xml::dtd::id::set_prefix "" return -code error -errorinfo $::errorInfo "Couldn't import global speakers from $filename" } ::xml::dtd::id::set_prefix "" # Transform into list set spklst {} foreach speaker [$spktree getElementChilds "Speaker"] { set id [$speaker getAttr "id"] lappend spklst [get_atts $pref$id] } $spktree deltree set spklst [lsort -dictionary -index 0 $spklst] set spknam "" set spk_global {} set chklst {} set nb 0 foreach l $spklst { #lappend spknam [lformat $l {30 1 1 3 10 3}] if {[lindex $l 5] == "global"} { lappend spk_global $l lappend spknam [lformat $l {30 1 1 3 10 3}] if {[lindex $l 1] == "yes"} { lappend chklst $nb } incr nb } } # Select items from list set f .imp CreateModal $f "Import global speakers" set w1 [frame $f.top -relief raised -bd 1] pack $w1 -side top -fill both -expand true variable lst [ListFrame $w1.lst $spknam] $lst selection set 0 end #set w2 [frame $w1.but -relief raised -bd 1] #pack $lst $w2 -side left -fill both -expand true button $w1.glb -text [Local "Select checked speakers"] -command "$lst selection clear 0 end; foreach i {$chklst} {$lst selection set \$i}" button $w1.all -text [Local "Select all"] -command "$lst selection set 0 end" button $w1.no -text [Local "Deselect all"] -command "$lst selection clear 0 end" pack $w1.glb $w1.all $w1.no -side left -padx 3m -pady 3m -fill x -expand true $lst conf -selectmode multiple -font list -width 40 global dial OkCancelFrame $f.bot dial(result) $f.bot.ok conf -command "set dial(sel) \[$lst curselection]; [$f.bot.ok cget -command]" WaitForModal $f $f dial(result) if {$dial(result) == "OK"} { foreach i $dial(sel) { if {![info exist listg([lindex [lindex $spk_global $i] 0 ])]} { eval create_glob [lindex $spk_global $i] } if {[info exist listg([lindex [lindex $spk_global $i] 0 ])] && [lindex [lindex $spk_global $i] 1 ] == "yes"} { eval create_glob [lindex $spk_global $i] } } store_dbg } return } proc importg {filename} { # prodedure create by Mathieu MANTA on January 20th, 2005 # It simply disables the import of the external speaker database, # and will be enable in a future release when the speaker database # will be rethink # The previous proc has been renamed to importg_old } proc importg_old {filename} { # Mathiau MANTA, January 20th, 2005 # Old importg procedure # It has been renamed to be desabled global v global env variable listg variable spklst variable spktree variable list_globale if {![file exist $filename] || [file isdirectory $filename]} { set v(trans,speakerg) [::xml::element "Trans"] set id1 [::xml::element "Speakers" {} -in $v(trans,speakerg)] set id0 [::xml::element "Episode" {} -in $v(trans,speakerg)] return } if {[info exists spktree]} { catch {$spktree deltree} unset spktree } set pref "importg_" ::xml::dtd::id::set_prefix $pref if {[catch { set spktree [::xml::parser::read_file $filename -keepdtd 3] } err]} { ::xml::dtd::id::set_prefix "" return -code error -errorinfo $::errorInfo "Couldn't import speakers from $filename" } set v(trans,speakerg) $spktree ::xml::dtd::id::set_prefix "" # Transform into list set spklst {} foreach speaker [$spktree getElementChilds "Speaker"] { set id [$speaker getAttr "id"] lappend spklst [get_atts $pref$id] if {[lindex [get_atts $pref$id] 5] == "global" && ![info exist listg([lindex [get_atts $pref$id] 0])]} { set listg([lindex [get_atts $pref$id] 0]) $pref$id set list_globale([lindex [get_atts $pref$id] 0],id) $pref$id set list_globale([lindex [get_atts $pref$id] 0],name) [lindex [get_atts $pref$id] 0] set list_globale([lindex [get_atts $pref$id] 0],check) [lindex [get_atts $pref$id] 1] set list_globale([lindex [get_atts $pref$id] 0],type) [lindex [get_atts $pref$id] 2] set list_globale([lindex [get_atts $pref$id] 0],dialect) [lindex [get_atts $pref$id] 3] set list_globale([lindex [get_atts $pref$id] 0],accent) [lindex [get_atts $pref$id] 4] set list_globale([lindex [get_atts $pref$id] 0],scope) [lindex [get_atts $pref$id] 5] } } } proc import_dbg {} { global v global env variable listg variable list_globale set types { {"XML format" {.xml .trs .spk}} {"All files" {*}} } set filename [tk_getOpenFile -filetypes $types \ -initialdir $v(trans,path) \ -title [Local "Import speakers from file"]] if {$filename == ""} return #import $filename importg $filename importg $env(HOME)/[file tail $v(list,ext)] } proc store_dbg {} { # prodedure create by Mathieu MANTA on January 17th, 2005 # It simply disables the storing of the external speaker database, # and will be enable in a future release when the speaker database # will be rethink # The previous proc has been renamed to store_dbg_old return } proc store_dbg_old {} { # Mathiau MANTA, January 17th, 2005 # Old store_dbg procedure # It has been renamed to be desabled global v global env variable list_globale variable listg variable id_test set v(lspeaker) {} set pref "store_" #set id 0 #Mise jour de list_globale if {[file tail $v(list,ext)] == ""} { return } foreach {name id1} [array get list_globale] { set taille [string length $name] set val "" append val [string index $name [expr ($taille -2)]] [string index $name [expr ($taille -1)]] if {![string compare $val "id"]} { if {![info exist listg([string range $name 0 [expr ($taille -4)]])]} { if {[info exist list_globale($name)]} { unset list_globale($name) } } } } #Mise en forme de la liste globale de speaker foreach {name id1} [array get listg] { lappend v(lspeaker) [list "id" $pref$id_test "name" $list_globale($name,name) "check" $list_globale($name,check) "type" $list_globale($name,type) \ "dialect" $list_globale($name,dialect) "accent" $list_globale($name,accent) "scope" $list_globale($name,scope)] incr id_test } #Important : permet de faire un reset de certaines variables if {[info exist v(trans,store)]} { # ::xml::dtd::id::set_prefix "importg_store_" # catch {$v(trans,store) deltree} } ::xml::dtd::id::set_prefix "" set v(trans,store) [::xml::element "Trans"] set id1 [::xml::element "Speakers" {} -in $v(trans,store)] foreach speak $v(lspeaker) { set id0 [::xml::element "Speaker" $speak -in $id1] } set id0 [::xml::element "Episode" {} -in $v(trans,store)] #set name [file join $env(HOME) $v(list,ext)] ::xml::parser::write_file $env(HOME)/[file tail $v(list,ext)] $v(trans,store) #if {[info exist v(trans,speakerg)]} { # $v(trans,speakerg) deltree #} set v(trans,speakerg) $v(trans,store) } proc modify_dbg {tuple} { variable listg variable list_globale set list_globale([lindex $tuple 1],id) $listg([lindex $tuple 0]) set list_globale([lindex $tuple 1],name) [lindex $tuple 1] set list_globale([lindex $tuple 1],check) [lindex $tuple 2] set list_globale([lindex $tuple 1],type) [lindex $tuple 3] set list_globale([lindex $tuple 1],dialect) [lindex $tuple 4] set list_globale([lindex $tuple 1],accent) [lindex $tuple 5] set list_globale([lindex $tuple 1],scope) [lindex $tuple 6] set listg([lindex $tuple 1]) $listg([lindex $tuple 0]) if {[string compare [lindex $tuple 1] [lindex $tuple 0]] != 0} { # unset list_globale([lindex $tuple 0],id) # unset list_globale([lindex $tuple 0],name) # unset list_globale([lindex $tuple 0],check) # unset list_globale([lindex $tuple 0],type) # unset list_globale([lindex $tuple 0],dialect) # unset list_globale([lindex $tuple 0],accent) # unset list_globale([lindex $tuple 0],scope) # unset listg([lindex $tuple 0]) } } proc modify_dbg_old {tuple} { variable listg variable list_globale set list_globale([lindex $tuple 1],id) $listg([lindex $tuple 0]) set list_globale([lindex $tuple 1],name) [lindex $tuple 1] set list_globale([lindex $tuple 1],check) [lindex $tuple 2] set list_globale([lindex $tuple 1],type) [lindex $tuple 3] set list_globale([lindex $tuple 1],dialect) [lindex $tuple 4] set list_globale([lindex $tuple 1],accent) [lindex $tuple 5] set list_globale([lindex $tuple 1],scope) [lindex $tuple 6] set listg([lindex $tuple 1]) $listg([lindex $tuple 0]) if {[string compare [lindex $tuple 1] [lindex $tuple 0]] != 0} { unset list_globale([lindex $tuple 0],id) unset list_globale([lindex $tuple 0],name) unset list_globale([lindex $tuple 0],check) unset list_globale([lindex $tuple 0],type) unset list_globale([lindex $tuple 0],dialect) unset list_globale([lindex $tuple 0],accent) unset list_globale([lindex $tuple 0],scope) unset listg([lindex $tuple 0]) } } proc update_dbg {} { global v global env import_dbg store_dbg reset_dbg ::speaker::importg $env(HOME)/[file tail $v(list,ext)] } proc del_spkg {name} { variable listg variable list_globale unset listg($name) } proc undo_del_spkg {} { variable listg variable list_globale if {[info exist listg]} { unset listg } foreach {name id} [array get list_globale] { set taille [string length $name] set val "" append val [string index $name [expr ($taille -2)]] [string index $name [expr ($taille -1)]] if {![string compare $val "id"]} { set listg([string range $name 0 [expr ($taille -4)]]) $list_globale([string range $name 0 [expr ($taille -4)]],id) } } } proc reset_dbg {} { variable spktree variable list_globale variable listg if {[info exist listg]} { unset listg } if {[info exist list_globale]} { unset list_globale } if {[info exist spktree]} { catch {$spktree deltree} unset spktree } } proc attributs_local {} { global v variable lst_local variable lst_import variable loc variable listg if {[$lst_local curselection] != ""} { set v(loc) [lformat [get_atts $listg([$lst_local get [$lst_local curselection]])] {30 3 7 9 10 6} ] # set v(loc) [$lst_local get [$lst_local curselection]] } if {[info exist loc([$lst_local get [$lst_local curselection]])]} { set index [lsearch -exact [$lst_import get 0 end] [$lst_local get [$lst_local curselection]]] $lst_import selection clear 0 end $lst_import selection set $index $lst_import see $index set v(glob) [lformat [get_atts $loc([$lst_import get [$lst_import curselection]])] {30 3 7 9 10 6} ] } else { $lst_import selection clear 0 end set v(glob) "" } } proc attributs_import {} { global v variable lst_local variable lst_import variable loc variable listg if {[$lst_import curselection] != ""} { set v(glob) [lformat [get_atts $loc([$lst_import get [$lst_import curselection]])] {30 3 7 9 10 6} ] # set v(glob) [$lst_import get [$lst_import curselection]] if {[info exist listg([$lst_import get [$lst_import curselection]])]} { set index [lsearch -exact [$lst_local get 0 end] [$lst_import get [$lst_import curselection]]] $lst_local selection clear 0 end $lst_local selection set $index $lst_local see $index set v(loc) [lformat [get_atts $listg([$lst_local get [$lst_local curselection]])] {30 3 7 9 10 6} ] } else { $lst_local selection clear 0 end set v(loc) "" } } } } namespace eval turn { variable list_atts {"speaker" "mode" "fidelity" "channel"} # returns speaker ids and other attributes for given turn as a list # {speaker_ids mode fidelity} proc get_atts {item} { variable list_atts foreach attr $list_atts { lappend vals [$item getAttr $attr] } return $vals } # We could append gender to speaker name ? proc get_name {turn} { return [::speaker::name [lindex [get_atts $turn] 0]] } # Set attributes as a list {speaker_ids mode fidelity} for the given turn # and update display and undo infos proc set_atts {turn vals} { global v # Register old turn attributes for undo DoModif [list "TURN" $turn [get_atts $turn]] # Update transcription variable list_atts foreach attr $list_atts val $vals { $turn setAttr $attr $val } # Refresh display update $turn } proc update {turn} { global v set name [get_name $turn] # Update segmentation set nb [SearchSegmtId seg1 $turn] SetSegmtField seg1 $nb -text $name # Update editor button set button $v(tk,edit).[namespace tail $turn] $button config -text $name } # Called from menu or button : choose speaker for given or current turn proc edit {{turn ""}} { global v if {$turn == ""} { if {![info exist v(segmt,curr)]} return set turn [[GetSegmtId $v(segmt,curr)] getFather] } catch { set_atts $turn [choose [get_atts $turn] 0 $turn] } } # Let user choose a speaker between existing ones variable mod "" variable fid "" variable cha "" proc choose {atts {start 0} {turn ""}} { variable ids variable pos $start variable newpos $start variable id1 variable ovl variable mod variable fid variable cha variable nam variable chk variable exp variable typ variable dia variable acc variable ::speaker::recent variable state variable name_g "" # added by Zhibiao variable role variable age variable birth variable education variable group variable language variable ses variable sex # get speaker list and overlap state set ids [lindex $atts 0] set id1 [lindex $ids $pos] if {[llength $ids] > 1} { set ovl 1 } else { set ovl 0 } set ini_ovl $ovl # If not given, keep previous mode and fidelity if {[llength $atts] > 1} { set mod [lindex $atts 1] } if {[llength $atts] > 2} { set fid [lindex $atts 2] } set cha [lindex $atts 3] # set pad 1m set w [CreateModal .turn "Edit turn attributes"] # set w3 [frame $w.top -relief raised -bd 1] pack $w3 -side top -fill both checkbutton $w3.0 -text [Local "Overlapping speech"] -variable ::turn::ovl -command "::turn::choose_overlap" radiobutton $w3.1 -text [Local "Choose first speaker"] -variable ::turn::newpos -value 0 -command "::turn::choose_register; ::turn::choose_switch" radiobutton $w3.2 -text [Local "Choose second speaker"] -variable ::turn::newpos -value 1 -command "::turn::choose_register; ::turn::choose_switch" pack $w3.0 $w3.1 $w3.2 -side left -anchor w -padx $pad -pady $pad -expand true # set w0 [frame $w.mid] pack $w0 -side top -fill both -expand true # set w1 [frame $w0.left -relief raised -bd 1] pack $w1 -side left -fill both -expand true # set w2 [frame $w0.right -relief raised -bd 1] pack $w2 -side top -fill both -expand true set w2l [frame $w2.list -relief raised -bd 1] pack $w2l -side left -fill both -expand true set w2lg [frame $w2.listg -relief raised -bd 1] pack $w2lg -side left -fill both -expand true set w3i [frame $w0.otheri -relief raised -bd 1] # set w11 [frame $w1.up] pack $w11 -side top -fill both -expand 1 variable new [button $w11.new -text [Local "Create speaker"] -command {::turn::choose_new}] pack $w11.new -side left -padx $pad -pady $pad -expand true variable edit [button $w11.edit -text [Local "Modify speaker"] -command {::turn::choose_edit}] pack $w11.edit -side left -padx $pad -pady $pad -expand true # set w12 [frame $w1.spkatt] variable watt $w12 pack $w12 -side top -fill both -expand 1 variable ent [EntryFrame $w12.nam "Name" ::turn::nam] frame $w12.bts pack $w12.bts -side top -expand true -anchor w checkbutton $w12.bts.chk -text [Local "spelling checked"] -var ::turn::chk -onvalue "yes" -offvalue "no" -state disabled checkbutton $w12.bts.exp -text [Local "global name"] -var ::turn::exp -onvalue "global" -offvalue "local" -state disabled pack $w12.bts.chk $w12.bts.exp -side left -padx $pad -pady $pad -expand true -anchor w MenuFrame $w12.typ "Type" ::turn::typ {"male" "female" "unknown"} MenuFrame $w12.dia "Dialect" ::turn::dia {"native" "nonnative"} if {$::v(chatMode)} { #### added by Zhibiao EntryFrame $w12.role "CH_Role" ::turn::role EntryFrame $w12.age "CH_Age" ::turn::age EntryFrame $w12.birth "CH_Birth" ::turn::birth EntryFrame $w12.education "CH_Education" ::turn::education EntryFrame $w12.group "CH_Group" ::turn::group EntryFrame $w12.langauge "CH_Language" ::turn::language EntryFrame $w12.ses "CH_Ses" ::turn::ses EntryFrame $w12.sex "CH_Sex" ::turn::sex # added end } entry $w12.dia.acc -text ::turn::acc -width 15 pack $w12.dia.acc -expand true -side left -padx $pad -pady $pad #EntryFrame $w12.acc "Accent" ::turn::acc # set w21 [frame $w2l.up] pack $w21 -side top -fill both #label $w2.lab -text [Local "Choose speaker"] #pack $w2.lab -side top -padx $pad -pady $pad -expand true set w211 [frame $w21.mid] pack $w211 -side top -fill x #if {[llength $ids] <= 1} radiobutton $w211.none -text [Local "no speaker"] -variable ::turn::nam -value "" -command {::turn::choose_empty} pack $w211.none -side left -padx $pad -pady $pad if {[llength $recent] > 0} { label $w21.lab -text [Local "Recently used speakers"]: pack $w21.lab -side top -padx $pad -anchor w foreach i [lrange $recent 0 2] { radiobutton $w21.$i -text [string range [::speaker::name $i] 0 20] -variable ::turn::id1 -value $i -command "::turn::choose_recent $i" pack $w21.$i -side top -anchor w -padx $pad } } # set w22 [frame $w2l.down] pack $w22 -side left -fill both -expand 1 variable lst [ListFrame $w22.lst [::speaker::all_names]] bind $lst "::turn::choose_lst" bind $lst "::turn::choose_lst" # key up/down let control choice in local list of speakers bind $w "tkListboxUpDown $lst -1; ::turn::choose_lst" bind $w "tkListboxUpDown $lst 1; ::turn::choose_lst" set w33lg [frame $w2lg.f2] pack $w33lg -side left -fill both -expand 1 variable titre_l [label $w33lg.l -text [Local "External Speakers Database :"]] pack $w33lg.l -side top variable lstg [ListFrame $w33lg.lstg [::speaker::global_names]] bind $lstg "::turn::choose_lstg" bind $lstg "::turn::del_bdg" set w33bg1 [frame $w3i.f1] pack $w33bg1 -side top -fill both -expand 1 variable synchro # Detect normal keypress when entry is disabled foreach key {Control-Key Alt-Key Meta-Key Return Escape Tab} { bind $ent <$key> {continue} } bind $ent {set k %A; if {$k != "" && $::turn::state == "choose"} {::turn::choose_new}} # set w4 [frame $w.comp -relief raised -bd 1] pack $w4 -after $w0 -fill x -expand 0 MenuFrame $w4.mod "Mode" ::turn::mod {"spontaneous" "planned"} MenuFrame $w4.fid "Fidelity" ::turn::fid {"high" "medium" "low"} MenuFrame $w4.cha "Channel" ::turn::cha {"studio" "telephone"} pack $w4.mod $w4.fid $w4.cha -side left choose_overlap choose_recent $id1 #OkCancelFrame $w.bot dial(result) {"OK" "Cancel"}; return if {$turn != ""} { set buttons {"OK" "Destroy" "Cancel"} } else { set buttons {"OK" "Cancel"} } set result [OkCancelModal $w $ent $buttons] if {$result != "OK"} { if {$result == "Destroy"} { ::speaker::undo_del_spkg JoinTransTags 1 $turn } ::speaker::undo_del_spkg return -code error cancel } ::turn::choose_register ::speaker::most_recent $ids # Check if overlapping state changed if {$turn != "" && $ovl != $ini_ovl} { if {$ovl} { DoWho $turn } else { NoWho $turn } } return [list $ids $mod $fid $cha] } proc choose_register {} { global env global v variable lst variable lstg variable id1 variable nam variable chk variable exp variable typ variable dia variable acc variable pos variable ids variable ovl variable state variable name_g variable egal # added by Zhibiao variable role variable age variable birth variable education variable group variable language variable ses variable sex set cross_edit "false" set idg [::speaker::search_idg $nam] set idl [::speaker::search_id $nam] if {$state == "choose"} { ::speaker::store_dbg } if {$state == "new"} { if {$::v(chatMode)} { set id1 [::speaker::create $nam $chk $typ $dia $acc $exp $role $age $birth $education $group $language $ses $sex] } else { set id1 [::speaker::create $nam $chk $typ $dia $acc $exp] } } elseif {$state == "edit"} { set cross_edit "true" if { [::speaker::search_idg [lindex [::speaker::get_atts $id1] 0]] != ""} { if {$exp != "global"} { set answer [tk_messageBox -message "$nam isn't a global name, it's impossible to synchronize local and external database !" -type ok] return } if {$egal == "true"} { set state "editg" } set name_g [lindex [::speaker::get_atts $id1] 0] } ::speaker::store_dbg set id [::speaker::search_id $nam] if {$id != "" && $id != $id1} { set answer [tk_messageBox -message "Speaker $nam already exists. Replace [::speaker::name $id1] with $nam everywhere?" -type yesno -icon question] if {$answer == "yes"} { ::speaker::replace $id1 $id set id1 $id } } else { if {$::v(chatMode)} { ::speaker::set_atts $id1 [list $nam $chk $typ $dia $acc $exp $role $age $birth $education $group $language $ses $sex] } else { ::speaker::set_atts $id1 [list $nam $chk $typ $dia $acc $exp] } } } if {$state == "delg"} { ::speaker::store_dbg } if {$state == "editg"} { set idg [::speaker::search_idg $nam] if {$idg != ""} { if {$exp != "global"} { set answer [tk_messageBox -message "$nam isn't a global name, it's impossible to synchronize local and external database !" -type ok] return } if {$nam == $name_g} { set answer "yes" set answer_dbg "yes" } else { set answer "yes" set answer_dbg "no" } if {$answer == "yes"} { if {$answer_dbg == "yes"} { ::speaker::store_dbg ::speaker::modify_dbg [list $name_g $nam $chk $typ $dia $acc "global"] ::speaker::store_dbg ::speaker::reset_dbg ::speaker::importg $env(HOME)/[file tail $v(list,ext)] } if {$egal == "false"} { set cross_edit "true" } if {$cross_edit == "false"} { if {[::speaker::search_id $name_g] != ""} { set id [::speaker::search_id $nam] if {$id != "" && $id != $id1} { set answer [tk_messageBox -message "Speaker $nam already exists. Replace [::speaker::name $id1] with $nam everywhere?" -type yesno -icon question] if {$answer == "yes"} { ::speaker::replace $id1 $id set id1 $id } } else { if {$::v(chatMode)} { ::speaker::set_atts $id1 [list $nam $chk $typ $dia $acc $exp $role $age $birth $education $group $language $ses $sex] } else { ::speaker::set_atts $id1 [list $nam $chk $typ $dia $acc $exp] } } } else { set id1 [::speaker::create $nam $chk $typ $dia $acc $exp] } } } } else { if {$cross_edit == "false"} { if {[::speaker::search_id $name_g] != ""} { set id [::speaker::search_id $nam] if {$id != "" && $id != $id1} { set answer [tk_messageBox -message "Speaker $nam already exists. Replace [::speaker::name $id1] with $nam everywhere?" -type yesno -icon question] if {$answer == "yes"} { ::speaker::replace $id1 $id set id1 $id } } else { if {$::v(chatMode)} { ::speaker::set_atts $id1 [list $nam $chk $typ $dia $acc $exp $role $age $birth $education $group $language $ses $sex] } else { ::speaker::set_atts $id1 [list $nam $chk $typ $dia $acc $exp] } } } else { set id1 [::speaker::create $nam $chk $typ $dia $acc $exp] } } } } if {$id1 == ""} { if {$ovl} { set pos [expr 1-$pos] set ovl 0 catch {choose_overlap} } else { set ids [lreplace $ids $pos $pos] } } else { set ids [lreplace $ids $pos $pos $id1] } if {$state == "new"} { if {$exp == "global" } { set id_glob [::speaker::search_idg $nam] if { $id_glob != "" } { if {[lindex [::speaker::get_atts $id_glob] 1] == $chk\ &&\ [lindex [::speaker::get_atts $id_glob] 2] == $typ\ &&\ [lindex [::speaker::get_atts $id_glob] 3] == $dia\ &&\ [lindex [::speaker::get_atts $id_glob] 4] == $acc\ &&\ [lindex [::speaker::get_atts $id_glob] 5] == $exp } { } else { set answer [tk_messageBox -type okcancel -message "Speaker $nam already exists in the external database, Replace it ?"] if {$answer == "ok"} { ::speaker::create_glob $nam $chk $typ $dia $acc $exp } } } else { #::speaker::create_glob $nam $chk $typ $dia $acc "global" } } ::speaker::store_dbg } } proc choose_overlap {} { variable ovl variable pos variable newpos variable ids variable id1 if {$ovl} { pack .turn.top.1 .turn.top.2 -side left -anchor w -padx 3m -pady 3m -expand true if {$ids == ""} { lappend ids "" } if {[llength $ids] <= 1} { choose_register lappend ids [::speaker::second_one $ids] set newpos 1 choose_switch } } else { pack forget .turn.top.1 .turn.top.2 if {[llength $ids] > 1} { set ids [lindex $ids $pos] set newpos 0 choose_switch } } } proc choose_switch {} { variable id1 variable pos variable newpos variable ids set pos $newpos set id1 [lindex $ids $pos] choose_recent $id1 } proc choose_new {} { variable id1 "" variable nam "" variable chk "no" variable exp "local" variable typ "" variable dia "native" variable acc "" variable state "new" variable edit variable del # added by Zhibiao variable role variable age variable birth variable education variable group variable language variable ses variable sex $edit conf -state disabled variable lst variable lstg $lst selection clear 0 end $lstg selection clear 0 end variable watt FrameState $watt 1 #foreach w {nam.ent typ.men chk dia.men} { # FrameState $watt.$w 1 #} variable ent variable ::speaker::nb #nicolas $ent insert insert [format $::v(newSpeakerFmt) $nb] #$ent insert insert "speaker\#$nb" $ent select range 0 end focus $ent } proc choose_lst {} { variable lst variable lstg variable egal if {[$lst curselection] != ""} { $lstg selection clear 0 end #$lst configure -selectbackground grey $lst configure -selectforeground white set id [::speaker::search_id [$lst get [$lst curselection]]] choose_id $id set id_glob [::speaker::search_idg [$lst get [$lst curselection]]] if {$id_glob != ""} { set index [lsearch -exact [$lstg get 0 end] [$lst get [$lst curselection]]] $lstg selection clear 0 end $lstg selection set $index $lstg see $index if {[lindex [::speaker::get_atts $id_glob] 1] == [lindex [::speaker::get_atts $id] 1] \ && \ [lindex [::speaker::get_atts $id_glob] 2] == [lindex [::speaker::get_atts $id] 2] \ && \ [lindex [::speaker::get_atts $id_glob] 3] == [lindex [::speaker::get_atts $id] 3] \ &&\ [lindex [::speaker::get_atts $id_glob] 4] == [lindex [::speaker::get_atts $id] 4]\ &&\ [lindex [::speaker::get_atts $id_glob] 5] == [lindex [::speaker::get_atts $id] 5]} { $lstg configure -selectforeground white $lst configure -selectforeground white set egal "true" } else { set egal "false" $lstg configure -selectforeground red $lst configure -selectforeground white } } } } proc choose_lstg {} { variable lstg variable lst variable egal if {[$lstg curselection] != ""} { $lst selection clear 0 end $lstg configure -selectforeground white set id [::speaker::search_idg [$lstg get [$lstg curselection]]] choose_idg $id set id_loc [::speaker::search_id [$lstg get [$lstg curselection]]] if {$id_loc != ""} { set index [lsearch -exact [$lst get 0 end] [$lstg get [$lstg curselection]]] $lst selection clear 0 end $lst selection set $index $lst see $index if {[lindex [::speaker::get_atts $id_loc] 1] == [lindex [::speaker::get_atts $id] 1] \ && \ [lindex [::speaker::get_atts $id_loc] 2] == [lindex [::speaker::get_atts $id] 2] \ && \ [lindex [::speaker::get_atts $id_loc] 3] == [lindex [::speaker::get_atts $id] 3] \ &&\ [lindex [::speaker::get_atts $id_loc] 4] == [lindex [::speaker::get_atts $id] 4]\ &&\ [lindex [::speaker::get_atts $id_loc] 5] == [lindex [::speaker::get_atts $id] 5] } { $lstg configure -selectforeground white $lst configure -selectforeground white set egal "true" } else { set egal "false" $lstg configure -selectforeground white $lst configure -selectforeground red } } } } proc choose_empty {} { choose_recent "" } proc choose_recent {id} { variable lst variable lstg if {$id != ""} { set index [lsearch [::speaker::all_names] [::speaker::name $id]] $lst selection clear 0 end $lst selection set $index $lst see $index $lst configure -selectforeground white set id_glob [::speaker::search_idg [$lst get [$lst curselection]]] if {$id_glob != ""} { set index [lsearch -exact [$lstg get 0 end] [$lst get [$lst curselection]]] $lstg selection clear 0 end $lstg selection set $index $lstg see $index if {[lindex [::speaker::get_atts $id_glob] 1] == [lindex [::speaker::get_atts $id] 1] \ &&\ [lindex [::speaker::get_atts $id_glob] 2] == [lindex [::speaker::get_atts $id] 2]\ &&\ [lindex [::speaker::get_atts $id_glob] 3] == [lindex [::speaker::get_atts $id] 3]\ &&\ [lindex [::speaker::get_atts $id_glob] 4] == [lindex [::speaker::get_atts $id] 4]\ &&\ [lindex [::speaker::get_atts $id_glob] 5] == [lindex [::speaker::get_atts $id] 5]} { $lstg configure -selectforeground white } else { $lstg configure -selectforeground red $lst configure -selectforeground white } } } else { $lst selection clear 0 end } choose_id $id } proc choose_edit {} { variable state "edit" variable watt variable lst variable lstg variable new variable id1 if {[llength [$lst curselection]] == 0 } { variable name_g [$lstg get [$lstg curselection]] set state "editg" } if {[$new cget -state] == "disabled" && [llength [$lst curselection]] != 0} { variable name_g [$lstg get [$lstg curselection]] set state "editg" } FrameState $watt 1 } proc choose_id {id} { variable id1 $id variable nam "" variable chk "" variable exp variable typ "" variable dia "" variable acc "" variable state "choose" variable edit variable del variable new # added by zhibiao variable role "" variable age variable birth variable education variable group variable language variable ses variable sex # added end if {$id != ""} { if {$::v(chatMode)} { foreach {nam chk typ dia acc exp role age birth education group language ses sex} [::speaker::get_atts $id] {} } else { foreach {nam chk typ dia acc exp} [::speaker::get_atts $id] {} } $edit conf -state normal $new conf -state normal } else { $edit conf -state disabled } variable watt FrameState $watt 0 #foreach w {nam.ent typ.men chk dia.men} { # FrameState $watt.$w 0 #} } proc choose_idg {id} { #variable id1 $id variable id1 variable nam "" variable chk "" variable exp variable typ "" variable dia "" variable acc "" #variable state "choose" variable state "new" variable edit variable del variable new # added by zhibiao variable role "" variable age variable birth variable education variable group variable language variable ses variable sex # added end variable lst if {[$lst curselection] != ""} { set name [$lst get [$lst curselection]] set id1 [::speaker::search_id $name ] } if {$id != ""} { if {$::v(chatMode)} { foreach {nam chk typ dia acc exp role age birth education group language ses sex} [::speaker::get_atts $id] {} } else { foreach {nam chk typ dia acc exp} [::speaker::get_atts $id] {} } $edit conf -state normal $new conf -state disabled } else { $edit conf -state disabled } variable watt FrameState $watt 0 } proc del_bdg {} { variable lstg variable lst variable del variable ent variable watt variable nam variable listg variable list_globale variable state "delg" variable new variable edit variable id1 if {[$lstg curselection] == ""} { return } set name [$lstg get [$lstg curselection]] $lstg delete [$lstg curselection] FrameState $watt 0 set nam "" set id1 [::speaker::create ""] #$del conf -state disabled $edit conf -state disabled $new conf -state disabled ::speaker::del_spkg $name $lst configure -selectforeground white } proc maj_liste_globale {} { variable lstg if {[info exist lstg]} { catch { $lstg delete 0 end} catch {eval $lstg insert end [::speaker::global_names]} } } } transcriber-1.5.1.1/tcl/Interface.tcl0000444000175000017500000006675410174216564015243 0ustar rtrt# RCS: @(#) $Id: Interface.tcl,v 1.23 2005/01/21 15:19:16 mantam Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ################################################################ proc BuildGUI {} { LoadImages CreateFonts CreateWidgets SetBindings InitMenus update } ####################################################################### # Generation of user interface : widgets, bindings, menus proc LoadImages {} { global v # foreach {name} { } { # set photo [image create photo ${name}Img] # $photo read [file join $v(path,image) $name.gif] # } foreach {name} { play pause forward backward circle circle2 over1 over2 music musicl musicr next previous} { set v(img,$name) [image create bitmap -file [file join $v(path,image) $name.bmp]] } $v(img,circle) conf -foreground $v(color,bg-sync) $v(img,circle2) conf -foreground $v(color,bg-sync) $v(img,over1) conf -foreground $v(color,bg-sync) $v(img,over2) conf -foreground $v(color,bg-sync) } # Create configurable named fonts for later use proc CreateFonts {} { global v foreach var [array names v "font,*"] { set name [string range $var [string length "font,"] end] catch { eval font create $name [font actual $v(font,$name)] } } } ####################################################################### proc CreateWidgets {} { # JOB: create all the widgets of the interface # # IN: nothing # OUT: nothing # MODIFY: nothing # # Author: Claude Barras, Sylvain Galliano # Version: 1.1 # Date: October 20, 2004 global v catch {destroy .edit .cmd .snd .snd2 .gain .msg} CreateTextFrame .edit CreateCommandFrame .cmd if {!$v(view,.edit)} { pack configure .snd -expand true } #CreateGainFrame .gain set v(tk,wavfm) [CreateSoundFrame .snd] CreateSoundFrame .snd2 CreateNEFrame .edit.ne CreateMessageFrame .msg if {$v(geom,.) != ""} { wm geom . $v(geom,.) } else { if {[info tclversion] >= 8.4 && [tk windowingsystem] == "aqua"} { wm geometry . [winfo screenwidth .]x[expr [winfo screenheight .]-44]+0+22 } else { wm geometry . [winfo screenwidth .]x[expr [winfo screenheight .]-44]+0+22 } } } ######################################################## proc CreateNEFrame {f} { # JOB: create the NE interface in the text widget for esay creation of entities events # # IN: f, name of the window created # OUT: nothing # MODIFY: nothing # # Author: Sylvain Galliano # Version: 1.0 # Date: October 20, 2004 global v # set the list Named Entities (NE) by macroclass set v(listNE,macroclass) {"pers" "org" "gsp" "loc" "fac" "prod" "time" "amount" "meto" "unk" "user"} if {[winfo exists $f]} {DestroyNEFrame $f} # make dynamicaly the different list of macroclass by taking the list of all the entities in the configuartion file if exists else in the default.txt foreach ent $v(entities) { set name [lindex $ent 0] # the metonymy entities are detected by the presence of the "/" character in the name if { [regexp "/" $name] } { lappend v(listNE,meto) $name continue } else { set find 0 foreach macro $v(listNE,macroclass) { if { [regexp "^$macro" $name] } { lappend v(listNE,$macro) $name set find 1 break } } # if the entity doesn't match any macroclass, add it to user entities class if { $find == 0 } { lappend v(listNE,user) $name } } } if { ![info exists v(listNE,user)] } { set v(listNE,user) "" } set v(listNE,all) [concat "$v(listNE,pers)" "$v(listNE,org)" "$v(listNE,gsp)" "$v(listNE,loc)" "$v(listNE,fac)" "$v(listNE,prod)" "$v(listNE,time)" "$v(listNE,amount)" "$v(listNE,meto)" "$v(listNE,user)"] frame $f -bd 1 -relief raised set row 0 set column 0 # create the interface with buttons foreach macro $v(listNE,macroclass) { frame $f.$macro foreach micro $v(listNE,$macro) { regsub -all {\.} $micro "" name if { $v(checkNEcolor,buton) == 1 } { button $f.$macro.$name -text $micro -font $v(font,NEbutton) -bg $v(color,netag-$macro) -pady 0 -width [maxlength $v(listNE,all)] -command "CreateAutoEvent $micro entities" } else { button $f.$macro.$name -text $micro -font $v(font,NEbutton) -pady 0 -width [maxlength $v(listNE,all)] -command "CreateAutoEvent $micro entities" } pack $f.$macro.$name -ipadx 2 } grid $f.$macro -row $row -column $column -padx 2 -pady 6 -sticky n incr column # control the number of column if {$column>2} { set column 0 incr row } unset v(listNE,$macro) } set g [frame $f.auto -borderwidth 5 -relief raised] label $g.label -text [Local Automatic] grid $g.label -row 1 -column 0 entry $g.entry -textvariable v(findNE,what) grid $g.entry -row 1 -column 1 set h [frame $g.radio -relief raised] set i [frame $h.left] set j [frame $h.right] label $i.label -text "Mode:" grid $i.label -row 0 -column 2 -padx 10 radiobutton $j.radioadd -text [Local Add] -variable v(autoNE) -value Add grid $j.radioadd -sticky w radiobutton $j.radiosup -text [Local Suppress] -variable v(autoNE) -value Suppress grid $j.radiosup -sticky w grid $i -row 1 -column 2 grid $j -row 1 -column 3 grid $h -row 1 -column 2 -columnspan 2 grid $g -pady 10 -row [expr $row+2] -column 0 -columnspan 3 if {$v(view,$f)} { pack $f -fill both -expand true } } proc DestroyNEFrame {f} { # JOB: destroy the NE interface # # IN: f, name of the NE window to destroy # OUT: nothing # MODIFY: nothing # # Author: Sylvain Galliano # Version: 1.0 # Date: October 20, 2004 global v catch {destroy $f} set v(view,$f) 0 } proc UpdateNEFrame {f} { # JOB: update the NE interface # # IN: f, name of the NE window # OUT: nothing # MODIFY: nothing # # Author: Sylvain Galliano # Version: 1.0 # Date: October 20, 2004 global v set oldview $v(view,$f) DestroyNEFrame $f set v(view,$f) $oldview CreateNEFrame $f } proc SwitchNEFrame {f} { # JOB: switch the display of the NE interface # # IN: f, name of the NE window # OUT: nothing # MODIFY: nothing # # Author: Sylvain Galliano # Version: 1.0 # Date: October 20, 2004 global v if {![winfo exists $f]} { CreateNEFrame .edit.ne } elseif {[winfo ismapped $f]} { pack forget $f } else { pack $f -fill y -side right } } proc CreateCommandFrame {f args} { global v # Commands frame frame $f -bd 1 -relief raised set v(tk,play) [button $f.play -command {PlayOrPause}] set v(tk,stop) [button $f.pause -command {PlayOrPause} -state disabled] button $f.previous -command {MoveNextSegmt -1} button $f.next -command {MoveNextSegmt +1} button $f.backward button $f.forward bind $f.backward {BeginPlayForward -1} bind $f.forward {BeginPlayForward +1} bind $f.backward {EndPlayForward} bind $f.forward {EndPlayForward} foreach but {previous backward pause play forward next} { $f.$but conf -image $v(img,$but) -width 16 -height 16 pack $f.$but -side left -padx 1 -pady 1 } $v(img,play) conf -foreground "#70c078" $v(img,pause) conf -foreground "#f08020" button $f.info -command {CreateInfoFrame} -width 16 -height 16 -bitmap info; pack $f.info -side left -padx 10 # if one wishes to have buttons for segment/turn/section creation if {0} { button $f.seg -command {InsertSegment} \ -width 16 -height 16 -image $v(img,circle) pack $f.seg -side left -padx 1 -pady 1 button $f.tur -command {ChangeSegType Turn} \ -text "Turn" -font info -padx 0 -pady 2 \ -activeforeground $v(color,fg-turn) -fg $v(color,fg-turn) \ -activebackground $v(color,bg-turn) -bg $v(color,bg-turn) pack $f.tur -side left -padx 1 -pady 1 button $f.sec -command {ChangeSegType Section} \ -text "Sect." -font info -padx 0 -pady 2 \ -activeforeground $v(color,fg-sect) -fg $v(color,fg-sect) \ -activebackground $v(color,bg-sect) -bg $v(color,bg-sect) pack $f.sec -side left -padx 1 -pady 1 } label $f.name -textvariable v(sig,shortname) -font info -padx 20 pack $f.name -side right -fill x -expand true # Default : display command frame setdef v(view,$f) 1 if {$v(view,$f)} { pack $f -fill x } } ####################################################################### proc FrameOrTop {f top title} { global v # Default : do not display frame setdef v(view,$f) 0 # Signal infos frame if {$top} { toplevel $f wm title $f $title wm protocol $f WM_DELETE_WINDOW "wm withdraw $f; set v(view,$f) 0" if {! $v(view,$f)} { wm withdraw $f } } else { frame $f -relief raised -bd 1 if {$v(view,$f)} { pack $f -fill x } } } # Signal description (not localized) proc CreateInfoFrame {{f .inf}} { global v if {![winfo exists $f]} { toplevel $f wm title $f [Local "Informations"] if {$::tcl_platform(platform) == "windows"} { wm attributes $f -topmost 1 } message $f.sig -font list -justify left \ -width 15c -anchor w -textvariable v(sig,desc) pack $f.sig -padx 3m -pady 2m -anchor w message $f.trans -font list -justify left \ -width 15c -anchor w -textvariable v(trans,desc) pack $f.trans -padx 3m -pady 2m -anchor w button $f.upd -text [Local "Update"] -command UpdateInfo pack $f.upd -side left -expand 1 -padx 3m -pady 2m button $f.close -text [Local "Close"] -command [list wm withdraw $f] pack $f.close -side left -expand 1 -padx 3m -pady 2m } else { FrontWindow $f } update UpdateInfo } proc UpdateInfo {} { global v set v(trans,desc) [eval [list format "Transcription:\t$v(trans,name)\n[Local "nb. of sections:"]\t%d\t [Local "with %d topics"]\n[Local "nb. of turns:"] \t%d\t [Local "with %d speakers"]\n[Local "nb. of syncs:"] \t%d\n[Local "nb. of words:"] \t%d"] [TransInfo]] TraceInfo } # Short file description proc UpdateShortName {} { global v set sig [file tail $v(sig,name)] set trans [file tail $v(trans,name)] if {[file root $sig] == [file root $trans]} { set v(sig,shortname) [file root $sig] } elseif {$trans == ""} { set v(sig,shortname) $sig } elseif {$sig == ""} { set v(sig,shortname) $trans } else { set v(sig,shortname) "$trans\n$sig" } update idletasks } # Vertical zoom proc CreateGainFrame {{f .gain}} { global v dial if {![winfo exists $f]} { toplevel $f wm title $f [Local "Control panel"] if {$::tcl_platform(platform) == "windows"} { wm attributes $f -topmost 1 } if {[info tclversion] < 8.4 || [tk windowingsystem] != "aqua"} { scale $f.s -label [Local "Volume"] \ -orient horiz -length 200 -width 10 \ -variable dial(volume) -command {snack::audio play_gain} pack $f.s -expand true -fill x -padx 10 -pady 5 } set v(tk,gain) [scale $f.gain -label [Local "Vertical zoom (dB)"] \ -orient horizontal -length 200 -width 10 -showvalue 1 \ -from -10 -to 20 -tickinterval 10 -resolution 1 \ -variable v(sig,gain) -command [list NewGain]] pack $f.gain -expand true -fill x -padx 10 -pady 5 # Disabled, since changing frequency is not yet available scale $f.freq -label [Local "Adjust playback speed (%)"] \ -orient horiz -length 200 -width 10 \ -from -40 -to 60 -tickinterval 20 -resolution 1 \ -command {AdjustPlaybackSpeed} #pack $f.freq -expand true -fill x -padx 10 -pady 5 button $f.close -text [Local "Close"] -command [list wm withdraw $f] pack $f.close -side bottom -expand 1 -padx 3m -pady 2m } else { FrontWindow $f } set dial(volume) [snack::audio play_gain] } proc AdjustPlaybackSpeed {val} { global v set play [IsPlaying] if {$play} {PauseAudio} set v(playbackSpeed) [expr 1.0+$val/100.0] if {$play} {Play} } proc SwitchFrame {f args} { global v if {[winfo class $f] == "Toplevel"} { # Always bring to top if {[winfo ismapped $f]} { wm withdraw $f set v(view,$f) 0 } else { wm deiconify $f set v(view,$f) 1 } } else { # Switch display/hide if {[winfo ismapped $f]} { pack forget $f set v(view,$f) 0 } else { eval pack $f -fill x $args set v(view,$f) 1 } } } ####################################################################### proc CreateMessageFrame {f} { global v label $f -font mesg -textvariable v(var,msg) \ -justify left -anchor w -bg $v(color,bg) -padx 10 -relief raised -bd 1 if {$v(view,$f)} { pack $f -fill x -side bottom } bind $f EditCursor } proc DisplayMessage {text} { global v set v(var,msg) $text } ####################################################################### proc SetBindings {} { global v # Mouse events #bind all {focus %W} # Forget existing bindings foreach b [bind .] {bind . $b {}} # Some aliases for keyboard events bind . {PlayOrPause} bind . {PlayCurrentSegmt} # alternative for Shift-Tab already defined in menu bindings catch {bind . {PlayCurrentSegmt; break}} # the break added in previous should make following useless: # bind all <> {} } ####################################################################### proc ConfigureGeneral {} { global v env # Keep initial values for 'Cancel' (but not for 'lang') foreach name { scribe,name autosave,time backup,ext encoding debug trace,name lang space,auto spell,names } { lappend initConf $name $v($name) } set f .col CreateModal $f "General options" set g [frame $f.fr0 -relief raised -bd 1] pack $g -fill both -expand true -side top EntryFrame $g.en1 "Default scribe's name" v(scribe,name) EntryFrame $g.en2 "Log trace in file" v(trace,name) #EntryFrame $g.en3 "Global speakers database" v(list,ext) # Menu to choose the default browser set i [frame $g.fr] pack $i -fill both -expand true -side top label $i.lab -text [Local "Default browser:"] set v(browser,but) [button $i.v(browser,but) -text $v(browser) -default disabled ] pack $i.lab $i.v(browser,but) -side left -padx 3m -pady 3m -fill x -expand true bind $i.v(browser,but) { set v(browser) [SelectBrowser .col.fr0.fr] $v(browser,but) configure -text $v(browser) } set g [frame $f.fr1 -relief raised -bd 1 -width 25c] pack $g -fill both -expand true -side top EntryFrame $g.en1 "Auto-save interval (in minutes)" v(autosave,time) EntryFrame $g.en2 "Backup extension" v(backup,ext) if {![catch {encoding system}]} { EncodingChooser $f } set g [frame $f.fr3 -relief raised -bd 1] pack $g -fill both -expand true -side top checkbutton $g.en7 -text [Local "Ask user to save configuration before leaving"] -variable v(keepconfig) -anchor w -padx 3m -pady 2m MenuFrame $g.defpos "Default text cursor position" v(preferedPos) { "Start of line" "End of line" } {"begin" "end"} checkbutton $g.en5 -text [Local "Automatic space insertion"] -variable v(space,auto) -anchor w -padx 3m -pady 2m checkbutton $g.en6 -text [Local "Check spelling of capitalized words"] -variable v(spell,names) -anchor w -padx 3m -pady 2m checkbutton $g.en8 -text [Local "Debug menu"] -variable v(debug) -command {InitMenus} -anchor w -padx 3m -pady 2m pack $g.en7 $g.en5 $g.en6 $g.en8 -side top -expand true -fill x set g [frame $f.fr4 -relief raised -bd 1] pack $g -fill both -expand true -side top set h [frame $g.fr] pack $h -fill both -expand true -side top # Menu for language selection set langlist {} set langother {} set current_nam "" foreach {lang nam} [join $v(language)] { set nam [Local $nam] if {$lang == $v(lang)} { set current_nam $nam } if {$lang == "en" || [info exists ::local_$lang] || [file readable [file join $v(path,etc) "local_$lang.txt"]]} { lappend langlist $lang $nam } else { lappend langother $lang $nam } } label $h.lab -text "[Local Language]:" menubutton $h.en5 -text $current_nam -menu $h.en5.menu -relief raised -bd 2 -highlightthickness 2 -anchor c -width [maxlength $v(language)] menu $h.en5.menu -tearoff 0 foreach {val nam} $langlist { if {$val=="en"} { set stat "disabled" } else { set stat "normal" } $h.en5.menu add radiobutton -label $nam -variable v(lang) -value $val -command "ChangedLocal; $h.en5 conf -text $nam; $h.but conf -state $stat" } $h.en5.menu add cascade -label [Local "New language"] -menu $h.en5.menu.oth menu $h.en5.menu.oth -tearoff 0 foreach {val nam} $langother { $h.en5.menu.oth add radiobutton -label $nam -variable v(lang) -value $val -command "ChangedLocal; $h.en5 conf -text $nam; $h.but conf -state normal" } button $h.but -text [Local "Edit translation"] -command {EditLocal} if {$v(lang) == "en"} {$h.but conf -state disabled} pack $h.lab $h.en5 $h.but -side left -padx 3m -pady 3m -fill x -expand true EntryFrame $g.en7 "Localization file" v(file,local) # Wait for answer and undo changes if 'Cancel' set answer [OkCancelModal $f $f] if {$answer != "OK"} { set newlang $v(lang) array set v $initConf if {$v(lang) != $newlang} { ChangedLocal } } else { ::speaker::reset_dbg ::speaker::importg $env(HOME)/[file tail $v(list,ext)] ::speaker::store_dbg TraceInit 1 } } ####################################################################### # Edit v(encoding) within $f frame - called by ConfigureGeneral proc EncodingChooser {f} { global v set e [frame $f.enc -relief raised -bd 1] pack $e -fill both -expand true -side top label $e.lab -text "[Local Encoding]:" menubutton $e.men -indicatoron 1 -menu $e.men.menu -relief raised -bd 2 -highlightthickness 2 -anchor c menu $e.men.menu -tearoff 0 set len 20 # List of encoding: IANA name/usual name foreach subl $v(encodingList) { if {$subl == ""} { $e.men.menu add separator continue } foreach {val name} $subl {} if {$name == ""} { set name $val } set name [Local $name] set len [max $len [string length $name]] if {$val == $v(encoding)} { $e.men configure -text $name } $e.men.menu add radiobutton -label $name -variable v(encoding) -value $val -command [list $e.men configure -text $name] } $e.men configure -width $len pack $e.lab $e.men -side left -padx 3m -pady 3m -fill x -expand true } # Try to find an available Tcl encoding matching the given IANA name # and return it, or else an empty string. proc EncodingFromName {iana} { set enc [string tolower $iana] regsub "iso-" $enc "iso" enc regsub "_" $enc "" enc # resolve confusion: IANA gb_2312-80 => Tcl gb2312; IANA gb2312 => Tcl euc-cn regsub "gb2312" $enc "euc-cn" enc regsub "macintosh" $enc "macRoman" enc if {[lsearch [encoding names] $enc] >= 0} { return $enc } else { return "" } } ####################################################################### proc EditGlossary {} { global v # When a selection is active, propose its content as default value set new {} if {[$v(tk,edit) tag ranges sel] != {}} { set new [list [CopyAll sel.first sel.last] ""] } catch { set v(glossary) [ListEditor $v(glossary) "Glossary" \ {"Value" "Comment"} $new GlosBack] } } proc GlosBack {} { global v lst button .lst.bot.ins -text [Local "Insert"] -command {GlosIns} pack .lst.bot.ins -side left -after .lst.bot.ok -padx 3m -pady 2m -fill x -expand true } proc GlosIns {} { global v lst PasteAll $v(tk,edit) $lst(f0) set lst(result) "Insert" } ####################################################################### proc ConfigureBindings {} { global v # When a selection is active, propose its content as default value set new {} if {[$v(tk,edit) tag ranges sel] != {}} { set new [list "" [CopyAll sel.first sel.last]] } catch { RegisterBindings [ListEditor $v(bindings) "Bindings" \ {"Keystrokes" "Replacement string"} $new BindBack] } } # Inside binding editor, replace keystroke with corresponding string proc BindBack {} { global v lst catch { bind $lst(e0) {if {[string length %A] > 0} {tkEntryInsert %W ""}; break} bind $lst(e0) {if {[string length %A] > 0} {tkEntryInsert %W ""}; break} bind $lst(e0) {if {[string length %A] > 0} {tkEntryInsert %W ""}; break} bind $lst(e0) {if {[string length %A] > 0} {tkEntryInsert %W ""}; break} bind $lst(e0) {if {[string length %A] > 0} {tkEntryInsert %W ""}; break} } } proc RegisterBindings {new} { global v foreach subl $v(bindings) { foreach {s1 s2} $subl {} bind Text $s1 "" } set v(bindings) $new foreach subl $v(bindings) { foreach {s1 s2} $subl {} # count plain chars to delete before current char - can be wrong ! regsub -all "<(Control|Alt|Meta|Command|Option)-\[^>]+>" $s1 "" s3 regsub -all "<\[^>]+>" $s3 "." s3 set l [expr [string length $s3]-1] catch { if {$l > 0} { bind Text $s1 "%W delete insert-${l}c insert; PasteAll %W [list $s2]; break" } else { bind Text $s1 "PasteAll %W [list $s2]; break" } } } } ####################################################################### proc ConfigureColors {} { # JOB: Configure the colors of the interface. Called by the menu Options->Colors... # # IN: nothing # OUT: nothing # MODIFY: nothing # # Author: Claude Barras, Sylvain Galliano # Version: 1.1 # Date: October 20, 2004 global v set f .col CreateModal $f "Configure colors" set i 0 foreach set { {"Waveform bg" bg "selected" bg-sel} {"Segments foreground" fg-sync "background" bg-sync} {"Current segment" hi-sync} {"Speaker foreground" fg-turn "background" bg-turn} {"Sections foreground" fg-sect "background" bg-sect} {"Noise foreground" fg-back "background" bg-back} {"Text foreground" fg-text "background" bg-text} {"Highlighted text bg" hi-text} {"Event foreground" fg-evnt "background" bg-evnt} {"NE pers" netag-pers "NE org" netag-org} {"NE gsp" netag-gsp "NE loc" netag-loc} {"NE fac" netag-fac "NE prod" netag-prod} {"NE time" netag-time "NE amount" netag-amount} {"NE metonymy" netag-meto "NE unknown" netag-unk} } { set g [frame $f.fr[incr i] -bd 1 -relief raised] pack $g -side top -fill x -ipady 1m foreach {title var} $set { lappend old $var $v(color,$var) ColorFrame $g.$var $title v(color,$var) pack $g.$var -side left } } # check buttons that allow to use or not the color with entities (tag, text and button) set g [frame $f.checkNE -bd 1 -relief raised] checkbutton $g.enttag -text [Local "Use color for NE tag"] -variable v(checkNEcolor,tag) -command { UpdateColors } pack $g.enttag -side left -padx 10 checkbutton $g.enttext -text [Local "Use color for NE text"] -variable v(checkNEcolor,text) -command { UpdateColors } pack $g.enttext -side left -padx 10 checkbutton $g.entbuton -text [Local "Use color for NE buton"] -variable v(checkNEcolor,buton) -command [list UpdateNEFrame .edit.ne] pack $g.entbuton -side left -padx 10 pack $g -side top -fill x -expand true # Undo changes after "Cancel" if {[OkCancelModal $f $f] != "OK"} { foreach {var val} $old { set v(color,$var) $val } UpdateColors } } proc ChooseColor {varName} { # JOB: Change configuration color with a popup to choose the color and redisplay widgets. Called by ColorFrame and ConfigureColors # # IN: varName, nale of the color variable to change # OUT: nothing # MODIFY: nothing # # Author: Claude Barras # Version: 1.0 # Date: 1999 global v upvar $varName var set color [tk_chooseColor -initialcolor $var] if {$color != ""} { set var $color UpdateColors } } proc UpdateColors {} { # JOB: Update the color of all the interface. Called by ChooseColor # # IN: nothing # OUT: nothing # MODIFY: nothing # # Author: Claude Barras, Sylvain Galliano # Version: 1.1 # Date: October 20, 2004 global v # Update the entities colors in the text and in the NE interface UpdateNEColors UpdateNEFrame .edit.ne foreach wavfm $v(wavfm,list) { set f [winfo parent $wavfm] if [winfo exists $f.seg0] { $f.seg0 config -fg $v(color,fg-sync) -full $v(color,bg-sync) } if [winfo exists $f.seg1] { $f.seg1 config -fg $v(color,fg-turn) -full $v(color,bg-turn) } if [winfo exists $f.seg2] { $f.seg2 config -fg $v(color,fg-sect) -full $v(color,bg-sect) } if [winfo exists $f.bg] { $f.bg config -fg $v(color,fg-back) -full $v(color,bg-back) } foreach w [concat $f [winfo children $f]] { if {[winfo class $w] != "Scrollbar"} { $w config -bg $v(color,bg) } } $wavfm config -selectbackground $v(color,bg-sel) } .msg config -bg $v(color,bg) if [info exists v(tk,edit)] { set t $v(tk,edit)-bis $t conf -bg $v(color,bg-text) -fg $v(color,fg-text) $t tag conf "event" -background $v(color,bg-evnt) -foreground $v(color,fg-evnt) foreach w [$t window names] { switch -glob -- [$w conf -command] { *section* { $w conf -activeforeground $v(color,fg-sect) \ -fg $v(color,fg-sect) \ -activebackground $v(color,bg-sect) -bg $v(color,bg-sect) } *turn* { $w conf -activeforeground $v(color,fg-turn)\ -fg $v(color,fg-turn) \ -activebackground $v(color,bg-turn) -bg $v(color,bg-turn) } } } $v(img,circle) conf -foreground $v(color,bg-sync) $v(img,over1) conf -foreground $v(color,bg-sync) $v(img,over2) conf -foreground $v(color,bg-sync) } } proc UpdateNEColors {} { # JOB: switch the display of the NE interface # # IN: f, name of the NE window # OUT: nothing # MODIFY: nothing # # Author: Sylvain Galliano # Version: 1.0 # Date: October 20, 2004 global v set t $v(tk,edit)-bis foreach macro "$v(listNE,macroclass) meto" { foreach part {"tag" "text"} { if { $v(checkNEcolor,$part) == 1 } { $t tag conf NE$macro$part -foreground $v(color,netag-$macro) } else { $t tag conf NE$macro$part -foreground black } } } } proc RandomColor {} { set sum 0 while {$sum < 384} { set col "\#" set sum 0 foreach c {r g b} { set d [expr int(rand()*256)] append col [format "%02x" $d] incr sum $d } } return $col } proc ColorMap {val {col ""}} { global color regsub -all "\[ _-]" $val "" val set val [string tolower $val] if {$col != ""} { set color($val) $col } elseif {[info exists color($val)]} { set col $color($val) } else { set col [RandomColor] set color($val) $col } return $col } proc ColorizeSpk {{segmt seg1}} { global v color if {$v(colorizeSpk)} { ColorMap ([Local "no speaker"]) $::v(color,bg) for {set i 0} {$i < [GetSegmtNb $segmt]} {incr i} { SetSegmtField $segmt $i -color [ColorMap [GetSegmtField $segmt $i -text]] } } else { catch {unset color} for {set i 0} {$i < [GetSegmtNb $segmt]} {incr i} { SetSegmtField $segmt $i -color "" } } } transcriber-1.5.1.1/tcl/Menu.tcl0000555000175000017500000003712110166734262014235 0ustar rtrt#!/bin/sh #\ exec wish "$0" "$@" # RCS: @(#) $Id: Menu.tcl,v 1.22 2005/01/05 09:51:46 mantam Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ####################################################################### # Automatic creation of menus for Tcl/Tk 8.0 (generic functions) # # Syntax : create_menu description_list # # with description = list of {name type options [arguments]} # and # - name = name of menu or item # - type options = command {command content} # radio {variable [value]} # check variable # cascade {sub-items list} # - arguments = options for item configuration # # At first level, one should use only "cascade" # proc add_menu {m liste} { global Menu if ![winfo exists $m] { menu $m -tearoff 0 } if ![info exists Menu(uid)] { set Menu(uid) 0 } foreach item $liste { set name [Local [lindex $item 0]] if {[string length $name]==0} { $m add separator continue } set type "" set option "" set sequence "" foreach {cmd arg} [lrange $item 1 end] { switch -glob -- $cmd { cmd - com* { set type "command" lappend option -command $arg } rad* { set type "radio" if {[llength $arg] > 1} { foreach {var val} $arg break lappend option -variable $var -value $val } else { lappend option -variable $arg } } ch* { set type "check" lappend option -variable $arg } cas* { set type "cascade" if {![string compare $name [Local "Help"]]} { set new_m $m.help } else { set new_m $m.item[incr Menu(uid)] } set Menu(menu,$name) $new_m lappend option -menu [add_menu $new_m $arg] } -acc { if {[info tclversion] < 8.4 || [tk windowingsystem] != "aqua"} { lappend option $cmd $arg } } -bind { if {![regsub -- {-([^-]*)$} $arg {-Key-\1} sequence]} { set sequence "Key-$arg" } if {[info tclversion] >= 8.4 && [tk windowingsystem] == "aqua"} { if {[regsub "C(trl)?-" $arg "Cmd-" arg] || [regsub "A(lt)?-" $arg "Alt-" arg] || [regsub "S(hift)?-" $arg "Shift-" arg]} { lappend option -accelerator [string toupper $arg] } foreach {short long} { "C(trl)?-" "Command-" "A(lt)?-" "Option-" "S(hft)?-" "Shift-" } { regsub $short $sequence $long sequence } } else { lappend option -accelerator $arg foreach {short long} { "C(trl)?-" "Control-" "A-" "Alt-" "S(hft)?-" "Shift-" } { regsub $short $sequence $long sequence } } } -* { lappend option $cmd $arg } default {error "$name : Bad menu syntax $cmd $arg"} } } eval {$m add $type -label $name} $option if {$sequence != ""} { bind . <$sequence> [list invoke_from_bind $m [$m index last]] bind . <$sequence> +break } } return $m } proc create_menu {liste} { global Menu catch {unset Menu} catch {destroy .menu} . configure -menu [add_menu .menu $liste] } proc append_menu {menu liste} { global Menu set menu [Local $menu] add_menu $Menu(menu,$menu) $liste } proc config_menu {menu args} { global Menu set menu [Local $menu] if [catch {set Menu(menu,$menu)} menu_id] { error "Unknown menu $menu" } eval $menu_id config $args } proc eval_menu {menu args} { global Menu set menu [Local $menu] if [catch {set Menu(menu,$menu)} menu_id] { error "Unknown menu $menu" } eval $menu_id $args } proc config_entry {menu item args} { global Menu set menu [Local $menu] set item [Local $item] if [catch {set Menu(menu,$menu)} menu_id] { error "Unknown menu $menu" } eval [list $menu_id entryconfig $item] $args } proc invoke_from_bind {menu_id item_id} { # just to be sure menu is in the right state, call post command set cmd [$menu_id cget -post] if {$cmd != ""} { eval $cmd } eval $menu_id invoke $item_id } proc bind_menu {sequence menu item} { global Menu set menu [Local $menu] set item [Local $item] if [catch {set Menu(menu,$menu)} menu_id] { error "Unknown menu $menu" } if [catch {$menu_id index $item} item_id] { error "Unknown item $item" } bind . $sequence "invoke_from_bind $menu_id $item_id; break" set sequence [string trim $sequence "<>"] regsub "Key(Press)?-" $sequence "" sequence regsub "Control-" $sequence "Ctrl-" sequence $menu_id entryconfigure $item_id -accelerator $sequence } ####################################################################### # Menus for Transcriber proc InitMenus {} { global v # Global menu #{"Close" -bind "Ctrl-w" cmd {CloseAndDestroyTrans}} create_menu { {"File" -underline 0 cascade { {"New trans" -bind "Ctrl-n" cmd {NewTrans}} {"Open trans..." -bind "Ctrl-o" cmd {OpenTransFile}} {"Save" -bind "Ctrl-s" cmd {SaveTrans}} {"Save as..." cmd {SaveTrans as}} {"Export" cascade {}} {""} {"Revert" cmd {RevertTrans}} {""} {"Informations" cmd {CreateInfoFrame}} {"Edit episode attributes..." cmd {EditEpisode}} {""} {"Open video file..." cmd {OpenVideoFile}} {"Open audio file..." -bind "Ctrl-a" cmd {OpenAudioFile}} {"Synchronized audio files" cascade { {"Add audio file..." cmd {OpenAudioFile add}} {""} }} {"Save audio segment(s)" cascade { {"Selected..." cmd {SaveAudioSegment}} {"Automatic..." cmd {SaveAudioSegmentAuto}} }} {""} {"Open segmentation file..." cmd {OpenSegmt}} {""} {"Quit" -bind "Ctrl-q" cmd {Quit}} }} {"Edit" -underline 0 cascade { {"Undo" -bind "Ctrl-z" cmd {Undo} -state disabled} {""} {"Cut" -acc "Ctrl-x" cmd { TextCmd Cut }} {"Copy" -acc "Ctrl-c" cmd { TextCmd Copy }} {"Paste" -acc "Ctrl-v" cmd { TextCmd Paste }} {""} {"Find/Replace" cmd {Find} -bind "Ctrl-f"} {"Spell checking" cmd {SpellChecking}} {"Glossary" cmd {EditGlossary} -bind "Ctrl-k"} {"Speakers" cascade { {"Find speaker" cmd {::speaker::find}} {"Import from file..." cmd {::speaker::import}} {"Remove unused speakers" cmd {::speaker::purge}} }} {"Topics" cascade { {"Find topic" cmd {::topic::find}} {"Import from file..." cmd {::topic::import}} {"Remove unused topics" cmd {::topic::purge}} {""} {"Automatic import from selected file" check v(importTopics)} }} {""} {"Insert event..." cascade { {"Isolated noise" cmd {CreateEvent "b" "noise" "instantaneous" 1} -bind "Ctrl-d"} {"Overlapping noise" cmd {CreateAutoEvent "b" "noise" "previous" 1}} {"Pronounce" cmd {CreateAutoEvent "" "pronounce" "previous" 1} -bind "Alt-equal"} {"Language" cmd {CreateAutoEvent "en" "language" "previous" 1}} {"Lexical" cmd {CreateAutoEvent "" "lexical" "previous" 1}} {"Comment" cmd {CreateAutoEvent "" "comment"}} {"Named Entities" cmd {CreateAutoEvent "" "entities"} -bind "Ctrl-e"} }} }} {"Signal" -underline 0 cascade { {"Play/Pause" cmd {PlayOrPause} -bind "Tab"} {"Play segment" cmd {PlayCurrentSegmt} -bind "Shift-Tab"} {"Play next segment" cmd {PlayNextSegmt} -bind "Ctrl-Return"} {"Play around cursor" cmd {PlayAround} -bind "Alt-space"} {"Playback mode" cascade { {"Continuous playback" radio {v(playbackMode) "continuous"}} {"Pause at segment boundaries" radio {v(playbackMode) "pause"}} {"Beep at segment boundaries" radio {v(playbackMode) "beep"}} {"Stop before next segment boundary" radio {v(playbackMode) "next"}} {"Stop at next segment boundary" radio {v(playbackMode) "stop"}} {"Loop on segment or selection after a pause" radio {v(playbackMode) "loop"}} }} {"Stereo channel" cascade { {"Left" radio {v(sig,map) "1 0 1 0"} -command {if {[IsPlaying]} {PauseAudio; Play}} -bind "Alt-6"} {"Right" radio {v(sig,map) "0 1 0 1"} -command {if {[IsPlaying]} {PauseAudio; Play}} -bind "Alt-7"} {"Both" radio {v(sig,map) "1 0 0 1"} -command {if {[IsPlaying]} {PauseAudio; Play}} -bind "Alt-8"} }} {""} {"Go to..." cascade { {"Forward" cmd {PlayForward +1} -bind "Alt-Right"} {"Backward" cmd {PlayForward -1} -bind "Alt-Left"} {"Previous" cmd {MoveNextSegmt -1} -bind "Alt-Up"} {"Next" cmd {MoveNextSegmt +1} -bind "Alt-Down"} {""} {"Position" cmd {EditCursor}} }} {""} {"Resolution" cascade { {"1 sec" cmd {Resolution 1} -bind "Alt-1"} {"10 sec" cmd {Resolution 10} -bind "Alt-2"} {"30 sec" cmd {Resolution 30} -bind "Alt-3"} {"1 mn" cmd {Resolution 60} -bind "Alt-4"} {"5 mn" cmd {Resolution 300} -bind "Alt-5"} {""} {"up" cmd {ZoomReso -1} -bind "Alt-9"} {"down" cmd {ZoomReso +1} -bind "Alt-0"} {""} {"View all" cmd {ViewAll} -bind "Alt-a"} }} {"Zoom selection" cmd {ZoomSelection} -state disabled -bind "Alt-z"} {"Unzoom selection" cmd {UnZoom} -state disabled -bind "Alt-u"} {""} {"Control panel" cmd {CreateGainFrame}} }} {"Segmentation" -underline 2 cascade { {"Move to..." cascade { {"Next synchro" cmd {TextNextSync +1} -acc "Down"} {"Previous synchro" cmd {TextNextSync -1} -acc "Up"} {"First segment" cmd {TextFirstSync} -acc "Ctrl-Home"} {"Last segment" cmd {TextLastSync} -acc "Ctrl-End"} {""} {"Next turn" cmd {TextNextTurn +1} -acc "Ctrl-Down"} {"Previous turn" cmd {TextNextTurn -1} -acc "Ctrl-Up"} {""} {"Next section" cmd {TextNextSection +1} -acc "Page Down"} {"Previous section" cmd {TextNextSection -1} -acc "Page Up"} }} {""} {"Insert breakpoint" cmd {InsertSegment} -bind "Return"} {"Insert background" cmd {CreateBackground}} {""} {"Create turn..." cmd {ChangeSegType Turn} -bind "Ctrl-t"} {"Create section..." cmd {ChangeSegType Section} -bind "Ctrl-r"} {"Edit turn attributes..." cmd {::turn::edit} -bind "Ctrl-Alt-t"} {"Edit section attributes..." cmd {::section::edit}} {""} {"Move breakpoint" cmd { tk_messageBox -type ok -message "Just click on the segment boundary with central button (or control-click with left button) and drag it to the new position! Use shift modifier for a forced move."}} {"Delete breakpoint" cmd { DeleteSegment } -bind "Ctrl-BackSpace"} }} {"Options" -underline 0 cascade { {"General..." cmd {ConfigureGeneral}} {"Audio file..." cmd {ConfigureAudioFile}} {"Events" cascade { {"Events display..." cmd {ConfigureEvents}} {"Edit noise list..." cmd {ConfEventName "noise" "Noise"}} {"Edit pronounce list..." cmd {ConfEventName "pronounce" "Pronounce"}} {"Edit lexical list..." cmd {ConfEventName "lexical" "Lexical"}} {"Edit language list..." cmd {ConfEventName "language" "Language"}} {"Edit named entities list..." cmd {ConfEventName "entities" "Named Entities"}} }} {"Display" -underline 0 cascade { {"Text editor" check v(view,.edit) -command {SwitchTextFrame} -bind "F2"} {"NE buttons" check v(view,.edit.ne) -command {SwitchNEFrame .edit.ne} -bind "F3"} {"Command buttons" check v(view,.cmd) -command {SwitchFrame .cmd -after .edit} -bind "F4"} {"First signal view" check v(view,.snd) -command {SwitchFrame .snd} -bind "F5"} {"Second signal view" check v(view,.snd2) -command {SwitchFrame .snd2} -bind "F6"} {"Messages" check v(view,.msg) -command {SwitchFrame .msg -side bottom} -bind "F7"} {"Smart segmentation display" check v(hideLevels) -command {UpdateSegmtView}} {"Colorize speaker segments" check v(colorizeSpk) -command {ColorizeSpk}} }} {"Fonts" cascade { {"Text" cmd {set v(font,text) [ChooseFont text] }} {"Events" cmd {set v(font,event) [ChooseFont event] }} {"Segmentation" cmd {set v(font,trans) [ChooseFont trans]}} {"Information" cmd {set v(font,info) [ChooseFont info] }} {"Messages" cmd {set v(font,mesg) [ChooseFont mesg] }} {"Lists" cmd {set v(font,list) [ChooseFont list] }} {"Axis" cmd {set v(font,axis) [ChooseFont axis] }} {"NE buttons" cmd {set v(font,NEbutton) [ChooseFont NEbutton];UpdateNEFrame .edit.ne }} }} {"Colors..." cmd {ConfigureColors}} {"Bindings..." cmd {ConfigureBindings}} {""} {"Load configuration file..." cmd {LoadConfiguration}} {"Save configuration" cmd {SaveOptions}} {"Save configuration as..." cmd {SaveOptions as}} }} {"Help" -underline 0 cascade { {"About..." cmd {ViewHelp "Index"} -bind "F1"} {""} {"Presentation" cmd {ViewHelp "Presentation"}} {"Main features" cmd {ViewHelp "Main features"}} {"User guide" cmd {ViewHelp "User guide"}} {"Reference manual" cmd {ViewHelp "Reference manual"}} }} } config_menu "File" -postcommand UpdateFileMenu config_menu "Edit" -postcommand UpdateEditMenu config_menu "Segmentation" -postcommand UpdateSegmentationMenu if {$v(debug)} { if {[info tclversion] >= 8.4 && [tk windowingsystem] == "aqua"} { append_menu "Help" { {""} {"Update" cmd {LoadModules}} {"Refresh" cmd {Refresh}} {"Expert mode" cmd {console show}} } } else { append_menu "Help" { {""} {"Debug" cascade { {"Update" cmd {LoadModules}} {"Refresh" cmd {Refresh}} {"Expert mode" cmd {CreateDebug}} }} } } } if {$v(chatMode)} { append_menu "Edit" { {"Insert Dependent" cmd {InsertDependent } -bind "Ctrl-p"} {"Insert Header" cmd {InsertHeader } -bind "Ctrl-h"} {"Insert Scope" cmd {InsertScope } -bind "Ctrl-i"} } } UpdateConvertorMenu } ####################################################################### # post command called by menus proc UpdateFileMenu {} { global v if [info exists v(tk,edit)] { if {[HasModifs]} { set state normal } else { set state disabled } foreach type {"Save" "Revert"} { config_entry "File" $type -state $state } foreach type {"Save as..."} { config_entry "File" $type -state normal } } else { foreach type {"Save" "Save as..." "Revert"} { config_entry "File" $type -state disabled } } } # set state for undo/cut/copy/paste menus proc UpdateEditMenu {} { global v if [info exists v(tk,edit)] { # Undo has to be the first Edit menu line switch [HasUndo] { 0 { config_entry "Edit" 0 -label [Local "Undo"] -state disabled } 1 { config_entry "Edit" 0 -label [Local "Undo"] -state normal } 2 { config_entry "Edit" 0 -label [Local "Redo"] -state normal } } if [catch {$v(tk,edit) index sel.first}] { set state disabled } else { set state normal } foreach type {"Cut" "Copy"} { config_entry "Edit" $type -state $state } foreach type {"Paste" } { config_entry "Edit" $type -state normal } } else { foreach type {"Cut" "Copy" "Paste"} { config_entry "Edit" $type -state disabled } config_entry "Edit" 0 -label [Local "Undo"] -state disabled } } proc UpdateSegmentationMenu {} { global v if {[GetSegmtNb seg0] > 0} { set state normal } else { set state disabled } for {set i 0} {$i <= [eval_menu "Segmentation" index end]} {incr i} { catch { config_entry "Segmentation" $i -state $state } } } transcriber-1.5.1.1/tcl/Edit.tcl0000444000175000017500000006453310160571002014203 0ustar rtrt# RCS: @(#) $Id: Edit.tcl,v 1.28 2004/12/17 14:49:38 galliano Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ################################################################ # Text edit frame # # Tags used in widget : # "locked" -> forbid deleting chars with this tag # "$id" -> applied to button + chars belonging to a segment. proc CreateTextFrame {f {top 0}} { global v if {$top} { toplevel $f } else { frame $f -bd 2 -relief raised setdef v(view,$f) 1 if {$v(view,$f)} { pack $f -expand true -fill both -side top if {[catch { pack $f -before .cmd }]} {catch { pack $f -before .snd }} } } set v(tk,edit) [text $f.txt -wrap word -width 40 -height 8 \ -fg $v(color,fg-text) -bg $v(color,bg-text) \ -font text -yscrollcommand [list $f.ysc set]] scrollbar $f.ysc -orient vertical -command [list $f.txt yview] pack $f.txt -side left -fill both -expand true pack $f.ysc -side right -fill y # Filter actions to text widget rename $v(tk,edit) $v(tk,edit)-bis if {[concat \xe0] == "\xe0"} { proc $v(tk,edit) {args} "eval TextFilter $v(tk,edit)-bis \$args" } else { # turn around Tcl8.3.2 bug (SourceForge bug ID 227512) proc $v(tk,edit) {args} "set args \[linsert \$args 0 TextFilter $v(tk,edit)-bis]; eval \$args" } # Bindings for widget: tabs and insert are propagated bind $v(tk,edit) {focus %W} bind Text { tkTextInsert %W %A; break } # Suppress local control bindings to allow global menu accelerators foreach k { Tab Insert Return Pause Shift-BackSpace Shift-Tab ISO_Left_Tab Alt-Up Alt-Down Alt-Left Alt-Right Alt-Tab Control-Tab } { catch {bind Text <$k> { continue }} } if {$::tcl_platform(os) == "Darwin"} { catch {bind Text { continue }} } foreach k {q w e r t y u i o p a s d f g h j k l z b n m} { bind Text { continue } } foreach k {F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12} { bind Text <$k> { continue } } # ...except for ^X/^C/^V which are best handled in current text widget bind Text { tk_textCut %W; break } bind Text { tk_textCopy %W; break } bind Text { tk_textPaste %W; break } # Insert automatically spaces before "," or "." etc. but not inside "..." foreach c {"," ";" "." ":"} { bind $v(tk,edit) $c { SpaceMagic; tkTextInsert %W %A; break } } bind $v(tk,edit) ".." { tkTextInsert %W %A; break } # Special chars can be generated with bindings RegisterBindings $v(bindings) bind $v(tk,edit) {TextNextLine -1; break } bind $v(tk,edit) {TextNextLine +1; break } #bind $v(tk,edit) { TextNextSync -1; break } #bind $v(tk,edit) { TextNextSync +1; break } bind $v(tk,edit) { TextNextTurn -1; break } bind $v(tk,edit) { TextNextTurn +1; break } bind $v(tk,edit) { TextNextSection -1; break } bind $v(tk,edit) { TextNextSection +1; break } #bind $v(tk,edit) { KbdPlayForward -1; break } #bind $v(tk,edit) { KbdPlayForward +1; break } bind $v(tk,edit) { tkTextInsert %W "\n\t"; break } # alt-backspace/delete: delete word before/after cursor respectively bind $v(tk,edit) {%W mark set tmp "insert wordend"; tkTextSetCursor %W [tkTextPrevPos %W insert tcl_startOfPreviousWord]; %W delete insert tmp; break } bind $v(tk,edit) {%W mark set tmp "insert wordstart"; tkTextSetCursor %W [tkTextNextWord %W insert]; %W delete tmp insert; break } # Windows style - any but space, tab, or newline catch {tcl_wordBreakAfter}; # force loading word.tcl if {[info tclversion] >= 8.1} { set ::tcl_wordchars "\\S" set ::tcl_nonwordchars "\\s" } else { set ::tcl_wordchars "\[^ \t\n\]" set ::tcl_nonwordchars "\[ \t\n\]" } } # correct bug in tkTextPrevPos catch {tkTextPrevPos}; # force loading text.tcl proc [expr {([info tclversion] >= 8.4 && [info commands tk] != "") ? "::tk::TextPrevPos" : "tkTextPrevPos"}] {w start op} { set text "" set cur $start while {[$w compare $cur > 0.0]} { set text [$w get "$cur linestart - 1c" $cur]$text set pos [$op $text end] #puts "'$text' => $pos: [string range $text $pos end]" if {$pos >= 0} { ## Adjust for embedded windows and images set dump [$w dump -image -window "$cur linestart" "$start - 1c"] foreach {d1 d2 d3} $dump { if {[$w compare $d2 <= "$cur linestart - 1c + $pos c"]} { incr pos } } return [$w index "$cur linestart - 1c + $pos c"] } set cur [$w index "$cur linestart - 1c"] } return 0.0 } # called from: InitEditor; CloseTrans proc EmptyTextFrame {} { global v if [info exists v(tk,edit)] { set t $v(tk,edit)-bis # Remove marks and tags eval $t mark unset [$t mark names] eval $t tag delete [$t tag names] # Direct text widget, no filter $t delete 1.0 end } } # called from: menu Help/Debug/Restart; CloseAndDestroyTrans (not in use) proc DestroyTextFrame {} { global v if [info exists v(tk,edit)] { set f [winfo parent $v(tk,edit)] destroy $f unset v(tk,edit) } } proc SwitchTextFrame {} { global v # Switch display/hide set f .edit if {[winfo ismapped $f]} { set v(geom,.) [wm geom .] pack forget $f pack configure .snd -expand true wm geom . {} set v(view,$f) 0 } else { pack $f -expand true -fill both -side top if {[catch { pack $f -before .cmd }]} {catch { pack $f -before .snd }} pack configure .snd -expand false wm geom . $v(geom,.) set v(view,$f) 1 } } ################################################################ # called from: DisplayTrans proc InitEditor {} { global v if ![info exists v(tk,edit)] { CreateTextFrame .edit } else { EmptyTextFrame # For optimization : destroy and re-create is much quicker... } set t $v(tk,edit)-bis $t tag conf "sel" -underline 0 $t tag conf "section" -justify center $t tag conf "turn" -justify left $t tag conf "sync" -tabs "1c left" -lmargin2 1c -spacing3 5 $t tag conf "event" -background $v(color,bg-evnt) -foreground $v(color,fg-evnt) -font event $t tag bind "cursor" [list $t config -cursor top_left_arrow] $t tag bind "cursor" [list $t config -cursor xterm] $t tag conf "hilight" -background $v(color,hi-text) $t tag raise "sel" set pos [$t index insert] $t insert "insert" "\n\n\n\n\n" locked $t mark set insert $pos } proc CreateSectionButton {section} { global v set button $v(tk,edit).[namespace tail $section] set name [::section::long_name $section] ColoredButton $button "::section::edit $section" \ -text $name -width [max 20 [string length $name]] \ -cursor top_left_arrow \ -activeforeground $v(color,fg-sect) -fg $v(color,fg-sect) \ -activebackground $v(color,bg-sect) -bg $v(color,bg-sect) return $button } proc InsertSectionButton {sec} { global v set t $v(tk,edit)-bis # Button for new section if {[$t compare "insert" > "1.0"]} { $t insert insert "\n" } set beg [$t index "insert"] $t window create "insert" -align center -window [CreateSectionButton $sec] $t tag add "locked" "$beg-1c" "insert" $t tag add "section" $beg "insert" $t tag add "$sec" "$beg-1c" "insert" } ###### Added by Zhibiao proc CreateEpisodeButton {episode} { global v set button $v(tk,edit).[namespace tail $episode] set name "Edit File" ColoredButton $button "EditEpisode" \ -text $name -width [max 20 [string length $name]] \ -cursor top_left_arrow \ -activeforeground $v(color,fg-sect) -fg $v(color,fg-sect) \ -activebackground $v(color,bg-sect) -bg $v(color,bg-sect) return $button } proc InsertEpisodeButton {episode} { global v set t $v(tk,edit)-bis # Button for new section if {[$t compare "insert" > "1.0"]} { $t insert insert "\n" } set beg [$t index "insert"] $t window create "insert" -align center -window [CreateEpisodeButton $episode] $t tag add "locked" "$beg-1c" "insert" $t tag add "episode" $beg "insert" $t tag add "$episode" "$beg-1c" "insert" } ###### added end proc CreateTurnButton {turn} { global v set button $v(tk,edit).[namespace tail $turn] set name [::turn::get_name $turn] ColoredButton $button "::turn::edit $turn" \ -text $name -anchor w -padx 1m -pady 0 \ -cursor top_left_arrow \ -activeforeground $v(color,fg-turn) -fg $v(color,fg-turn) \ -activebackground $v(color,bg-turn) -bg $v(color,bg-turn) return $button } proc InsertTurnButton {tur} { global v set t $v(tk,edit)-bis # Button for new speaker $t insert "insert" "\n" set beg [$t index "insert"] $t window create "insert" -padx 3 -pady 2 -window [CreateTurnButton $tur] $t tag add "locked" "$beg-1c" "insert" $t tag add "turn" $beg "insert" $t tag add "$tur" "$beg-1c" "insert" } proc InsertSyncButton {bp} { global v set t $v(tk,edit)-bis # Image for breakpoint: sync or background $t insert "insert" "\n" "locked $bp" set beg [$t index "insert"] # Optimization: delayed windows much quicker, but display is unpleasant $t image create "insert" -padx 4 -image $v(img,circle) $t insert "insert" "\t" $t tag add "locked" "$beg-1c" "insert" $t tag add "sync" $beg "insert" $t tag add "$bp" "$beg-1c" "insert" $t tag lower "$bp" $t tag bind "$bp" "Synchro::syncContextMenu $bp %X %Y" $t tag bind "$bp" "Synchro::syncContextMenu $bp %X %Y; break" $t tag add "cursor" $beg "insert" } proc ChangeSyncButton {bp img} { global v set t $v(tk,edit)-bis set i [lindex [$t dump -image "$bp.first" "$bp.last"] 1] $t image configure $i -image $v(img,$img) } proc InsertData {data} { global v set t $v(tk,edit)-bis # Previous char tagged as data to allow insertion at beginning of field $t tag add "$data" "insert-1c" $t insert "insert" [$data getData] "$data sync" } proc HomeEditor {} { global v set t $v(tk,edit)-bis catch {unset v(segmt,curr)} if {[GetSegmtNb seg0] > 0} { SetCurrentSegment 0 } $t see 1.0 } ################################################################ proc SpaceMagic {} { global v if {$v(space,auto)} { if {[string trim [$v(tk,edit) get "insert -1 chars"]] != ""} { $v(tk,edit) insert "insert" " " } } } proc CopyAll {first last} { global v set t $v(tk,edit)-bis set data "" set end "" foreach {typ val idx} [$t dump -text $first $last] { if {$end != "" && [$t compare $idx < $end]} continue set tags [$t tag names $idx] set elem [lindex $tags [lsearch -glob $tags "*element*"]] if {$elem != ""} { switch [$elem getType] { "Event" - "Comment" { append data [$elem dumpTag -empty] set end [$t index $elem.last] } default { #append data $val append data " " } } } else { append data $val } } return $data } proc PasteAll {w text} { global v if {$w == $v(tk,edit)} { set re "^(\[^<\]*)<(\[^ \]+)( +desc=\"(\[^\"\]*)\")?( +type=\"(\[^\"\]*)\")?( +extent=\"(\[^\"\]*)\")? */>(.*)$" while {[regexp $re $text a t1 evt d desc t type e extent text]} { $w insert insert $t1 switch -exact -- $evt { "Comment" { CreateEvent $desc "comment" } "Event" { if {$type == ""} { set type "noise" } if {$extent == ""} { set extent "instantaneous" } CreateEvent $desc $type $extent } default { } } } } $w insert insert $text } # Override standard cut/Copy/Paste proc: paste always delete selection; # convert events and comments to XML tags and back proc tk_textCut w { global v if {![catch {set data [$w get sel.first sel.last]}]} { if {$w == $v(tk,edit)} { set data [CopyAll sel.first sel.last] } clipboard clear -displayof $w clipboard append -displayof $w $data $w delete sel.first sel.last } } proc tk_textCopy w { global v if {![catch {set data [$w get sel.first sel.last]}]} { if {$w == $v(tk,edit)} { set data [CopyAll sel.first sel.last] } clipboard clear -displayof $w clipboard append -displayof $w $data } } proc tk_textPaste w { global v catch { catch { $w delete sel.first sel.last } set text [selection get -displayof $w -selection CLIPBOARD] PasteAll $w $text } } # Filter text widget commands : # - doesn't allow deleting locked text area (especially embedded windows) # - propagate changes to transcription list # - synchronize view of signal to the current segment proc TextFilter {t option args} { global v switch -glob -- $option { "del*" { # Display warning message in case of more than 1 line selected for deletion # Don't display warning if only 1 character is deleted if {[llength $args] > 1} { set BegSel [$v(tk,edit) index [lindex $args 0]] set EndSel [$v(tk,edit) index [lindex $args 1]] set lBegSel [split $BegSel .] set lEndSel [split $EndSel .] set FirstLine [lindex $lBegSel 0] set LastLine [lindex $lEndSel 0] set nbSelectLines [expr {$LastLine - $FirstLine +1}] if { $nbSelectLines > 1 } { set choice [tk_messageBox -type yesno -default no -message \ [Local "You have selected several lines. Confirm their deletion ?"] \ -icon question ] if { $choice == "no" } { return } } } # End of delete range (eventually empty) set end [lindex $args 1] # Dump text widget between requested delete indices set lst [eval $t dump -text -image -window $args] # Process backwards to keep correct indices for {set i [expr [llength $lst]-3]} {$i>=0} {incr i -3} { set key [lindex $lst $i] set idx [lindex $lst [expr $i+2]] if {$i == 0} {set idx [lindex $args 0]} if {$end != "" && [$t compare $idx >= $end]} continue # Verify that first character of block is not locked set tags [$t tag names $idx] if {[lsearch -exact $tags "locked"] < 0} { set elem [lindex $tags [lsearch -glob $tags "*element*"]] if {$elem != ""} { switch [$elem getType] { "Background" { #set idx [$t index $elem.first] #SuppressBackground $elem } "Event" - "Comment" { set idx [$t index $elem.first] SuppressEvent $elem } default { if {[info commands ::tag::[$elem getType]::suppress] != {}} { set idx [$t index $elem.first] SuppressOther $elem } } } } else { set data [GetDataFromPos "$idx+1c"] eval $t delete $idx $end # Update corresponding segment if {$data != ""} { # Display text on transcription and segmentation ModifyText $data } } } set end $idx } } "ins*" { # Position of insertion set idx [lindex $args 0] # We can only insert right to a data tagged char set data [GetDataFromPos "$idx"] if {$data != ""} { # Insert with the tag of current breakpoint set colortag [ColorNE "$idx"] if { [regexp {(^NE.*)tag} $colortag match color] } { set colortag ${color}text } if { $colortag != "" } { lappend args [list $data sync hilight $colortag] } else { lappend args [list $data sync hilight] } # turn around Tcl8.3.2 bug (SourceForge bug ID 227512) if {[concat \xe0] == "\xe0"} { eval $t "insert" $args } else { set args [linsert $args 0 $t insert]; eval $args } if {$v(chatMode)} { CheckTerminator $t } # Display text on transcription and segmentation ModifyText $data } } "mark" { # Detect the case of insert point position "$t mark set insert ..." if {[string match "set insert *" $args]} { # Inhibit mark set from button press if {[info exists v(tk,dontmove)]} { unset v(tk,dontmove) return } # Requested insert position set idx [lindex $args 2] # Some "ad-hoc" test to decide if we move left or right in # case we are out of segment if {([string match "*-*" $idx] || [$t compare $idx < insert] || [string match "*lineend*" $idx]) && ![string match "*linestart*" $idx]} { set dir "-1c" } else { set dir "+1c" } set idx [$t index $idx] while {[$t compare $idx < end]} { # Search a pos where insertion is allowed set data [GetDataFromPos "$idx"] if {$data != ""} { # Move to new pos and view corresponding segment eval $t $option set insert $idx SynchroToText [SyncBefore $data] return } # If selection active, don't move cursor (blinking effect) if {[$t tag ranges sel] != ""} return # "Bounce" on first char and move left or right if {[$t compare $idx == 1.0]} { set dir "+1c" } set idx [$t index "$idx $dir"] } } else { eval $t $option $args } } default { # Blindly propagate other commands to widget eval $t $option $args } } } ################################################################ # Search a breakpoint tag at the left of given cursor position # because we can only insert right to a data tagged char proc GetDataFromPos {idx} { global v set t $v(tk,edit)-bis set tags [$t tag names "$idx -1 chars"] set data [lindex $tags [lsearch -glob $tags "*data*"]] return $data } # Register modification of $data item inside $bp breakpoint proc ModifyText {data} { global v set t $v(tk,edit)-bis # Save old text for Undo DoModif [list "TEXT" $data [$data getData]] # Register new text into data field of transcription set txt [$t get "$data.first+1c" "$data.last"] $data setData $txt # Display whole segment text on segmentation set bp [SyncBefore $data] SetSegmtField seg0 [SearchSegmtId seg0 $bp] -text [TextFromSync $bp] } ################################################################ proc ViewAroundText {} { global v if ![info exists v(segmt,curr)] return set t $v(tk,edit)-bis set nb $v(segmt,curr) set bp1 [GetSegmtId [expr $nb-1]] if [catch {$t see "$bp1.first+1c"}] {$t see 1.0} set bp2 [GetSegmtId [expr $nb+1]] if [catch {$t see "$bp2.first+1c"}] {$t see end} $t see insert } ################################################################ # Goto end of next/previous synchro/segment/section depending on $rel # (or current insert pos if move impossible) proc TextNextLine {{dir +1}} { global v tkTextSetCursor $v(tk,edit) "insert${dir}l" if {$v(preferedPos) == "begin"} { tkTextSetCursor $v(tk,edit) "insert linestart" } elseif {$v(preferedPos) == "end"} { tkTextSetCursor $v(tk,edit) "insert lineend" } } proc TextNextSync {rel} { global v set t $v(tk,edit)-bis set id [GetSegmtId [expr $v(segmt,curr)+$rel]] if {$id != ""} { set last [lindex [$t tag nextrange "sync" "$id.first"] 1] tkTextSetCursor $v(tk,edit) "$last lineend" if {$v(preferedPos) == "begin"} { tkTextSetCursor $v(tk,edit) "insert linestart" } else { tkTextSetCursor $v(tk,edit) "insert lineend" } update idle } } proc TextFirstSync {} { global v tkTextSetCursor $v(tk,edit) 1.0 } proc TextLastSync {} { global v tkTextSetCursor $v(tk,edit) {end - 1 char} } proc TextNextTurn {rel {spk ""}} { global v set t $v(tk,edit)-bis set nb $v(segmt,curr) set max [expr [GetSegmtNb seg0]-1] while {1} { set nb [expr $nb+$rel] if {$nb > $max} { set nb 0 } elseif {$nb < 0} { set nb $max } if {$nb == $v(segmt,curr)} { return } set tag [GetSegmtId $nb] set tur [$tag getFather] set bros [$tur getChilds] if {$tag == [lindex $bros 0]} { if {$spk != ""} { set crt [$tur getAttr "speaker"] if {[lsearch -exact $crt $spk] < 0} { continue } } set id [GetSegmtId $nb] set last [lindex [$t tag nextrange "sync" "$id.first"] 1] tkTextSetCursor $v(tk,edit) "$last lineend" return } } } proc TextNextSection {rel {top ""}} { global v set t $v(tk,edit)-bis set nb $v(segmt,curr) set max [expr [GetSegmtNb seg0]-1] while {1} { set nb [expr $nb+$rel] if {$nb > $max} { set nb 0 } elseif {$nb < 0} { set nb $max } if {$nb == $v(segmt,curr)} { return } set tag [GetSegmtId $nb] set sec [[$tag getFather] getFather] set bros [[lindex [$sec getChilds] 0] getChilds] if {$tag == [lindex $bros 0]} { if {$top != ""} { set crt [$sec getAttr "topic"] if {[lsearch -exact $crt $top] < 0} { continue } } set id [GetSegmtId $nb] set last [lindex [$t tag nextrange "sync" "$id.first"] 1] tkTextSetCursor $v(tk,edit) "$last lineend" return } } } ################################################################ # Test text widget existence for Cut/Copy/Paste proc TextCmd {{type ""}} { global v if ![info exists v(tk,edit)] return eval tk_text$type $v(tk,edit) } proc InsertText {text} { global v if ![info exists v(tk,edit)] return $v(tk,edit) insert insert $text } ################################################################ # Find & Replace proc Find {} { global v if ![info exists v(tk,edit)] return set w .find if ![winfo exists $w] { toplevel $w wm title $w [Local "Find and replace"] if {[info tclversion] >= 8.4 && $::tcl_platform(platform) == "windows"} { wm attributes $w -topmost 1 } set v(find,what) "" set v(find,direction) "-forward" set v(find,case) "-nocase" set v(find,mode) "-exact" set v(find,replace) "" frame $w.what -relief raised -bd 1 checkbutton $w.what.case -text [Local "Case sensitive"] -variable v(find,case) -offvalue "-nocase" -onvalue "" -anchor w -padx 3m checkbutton $w.what.dir -text [Local "Backward search"] -variable v(find,direction) -offvalue "-forward" -onvalue "-backward" -anchor w -padx 3m checkbutton $w.what.rgxp -text [Local "Use regular expression"] -variable v(find,mode) -offvalue "-exact" -onvalue "-regexp" -anchor w -padx 3m pack $w.what.rgxp $w.what.dir $w.what.case -expand true -fill x -side bottom EntryFrame $w.what.val "Find" v(find,what) $w.what.val.lab conf -width 10 -anchor w frame $w.repl -relief raised -bd 1 EntryFrame $w.repl.val "Replace" v(find,replace) $w.repl.val.lab conf -width 10 -anchor w frame $w.but -relief raised -bd 1 button $w.but.next -text [Local "Next"] -command [list FindNext] -default active button $w.but.repl -text [Local "Replace"] -command [list Replace] button $w.but.repa -text [Local "Replace all"] -command [list ReplaceAll] button $w.but.close -text [Local "Close"] -command [list wm withdraw $w] pack $w.but.next $w.but.repl $w.but.repa $w.but.close -side left \ -expand 1 -padx 2m -pady 1m pack $w.what $w.repl $w.but -side top -fill both -expand true focus $w.what.val.ent bind $w "tkButtonInvoke $w.but.next" } else { FrontWindow $w } } proc FindNext {{loop 1}} { global v if ![info exists v(tk,edit)] return set t $v(tk,edit) if {$v(find,direction) == "-backward" && [${t}-bis tag ranges sel] != ""} { set start "sel.first" } else { set start "insert" } if {$loop} { set stop "" } elseif {$v(find,direction) == "-backward"} { set stop "1.0" } else { set stop "end" } set pos [eval ${t}-bis search $v(find,direction) $v(find,mode) \ $v(find,case) -count cnt -- [list $v(find,what)] $start $stop] ${t}-bis tag remove sel 0.0 end if {$pos != ""} { $t mark set insert "$pos + $cnt chars" ${t}-bis tag add sel $pos insert } else { DisplayMessage "$v(find,what) not found." } return $pos } proc Replace {{loop 1}} { global v if ![info exists v(tk,edit)] return set t $v(tk,edit) # If no selection, do find and replace if {[${t}-bis tag ranges sel] == ""} { FindNext $loop } # If still no selection, abort replace. if {[${t}-bis tag ranges sel] == ""} { return } # Do the work (skipping element tags) if {[lsearch -glob [$t tag names sel.first] "*element*"] < 0} { $t mark set insert "sel.first" $t delete "insert" "sel.last" $t insert insert $v(find,replace) set nb 1 } else { $t mark set insert "sel.last" set nb 0 } # Search again FindNext $loop DisplayMessage "Replaced $nb occurence" return $nb } # Replace all occurences without wrap-around at document boundaries # (avoiding infinite loops) proc ReplaceAll {} { global v if ![info exists v(tk,edit)] return set t $v(tk,edit) set nb 0 while {[set done [Replace 0]] != ""} { incr nb $done if {[expr $nb % 10] == 0} { ${t}-bis see insert update idle } } $t see insert DisplayMessage "Replaced $nb occurence(s)." } ################################################################ proc CheckTerminator {t} { global v set a [$t index insert] set oldcursor $a regsub {.[0-9]+$} $a "" line set lastchar [$t get $line.0 $line.end] if {[regexp {^\[.*$} $lastchar] == 1} { return } tkTextSetCursor $t "$line.end" set a [$t index insert] regsub {^[0-9]+.} $a "" lineend set lastone [expr $lineend- 1] set lastchar [$t get $line.$lastone $line.end] set found 0 if {[info exists v(terminator,$lastchar)] != 0 && $v(terminator,$lastchar) == 1} { set found 1 } else { set lastone [expr $lineend- 2] set lastchar [$t get $line.$lastone $line.end] if {[info exists v(terminator,$lastchar)] != 0 && $v(terminator,$lastchar) == 1} { set found 1 } else { set lastone [expr $lineend- 3] set lastchar [$t get $line.$lastone $line.end] if {[info exists v(terminator,$lastchar)] != 0 && $v(terminator,$lastchar) == 1} { set found 1 } else { set lastone [expr $lineend- 4] set lastchar [$t get $line.$lastone $line.end] if {[info exists v(terminator,$lastchar)] != 0 && $v(terminator,$lastchar) == 1} { set found 1 } } } } tkTextSetCursor $t $oldcursor if {$found != 1} { tk_dialog .my_errormsg "Terminator not valid" \ "The terminator is not valid for CHILDES format" "" 0 "Ok" } } transcriber-1.5.1.1/tcl/Trans.tcl0000444000175000017500000007070710170743442014417 0ustar rtrt# RCS: @(#) $Id: Trans.tcl,v 1.22 2005/01/11 12:31:30 mantam Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) ################################################################ # Native transcription in XML format I/O namespace eval trs { variable msg "Native XML format" variable ext ".trs .xml" proc guess {name} { # any XML file with 'Trans' root tag is supposed to be a .trs file set f [open $name]; set magic [read $f 128]; close $f if {[string match "=0] } } } # Add default readSegmt proc from readSegmtSet if {[info command ${format}::readSegmt] == "" && [info command ${format}::readSegmtSet] != ""} { namespace eval $format { proc readSegmt {content} { return [lindex [lindex [readSegmtSet $content] 0] 0] } } } if {[info command ${format}::import] != ""} { eval lappend v(ext,trs) $ext } elseif {[info command ${format}::readSegmt] != ""} { eval lappend v(ext,lbl) $ext } } } #UpdateConvertorMenu } proc UpdateConvertorMenu {} { global v foreach format [namespace children convert] { upvar 0 ${format}::msg msg if {[info command ${format}::export] != ""} { if {[namespace tail $format] == "cha" && !$v(chatMode)} continue append_menu "Export" [subst { {"Export to $msg..." cmd {SaveTrans as $format}} }] } } } ################################################################ # Read single-level segmentations # Read any file proc ReadFile {fileName} { global v set channel [open $fileName r] # Read with chosen encoding (intended for tcl/tk 8.1 only) if {![catch {encoding system}]} { fconfigure $channel -encoding [EncodingFromName $v(encoding)] } set text [read -nonewline $channel] close $channel return $text } proc LookForLabelFormat {name} { global v # Look for a segmentation format matching the file set format "" foreach ns [lsort [namespace children convert]] { if {[info command ${ns}::readSegmt] != "" && [${ns}::guess $name]} { set format $ns break } } return $format } # Open one or severel new independant segmentation files proc OpenSegmt {args} { global v if {$args != ""} { set names $args } else { set types [subst { {"Label file" {$v(ext,lbl)}} {"All files" {*}} }] if {$v(labelNames) != {}} { set path [file dir [lindex $v(labelNames) 0]] } elseif {$v(trans,name) == "" && $v(sig,name) != ""} { set path [file dir $v(sig,name)] } else { set path $v(trans,path) } if {[info tclversion] >= 8.4} { set names [tk_getOpenFile -filetypes $types -initialdir $path \ -multiple 1 -title [Local "Open segmentation file"]] } else { set names [list [tk_getOpenFile -filetypes $types -initialdir $path \ -title [Local "Open segmentation file"]]] } } foreach name $names { if {![file readable $name]} continue # Look for a segmentation format matching the file set format [LookForLabelFormat $name] if {$format == ""} { error [format [Local "Unknown format for file %s"] $name] } # Choose uique segmentation id set i 1 set seg lbl$i if {[info command ${format}::readSegmtSet] != ""} { set result [${format}::readSegmtSet [ReadFile $name]] } else { set result [list [list [${format}::readSegmt [ReadFile $name]]]] } foreach set $result { foreach {segments entryname view color} $set break if {$view == ""} { set view 1 } if {$color == ""} { set color white } while {[info exists v(trans,$seg)]} { set seg lbl[incr i] } set v(trans,$seg) $segments foreach wavfm $v(wavfm,list) { set v(view,[winfo parent $wavfm].$seg) $view CreateSegmentWidget $wavfm $seg "[file tail $name] $entryname" -full $color } } lappend v(labelNames) $name } } # Create a transcription from a segmentation proc SegmtToTrans {segmt} { global v # Newly created transcription must follow the DTD ::xml::dtd::xml_read $v(file,dtd) if {$v(sig,name) != ""} { set t0 $v(sig,min) set t2 $v(sig,max) } else { set t0 [lindex [lindex $segmt 0] 0] set t2 [lindex [lindex $segmt end] 1] } set v(trans,root) [::xml::element "Trans"] set id0 [::xml::element "Episode" {} -in $v(trans,root)] set id1 [::xml::element "Section" [list "type" "report" "startTime" $t0 "endTime" $t2] -in $id0] set id2 [::xml::element "Turn" [list "startTime" $t0 "endTime" $t2] -in $id1] foreach s $segmt { set t1 [lindex $s 0] if {$t0 < $t1} { ::xml::element "Sync" [list "time" $t0] -in $id2 ::xml::data "" -in $id2 } ::xml::element "Sync" [list "time" $t1] -in $id2 ::xml::data [lindex $s 2] -in $id2 set t0 [lindex $s 1] } if {$t0 < $t2} { ::xml::element "Sync" [list "time" $t0] -in $id2 ::xml::data "" -in $id2 } } ################################################################ # Read transcriptions # Read transcription file in several formats # Called from: OpenTrans(OrSound)File, RevertTrans, StartWith proc ReadTrans {name {soundFile ""} {multiwav {}}} { global v # First, try to rescue from last autosaved file if it exists. AutoRescue $name set format "trs" foreach ns [namespace children convert] { if {[info command ${ns}::guess] != "" && [${ns}::guess $name]} { set format $ns break } } #puts "format $format" DisplayMessage [Local "Cleaning up memory..."]; update CloseTrans -nosave EmptyVideo # Try to open associated sound file as early as possible for non-xml files if {$format !="trs"} { LookForSignal $name $soundFile } DisplayMessage [Local "Reading transcription file..."]; update if {[info command ${format}::import] != ""} { ${format}::import $name } elseif {[info command ${format}::readSegmt] != ""} { SegmtToTrans [${format}::readSegmt [ReadFile $name]] } else { error "Can't import from [set ${format}::msg]" } if {[namespace tail $format] == "cha"} { setChatMode 1 } else { setChatMode 0 } set v(trans,name) $name UpdateShortName set v(trans,format) $format set v(trans,saved) 0 set v(trans,path) [file dirname $name] if {$v(importTopics)} { ::topic::import $v(topicFile) 0 } if {$v(importSpeakers)} { ::speaker::import $v(speakerFile) 0 } InitModif GetVersion if {[set msg [NormalizeTrans]] != ""} { tk_messageBox -message $msg -title [Local "File format checking"] -type ok -icon error puts stderr $msg } DisplayTrans TraceOpen # Try to open automatically sound file else ask user if {$format == "trs"} { LookForSignal $name $soundFile [lindex [GetFilename] 0] } else { # For newly created transcriptions, keep info about signal basename UpdateFilename } if {$v(sig,name) == ""} { set rep [tk_messageBox -type okcancel -icon warning -message \ [concat [Local "Please open signal for transcription"] $name]] if {$rep == "ok"} { OpenAudioFile } if {$v(sig,name) == ""} { EmptySignal } } # add list of sound files found in .trs header if {$format == "trs"} { MW_Update } # also add multiple wav files from command line or configuration if {[llength $multiwav] > 1} { eval MW_AddFile $multiwav UpdateFilename } # trace if the name of the dtd has been updated to do like if the transcription have been modified # if { [info exists ::xml::parser::modifdtd] && $::xml::parser::modifdtd == "1" } { # set v(trans,modif) 1 # RegisterAutoSave # } } proc setChatMode {newMode} { global v set oldMode $v(chatMode) set v(chatMode) $newMode if {$v(chatMode) != $oldMode} { InitMenus } } # Open transcription file through selection box proc OpenTransFile {} { global v if [catch {SaveIfNeeded} err] return set types [subst { {"Transcription" {$v(ext,trs)}} {"Label file" {$v(ext,lbl)}} }] eval lappend types $v(newtypes) {{"All files" {*}}} set name [tk_getOpenFile -filetypes $types -initialdir $v(trans,path) \ -title [Local "Open transcription file"]] if {$name != ""} { if {[catch { ReadTrans $name } error]} { tk_messageBox -message $error -type ok -icon error NewTrans $v(sig,name) return } } } # Open transcription or sound file through selection box at startup proc OpenTransOrSoundFile {} { global v set upperSndExt [string toupper $v(ext,snd)] set allSndExt [concat $v(ext,snd) $upperSndExt] set upperTrsExt [concat [string toupper $v(ext,trs)] [string toupper $v(ext,lbl)]] set allTrsExt [concat $v(ext,trs) $v(ext,lbl) $upperTrsExt] set types [subst { {"All files" {*}} {"Transcription" {$allTrsExt}} {"Audio files" {$allSndExt}} }] set name [tk_getOpenFile -filetypes $types -initialdir $v(trans,path) \ -title [Local "Open transcription or audio file"]] if {$name != ""} { if {[catch { set ext [file extension $name] if {[lsearch -exact [lindex [lindex $types 1] 1] $ext] >= 0} { ReadTrans $name } elseif {[lsearch -exact [lindex [lindex $types 2] 1] $ext] >= 0 || [SoundFileType $name] != "RAW"} { NewTrans $name } else { tk_messageBox -message "Type of $name unknown" -type ok -icon error NewTrans "" } } error]} { tk_messageBox -message "$error" -type ok -icon error } else { return } } NewTrans "" } ################################################################ # Write transcriptions # Write transcription to the file in specified format; returns chosen format. proc WriteTrans {name format} { global v set ext [string trimright [string tolower [file extension $name]] "\#"] # Try to guess format from extension if not given - unused feature # if {$format == ""} { # foreach format [concat [namespace children convert] "trs"] { # if {[info exists ${format}::ext] # && [lsearch [set ${format}::ext] $ext] >= 0} { # break # } # } # } if {[lsearch [set ${format}::ext] $ext] < 0} { if {[tk_messageBox -type yesno -icon question -message [format [Local "%s is not a standard extension for %s. Continue?"] $ext [set ${format}::msg]]] != "yes"} { error "" } } if {[info command ${format}::export] != ""} { ${format}::export $name } else { error [format [Local "unsupported output format %s"] [namespace tail $format]] } DisplayMessage [format [Local "Transcription %s saved."] $name] return $format } ################################################################ # Open and save transcriptions (user-level) # Create new transcription. # If audio file not given, ask through dialog box. proc NewTrans {{soundFile ""} {multiwav {}}} { global v if [catch {CloseTrans} err] return EmptyVideo if {[catch { if {$soundFile == ""} { EmptySignal } elseif {$soundFile != "" && ([file readable $soundFile] || $v(sig,remote))} { Signal $soundFile } else { OpenAudioFile } }]} { if {$v(debug)} {puts $::errorInfo} EmptySignal } # add multiple wav files from command line eval MW_AddFile $multiwav setChatMode 0 set v(trans,name) "" UpdateShortName set v(trans,format) "trs" set v(trans,saved) 0 SegmtToTrans [list [list $v(sig,min) $v(sig,max) ""]] InitEpisode if {$v(importTopics)} { ::topic::import $v(topicFile) 0 } if {$v(importSpeakers)} { ::speaker::import $v(speakerFile) 0 } InitModif DisplayTrans TraceOpen } # Save [as] # returns empty string if save failed (or was canceled) proc SaveTrans {{as ""} {format ""}} { global v if { [info exists ::xml::parser::modifdtd] && $::xml::parser::modifdtd == "1" } { set rep [tk_messageBox -message [Local "This file is formated for older version of Transcriber (<1.4.7).\nExport to new format ?\n\n\"yes\" will export to new format and make your file only usable with Transcriber-1.4.7 or higher (recommended).\n\n\"no\" will keep the original format."] -type yesnocancel -icon question] switch $rep { cancel { return } yes { set ::xml::parser::modifdtd 0 } no { set ::xml::parser::modifdtd 0 set ::xml::dtd::name [file join $v(path,etc) "$::xml::parser::olddtd"] } } } if {[GetSegmtNb seg0] <= 0} return if {$format == ""} { set format "trs" } if {$v(trans,name) != "" && $as == "" && $v(trans,format) == $format} { set name $v(trans,name) } else { if {$v(trans,name) == ""} { # default base name is first one from list given in episode tag set base [lindex [GetFilename] 0] } else { set base [file root [file tail $v(trans,name)]] } set exts [set ${format}::ext] set ext [lindex $exts 0] set types [list [list [set ${format}::msg] $exts]] lappend types {"All files" {*}} set name [tk_getSaveFile -filetypes $types -defaultextension $ext \ -initialfile $base$ext -initialdir $v(trans,path) \ -title "Save transcription file $as"] if {$name != "" && [file extension $name] == ""} { append name $ext } } if {$name != ""} { if {[file exists $name] && $v(backup,ext) != "" && ($v(trans,name) == "" || $as != "" || !$v(trans,saved))} { file copy -force -- $name "$name$v(backup,ext)" } if {[HasModifs]} { UpdateVersion } if [catch { WriteTrans $name $format } res] { tk_messageBox -message [format [Local "%s not saved !!"] $name] -type ok -icon error return "" } else { tk_messageBox -message [format [Local "%s saved !!"] $name] -type ok -icon info } if {$format == "trs"} { set v(trans,name) $name UpdateShortName set v(trans,format) $res set v(trans,saved) 1 set v(trans,path) [file dirname $name] InitModif } } return $name } proc SaveIfNeeded {} { global v if { [info exists ::xml::parser::modifdtd] && $::xml::parser::modifdtd == "1" } { set rep [tk_messageBox -message [Local "This file is formated for older version of Transcriber (<1.4.7).\nExport to new format ?\n\n\"yes\" will export to new format and make your file only usable with Transcriber-1.4.7 or higher (recommended).\n\n\"no\" will keep the original format."] -type yesnocancel -icon question] switch $rep { cancel { return -code error cancel } yes { set ::xml::parser::modifdtd 0 if {[SaveTrans]==""} {return -code error cancel} } no { set ::xml::parser::modifdtd 0 set ::xml::dtd::name [file join $v(path,etc) "$::xml::parser::olddtd"] } } } if {[HasModifs]} { set answer [tk_messageBox -message [Local "Transcription has been modified - Save before closing?"] -type yesnocancel -icon question] switch $answer { cancel { return -code error cancel } yes { if {[SaveTrans]==""} {return -code error cancel} } no { } } } } proc RevertTrans {} { global v if {$v(trans,name) != "" && [HasModifs]} { set answer [tk_messageBox -message [Local "Warning !\nAll changes will be lost.\nReally revert from file ?"] -type okcancel -icon warning] if {$answer == "ok"} { InitModif ReadTrans $v(trans,name) $v(sig,name) } } } # called from: NewTrans, ReadTrans, CloseAndDestroyTrans proc CloseTrans {{option save}} { global v if {$option=="save"} { SaveIfNeeded } TraceClose EmptyTextFrame ::xml::init set v(trans,root) "" ::speaker::init ::topic::init InitSegmt seg0 seg1 seg2 bg DestroyLabels set v(trans,name) "" UpdateShortName InitModif } proc CloseAndDestroyTrans {} { global v if [catch { CloseTrans } err] { return -code return } DestroyTextFrame DestroySegmentWidgets } ################################################################ proc TransInfo {} { global v return [list [GetSegmtNb seg2] [llength [::topic::all_names]] [GetSegmtNb seg1] [llength [::speaker::all_names]] [GetSegmtNb seg0] [CountWordSegmt seg0]] } ################################################################ # Normalize the transcription by "filling the holes" with sections or turns, # check wrong boundary order # and creates empty data sections between non-contiguous breakpoints proc NormalizeTrans {} { global v set msg "" if {![info exist v(trans,root)] || $v(trans,root)==""} return DisplayMessage [Local "Checking temporal consistency..."]; update set episode [$v(trans,root) getChilds "element" "Episode"] # Contrain sections to be a partition of the episode #if {[namespace tail $v(trans,format)] != "hub4e"} if {1} { set t1 $v(sig,min) foreach sec [$episode getChilds "element" "Section"] { set t2 [$sec getAttr "startTime"] if {$t2 < $t1} { $sec setAttr "startTime" $t1 append msg "shifted start time of overlapping section $t2 -> $t1\n" } elseif {$t2 > $t1} { ::xml::element "Section" [list "type" "nontrans" "startTime" $t1 "endTime" $t2] -before $sec #append msg "inserted new section between $t1-$t2\n" } set t1 [$sec getAttr "endTime"] # detect inconsistency in sections if {$t1 <= $t2} { append msg "WARNING - section interval inconsistency $t2-$t1\n" } } # Don't add a new section up to the end, because we will synchronize # the last breakpoint to the end of signal - else it would be done with: #set t2 $v(sig,max) #if {$t2 > $t1} { # ::xml::element "Section" [list "type" "nontrans" "startTime" $t1 "endTime" $t2] -in $episode #} } foreach sec [$episode getChilds "element" "Section"] { # Constrain turns to be a partition of each section if {1} { set t1 [$sec getAttr "startTime"] foreach turn [$sec getChilds "element" "Turn"] { set t2 [$turn getAttr "startTime"] if {$t2 < $t1} { $turn setAttr "startTime" $t1 append msg "shifted start time of overlapping turn $t2 -> $t1\n" } elseif {$t2 > $t1} { ::xml::element "Turn" [list "startTime" $t1 "endTime" $t2] \ -before $turn #append msg "inserted new turn between $t1-$t2\n" } set t1 [$turn getAttr "endTime"] # detect inconsistency in turns if {$t1 <= $t2} { append msg "WARNING - turn interval inconsistency $t2-$t1\n" } } set t2 [$sec getAttr "endTime"] if {$t2 < $t1} { $turn setAttr "endTime" $t2 append msg "shifted end time of overlapping turn $t1 -> $t2\n" } elseif {$t2 > $t1} { ::xml::element "Turn" [list "startTime" $t1 "endTime" $t2] -in $sec #append msg "inserted new turn between $t1-$t2\n" } } foreach turn [$sec getChilds "element" "Turn"] { set t1 [$turn getAttr "startTime"] # Each turn must begin with a sync set sync [lindex [$turn getChilds "element" "Sync"] 0] if {$sync == "" || [$sync getAttr "time"] > $t1} { ::xml::element "Sync" [list "time" $t1] -begin $turn } if {$sync != "" && [$sync getAttr "time"] < $t1} { append msg "shifted synchro [$sync getAttr time] -> $t1\n" $sync setAttr "time" $t1 } # Create data between non-contiguous breakpoints foreach elem [$turn getChilds "element"] { set next [$elem getBrother "element"] if {$next == ""} { set t2 [$turn getAttr "endTime"] } else { set t2 "" catch { set t2 [$next getAttr "time"] } } if {$t1 == "" || $t2 == "" || $t2 > $t1} { set data [$elem getBrother] if {$data == "" || ([$data class] != "data" && !([$data class] == "element" && [$data getType] == "Who" && [$data getAttr "nb"] == 1))} { ::xml::data "" -after $elem } } else { if {$t2 < $t1} { # detect inconsistency in times append msg "WARNING - element time inconsistency at $t2\n" } } set t1 $t2 } # Convert data [...] to XML tags for .typ and old .xml format if {[namespace tail $v(trans,format)] == "typ" || $v(convert_events)} { foreach data [$turn getChilds "data"] { ConvertData $data } } } } return $msg } ################################################################ # Try to guess Events from strings in .typ - very rough anyway. proc ConvertData {data} { set text [$data getData] if {[regexp ".*SPEAKER1: ?(.*) SPEAKER2: ?(.*)" $text all t1 t2]} { set text "\[1]$t1\[2]$t2" } while {[regexp "^(\[^\\\[]*)\\\[(\[^]]+)](.*)$" $text all t1 evt text]} { $data setData $t1 switch -regexp -- $evt { ^(1|2)$ { set elem [::xml::element "Who" [list "nb" $evt] -after $data] } ^-?(r|i|e|n|pf|bb|bg|tx|rire|sif|ch|b|conv|pap|shh|mic|jingle|musique|indicatif|top|pi|pif|nontrans)-?$ { set extn "instantaneous" # For backward compability: [noise-] ... [-noise] if {[regexp "^(-)?(.*\[^-])(-)?$" $evt all start evt end]} { if {$start != ""} { set extn "end" } elseif {$end != ""} { set extn "begin" } } set elem [::xml::element "Event" \ [list "desc" $evt "extent" $extn] -after $data] } default { set elem [::xml::element "Comment" [list "desc" $evt] -after $data] } } set data [::xml::data $text -after $elem] } } ################################################################ # Display a (previously normalized) transcription. # Process sequentially time markers of the transcription and # register a unique shared time for each different value. # Create a segmentation at section, speaker and synchro level. proc DisplayTrans {} { global v variable ::Synchro::time if {![info exist v(trans,root)] || $v(trans,root)==""} return set episode [$v(trans,root) getChilds "element" "Episode"] DisplayMessage [Local "Displaying transcription..."]; update # Init set min $v(sig,min) set max $v(sig,max) InitSegmt seg0 seg1 seg2 bg Synchro::InitTime InitEditor update set t0 [Synchro::NewTime $min]; set t6 $t0; set t5 $t0; set tprev $t0 set bgTim $t0; set bgTxt ""; set bgId "" if {$v(chatMode)} { InsertEpisodeButton $episode } foreach sec [$episode getChilds "element" "Section"] { set t1 [Synchro::NextTimeTag $sec "startTime"] # Editor button if {!$v(chatMode)} { InsertSectionButton $sec } # register new section segment set t6 [Synchro::NextTimeTag $sec "endTime"] set top [::section::short_name $sec] AddSegmt seg2 $t1 $t6 $top $sec set turns [$sec getChilds "element" "Turn"] foreach tur $turns { set t2 [Synchro::NextTimeTag $tur "startTime"] # Editor button InsertTurnButton $tur # register new turn segment set t5 [Synchro::NextTimeTag $tur "endTime"] set spk [::turn::get_name $tur] AddSegmt seg1 $t2 $t5 $spk $tur set txt "" set t3 $t2 foreach chn [$tur getChilds] { switch [$chn class] { "element" { switch [$chn getType] { "Sync" { # register new synchro segment set t4 [Synchro::NextTimeTag $chn "time"] if {$time($t4)>$time($t3)} { AddSegmt seg0 $t3 $t4 $txt $id # Test overlap with previous turn for display if {$time($tprev) > $time($t3)} { ChangeSyncButton $idprev over1 ChangeSyncButton $id over2 } } set t3 $t4 set id $chn set txt "" InsertSyncButton $id # update image for floating boundaries if {[Synchro::getElastic $t3]} { Synchro::updateSyncImage $t3 } # for first Background breakpoint if {$bgId == ""} { set bgId $chn } } "Background" { set t4 [Synchro::NextTimeTag $chn "time"] if {$time($t4) > $time($bgTim)} { AddSegmt bg $bgTim $t4 $bgTxt $bgId } set bgTim $t4 set bgId $chn foreach {bgTxt img} [ReadBackAttrib $chn] {} InsertImage $chn $img } "Dependent" { InsertDependent $chn } "Header" { InsertHeader $chn } "Scope" { InsertScope $chn } "Event" - "Comment" { # Enable to display a " " between 2 contiguous events # In that case, if an event is deleted, it will be replaced by a " " set prevBrother [$chn getBrother * * -1] set prevPrevBrother [$prevBrother getBrother * * -1] if { ( [$prevBrother class] == "data" && [$prevBrother getData] == "" ) && ([$prevPrevBrother class]=="element" && [$prevPrevBrother getType]=="Event")} { $prevBrother setData " " append txt " " InsertData $prevBrother } InsertEvent $chn append txt [StringOfEvent $chn] } "Who" { if {[$chn getAttr "nb"] > 1} { # segment box is splitted vertically at form-feed append txt "\f" } InsertWho $chn } default { InsertOther $chn append txt [StringOfOther $chn] } } } "data" { append txt [$chn getData] InsertData $chn } } } # register last synchro segment if {$time($t5)>$time($t3)} { AddSegmt seg0 $t3 $t5 $txt $id # Test overlap with previous turn for display if {$time($tprev) > $time($t3)} { ChangeSyncButton $idprev over1 ChangeSyncButton $id over2 } } # For overlapping speech set idprev $id set tprev $t5 } } if {$time($t6) > $time($bgTim)} { AddSegmt bg $bgTim $t6 $bgTxt $bgId } #set t7 [Synchro::NewTime $max] # For demo purposes only if {[info exists v(demo)]} { DestroyTextFrame DestroySegmentWidgets CreateSegmentWidget .snd.w seg0 "Demo" -fg $v(color,fg-sync) -full $v(color,bg-sync) -height 1 -high $v(color,hi-sync) destroy .demo frame .demo -bd 2 -relief raised pack .demo -expand true -fill both -side top text .demo.txt -wrap word -width 40 -height 15 \ -fg $v(color,fg-text) -bg $v(color,bg-text) \ -font {courier 24 bold} -yscrollcommand [list .demo.ysc set] scrollbar .demo.ysc -orient vertical -command [list .demo.txt yview] pack .demo.txt -side left -fill both -expand true pack .demo.ysc -side right -fill y bind .demo.txt {.demo.txt delete 1.0 end} return } # Create widgets if necessary CreateAllSegmentWidgets # Only display requested ones UpdateSegmtView # Fancy colors if needed ColorizeSpk HomeEditor DisplayMessage "" } ################################################################ # Construct text description associated with Sync tag proc TextFromSync {bp} { set txt "" for {set tag [$bp getBrother]} {$tag != ""} {set tag [$tag getBrother]} { switch [$tag class] { "data" { append txt [$tag getData] } "element" { switch [$tag getType] { "Sync" { break } "Background" { #append txt " * " } "Who" { set nb [$tag getAttr "nb"] if {$nb > 1} { # segment box is splitted vertically at form-feed append txt "\f" } } "Event" - "Comment" { append txt [StringOfEvent $tag] } default { append txt [StringOfOther $tag] } } } } } return $txt } # Get BP from which depends current tag proc SyncBefore {tag} { return [$tag getBrother "element" "Sync" -1] } transcriber-1.5.1.1/tcl/Undo.tcl0000444000175000017500000002216607553033306014233 0ustar rtrt# RCS: @(#) $Id: Undo.tcl,v 1.4 2002/10/15 15:39:50 barras Exp $ # Copyright (C) 1998-2000, DGA - part of the Transcriber program # distributed under the GNU General Public License (see COPYING file) # called by: ReadTrans, NewTrans, SaveTrans, CloseTrans proc InitModif {} { global v set v(trans,modif) {} # Init auto-save and undo InitAutoSave InitUndo } proc DoModif {descr} { global v set v(trans,modif) 1 # Handle auto-save and undo RegisterAutoSave RegisterUndo $descr } proc HasModifs {} { global v return [expr {[info exists v(trans,modif)] && $v(trans,modif) != ""}] } ################################################################ proc InitUndo {} { global v set v(undo,list) {} set v(undo,redo) 0 } proc RegisterUndo {descr} { global v if {[llength $descr] > 1} { # Register undoable changes (TEXT, MOVE, SPEAKER, TOPIC) if {$v(undo,list) == "" || $v(undo,redo) == 1 || [lindex $descr 0] != [lindex $v(undo,list) 0] || [lindex $descr 1] != [lindex $v(undo,list) 1]} { set v(undo,list) $descr } } else { # Can't be undone (INSERT, DELETE, TYPE) set v(undo,list) {} } set v(undo,redo) 0 } # Returns 0 in case of no undo available, 1 if undo, 2 if redo proc HasUndo {} { global v return [expr {($v(undo,list) != "") + $v(undo,redo)}] } proc Undo {} { global v if {$v(undo,list) == ""} return # Unset previous value (and allow "redo") set undo $v(undo,list) set v(undo,list) "" switch [lindex $undo 0] { "TEXT" { set data [lindex $undo 1] set txt [lindex $undo 2] set t $v(tk,edit) $t mark set insert "$data.first+1c" $t delete insert "$data.last" $t insert insert $txt } "MOVE" { set id [lindex $undo 1] set pos [lindex $undo 2] set flt [lindex $undo 3] Synchro::GetBoundaries $id previous left right leftIds rightIds set prev_flt [Synchro::getElastic $id] Synchro::ModifyTime $id $pos Synchro::setElastic $id $flt Synchro::ModifyElastic $leftIds $previous $pos $left Synchro::ModifyElastic $rightIds $previous $pos $right foreach i [concat $id $leftIds $rightIds] { Synchro::UpdateTimeTags $i } DoModif "MOVE $id $previous $prev_flt" } "SPEAKER" { ::speaker::set_atts [lindex $undo 1] [lindex $undo 2] } "TOPIC" { ::topic::set_atts [lindex $undo 1] [lindex $undo 2] } "TURN" { ::turn::set_atts [lindex $undo 1] [lindex $undo 2] } "SECTION" { ::section::set_atts [lindex $undo 1] [lindex $undo 2] } } set v(undo,redo) 1 } ################################################################ proc InitAutoSave {} { global v if {[info exists v(autosave,name)] && $v(autosave,name) != ""} { # Destroy previous auto-saved file catch {file delete $v(autosave,name)} } set v(autosave,name) [file join [file dirname $v(trans,name)] "\#[file tail $v(trans,name)]\#"] after cancel AutoSave set v(autosave,next) 0 } proc RegisterAutoSave {} { global v catch { if {$v(autosave,time) > 0 && !$v(autosave,next)} { # Register handler for auto-save (time in minutes) after [expr int(1000*60*$v(autosave,time))] AutoSave set v(autosave,next) 1 } } } proc AutoSave {} { global v if {$v(trans,name) == ""} { # Auto-save of a newly created transcription: ask user SaveTrans } else { DisplayMessage "Autosaving as $v(autosave,name). Please wait..." update if {[catch { WriteTrans $v(autosave,name) $v(trans,format) }]} { DisplayMessage "Autosaving as $v(autosave,name) failed!" } else { DisplayMessage "" } } set v(autosave,next) 0 } proc AutoRescue {name} { global v set name2 [file join [file dirname $name] "\#[file tail $name]\#"] if {[file isfile $name] && [file writable $name] && [file isfile $name2] && [file writable $name2] && [file mtime $name2] >= [file mtime $name]} { set answer [tk_messageBox -message [Local "An automatically saved version was found. Rescue from it?"] -type yesno -icon question] if {$answer == "yes"} { # keep last regular version in case autosaved file would be damaged file rename -force -- $name "$name$v(backup,ext)" file rename -force -- $name2 $name } } file delete -force $name2 } ################################################################ # called by Main, ConfigureGeneral, TraceAction proc TraceInit {{dynamic 0}} { global v if {$v(trace,name) == ""} { bind all