Minun pitäisi käsitellä lähes 'reaaliaikaisesti' äänisignaalia, joka tulee tietokoneeseen suoraan mikrofonin kautta. Tarkoituksena on pätkiä ääni pieniin osiin, joita jokaista analysoidaan erikseen. Voinko tehdä tämän Javalla suoraan vai täytyykö käyttää esim. Windowsin omaa nauhuria ja ottaa nauhoitetusta äänestä pätkiä? Mutta toisaalta ei kai samaa tiedostoa voi lukea samalla kun siihen kirjoitetaan...
Eli vVoiko digitaalisesta äänisignaalista itse ottaa näytteitä Javalla vai käykö liian hitaaksi?
Eli vVoiko digitaalisesta äänisignaalista itse ottaa näytteitä Javalla vai käykö liian hitaaksi?
Vastaukset 4
Vanhimmat
javax.sound.sampled.TargetDataLine tarjoaa metodit, joilla voi lukea ääntä haluamansa tavumäärän kerrallaan. Luulisi olevan huomattavasti selkeämpi ratkaisu kuin yrittää jollain ulkoisella ohjelmalla tiedostoon, ja sieltä sitten lukea.
Jos on suorituskykyongelma, voinee tietysti kirjoittaa jotain JNI-natiiviyhdistelmiä, ja tehdä jollain käännettävämmällä kielellä sen nauhoituksen. (Ei kyllä pitäisi olla. Jopa eräänkin S60-puhelimen J2ME-alustalla vaikutti miltei-reaaliaikainen äänenkäpistely onnistuvan - kaikennäköistä JITtiä ja muuta tekevällä gigahertsi-multimedialaitteella ei pitäisi olla mitään ongelmia.)
Itselläni olisi samantapainen projekti, jossa tulisi käsitellä ääntä matkapuhelimella. Tarkoitus olisi siis nauhoittaa ääntä ja saada desibeliarvoja äänestä. Kerro vähän mitä käytit äänen käsittelyyn matkapuhelimella? MMAPI:a?
Heh, ei käy kateeksi - ainakin, jos sovelluksesi tulisi reaaliajassa toimia. MMAPI olisi noin periaatteessa ihan toimiva ja selkeä ratkaisu, sille kun voi antaa minkä tahansa itse-viritetyn OutputStreamin äänidatan kohteeksi.
Testatuissa (ainakin Nokia 6600, saattoi olla joku toinenkin) malleissa nauhoitus vaan oli toteutettu siten, että tavuakaan äänidataa ei tullut, ennen kuin nauhoituksen pysäytti. Oletettavasti puskuroi siellä natiivi-symbian-puolella jonnekin. (Symbian-koodilla kyllä onnistui äänenkäsittely, mutta eihän matkapuhelimissa mitään JNI:n kaltaista ole.) Lisäksi nauhoituksilla oli joku naurettava (lue: noin 13 sekuntia) enimmäispituus. Suorituskyky kyllä olisi riittänyt melkein joka samplen analysointiin, ja tehty laskentakin oli suhteellisen työlästä. (Fixed-point-aritmetiikalla rusikoitu FFT.)
Johonkin kvasi-reaaliaikaisuuteen päässee sillä, että aloittaa ja pysäyttää nauhoitusta jatkuvasti. Ei testattu, paljonko siitä seuraa latenssia - täysin arvauksena ehkä sekunnin luokkaa.
(Siitä en osaa sanoa, miten laajalti MMAPI-toteutukset ovat yhtäläisen puolivillaisia, mutta ainakin matkapuhelimia käpistelevä tuttavani valittaa Nokian Java-VM:stä useinkin.)
http://java.sun.com/products/java-media/jmf/