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.
Italiano
English