ソースを参照

first cut for adding Festival daemon/server support

Ralf S. Engelschall 17 年 前
コミット
c140986683
5 ファイル変更202 行追加38 行削除
  1. 23 0
      festival/festival-init.scm
  2. 7 0
      festival/festival-vars.scm
  3. 38 0
      festival/festival.patch
  4. 71 38
      festival/festival.spec
  5. 63 0
      festival/rc.festival

+ 23 - 0
festival/festival-init.scm

@@ -0,0 +1,23 @@
+;;
+;;  festival-init.scm -- Festival Initialization Procedure (language: Scheme)
+;;
+
+;;  server configuration
+(set! server_log_file      '@l_prefix@/var/festival/festival.log)
+(set! server_port          '12345)
+(set! server_access_list   '("localhost\\.example\\.com" "localhost"))
+(set! server_deny_list     nil)
+(set! server_passwd        nil)
+(set_server_safe_functions '(tts_return_to_client tts_text tts_textall Parameter.set tts_textasterisk))
+
+;;  select default voice (given in the Festival priority order)
+(set! voice_default 'voice_kal_diphone)
+;(set! voice_default 'voice_cmu_us_bdl_arctic_hts)
+;(set! voice_default 'voice_cmu_us_jmk_arctic_hts)
+;(set! voice_default 'voice_cmu_us_slt_arctic_hts)
+;(set! voice_default 'voice_cmu_us_awb_arctic_hts) 
+;(set! voice_default 'voice_ked_diphone)
+;(set! voice_default 'voice_us1_mbrola)
+;(set! voice_default 'voice_us2_mbrola)
+;(set! voice_default 'voice_us3_mbrola)
+

+ 7 - 0
festival/festival-vars.scm

@@ -0,0 +1,7 @@
+;;
+;;  festival-vars.scm -- Festival Variable Configuration (language: Scheme)
+;;
+
+(set! system-voice-path '("@l_prefix@/lib/festival/voices"))
+(set! sgml_parse_progname "@l_prefix@/bin/onsgmls")
+

+ 38 - 0
festival/festival.patch

@@ -35,3 +35,41 @@
 -EST_TVector<int> size = 20 bytes.
 -EST_TMatrix<int> size = 28 bytes.
  Initial Matrix
+Index: festival/lib/init.scm
+--- festival/lib/init.scm.orig	2004-07-16 01:03:04 +0200
++++ festival/lib/init.scm	2008-03-20 16:18:56 +0100
+@@ -55,6 +55,10 @@
+ (if (probe_file (path-append libdir "sitevars.scm"))
+     (load (path-append libdir "sitevars.scm")))
+ 
++;;;  OpenPKG configuration hook 1
++(if (probe_file "@l_prefix@/etc/festival/festival-vars.scm")
++    (load "@l_prefix@/etc/festival/festival-vars.scm")))
++
+ ;;; CSTR siod extensions
+ (require 'cstr)
+ 
+@@ -138,6 +142,10 @@
+ (if (probe_file (path-append libdir "siteinit.scm"))
+     (load (path-append libdir "siteinit.scm")))
+ 
++;;;  OpenPKG configuration hook 2
++(if (probe_file "@l_prefix@/etc/festival/festival-init.scm")
++    (load "@l_prefix@/etc/festival/festival-init.scm")))
++
+ ;;;  User initialization, if a user has a personal customization
+ ;;;  file loaded it
+ (if (probe_file (path-append home-directory ".siodrc"))
+--- festival/lib/multisyn/multisyn_pauses.scm	2004-06-21 08:19:30.000000000 -0600
++++ festival/lib/multisyn/multisyn_pauses.scm	2005-01-12 18:53:27.000000000 -0700
+@@ -85,8 +85,8 @@
+ (let ((silence (car (cadr (car (PhoneSet.description '(silences))))))
+       (seg (item.relation (find_last_seg word) 'Segment))
+       pause_item)
+-  (format t "  inserting pause after: %s.\n" (item.name seg))
+-  (format t "  Inserting pause\n")
++;  (format t "  inserting pause after: %s.\n" (item.name seg))
++;  (format t "  Inserting pause\n")
+ ; if next seg is not silence insert one.
+   (if (or (not (item.next seg))
+ 	  (not (string-equal (item.name (item.next seg)) silence)))

+ 71 - 38
festival/festival.spec

@@ -54,13 +54,16 @@ Source11:     http://festvox.org/packed/festival/%{V_festival}/festvox_cmu_us_aw
 Source12:     http://festvox.org/packed/festival/%{V_festival}/festvox_cmu_us_bdl_arctic_hts.tar.gz
 Source13:     http://festvox.org/packed/festival/%{V_festival}/festvox_cmu_us_jmk_arctic_hts.tar.gz
 Source14:     http://festvox.org/packed/festival/%{V_festival}/festvox_cmu_us_slt_arctic_hts.tar.gz
+Source15:     rc.festival
+Source16:     festival-init.scm
+Source17:     festival-vars.scm
 Patch0:       festival.patch
 
 #   build information
 Prefix:       %{l_prefix}
 BuildRoot:    %{l_buildroot}
 BuildPreReq:  OpenPKG, openpkg >= 20040130, make, gcc, gcc::with_cxx = yes
-PreReq:       OpenPKG, openpkg >= 20040130
+PreReq:       OpenPKG, openpkg >= 20040130, opensp
 AutoReq:      no
 AutoReqProv:  no
 
@@ -99,30 +102,34 @@ AutoReqProv:  no
     %patch -p0
 
 %build
+    #   expand variables in patched sources
+    %{l_shtool} subst %{l_value -s -a} \
+        festival/lib/init.scm
+
     #   build speech tools
-    ( cd speech_tools
-      CC="%{l_cc}" \
-      CXX="%{l_cxx}" \
-      CFLAGS="%{l_cflags -O}" \
-      CXXFLAGS="%{l_cxxflags -O}" \
-      CPPFLAGS="%{l_cppflags}" \
-      LDFLAGS="%{l_ldflags}" \
-      ./configure \
-          --prefix=%{l_prefix}
-      %{l_make} %{l_mflags}
+    (   cd speech_tools
+        CC="%{l_cc}" \
+        CXX="%{l_cxx}" \
+        CFLAGS="%{l_cflags -O}" \
+        CXXFLAGS="%{l_cxxflags -O}" \
+        CPPFLAGS="%{l_cppflags}" \
+        LDFLAGS="%{l_ldflags}" \
+        ./configure \
+            --prefix=%{l_prefix}
+        %{l_make} %{l_mflags}
     ) || exit $?
 
     #   build festival toolkit
-    ( cd festival
-      CC="%{l_cc}" \
-      CXX="%{l_cxx}" \
-      CFLAGS="%{l_cflags -O}" \
-      CXXFLAGS="%{l_cxxflags -O}" \
-      CPPFLAGS="%{l_cppflags}" \
-      LDFLAGS="%{l_ldflags}" \
-      ./configure \
-          --prefix=%{l_prefix}
-      %{l_make} %{l_mflags}
+    (   cd festival
+        CC="%{l_cc}" \
+        CXX="%{l_cxx}" \
+        CFLAGS="%{l_cflags -O}" \
+        CXXFLAGS="%{l_cxxflags -O}" \
+        CPPFLAGS="%{l_cppflags}" \
+        LDFLAGS="%{l_ldflags}" \
+        ./configure \
+            --prefix=%{l_prefix}
+        %{l_make} %{l_mflags}
     ) || exit $?
 
 %install
@@ -131,8 +138,11 @@ AutoReqProv:  no
     %{l_shtool} mkdir -f -p -m 755 \
         $RPM_BUILD_ROOT%{l_prefix}/bin \
         $RPM_BUILD_ROOT%{l_prefix}/man/man1 \
+        $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d \
+        $RPM_BUILD_ROOT%{l_prefix}/etc/festival \
         $RPM_BUILD_ROOT%{l_prefix}/libexec/festival \
-        $RPM_BUILD_ROOT%{l_prefix}/lib/festival
+        $RPM_BUILD_ROOT%{l_prefix}/lib/festival \
+        $RPM_BUILD_ROOT%{l_prefix}/var/festival
 
     #   install program files
     %{l_shtool} install -c -m 755 \
@@ -142,17 +152,16 @@ AutoReqProv:  no
         festival/src/main/festival \
         festival/src/main/festival_client \
         $RPM_BUILD_ROOT%{l_prefix}/libexec/festival/
-    ( echo "#!/bin/sh"
-      echo "PATH=%{l_prefix}/libexec/festival:\$PATH"
-      echo "export PATH"
-      echo "exec %{l_prefix}/libexec/festival/festival \\"
-      echo "    --libdir %{l_prefix}/lib/festival \$*"
+    (   echo "#!/bin/sh"
+        echo "PATH=%{l_prefix}/libexec/festival:\$PATH"
+        echo "export PATH"
+        echo "exec %{l_prefix}/libexec/festival/festival \\"
+        echo "    --libdir %{l_prefix}/lib/festival \$*"
     ) >festival.sh
-    ( echo "#!/bin/sh"
-      echo "PATH=%{l_prefix}/libexec/festival:\$PATH"
-      echo "export PATH"
-      echo "exec %{l_prefix}/libexec/festival/festival_client \\"
-      echo "    %{l_prefix}/lib/festival \$*"
+    (   echo "#!/bin/sh"
+        echo "PATH=%{l_prefix}/libexec/festival:\$PATH"
+        echo "export PATH"
+        echo "exec %{l_prefix}/libexec/festival/festival_client \$*"
     ) >festival_client.sh
     %{l_shtool} install -c -m 755 \
         festival.sh $RPM_BUILD_ROOT%{l_prefix}/bin/festival
@@ -172,20 +181,44 @@ AutoReqProv:  no
     #   install library files
     chmod -R u+w,a+r,og-w festival/lib
     find festival/lib -type d -print | xargs chmod 755
+    mv festival/lib/voices/us/* festival/lib/voices/english/
+    rmdir festival/lib/voices/us
     cp -rp festival/lib/* $RPM_BUILD_ROOT%{l_prefix}/lib/festival/
     rm -rf $RPM_BUILD_ROOT%{l_prefix}/lib/festival/etc
-    ( echo "(set! system-voice-path '(\"%{l_prefix}/lib/festival/voices\"))"
-      echo "(set! sgml_parse_progname \"nsgmls\")"
-    ) >sitevars.scm
+
+    #   install default site configuration
     %{l_shtool} install -c -m 644 \
-        sitevars.scm \
-        $RPM_BUILD_ROOT%{l_prefix}/lib/festival/sitevars.scm
+        %{SOURCE festival-vars.scm} \
+        %{SOURCE festival-init.scm} \
+        $RPM_BUILD_ROOT%{l_prefix}/etc/festival/
+
+    #   install run-command script
+    %{l_shtool} install -c -m 755 %{l_value -s -a} \
+        %{SOURCE rc.festival} \
+        $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d/
 
     #   determine installation files
-    %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT %{l_files_std}
+    %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT \
+        %{l_files_std} \
+        '%config %{l_prefix}/etc/festival/*' \
+        '%attr(-,%{l_nusr},%{l_ngrp}) %{l_prefix}/var/festival'
 
 %files -f files
 
 %clean
     rm -rf $RPM_BUILD_ROOT
 
+%post
+    #   after upgrade, restart service
+    [ $1 -eq 2 ] || exit 0
+    eval `%{l_rc} festival status 2>/dev/null`
+    [ ".$festival_active" = .yes ] && %{l_rc} festival restart
+    exit 0
+
+%preun
+    #   before erase, stop service and remove log files
+    [ $1 -eq 0 ] || exit 0
+    %{l_rc} festival stop 2>/dev/null
+    rm -f $RPM_INSTALL_PREFIX/var/festival/* >/dev/null 2>&1 || true
+    exit 0
+

+ 63 - 0
festival/rc.festival

@@ -0,0 +1,63 @@
+#!@l_prefix@/bin/openpkg rc
+##
+##  rc.festival -- Run-Commands
+##
+
+%config
+    festival_enable="$openpkg_rc_def"
+    festival_daemon="no"
+    festival_log_prolog="true"
+    festival_log_epilog="true"
+    festival_log_numfiles="10"
+    festival_log_minsize="1M"
+    festival_log_complevel="9"
+
+%common
+    festival_logfile="@l_prefix@/var/festival/festival.log"
+    festival_pidfile="@l_prefix@/var/festival/festival.pid"
+    festival_signal () {
+        [ -f $festival_pidfile ] && kill -$1 `cat $festival_pidfile`
+    }
+
+%status -u @l_nusr@ -o
+    festival_usable="unknown"
+    festival_active="no"
+    rcService festival enable yes && \
+        festival_signal 0 && festival_active="yes"
+    echo "festival_enable=\"$festival_enable\""
+    echo "festival_usable=\"$festival_usable\""
+    echo "festival_active=\"$festival_active\""
+
+%start -u @l_nusr@
+    rcService festival enable yes || exit 0
+    rcService festival active yes && exit 0
+    rcVarIsYes festival_daemon || exit 0
+    (   nohup @l_prefix@/bin/festival --server \
+        </dev/null >/dev/null 2>&1 &
+        echo $! >$festival_pidfile
+    ) >/dev/null 2>&1
+
+%stop -u @l_nusr@
+    rcService festival enable yes || exit 0
+    rcService festival active no  && exit 0
+    rcVarIsYes festival_daemon || exit 0
+    festival_signal TERM
+    sleep 2
+    rm -f $festival_pidfile >/dev/null 2>&1 || true
+
+%restart -u @l_nusr@
+    rcService festival enable yes || exit 0
+    rcService festival active no  && exit 0
+    rcVarIsYes festival_daemon || exit 0
+    rc festival stop start
+
+%daily -u @l_nusr@
+    rcService festival enable yes || exit 0
+    rcVarIsYes festival_daemon || exit 0
+    shtool rotate -f \
+        -n ${festival_log_numfiles} -s ${festival_log_minsize} -d \
+        -z ${festival_log_complevel} -m 664 -o @l_nusr@ -g @l_ngrp@ \
+        -P "${festival_log_prolog}" \
+        -E "${festival_log_epilog}; rc festival restart" \
+        $festival_logfile
+