Hei!
Olin koittanut saada "hello world!" esimerkin toimimaan javax.speech kirjaston avulla.
Koodi:
import javax.speech.*; import javax.speech.synthesis.*; import java.util.Locale; public class HelloWorld { public static void main(String args[]) { try { // Create a synthesizer for English Synthesizer synth = Central.createSynthesizer( new SynthesizerModeDesc(Locale.ENGLISH)); // Get it ready to speak synth.allocate(); synth.resume(); // Speak the "Hello world" string synth.speakPlainText("Hello, world!", null); // Wait till speaking is done synth.waitEngineState(Synthesizer.QUEUE_EMPTY); // Clean up synth.deallocate(); } catch (Exception e) { e.printStackTrace(); } } }
virhe raportti:
java.lang.NullPointerException
at voiceoutput.voice.main(voice.java:14)
mikä avuksi?
(Mod. vaihtoi koodijava-tagit)
Tyhmiä kysymyksiä:
Oletko paljonkin koodaillut Javalla?
Minkä niminen on tiedosto mihin olet tallentanut antamasi koodin?
Entä minkälaisessa hakemistorakenteessa koodisi sijaitsee?
Onko tuossa kaikki tiedostossa oleva koodi?
vastaus 1:Olen koodannut javalla noin 2 vuotta.
vastaus 2:käytän eclipse galileoa javan koodaamiseen ja tiedosto tyyppi mitä eclipse käyttää on JAVA
vastaus 3:eclipse hoitaa hakemistorakenteet kuntoon minun tarvitsee vain ajaa ohjelma
vastaus 4:ON paitsi että ohjelman aluusa on: package voiceoutput;
Eli tiedoston nimi on HelloWorld.java ja se ei sijaitse nimetyssä paketissa(package) vaan projektin lähdekoodihakemiston juuressa, vai?
ohjelma sijaitsee polussa:
E:/workspace/voiceoutput/src/voiceoutput/voice.
Se sijaitsee omassa java projektissa omassa pakkauksessa
Ja jos saan kysyä onko tällä sijainnilla nii suurta väliä sillä eclipse löytää sen. Itse luulisin, että koodissa on joku ongelma.
Kokeileppa huviksesi seuraavia muutoksia:
Muuta koodistasi luokan nimi HelloWorld:sta voice:ksi.
Ja lisää koodin alkuun rivi "package voiceoutput;".
package voiceoutput; ... public class voice { ...
ei auta ja edelleenkin onko polulla tässä nyt merkitystä jos koodissa valittaa nullpointteria ja eclipse kyllä löytää ohjelman ja voi ajaa sen joten ongelmaa ei ole polun kanssa
En osaa enempää auttaa.
Edelliseen vielä semmosta että Javassa tiedoston nimi pitää vastata luokan nimeen ja koodissa pitää kertoa, jos luokka sijaitsee packagessa.
Juu tiedän olin sen korjannut jo, mutta olin ajatellut samalla että onkohan tuo kirjasto rikkinäinen kun rivi:
Synthesizer synth = Central.createSynthesizer(newSynthesizerModeDesc(Locale.ENGLISH));
ilmeisesti palauttaa: null
Lueppa javadoccia, jos vaikka sieltä löytäisit vastauksen.
etsubu kirjoitti:
Synthesizer synth = Central.createSynthesizer(newSynthesizerModeDesc(Locale.ENGLISH));
Pitäisikö tämän olla näin?
Synthesizer synth = Central.createSynthesizer(new SynthesizerModeDesc(Locale.ENGLISH));
(eli väli tuossa)
kayttaja-2499, ehkä kannattaisi olla auttamatta, kun neuvoillasi ei ole mitään tekemistä kysymyksen kanssa.
pake10, aluperäisessä viestissä on ihan oikea koodi, ja sitä paitsi tuollainen virhe ei mitenkään järkevästi voisi selittää NullPointerExceptionia, vaan seurauksena pitäisi olla, ettei koodi edes käänny.
etsubu, mistä latasit kirjaston ja millä ohjeilla asensit sen?
latasin sen osoitteesta:http://sourceforge.net/projects/freetts/files/
ohjeet sivulta:http://www.ryan-h.com/uncategorized/java-speech-jsapi-freetts/
en ymmärtänyt sivun ohjeita 100% joten saatoin tehdä jotain ehkä väärinkin
Yritäpä ensin saada paketin mukana tuleva HelloWorld.jar ajettua. Sain sen toimimaan, kun laitoin jarit ja tiedoston speech.properties oikeaan paikkaan. Luultavasti vika on sinullakin tuossa tiedostossa speech.properties. (Linuxin käyttäjänä en pysty auttamaan sijoittelussa enempää. Kokeile ohjeessa ehdotettua paikkaa ja muita hakemistoja siinä lähistöllä.)
Tuon jälkeen sain myös sinun koodisi näennäisesti toimimaan. Ääni kuitenkin kuului vasta, kun muutin alkupuolelta SynthesizerModeDesc-olion luomisen samanlaiseksi kuin FreeTTS:n mukana tulevassa HelloWorld-esimerkissä:
new SynthesizerModeDesc(null, "general", Locale.ENGLISH, null, null)
Kiitoksia kovasti!!!!! Enköhän saa sen toimimaan noilla neuvoilla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.