1、私域医疗病历问答结果展示:
最终识别结果==》张三 的 既往 疾病 是 什么
张三的既往疾病是高血压病史5年(未规律服药)。
回调函数返回的唤醒结果...:{"sst":"wakeup", "id":0, "score":2264, "bos":6030, "eos":6700 ,"keyword":"da4-fei1-da4-fei1"}
最终识别结果==》张三 的 过敏史 是 什么
张三的过敏史是青霉素过敏(皮疹反应)。
2、实现核心技术
ollama run deepseek-v2:16b
3、讯飞离线唤醒+离线合成
public static void startIvw() {
Integer ret = IvwService.INSTANCE.MSPLogin(null, null, Constants.IVW_LOGIN_PARAMS); // 登录
if (ret != 0) {
System.out.println("唤醒登录失败...:" + ret);
}
String sessionId = IvwService.INSTANCE.QIVWSessionBegin(null, Constants.IVW_SSB_PARAMS, Constants.IVW_ERROR_CODE); // 开启会话
if (Constants.IVW_ERROR_CODE.getValue() != 0) {
System.out.println("开启唤醒会话失败...:" + Constants.IVW_ERROR_CODE.getValue());
}
ret = IvwService.INSTANCE.QIVWRegisterNotify(sessionId, new IvwCallback(), null); // 注册唤醒回调函数
if (ret != 0) {
System.out.println("注册唤醒回调函数失败...:" + ret);
}
try {
while (true) {
byte[] audioDataByteArray = new byte[Constants.IVW_FRAME_SIZE];
Constants.IVW_ASR_TARGET_DATA_LINE.open(Constants.IVW_ASR_AUDIO_FORMAT);
Constants.IVW_ASR_TARGET_DATA_LINE.start();
int len = new AudioInputStream(Constants.IVW_ASR_TARGET_DATA_LINE).read(audioDataByteArray);
if (len == -1) { // 调用麦克风时候,这段将不会被执行...
Constants.IVW_AUDIO_STATUS = 4;
ret = IvwService.INSTANCE.QIVWAudioWrite(sessionId, "".getBytes(), 0, Constants.IVW_AUDIO_STATUS);
System.out.println("最后一帧返回的错误码:" + ret + ",即将执行退出...");
break; //文件读完,跳出循环
} else {
// 反复调用QIVWAudioWrite写音频方法,直到音频写完为止!!!!!!!!!!!!
ret = IvwService.INSTANCE.QIVWAudioWrite(sessionId, audioDataByteArray, len, Constants.IVW_AUDIO_STATUS);
}
Constants.IVW_AUDIO_STATUS = 2; // 中间帧
if (ret != 0) {
System.err.println("唤醒音频写入失败...:" + ret);
}
Thread.sleep(200); // 模拟人说话时间间隙,10帧的音频200ms写入一次
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void startTts(String ttsText) {
Constants.TTS_TEXT = ttsText;
Constants.TTS_BYTE_ARRAY_OUTPUT_STREAM = new ByteArrayOutputStream(); // 初始化
Constants.TTS_TOTAL_AUDIO_LENGTH = 0;
Integer ret = TtsService.INSTANCE.MSPLogin(null, null, Constants.TTS_LOGIN_PARAMS); // 登录
if (ret != 0) {
System.out.println("合成登录失败...:" + ret);
}
String session_id = TtsService.INSTANCE.QTTSSessionBegin(Constants.TTS_SESSION_BEGIN_PARAMS, Constants.TTS_ERROR_CODE); // 开启合成会话
if (Constants.TTS_ERROR_CODE.getValue() != 0) {
System.out.println("合成开启会话失败...:" + Constants.TTS_ERROR_CODE.getValue());
}
ret = TtsService.INSTANCE.QTTSTextPut(session_id, Constants.TTS_TEXT, Constants.TTS_TEXT.getBytes().length, null); // 正式合成
if (ret != 0) {
// System.out.println("合成音频失败...:" + ret);
}
try { //实时播放
Constants.TTS_SOURCE_DATA_LINE.open(Constants.TTS_AUDIO_FORMAT);
Constants.TTS_SOURCE_DATA_LINE.start();
} catch (Exception e) {
e.printStackTrace();
}
while (true) {
Pointer audioPointer = TtsService.INSTANCE.QTTSAudioGet(session_id, Constants.TTS_AUDIO_LEN, Constants.TTS_SYNTH_STATUS, Constants.TTS_ERROR_CODE); // 获取音频
byte[] audioDataByteArray = null;
if (audioPointer != null) {
audioDataByteArray = audioPointer.getByteArray(0, Constants.TTS_AUDIO_LEN.getValue());
}
if (Constants.TTS_ERROR_CODE.getValue() != 0) {
// System.out.println("合成获取音频失败...+:" + Constants.TTS_ERROR_CODE);
// break;
}
if (audioDataByteArray != null) {
try {
Constants.TTS_SOURCE_DATA_LINE.write(audioDataByteArray, 0, Constants.TTS_AUDIO_LEN.getValue()); //实时写音频流
Constants.TTS_BYTE_ARRAY_OUTPUT_STREAM.write(audioDataByteArray, 0, Constants.TTS_AUDIO_LEN.getValue()); //将数据写入字节数组的输出流,用来生成音频文件
} catch (Exception e) {
e.printStackTrace();
}
Constants.TTS_TOTAL_AUDIO_LENGTH = Constants.TTS_TOTAL_AUDIO_LENGTH + Constants.TTS_AUDIO_LEN.getValue(); //计算总音频长度,用来生成音频文件
}
if (Constants.TTS_SYNTH_STATUS.getValue() == 2) {
// 说明音频已经取完,退出本次循环
try {
Constants.TTS_SOURCE_DATA_LINE.drain();
Constants.TTS_SOURCE_DATA_LINE.close();
Constants.TTS_BYTE_ARRAY_OUTPUT_STREAM.flush();
Constants.TTS_BYTE_ARRAY_OUTPUT_STREAM.close();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
ret = TtsService.INSTANCE.QTTSSessionEnd(session_id, "正常退出"); //结束会话
if (ret != 0) {
System.out.println("合成结束会话失败...:" + ret);
}
ret = TtsService.INSTANCE.MSPLogout(); // 退出
if (ret != 0) {
System.out.println("合成退出失败...:" + ret);
}
}
4、JAVA通过API调用VOSK离线语音识别+DS大模型
public static void startIat() {
// System.out.println("开始调用听写");
AIMain.startTts("主人,您请说[p500]");
while (true) {
bytesRead = Constants.IVW_ASR_TARGET_DATA_LINE.read(buffer, 0, buffer.length);
if (bytesRead < 0) {
break;
}
if (recognizer.acceptWaveForm(buffer, bytesRead)) {
// System.out.println(recognizer.getFinalResult());
JsonParseFinal jsonParseFinal = gson.fromJson(recognizer.getFinalResult(), JsonParseFinal.class);
System.err.println("最终识别结果==》" + jsonParseFinal.text);
AIMain.startModel(jsonParseFinal.text);
break; // 仅做一次识别
} else {
// System.out.println(recognizer.getPartialResult());
JsonParseMid jsonParseMid = gson.fromJson(recognizer.getPartialResult(), JsonParseMid.class);
System.out.println("中间识别结果==》" + jsonParseMid.partial);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}