RSS
 

Posts Tagged ‘FreeTTS’

FreeTTS, una libreria java in jRuby on Rails

03 Aug

In questo articolo vedremo come utilizzare le classi java contenute in un file JAR
Per questo scopo andremo ad utilizzare una simpatica libreria opensource sviluppata dalla Carnegie Mellon University: FreeTTS.
L’acronimo TTS significa Text To speech tradotto: “da testo a voce”, permette infatti di trasformare un testo in formato audio. Noi la utilizzeremo in un progetto jRuby on Rails per farci leggere il testo che inseriremo nel db.

Nel precedente articolo, abbiamo visto come configurare l’ambiente, partiamo quindi creando la nuova applicazione:


C:>rails ProvaFreeTTS

Nella cartella lib (dalla root) creiamo una sotto cartella freetts, scarichiamo il file freetts-1.2.2-bin.zip, scompattiamo il contenuto in una cartella temporanea, copiamo solamente il contenuto della cartella lib (files jar e jsapi) nella cartella appena creata: tua_applicazionelibfreetts.

Ora creiamo l’interfaccia per il jar:

#libfreetts.rb
 
require 'freetts/freetts.jar'
 
import com.sun.speech.freetts.Voice
import com.sun.speech.freetts.VoiceManager
import com.sun.speech.freetts.util.Utilities
 
class FreeTTS
  def initialize
    @voice = VoiceManager.getInstance.getVoice(Utilities.getProperty("voice16kName","kevin16"))
    @voice.allocate
  end
 
  def speak(txt=nil)
    return nil unless txt
    @voice.speak txt
  end
end

Creiamo una semplicissima risorsa “sentence” con un solo campo “body


C:ProvaFreeTTS>jruby script/generate scaffold sentence body:text

Ora creiamo due nuove operazioni, come ho spiegato approfonditamente in un precedente articolo.

Iniziamo dal controller aggiungendo in coda:

  #appcontrollerssentences_controller.rb
 
  def speak
    @sentence = Sentence.new(params[:sentence])
    require 'freetts'
    tts = FreeTTS.new
    tts.speak @sentence.body
    render (@sentence.new_record? ? :new : :edit)
  end
 
  def read
    @sentence = Sentence.find(params[:id])
    require 'freetts'
    tts = FreeTTS.new
    tts.speak @sentence.body
    redirect_to :back
  end

Ora andiamo a modificare le viste.
Creiamo un nuovo file, più precisamente un partial dove inseriremo il form dati per la nostra risorsa, in questo modo utilizzeremo lo stesso codice per tutte le operazioni:

#appviewssentence_sentence.html.erb
 
<% form_for(@sentence) do |f| %>
  <%= f.error_messages %>
 
  <p>
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit 'Update' %>
  </p>
<% end %>
 
<h2>Preview</h2>
<% form_for @sentence, :url => speak_sentences_path, :method => :put do |f| %>
  <%= f.error_messages %>
 
  <p>
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit 'Speak' %>
  </p>
<% end %>

Aggiungiamo un form clone di quello creato dallo scaffold ma con l’action diversa, per richiamare l’operazione speak.

Ora modifichiamo le viste create in automatico:

#appviewssentencenew.html.erb
 
<h1>New sentence</h1>
 
<%= render @sentence %>
 
<%= link_to 'Back', sentences_path %>
 
#appviewssentenceedit.html.erb
 
<h1>Editing sentence</h1>
 
<%= render @sentence %>
 
<%= link_to 'Show', @sentence %> |
<%= link_to 'Back', sentences_path %>

Infine modifichiamo la lista per richiamare la seconda delle operazioni implementate, read. Sostanzialmente cliccando sulla riga corrispondente leggerà il testo precedentemente memorizzato nel db.

Dobbiamo solamente aggiungere una riga ottenendo questa view:

#appviewssentenceindex.html.erb
<h1>Listing sentences</h1>
 
<table>
  <tr>
    <th>Body</th>
  </tr>
 
<% @sentences.each do |sentence| %>
  <tr>
    <td><%=h sentence.body %></td>
    <td><%= link_to 'Read', read_sentence_path(sentence) %></td>
    <td><%= link_to 'Show', sentence %></td>
    <td><%= link_to 'Edit', edit_sentence_path(sentence) %></td>
    <td><%= link_to 'Destroy', sentence, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>
 
<br />
 
<%= link_to 'New sentence', new_sentence_path %>

Infine andiamo a modificare il routing:

#configroutes.rb
 
#sostituiamo map.resources :sentences con
map.resources :sentences, :member => { :read => :get }, :collection => { :speak => :put }
 
#aggiungiamo
map.root :controller => "sentences"

Configuriamo il file database.yml, creiamo il db e le tabelle con rake e facciamo partire glassfish come spiegato qua (cerca database.yml)

Come abbiamo visto, utilizzare librerie java con jruby on rails è semplicissimo, siamo pronti per far pronunciare al nostro server tutte le frasi più sporcaccione!

Il progetto completo potete scaricarlo qua.

Per ulteriori approfondimenti c’è anche questo articolo, mentre questo tratta la libreria FreeTTS in un progetto Java.

Buona continuazione.

 
Comments Off

Posted in JRuby, Ruby on Rails