como grabar sonido desde el microfono y guardarlo

tengo bastante tiempo investigando como grabar mi voz desde un microfono, lo cual ocupo para mi proyecto de
la universidad, e revisado muchas paginas i no veo nada claro, por favor si me pueden ayudar, y esque tengo que hacer un traductor
en el cual si no se encuentra la palabra, el usuario debe escribir la palabra y grabar como se pronuncia y todo eso guardarlo ,
por favor si me ayudan, selo agradeseria

este es mi codigo me guarda el sonido pero con el mismo nombre i el aterior se borra ps se sobre escribe,

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

public class NewClass {

String[]palabras=new String [100];

AudioFileFormat.Type aFF_T = AudioFileFormat.Type.WAVE;
AudioFormat aF = new AudioFormat(8000.0F, 16, 1, true, false);
TargetDataLine tD;

File f = new File("Grabacion.wav");

public NewClass() {
try {
DataLine.Info dLI = new DataLine.Info(TargetDataLine.class,aF);
tD = (TargetDataLine)AudioSystem.getLine(dLI);
new CapThread().start();
System.out.println("Grabando durante 10s...");
Thread.sleep(10000);
tD.close();
}catch (Exception e) {}
}
class CapThread extends Thread {
public void run() {
try {
tD.open(aF);
tD.start();
AudioSystem.write(new AudioInputStream(tD), aFF_T, f);
}catch (Exception e){}
}
}

me gustaria que me dejara poner el nombre y que lo pudiera abrir
public static void main(String[] args) {
new NewClass(); }
}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Lilith

Guardar archivo con otro nombre

Mira yo realmente no he checado tu código, confío en lo que tu me pones (que ya te guarda el archivo, aunque con el mismo nombre)...

Para guardar el archivo con otro nombre y hasta en otro lugar:

En al línea: File f = new File("Grabacion.wav"); tu le dices a tu programa que el archivo se creará en la misma ruta y obvio siempre con el mismo nombre.

Para obtener una ruta distinta utiliza un JFileChooser:

          //Se instancia el JFileChooser
        JFileChooser fc = new JFileChooser();
        //Le ponemos el título que nos guste
        fc.setDialogTitle("Guardar como");
/**Luego de mostrar el cuadro de diálogo y dependiendo de la acción del usuario (oprimió aceptar, cancelar o cerró la ventana) nos devuelve un valor entero  **/
        int seleccion = fileChooser.showSaveDialog(this);
/**Si se obtiene el valor que indica que oprimió aceptar, eligió una ruta y escribió un nombre de archivo, entonces obtenemos el path, que incluye el nombre del archivo que escribió el usuario, pero que se supone que no contiene la extensión del archivo, o  podría ser la equivocada, eso lo debes validar y agregar la extensión de ser necesario **/    
        if (seleccion == JFileChooser.APPROVE_OPTION){
            String ruta = fileChooser.getSelectedFile().getPath();
           ruta+=".wav";
         }

El String ruta es la cadena que usarás en sustitución de "Grabacion.wav" . Ojo si el archivo existe se sobreescribirá de cualquier forma, por eso debes de verificar si existe antes de escribirlo, si existe deberás preguntar al usuario si desea sobreescribirlo.

Para verificar si existe:

File f = new File(ruta);
if(archivo.exists()){
// Aquí escribe el código para solicitar la aprobación del usuario para sobreescribir el archivo existente, podría ser un JOptionPane.showConfirmDialog(), por ejemplo...
}

Si el usuario no desea sobreescribirlo tendrás que volver a mostrar el JFileChooser ...

Imagen de Lilith

Ahora en consola

Pues resulta que por andar a las carreras no tome en cuenta que más bien se trata de una aplicación en modo consola (por el System.out.println) ... no hay una única forma, aquí una opción:

//no olvides el import
import java.util.Scanner;

//Instanciamos el lector
  Scanner in = new Scanner(System.in);

//Se solicita al usuario escribir el nombre del archivo
       System.out.print("Escriba el nombre del archivo y enseguida oprima la tecla enter: ");
//leemos la linea, el nombre que nos dieron
       String nombre = in.nextLine();
//cerramos el lector
       in.close();
//verificamos que la linea leída no este vacía (el trim es para eliminar espacios), también podrías verificar longitud con nombre.length() y validar caracteres especiales... ya tu sabrás, esto es sólo un ejemplo
       if(nombre.trim().isEmpty()){
//si es vacia se lo decimos al usuario y volvemos a solicitar el nombre
           System.out.println("El nombre del archivo no puede ser vacio");
           System.out.print("Escribe el nombre del archivo y enseguida oprima la tecla enter: ");
       }
       else{
//si no es vacia
           File f = new File(archivo);
//aqui deberás verificar si el archivo existe para no sobreescribirlo, como en el primer ejemplo
//Resto de tu código
       }

Para abrir un archivo con el programa adecuado en Linux me funciona:

Process miProceso = Runtime.getRuntime().exec("nombrePrograma rutaArchivo");

Imagen de ezamudio

agregar sufijo

Puedes hacer una rutina para obtener un archivo en el mismo directorio pero que le vaya poniendo un sufijo distinto al nombre, para que cada grabación tenga un número de secuencia...

public File archivoNuevo() {
  File f = new File("Sonido.mp3");
  int cuenta = 0;
  while (f.exists()) {
    f = new File(String.format("Sonido_%d.mp3", ++cuenta));
  }
  return f;
}

Aunque si tienes 100 archivos del Sonido_1.mp3 al Sonido_99.mp3 (y aparte Sonido.mp3) y borras el Sonido_20.mp3, en tu siguiente ejecución se va a crear el archivo Sonido_20.mp3. Otra opción es que le pegues fecha y hora para que siempre puedas buscar el último, es un proceso similar...

LISTO

OK MUCHAS GRASIAS YA QUEDO SI ME AYUDASTE MUCHO CON LO QUE ME CONTESTASTE, AL FIN QUEDO MI PROGRAMA PARA EXPONERLO , OOH LO DE SYSTEM NO ES QUE LO ESTE ASIENDO EN COSOLA , NOMAS LO PUSE PARA
GUIARME , ES UNA FORMA DE NO REVOLVERME PARA MI, YO ME ENTIENDO I ME AYUDA GRACIAS , PERO GRACIAS OTRA VES