Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись звука с микрофона, диктофон на java 
V
    Опции темы
Fieral
Дата 24.10.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Необходимо записать звук с микрофона игнорируя тишину.

Вот часть кода который читает звук с микрофона:

Код

 //Внутренний класс для сбора данных с микрофона
    class CaptureThread extends Thread{
        byte tempBuffer[] = new byte[10000];
        public void run(){
            byteArrayOutputStream = new ByteArrayOutputStream();
            stopCapture = false;
            try{
                while(!stopCapture){
                    // прочитать данные
                    int cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length);
      
              if(cnt>0){
                        //Сохранение данных
                        byteArrayOutputStream.write(tempBuffer, 0, cnt);
                    }
                }
                byteArrayOutputStream.close();
            }catch(Exception e){
                System.out.println(e);
                System.exit(0);
            }
        }
    }


Как распознать тишину в tempBuffer?

Тут весь код апплета:
Код


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;

public class AudioCapture extends JFrame{
    boolean stopCapture = false;
    ByteArrayOutputStream byteArrayOutputStream;
    AudioFormat audioFormat;
    TargetDataLine targetDataLine;
    AudioInputStream audioInputStream;
    SourceDataLine sourceDataLine;
    public static void main(String args[]){
        new AudioCapture();
    }
    public AudioCapture(){
        final JButton captureBtn = new JButton("Capture");
        final JButton stopBtn = new JButton("Stop");
        final JButton playBtn = new JButton("Playback");
        captureBtn.setEnabled(true);
        stopBtn.setEnabled(false);
        playBtn.setEnabled(false);
        //Регистрация анонимных слушателей
        captureBtn.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    captureBtn.setEnabled(false);
                    stopBtn.setEnabled(true);
                    playBtn.setEnabled(false);
                    //Захват ввода данных с микрофон до тех пор, пока не нажата кнопка Stop
                    captureAudio();
                }
            }
        );
        getContentPane().add(captureBtn);
        stopBtn.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    captureBtn.setEnabled(true);
                    stopBtn.setEnabled(false);
                    playBtn.setEnabled(true);
                    //Остановка ввода данных с микрофона
                    stopCapture = true;
                }
            }
        );
        getContentPane().add(stopBtn);
        playBtn.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    //Воспроизведения сохраненных данных
                    playAudio();
                }
            }
        );
        getContentPane().add(playBtn);
        getContentPane().setLayout(new FlowLayout());
        setTitle("Capture/Playback Demo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(250,70);
        setVisible(true);
    }
    //Этот метод захватывает аудио вход от микрофона и сохраняет в ByteArrayOutputStream
    private void captureAudio(){
        try{
            //Получение данных для захвата аудио
            audioFormat = getAudioFormat();
            DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
            targetDataLine = (TargetDataLine) AudioSystem.getLine( dataLineInfo);
            targetDataLine.open(audioFormat);
            targetDataLine.start();
            //Создание и запуск потока для захвата данных с микрофона
            Thread captureThread = new Thread(new CaptureThread());
            captureThread.start();
        }catch(Exception e){
            System.out.println(e);
            System.exit(0);
        }
    }
    //Метод для проигрывания аудио данных из сохраненных в ByteArrayOutputStream данных
    private void playAudio(){
        try{
            //Получение данных аудио формата для воспроизводства
            byte audioData[] = byteArrayOutputStream.toByteArray();
            InputStream byteArrayInputStream = new ByteArrayInputStream(audioData);
            AudioFormat audioFormat = getAudioFormat();
            audioInputStream = new AudioInputStream(byteArrayInputStream, audioFormat, audioData.length/audioFormat.getFrameSize());
            DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat);
            sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
            sourceDataLine.open(audioFormat);
            sourceDataLine.start();
            //Создание и запуск потока для проигрывания сохраненных данных
            Thread playThread = new Thread(new PlayThread());
            playThread.start();
        }catch(Exception e){
            System.out.println(e);
            System.exit(0);
        }
    }
    //Этот метод создает и возвращает AudioFormat
    private AudioFormat getAudioFormat(){
        float sampleRate = 44100;
        //8000,11025,16000,22050,44100
        int sampleSizeInBits = 8;
        //8,16
        int channels = 1;
        //1,2
        boolean signed = true;
        //true,false
        boolean bigEndian = false;
        //true,false
        return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
    }
    //Внутренний класс для сбора данных с микрофона
    class CaptureThread extends Thread{
        byte tempBuffer[] = new byte[10000];
        public void run(){
            byteArrayOutputStream = new ByteArrayOutputStream();
            stopCapture = false;
            try{
                while(!stopCapture){
                    // прочитать данные
                    int cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length);
                    if(cnt>0){
                        //Сохранение данных
                        byteArrayOutputStream.write(tempBuffer, 0, cnt);
                    }
                }
                byteArrayOutputStream.close();
            }catch(Exception e){
                System.out.println(e);
                System.exit(0);
            }
        }
    }
    //Внутренний класс для воспроизведения данных
    class PlayThread extends Thread{
        byte tempBuffer[] = new byte[10000];
        public void run(){
            try{
                int cnt;
                while((cnt = audioInputStream.read(tempBuffer, 0, tempBuffer.length)) != -1){
                    if(cnt>0){
                        sourceDataLine.write(tempBuffer, 0, cnt);
                    }
                }
                sourceDataLine.drain();
                sourceDataLine.close();
            }catch(Exception e){
                System.out.println(e);
                System.exit(0);
            }
        }
    }
}

--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Fieral
Дата 25.10.2010, 15:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Ответ: надо посчитать энергию tempBuffer по формуле:

Код

Energy = Sum(tempBuffer[i]^2)
                   i=0..n


Добавлено через 1 минуту и 10 секунд
чем больше громкость в семпле tempBuffer - тем выше энергия
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.