Como capturar som no java

7 respostas
B

bom dia :grin:

sou iniciante em java, gostaria de saber como poderia entrar com algum
som e armazenalo em um banco de dados assim criando um algoritmo de
execução de comando baseado no som (voz)
q classe daria esse suporte?
e alguem tem alguma apostila do JSAPI (freeTTS)?

obrigado

7 Respostas

D

“businesss”:
bom dia :grin:

sou iniciante em java, gostaria de saber como poderia entrar com algum
som e armazenalo em um banco de dados assim criando um algoritmo de
execução de comando baseado no som (voz)
q classe daria esse suporte?
e alguem tem alguma apostila do JSAPI (freeTTS)?

obrigado

Já passou por aqui ? FreeTTS 1.2

H

Pode dar uma olhada também em JavaSpeech.
http://java.sun.com/products/java-media/speech/

Se você quer fazer só captura de som, pode ver JMF também.
http://java.sun.com/products/java-media/jmf/

Agora uma dica…
Se você está pensando em criar um banco de dados de áudio para trabalhar com texto pra voz ou voz para texto acho um trabalho interessante porém muito difícil.
Conversei sobre isso com um professor e dei uma pesquisada no assunto, essa API FreeTTS e JavaSpeech, possuem uma gramática da linguagem que ela trabalha (na maioria dos casos Inglês).
Quando você passa uma String para ser sonificada, é feita toda uma verificação de letras, sílabas e fonemas da palavra na gramática da API.
Quando achado o valor equivalente de cada sílaba, este é um conjunto de bits…
Assim, uma palavra pode possuir várias sílabas e quando é verificado cada tipo de som, etc esses bits são concatenados e transformados em um Stream que a API converte para áudio, ou seja…nenhuma API trabalho com arquivos de áudio, o áudio é gerado em tempo de execução.

Talvez isso nem venha a ser o seu caso, mas espero ter ajudado!
Abraço!

T

Realmente não é fácil, estou desenvolvendo um trabalho sobre Reconhecimento Automático do Locutor mas não é nada fácil. Você pode começar abrindo e executando arquivos wave em Java com este código. Te digo que você deve estudar mais sobre reconhecimento de voz do que java.

Boa sorte

import java.io.*; 
import javax.sound.sampled.*; 
  
  
public class SoundJava
{ 
     
    private AudioFormat format; 
    private byte[] samples; 
     
    public SoundJava(String filename){ 
        try{ 
            AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filename)); 
            format = stream.getFormat(); 
            samples = getSamples(stream); 
        } 
        catch (UnsupportedAudioFileException e){ 
            e.printStackTrace(); 
    } 
    catch (IOException e){ 
            e.printStackTrace(); 
        } 
    } 
     
    public byte[] getSamples(){ 
        return samples; 
    } 
     
    public byte[] getSamples(AudioInputStream stream){ 
        int length = (int)(stream.getFrameLength() * format.getFrameSize()); 
        byte[] samples = new byte[length]; 
        DataInputStream in = new DataInputStream(stream); 
        try{ 
            in.readFully(samples); 
        } 
        catch (IOException e){ 
            e.printStackTrace(); 
        } 
        return samples; 
    } 
     
  
    public void play(InputStream source){ 
        // 100 ms buffer for real time change to the sound stream 
        int bufferSize = format.getFrameSize() * Math.round(format.getSampleRate() / 10); 
        byte[] buffer = new byte[bufferSize]; 
        SourceDataLine line; 
        try{ 
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 
            line = (SourceDataLine)AudioSystem.getLine(info); 
            line.open(format, bufferSize); 
        } 
        catch (LineUnavailableException e){ 
            e.printStackTrace(); 
            return; 
        } 
        line.start(); 
        try{ 
            int numBytesRead = 0; 
            while (numBytesRead != -1){ 
                numBytesRead = source.read(buffer, 0, buffer.length); 
                if (numBytesRead != -1) 
                    line.write(buffer, 0, numBytesRead); 
            } 
        } 
        catch (IOException e){ 
            e.printStackTrace(); 
        } 
        line.drain(); 
        line.close(); 
    } 
     
    public static void main(String[] args){ 
        SoundJava player = new SoundJava("casa.wav"); 
        InputStream stream = new ByteArrayInputStream(player.getSamples()); 
        player.play(stream); 
        System.exit(0); 
    } 
}
MarcolaLipe10

Eu estava proucurando algum topico para poder falar em uma maquina e sair no audio de outra maquina (Stream )

