AI 音頻產品開發模板及流程(二)

?AI 音頻產品開發模板及流程(一)

6. 同聲傳譯

  • 實時翻譯,發言與翻譯幾乎同步,極大提升溝通效率。
  • 支持多語言互譯,適用于國際會議、商務洽談等多場景。
  • 自動斷句、轉寫和翻譯,減少人工干預,提升準確性。
  • 翻譯結果可由設備自動播放,交流體驗自然流暢。

功能展示

代碼片段

  // 錄音相關配置,并開始錄音const startRcordFn = async () => {// 設備需要在線if (!isOnline) return;// 開啟了翻譯,但沒有選擇翻譯語言時,給出提示if (needTranslate && !translationLanguage) {showToast({icon: 'none',title: Strings.getLang('realtime_recording_translation_no_select_tip'),});return;}try {setControlBtnLoading(true);const config: any = {// 錄音類型,0:呼叫、1:會議recordType: currRecordType,// DP 控制超時時間,單位秒controlTimeout: 5,// 灌流超時時間,單位秒dataTimeout: 10,// 0:文件轉寫、1:實時轉寫transferType: 1,// 是否需要翻譯needTranslate,// 輸入語言originalLanguage: originLanguage,// 智能體 ID,后面具體根據提供的 SDK 獲取 agentIdagentId: '',// 錄音通道,0:BLE、1:Bt、2:microrecordChannel,// TTS 流編碼方式,通過編碼后將流寫入到耳機設備,0:opus_silk、1:opus_celtttsEncode: isOpusCelt ? 1 : 0,};if (needTranslate) {// 目標語言config.targetLanguage = translationLanguage;}await tttStartRecord({deviceId,config,});setInterval(1000);lastTimeRef.current = Date.now();setControlBtnLoading(false);} catch (error) {setControlBtnLoading(false);}};// 點擊開始錄音對應的回調const handleStartRecord = useCallback(async () => {// 申請錄音權限if (isBtEntryVersion) {ty.authorize({scope: 'scope.record',success: () => {startRcordFn();},fail: e => {ty.showToast({ title: Strings.getLang('no_record_permisson'), icon: 'error' });console.log('cope.record: ', e);},});return;}startRcordFn();}, [deviceId,isOnline,controlBtnLoading,currRecordType,needTranslate,originLanguage,translationLanguage,recordChannel,isBtEntryVersion,offlineUsage,]);
  // 暫停const handlePauseRecord = async () => {if (controlBtnLoading) return;try {setControlBtnLoading(true);const d = await tttPauseRecord(deviceId);setInterval(undefined);setControlBtnLoading(false);} catch (error) {console.log('fail', error);setControlBtnLoading(false);}};
  // 繼續錄音const handleResumeRecord = async () => {if (controlBtnLoading) return;try {setControlBtnLoading(true);await tttResumeRecord(deviceId);setInterval(1000);lastTimeRef.current = Date.now();setControlBtnLoading(false);} catch (error) {setControlBtnLoading(false);}};
  // 停止const handleStopRecord = async () => {if (controlBtnLoading) return;try {ty.showLoading({ title: '' });await tttStopRecord(deviceId);setDuration(0);setInterval(undefined);ty.hideLoading({complete: () => {backToHome(fromType);},});} catch (error) {ty.hideLoading();}};
  // 監聽 ASR 和翻譯返回onRecordTransferRealTimeRecognizeStatusUpdateEvent(handleRecrodChange);// 處理 ASR 和翻譯const handleRecrodChange = d => {try {const {// 階段,0:任務、4:ASR、5:翻譯、6:skill、7:TTSphase,// 階段狀態,0:未開啟、1:進行中、2:結束、3:取消status,requestId,// 轉寫的文本text,// 錯誤碼errorCode,} = d;// ASR 階段,接收并實時更新對應 requestId 文本if (phase === 4) {const currTextItemIdx = currTextListRef.current.findIndex(item => item.id === requestId);if (currTextItemIdx > -1) {const newList = currTextListRef.current.map(item =>item.id === requestId ? { ...item, text } : item);currTextListRef.current = newList;setTextList(newList);} else {if (!text) return;const newList = [...currTextListRef.current,{id: requestId,text,},];currTextListRef.current = newList;setTextList(newList);}// 翻譯返回階段,接收并展示 status=2 即已完成翻譯的} else if (phase === 5 && status === 2) {let resText = '';if (text && text !== 'null') {if (isJsonString(text)) {const textArr = JSON.parse(text);const isArr = Array.isArray(textArr);// 數字的 string 類型如 111,isJsonString 判斷為 json 字符串,會導致 .join 失敗resText = isArr ? textArr?.join('\n') : textArr;} else {resText = text;}}if (!resText) {return;}const newList = currTextListRef.current.map(item => {return item.id === requestId ? { ...item, text: `${item.text}\n${resText}` } : item;});currTextListRef.current = newList;setTextList(newList);}} catch (error) {console.warn(error);}};

