Java 录音转文字 Demo 实现

一、整体流程

下面是实现 Java 录音转文字的整体流程:

步骤 动作
1 初始化录音配置
2 开始录音
3 将录音数据保存为本地音频文件
4 将本地音频文件转换为语音识别所需的音频格式
5 调用语音识别服务进行语音转文字
6 解析语音识别结果

下面将详细介绍每个步骤所需的操作和代码。

二、步骤及代码注释

1. 初始化录音配置

// 导入需要的包
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;

// 创建音频格式对象
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);

// 获取音频输入设备
DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);

// 打开音频输入流
targetDataLine.open(audioFormat);
targetDataLine.start();

上述代码中,我们使用了javax.sound.sampled包提供的类来初始化录音配置,具体的注释已经写在代码中。

2. 开始录音

// 创建保存音频数据的缓冲区
byte[] buffer = new byte[1024];

// 录音时长,单位为毫秒
int recordTime = 10000;

// 计算需要读取的音频数据大小
int numBytesRead = 0;
int numBytesToRead = audioFormat.getSampleRate() * audioFormat.getFrameSize() * (recordTime / 1000);

// 开始录音
while (numBytesRead <= numBytesToRead) {
    numBytesRead += targetDataLine.read(buffer, numBytesRead, buffer.length - numBytesRead);
}

上述代码中,我们创建了一个缓冲区来保存音频数据,并通过循环读取音频数据,直到达到指定的录音时长。

3. 保存音频文件

// 创建保存音频文件的路径
String audioFilePath = "audio.wav";

// 将音频数据保存为本地音频文件
File audioFile = new File(audioFilePath);
try (AudioInputStream audioStream = new AudioInputStream(targetDataLine)) {
    AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, audioFile);
}

上述代码中,我们指定了保存音频文件的路径,并使用AudioSystem.write方法将音频数据写入文件中。

4. 转换音频格式

// 导入需要的包
import com.google.cloud.speech.v1.RecognitionAudio;
import com.google.cloud.speech.v1.RecognitionConfig;
import com.google.cloud.speech.v1.RecognitionConfig.AudioEncoding;
import com.google.protobuf.ByteString;
import java.nio.file.Files;
import java.nio.file.Path;

// 创建音频输入流
Path audioPath = Path.of(audioFilePath);
byte[] audioBytes = Files.readAllBytes(audioPath);
ByteString audioData = ByteString.copyFrom(audioBytes);
RecognitionAudio recognitionAudio = RecognitionAudio.newBuilder().setContent(audioData).build();

// 创建语音识别配置
RecognitionConfig recognitionConfig = RecognitionConfig.newBuilder()
        .setEncoding(AudioEncoding.LINEAR16)
        .setSampleRateHertz(16000)
        .setLanguageCode("en-US")
        .build();

上述代码中,我们使用了 Google Cloud Speech-to-Text 提供的包来进行音频格式的转换,具体的注释已经写在代码中。

5. 语音转文字

// 导入需要的包
import com.google.cloud.speech.v1.SpeechClient;
import com.google.cloud.speech.v1.SpeechRecognitionAlternative;
import com.google.cloud.speech.v1.SpeechRecognitionResult;
import com.google.cloud.speech.v1.RecognizeResponse;

// 创建语音识别客户端
try (SpeechClient speechClient = SpeechClient.create()) {
    // 发送语音识别请求
    RecognizeResponse recognizeResponse = speechClient.recognize(recognitionConfig, recognitionAudio);
    
    // 获取语音识别结果
    for (SpeechRecognitionResult result : recognizeResponse.getResultsList()) {
        for (SpeechRecognitionAlternative alternative : result.getAlternativesList()) {
            System.out.println("Transcript: " + alternative.getTranscript());
        }
    }
}

上述代码中,我们使用了 Google Cloud