Mas me deparei com esse topico !!

Para capturar audio ...
Classe pronta , funcionando !

package com.desenv.logica;

import javax.sound.sampled.*;
import java.io.*;

public class CapturandoSom {
	// record duration, in milliseconds
    static final long RECORD_TIME = 60000;  // 1 minute
 
    // path of the wav file
    File wavFile = new File("C:/Users/Marcos/Desktop/music.wav");
 
    // format of audio file
    AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
 
    // the line from which audio data is captured
    TargetDataLine line;
 
    /**
     * Defines an audio format
     */
    AudioFormat getAudioFormat() {
        float sampleRate = 16000;
        int sampleSizeInBits = 8;
        int channels = 2;
        boolean signed = true;
        boolean bigEndian = true;
        AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
        return format;
    }
 
    /**
     * Captures the sound and record into a WAV file
     */
    void start() {
        try {
            AudioFormat format = getAudioFormat();
            DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
 
            // checks if system supports the data line
            if (!AudioSystem.isLineSupported(info)) {
                System.out.println("Line not supported");
                System.exit(0);
            }
            line = (TargetDataLine) AudioSystem.getLine(info);
            line.open(format);
            line.start();   // start capturing
 
            System.out.println("Start capturing...");
 
            AudioInputStream ais = new AudioInputStream(line);
 
            System.out.println("Start recording...");
 
            // start recording
            AudioSystem.write(ais, fileType, wavFile);
 
        } catch (LineUnavailableException ex) {
            ex.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
 
    /**
     * Closes the target data line to finish capturing and recording
     */
    void finish() {
        line.stop();
        line.close();
        System.out.println("Finished");
    }
 
    /**
     * Entry to run the program
     */
    public static void main(String[] args) {
        final CapturandoSom recorder = new CapturandoSom();
 
        // creates a new thread that waits for a specified
        // of time before stopping
        Thread stopper = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(RECORD_TIME);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                recorder.finish();
            }
        });
 
        stopper.start();
 
        // start recording
        recorder.start();
    }
}
MarcolaLipe10

Agora quem conseguir me ajudar no meu projeto …
Agradeço !!!

Pois está tenso d+ …

Projeto ==>

Falar em uma maquina e o som sair em outra maquina !!
Podendo ser intranet ou internet msmo =)

Obrigado !

R

ligado a som conheço estes dois métodos....

public void carregarSom(int posSom) {
        AudioInputStream sound = null;
        try {

            sound = AudioSystem.getAudioInputStream(this.getClass().getResource(colecao_sons[posSom] + ".WAV"));
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();

            JOptionPane.showMessageDialog(null, "problema no som", "problema no som", JOptionPane.INFORMATION_MESSAGE);
        } catch (IOException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "problema no som", "problema no som", JOptionPane.INFORMATION_MESSAGE);
        }
        DataLine.Info info = new DataLine.Info(Clip.class, sound.getFormat());
        try {
            clip = (Clip) AudioSystem.getLine(info);
        } catch (LineUnavailableException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "problema no som", "problema no som", JOptionPane.INFORMATION_MESSAGE);
        }
        try {
            clip.open(sound);
        } catch (LineUnavailableException e) {
            JOptionPane.showMessageDialog(null, "problema no som", "problema no som", JOptionPane.INFORMATION_MESSAGE);
            e.printStackTrace();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "problema no som", "problema no som", JOptionPane.INFORMATION_MESSAGE);
            e.printStackTrace();
        }
    }
    public void tocaSom() {
        clip.start();
    }
//arquivos para som
     private Clip clip;
    private String[] colecao_sons = {"CLICK11","MAGNETIC_vitoriaBingo","MUSHY_novojogo","_LASER_trocacartela"};




carregarSom(3);
tocaSom();
MarcolaLipe10

Pow veio , to tentando aqui agora com JavaScript …
No Html 5 da pra fazer isso !!

Ainda estou nessa guerra !

Pq eu tenho que pegar o audio no pc do cliente e jogar para o outro cliente ouvir …
Sendo que o cliente que vai ouvir , ele apenas ouve , pq é um raspeberry pi …

É um sistema de Audio para pessoas falar e sair nas caixas de som dos respectivos raspberrypi :smiley:

É um sistema de Audio simplex , sendo que é necessario passar pelo servidor xD

Não pode ser ponto-a-ponto …

Criado 4 de julho de 2006
Ultima resposta 7 de mar. de 2014
Respostas 7
Participantes 6