7. 現場錄音

  • 可自動錄制現場環境中的所有聲音,完整還原現場交流內容,便于后續查證和回顧。
  • 支持錄音內容的轉寫和 AI 總結,快速提煉關鍵信息,提高信息處理效率。
  • 降低人工記錄成本,避免遺漏重要細節,提升工作和溝通的準確性。
  • 適用于會議記錄、課堂筆記、采訪等多種場景,增強產品的實用性和智能化水平。

功能展示

代碼片段

  // 錄音相關配置,并調用 App 能力開始錄音const startRecordFn = async () => {try {setControlBtnLoading(true);await tttStartRecord({deviceId,config: {// 出錯時是否要保留音頻文件saveDataWhenError: true,// 錄音類型,0:呼叫、1:會議recordType: currRecordType,// DP 控制超時時間,單位秒controlTimeout: 5,// 灌流超時時間 單位秒dataTimeout: 10,// 0:文件轉寫、1:實時轉寫transferType: 0,// 錄音通道,0:BLE、1:Bt、2:microrecordChannel,// TTS 流編碼方式,通過編碼后將流寫入到耳機設備,0:opus_silk、1:opus_celtttsEncode: isOpusCelt ? 1 : 0,},},);setInterval(1000);lastTimeRef.current = Date.now();setControlBtnLoading(false);} catch (error) {setControlBtnLoading(false);}};  // 點擊開始錄音的回調const handleStartRecord = useCallback(async () => {// 申請權限if (isBtEntryVersion) {ty.authorize({scope: 'scope.record',success: () => {startRecordFn();},fail: e => {ty.showToast({ title: Strings.getLang('no_record_permisson'), icon: 'error' });},});return;}startRecordFn();}, [currRecordType, recordChannel, isBtEntryVersion]);
// 暫停const handlePauseRecord = async () => {try {setControlBtnLoading(true);await tttPauseRecord(deviceId);setInterval(undefined);setControlBtnLoading(false);} catch (error) {console.log('fail', error);setControlBtnLoading(false);}};
  // 繼續錄音const handleResumeRecord = async () => {try {setControlBtnLoading(true);await tttResumeRecord(deviceId);setInterval(1000);lastTimeRef.current = Date.now();setControlBtnLoading(false);} catch (error) {setControlBtnLoading(false);}};
  // 停止const handleStopRecord = async () => {try {ty.showLoading({ title: '' });await tttStopRecord(deviceId);setDuration(0);setInterval(undefined);ty.hideLoading();backToHome();} catch (error) {ty.hideLoading();}};

8. 轉錄和 AI 總結

  • 將音頻內容轉寫為可編輯的文字,便于保存和后續處理。
  • 利用 AI 技術根據選擇的模板對轉寫內容進行智能總結,快速提煉關鍵信息,提升信息獲取效率。
  • 降低人工整理和閱讀成本,避免遺漏重要內容。
  • 支持生成結構化的 Markdown 格式文本,方便文檔歸檔和分享。
  • 適用于會議紀要、通話記錄、面對面交流、課堂筆記等多種場景,增強產品的實用性和智能化水平。

功能展示

代碼片段

