From 647e83a18014a0d777f2c4b9b054c35fc6afe5ba Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Tue, 18 Feb 2025 11:12:46 +0800 Subject: [PATCH] =?utf8?q?=E6=8F=90=E4=BE=9B=E5=AE=9E=E6=97=B6=E7=9A=84AI?= =?utf8?q?=E5=BD=95=E9=9F=B3=E6=95=B0=E6=8D=AE=E4=B8=8A=E4=BC=A0=E6=8E=A5?= =?utf8?q?=E5=8F=A3(=E8=93=9D=E7=89=99=E6=8E=A5=E5=8F=A3=E5=BE=85=E6=B7=BB?= =?utf8?q?=E5=8A=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/aivoice/src/AiVoiceModel.cpp | 11 +- .../sample/wrapper/audio_capture_wrapper.cpp | 115 ++++++++++++++++++ .../sample/wrapper/audio_capture_wrapper.h | 2 + 3 files changed, 125 insertions(+), 3 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp index 60f0c4f83..7dfd132b8 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-20 15:14:50 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2025-02-17 10:59:24 + * @LastEditTime: 2025-02-18 11:07:51 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp */ #include "aivoice/include/AiVoiceModel.h" @@ -505,7 +505,8 @@ namespace OHOS { #endif int32_t AudioCaptureSample(int32_t argc, const char *argv[]); - + int32_t streamingRecordAndSend_AI(void); + #define IS_SUPPORT_REALTIME_RECORD_SEND_AI 0 #ifdef __cplusplus }; #endif @@ -523,6 +524,9 @@ namespace OHOS if ((view_->GetAiVoiceScrollView(AIVOICE_LISTENING_VIEWID) != nullptr) && (view_->GetAiVoiceScrollView(AIVOICE_LISTENING_VIEWID)->IsVisible())) { +#if IS_SUPPORT_REALTIME_RECORD_SEND_AI + streamingRecordAndSend_AI();//实时发送录音数据 +#else std::string audioPath = AiVoiceModel::GetInstance().GetAIAudioPath(); if (uapi_delete_files(audioPath.c_str())) // 先删除文件 { @@ -540,7 +544,8 @@ namespace OHOS const char *defaultArgs[6] = {"01", "msbc", "16000", "1", "16", audioPath.c_str()}; #endif uapi_save_runtime_log(RUNTIME_LOG_RECORD_START_AI);//TOOD* - AudioCaptureSample(6, (const char **)defaultArgs); + AudioCaptureSample(6, (const char **)defaultArgs); +#endif } return; } diff --git a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp index b475d99e7..f1aff0569 100755 --- a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp +++ b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp @@ -416,6 +416,121 @@ EXIT: return -1; } +/* ------------------------------- AI录音数据上传接口 ------------------------------- */ +#define AI_RECORD_TEST 1 //若需要调试可以打开该宏 +static void* AudioCaptureProcess_AI(void* arg) +{ + #if AI_RECORD_TEST + FILE *pfd = (FILE *)arg; + #endif + int32_t readCnt = 0; + Timestamp timeStamp; + g_audioSourceProcessInput.bThreadRun = true; + while (!g_sample.needStop && !g_interruptHintStop) { + int32_t ret = g_audioCap->Read(g_audioSourceProcessInput.buffer, g_audioSourceProcessInput.framesize, false); + if (ret == -1) { + MEDIA_ERR_LOG("audioCap Read failed:0x%x", ret); + continue; + } + if (ret == ERR_RETRY_READ) { + usleep(READ_RETRY_TIME_US); + continue; + } + #if AI_RECORD_TEST + int32_t writeLen = fwrite(g_audioSourceProcessInput.buffer, 1, ret, pfd); + if (writeLen != ret) { + MEDIA_ERR_LOG("errno:%d, errmsg:%s", errno, strerror(errno)); + break; + } + #endif + // 蓝牙接口发送实时录音数据 + + if (readCnt++ > READ_COUNT_MAX) { + break; + } + if (readCnt % GET_AUDIO_TIME_INTERVAL_TIMES == 0) { + if (g_audioCap->GetAudioTime(timeStamp, Timestamp::Timebase::MONOTONIC)) { + MEDIA_INFO_LOG("read %d frames timestamp seconds:%ld, nanoseconds:%ld", + readCnt, timeStamp.time.tv_sec, timeStamp.time.tv_nsec); + } + } + MEDIA_INFO_LOG("audioCap Read readCnt = %d, size = %d", readCnt, ret); + } + #if AI_RECORD_TEST + fclose(pfd); + #endif + AudioCaptureStop(); + MEDIA_INFO_LOG("AudioCaptureProcess end"); + return NULL; +} + +int32_t streamingRecordAndSend_AI(void) +{ + const char *argv[] = {"01", "pcm", "16000", "1", "16", "/user/aiRecord.pcm"}; + int32_t argc = 6; + if (g_audioSourceProcessInput.bThreadRun) { + return HandleAudioCaptureCmd(argc, argv); + } + std::string filePath = ""; + g_sample.needStop = false; + g_interruptHintStop = false; + g_sample.mutex = MediaMutexCreate(nullptr); + if (g_sample.mutex == nullptr) { + MEDIA_ERR_LOG("create mutex failed"); + g_audioSourceProcessInput.bThreadRun = false; + return -1; + } + SampleAudioCapturerInfo audioCapturerInfo = {}; + AudioSession sessionId = AUDIO_SESSION_ID_NONE; + FILE *pfd = nullptr; + MediaThreadattr attr = { "AudioCaptureTask", 0x2000, THREAD_SCHED_INVALID, 0, true }; + int32_t ret = CheckInputParam(argc, argv); + if (ret != 0) { + goto EXIT; + } + ret = AudioCaptureGetInfo(argv, audioCapturerInfo, filePath); + if (ret != 0) { + goto EXIT; + } + ret = ActivateAudioInterrupt(sessionId); + if (ret != 0) { + goto EXIT; + } + g_audioCap = std::make_shared(); + if (g_audioCap == nullptr || g_audioCap.get() == nullptr) { + MEDIA_ERR_LOG("audio capture is nullptr"); + (void)g_amInstance.DeactivateAudioInterrupt(g_sample.interrupt); + goto EXIT; + } + #if AI_RECORD_TEST + pfd = fopen(filePath.c_str(), "w+"); + if (pfd == NULL) { + MEDIA_ERR_LOG("open file failed"); + g_audioCap.reset(); + (void)g_amInstance.DeactivateAudioInterrupt(g_sample.interrupt); + goto EXIT; + } + #endif + audioCapturerInfo.sessionID = sessionId; + audioCapturerInfo.inputSource = AUDIO_MIC; + audioCapturerInfo.streamType = AUDIO_STREAM_VOICE_RECORD; + ret = AudioCaptureSetInfo(audioCapturerInfo); + if (ret != 0) { + fclose(pfd); + g_audioCap.reset(); + (void)g_amInstance.DeactivateAudioInterrupt(g_sample.interrupt); + goto EXIT; + } + g_sample.audioCaptureProcess = MediaThreadCreate(AudioCaptureProcess_AI, pfd, &attr); + if (g_sample.audioCaptureProcess == nullptr) { + MEDIA_ERR_LOG("thread create failed"); + goto EXIT; + } + return 0; +EXIT: + g_audioSourceProcessInput.bThreadRun = false; + return -1; +} #ifdef __cplusplus }; #endif diff --git a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.h b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.h index 11337f116..9c06a9ffe 100755 --- a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.h +++ b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.h @@ -16,6 +16,8 @@ extern "C" { int32_t AudioCaptureSample(int32_t argc, const char *argv[]); +int32_t streamingRecordAndSend_AI(void); + #ifdef __cplusplus }; #endif -- 2.17.1