{/* 轉錄結果 */}
<View className={styles.content}><Tabs.SegmentedPickeractiveKey={currTab}tabActiveTextStyle={{color: 'rgba(54, 120, 227, 1)',fontWeight: '600',}}style={{ backgroundColor: 'rgba(241, 241, 241, 1)' }}onChange={activeKey => {setCurrTab(activeKey);}}><Tabs.TabPanel tab={Strings.getLang('recording_detail_tab_stt')} tabKey="stt" /><Tabs.TabPanel tab={Strings.getLang('recording_detail_tab_summary')} tabKey="summary" /><Tabs.TabPaneltab={Strings.getLang('recording_detail_tab_mind_map')}tabKey="mindMap"/></Tabs.SegmentedPicker>{currTab === 'stt' && (<SttContentplayerStatus={playerStatus}wavFilePath={recordFile?.wavFilePath}transferStatus={transferStatus}sttData={sttData}recordType={recordFile?.recordType}currPlayTime={currPlayTime}onChangePlayerStatus={status => {setPlayerStatus(status);}}innerAudioContextRef={innerAudioContextRef}isEditMode={isEditMode}onUpdateSttData={handleUpdateSttData}/>)}{currTab === 'summary' && (<SummaryContent summary={summary} transferStatus={transferStatus} />)}{currTab === 'mindMap' && (<MindMapContent summary={summary} transferStatus={transferStatus} />)}{(transferStatus === TRANSFER_STATUS.Initial ||transferStatus === TRANSFER_STATUS.Failed) &&!(currTab === 'stt' && recordFile?.transferType === TransferType.REALTIME) && (<><EmptyContent type={EMPTY_TYPE.NO_TRANSCRIPTION} /><ButtonclassName={styles.generateButton}onClick={() => {// 先選擇模版setShowTemplatePopup(true);}}><Text className={styles.generateText}>{Strings.getLang('generate')}</Text></Button></>)}
</View>
  // 開始轉錄總結const handleStartTransfer = async (selectTemplate: TRANSFER_TEMPLATE) => {if (isLoading.current) return;try {isLoading.current = true;ty.showLoading({ title: '' });await tttTransfer({recordTransferId: currRecordTransferId.current,template: selectTemplate,language: recordFile?.originalLanguage || language,});setTransferStatus(TRANSFER_STATUS.Processing);const fileDetail: any = await tttGetFilesDetail({recordTransferId: currRecordTransferId.current,amplitudeMaxCount: 100,});setRecordFile(fileDetail);dispatch(updateRecordTransferResultList());ty.hideLoading();isLoading.current = false;} catch (error) {console.log(error);dispatch(updateRecordTransferResultList());ty.hideLoading();isLoading.current = false;}};
// 獲取轉錄和轉寫詳情
const getFileDetail = async () => {// loadingconst finishLoading = () => {ty.hideLoading();isLoading.current = false;};try {isLoading.current = true;ty.showLoading({ title: '' });const recordTransferId = currRecordTransferId.current;// 獲取錄音詳情const fileDetail = await tttGetFilesDetail({recordTransferId,amplitudeMaxCount: 100,});if (fileDetail) {setRecordFile(fileDetail);const { storageKey, transfer, visit, status, recordId, transferType } = fileDetail;if (!visit) {updateFileVisitStatus();}setTransferStatus(transfer);// 實時轉寫直接取用 App 接口的轉寫數據if (transferType === TransferType.REALTIME) {// 獲取轉寫數據const realTimeResult: any = await tttGetRecordTransferRealTimeResult({recordId,});const { list } = realTimeResult;const newData = list.filter(item => !!item?.asr && item?.asr !== 'null').map(item => ({asrId: item.asrId,startSecond: Math.floor(item.beginOffset / 1000),endSecond: Math.floor(item.endOffset / 1000),text: item.asr,transText: item.translate,channel: item.channel,}));setSttData(newData);originSttData.current = newData;// 獲取客戶端本地總結數據tttGetRecordTransferSummaryResult({recordTransferId,from: 0,}).then((d: any) => {if (d?.text) {resolveSummaryText(d?.text);}});// 獲取云端總結數據tttGetRecordTransferSummaryResult({recordTransferId,from: 1, // 云端}).then((d: any) => {if (d?.text) {tttSaveRecordTransferSummaryResult({ recordTransferId, text: d?.text });resolveSummaryText(d?.text);}});} else {// status 文件同步狀態,0:未上傳、1:上傳中、2:已上傳、3:上傳失敗// transfer 轉錄狀態,0:未轉錄、1:轉錄中、2:已轉錄、3:轉錄失敗if (status === 2 && transfer === 2) {// 獲取客戶端本地轉寫數據tttGetRecordTransferRecognizeResult({recordTransferId,from: 0, // 本地}).then((d: any) => {if (d?.text) {resolveSttText(d?.text);}});// 獲取云端轉寫數據tttGetRecordTransferRecognizeResult({recordTransferId,from: 1, // 云端}).then((d: any) => {if (d?.text) {// 緩存到客戶端本地tttSaveRecordTransferRecognizeResult({ recordTransferId, text: d?.text });resolveSttText(d?.text);}});// 獲取客戶端本地總結數據tttGetRecordTransferSummaryResult({recordTransferId,from: 0,}).then((d: any) => {if (d?.text) {resolveSummaryText(d?.text);}});// 獲取云端總結數據tttGetRecordTransferSummaryResult({recordTransferId,from: 1, // 云端}).then((d: any) => {if (d?.text) {tttSaveRecordTransferSummaryResult({ recordTransferId, text: d?.text });resolveSummaryText(d?.text);}});}}finishLoading();}} catch (error) {console.log('error', error);finishLoading();}
};

9. 結束

  • 恭喜你 🎉 完成了本教程的學習!
  • 有任何問題可以提交工單👉涂鴉IoT開發平臺入口頁面(提交技術工單)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90481.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90481.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90481.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kafka4.0集群部署

kafka4.0是最新版kafka&#xff0c;可在kafka官網下載&#xff0c;依賴的jdk版本要求在jdk17及jdk17以上tar -xzf kafka_2.13-4.0.0.tgzmv kafka_2.13-4.0.0 kafkacd kafka# 隨便一臺節點運行生成隨機uuid&#xff0c;后面每臺節點都要使用此uuidbin/kafka-storage.sh random-u…

【News】同為科技亮相首屆氣象經濟博覽會

7月18日&#xff0c;由中國氣象服務協會主辦的國內首個以“氣象經濟”為核心的國家級博覽會——首屆氣象經濟博覽會&#xff08;以下簡稱“博覽會”&#xff09;在合肥濱湖國際會展中心開幕。北京同為科技有限公司&#xff08;TOWE&#xff09;作為雷電防護領域的技術領導企業&…

數據結構 堆(2)---堆的實現

上篇文章我們詳細介紹了堆和樹的基本概念以及它們之間的關系&#xff0c;還要知道一般實現堆的方式是使用順序結構的數組進行存儲數據及實現。下來我們看看利用順序結構的數組如何實現對的內容:1.堆的實現關于堆的實現&#xff0c;也是三個文件&#xff0c;頭文件&#xff0c;實…

Arraylist與LinkedList區別

&#x1f4da; 歡迎來到我的Java八股文專欄&#xff01; &#x1f389;各位程序員小伙伴們好呀~ &#x1f44b; 我是雪碧聊技術&#xff0c;很高興能在CSDN與大家相遇&#xff01;?&#x1f680; 專欄介紹這個專欄將專注于分享Java面試中的經典"八股文"知識點 &…

Java實戰:基于Spring Cloud的電商微服務架構設計——從拆分到高可用的全流程解析

引言 2023年雙十一大促期間,某傳統電商平臺的單體應用再次“爆雷”:凌晨1點訂單量突破50萬單/分鐘時,用戶服務因數據庫連接池被訂單模塊占滿,導致登錄接口響應時間從200ms飆升至5秒,大量用戶流失。技術團隊緊急回滾后發現:這個運行了7年的單體應用,早已變成“代碼泥潭”…

STL學習(二、vector容器)

1.vector構造函數函數原型vector<int> v // 默認構造&#xff0c;size為0vector(const_iterator beg, const_iterator end) // 將v的[begin, end) 元素拷貝過來vector(n, elem) // 構造函數將n個elem拷貝到本身vector(const vector & v) // 拷貝構造2.vect…

深度學習-算子

概念&#xff1a;標識數字圖像中亮度變化明顯的點處理步驟1.濾波處理算子通常被稱為濾波器。2.增強確定各點sobel算子概念&#xff1a;主要用于獲得數字圖像的一階梯度&#xff0c;本質是梯度運算。Scharr算子Scharr算子 是一種用于邊緣檢測的梯度算子&#xff0c;它是Sobel算子…

全國產8通道250M AD FMC子卡

4片8路ADS42LB69標準FMC采集子卡自研成品ADC采集子卡和定制化設計ADC采集子卡&#xff0c;實測采集指標均與手冊標稱值一致。該板卡有全國產化和進口兩個版本&#xff0c;基于FMC標準設計&#xff0c;實現8路16bit/250MSPS ADC采集功能&#xff0c;遵循 VITA 57 標準&#xff0…

【牛客網C語言刷題合集】(三)

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言刷題集》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"任何足夠先進的bug都與魔法無異。" 前言&#xff1a;刷題博客主要記錄在學習編程語言…

Python之--字典

定義字典&#xff08;dict&#xff09;是一種無序、可變且可哈希的數據結構&#xff0c;字典是根據一個信息來查找另一個信息&#xff0c;它表示索引用的鍵和對應的值構成的成對關系。特點&#xff08;1&#xff09;字典與列表一樣&#xff0c;是Python里面的可變數據類型。&am…

【ARM】ARM微架構

1、 文檔目標對 ARM 微架構的概念有初步的了解。2、 問題場景在和客戶溝通和新同事交流時對于 ARM 架構和微架構二者有什么區別和聯系&#xff0c;做一個簡單的介紹。3、軟硬件環境1、軟件版本&#xff1a;不涉及2 、電腦環境&#xff1a;不涉及4、關于 ARM 架構和微架構架構不…

c++注意點(11)----設計模式(工廠方法)

創建型模式工廠方法模式是一種創建型設計模式&#xff0c; 其在父類中提供一個創建對象的方法&#xff0c; 允許子類決定實例化對象的類型。為什么需要工廠方法模式&#xff1f;看一個 “沒有工廠模式” 的痛點場景&#xff1a;假設你在開發一個游戲&#xff0c;最初只有 “戰士…

基于Kubernetes的微服務CI/CD:Jenkins Pipeline全流程實踐

一、部署gitlab GitLab 是一個集代碼托管、CI/CD、項目管理、安全掃描于一體的 DevOps 平臺&#xff0c;提供從代碼編寫到部署的全生命周期管理。它支持 Git 版本控制&#xff0c;內置自動化流水線&#xff0c;可與 Kubernetes 集成&#xff0c;實現云原生應用的持續交付。同時…

Spring Bean初始化及@PostConstruc執行順序

目錄 1. Bean初始化執行順序 2. 成員變量初始化順序 2.1 普通Java類&#xff08;非Spring環境&#xff09; (1) 默認初始化(即初始分配內存) (2) 顯式初始化 (3) 構造器初始化 (4)完整順序 2.2 Spring管理的Bean&#xff08;依賴注入場景&#xff09; (1) 普通成員變量…

webRTC合并本地源碼修改和官方更新

一、總體思路&#xff1a;基于 Git 分支管理改動origin/main 是官方 WebRTC 主干&#xff08;來自 webrtc.googlesource.com&#xff09;。my/webrtc 是你自己開發和修改的分支。每次 Google 更新 WebRTC&#xff0c;你從 origin/main 拉新代碼&#xff0c;再把 my/webrtc 分支…

c++注意點(12)----設計模式(生成器)

創建型模式生成器模式&#xff08;Builder Pattern&#xff09;是一種創建型設計模式&#xff0c;它專注于將復雜對象的構建過程與表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。就像是做飯&#xff0c;你可以自己慢慢做&#xff0c;各個步驟自己選擇。而使用生成…

[特殊字符] VLA 如何“繞過”手眼標定?—— 當機器人學會了“看一眼就動手”

&#x1f52e; VLA 如何“繞過”手眼標定&#xff1f;—— 當機器人學會了“看一眼就動手” 作者&#xff1a;石去皿 發布時間&#xff1a;2025年7月 在傳統機器人系統中&#xff0c;“手眼標定”是每一個工程師都繞不開的課題。 你必須精確測量相機和機械臂之間的空間變換關系…

《Maven 核心基礎筆記(第一天)》

1.說明maven軟件依賴管理和項目構建功能maven是為Java項目工作的 功能體現&#xff1a;依賴管理&#xff0c;項目構建 依賴管理&#xff1a;我們只需要寫配置文件(pom.xml)&#xff0c;maven就會幫我們下載依賴&#xff0c;并且也會下載依賴的依賴。 項目構建&#xff1a;項目源…

Yolo底層原理學習(V1~V3)(第一篇)

一&#xff0c;卷積后的特征圖大小計算眾所周知&#xff0c;提到深度學習&#xff0c;必不可少的會提及卷積&#xff0c;那么如何計算卷積之后的圖片大小呢&#xff1f;下圖呈現&#xff1a;如圖&#xff0c; 我們令FH&#xff0c;FW為原圖像的長度FH*FW。P為padding的長度&…

前端開發項目性能瓶頸分析

1. 使用 rollup-plugin-visualizer 分析構建 借助 rollup-plugin-visualizer 插件&#xff0c;可以分析通過 rollup 構建出的產物內容&#xff0c;并生成可視化圖表&#xff0c;幫助你分析打包后的文件大小以及各個模塊的占用情況。 1.1. 安裝插件 你需要在你的項目中安裝 r…