原生微信小程序實現語音轉文字搜索---同聲傳譯

效果展示
![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/23257ce3b6c149a1bb54fd8bc2a05c68.png#pic_center
在這里插入圖片描述
在這里插入圖片描述
注意:引入同聲傳譯組件請看這篇文章
1.search.wxml

<view class="search-page"><navigation-bar title="搜索"  color="#000" background="#fff"  bind:back="onNavigationBack"></navigation-bar><view class="search-bar"><input class="search-input" value="{{keyword}}"  placeholder="請輸入搜索名稱"  focus="{{true}}" bindinput="onInput" /><image wx:if="{{!isPressed}}" src="點擊前的圖標狀態" class="search-icon" style="width: 50rpx;height: 50rpx;" bindtap="onMicTap"/><image wx:else  src="點擊后的圖標狀態" style="width: 40rpx;height: 40rpx;" bindtap="closeOnMicTap"  class="search-icon" /></view><!-- 搜索結果區域 --><!-- <view class="search-result-placeholder" wx:if="{{productList.length==0}}">暫無數據</view> --><!-- 列表 --><view class="product-list" style="padding-bottom:230rpx;"><view class="product-card" wx:for="{{productList}}" wx:key="title" bind:tap="onsubCategoriesItemTap"  data-type="{{item.type}}" data-id="{{item.id}}"><image class="product-img" src="{{item.image}}" mode="aspectFit"></image><view class="product-info"><view class="product-title">{{item.productName}}</view><image class="product-tag" src="{{item.label}}" mode="widthFix"></image><view class="product-desc">{{item.productInfo}}</view></view></view></view>
</view> ```
1.search.ts```javascript
import { get, post } from '../../api/request';
//import { share } from '../../utils/util';
//引入插件:微信同聲傳譯
const plugin = requirePlugin('WechatSI');
//獲取全局唯一的語音識別管理器recordRecoManager
const manager = plugin.getRecordRecognitionManager();
// const shareData  =  wx.getStorageSync("shareData")
Page({data: {resultStr:null,keyword:"",//搜索詞msgText: 1, //1默認初始化  2對話進行中   3結束對話  4對話出現問題// recordState: false, //麥克風默認關閉狀態isFlag: false, //是否點擊錄音到獲取結果之間狀態islongPress: false, //是否長按isPressed: false,normalIcon: 'microphone.png', // 正常狀態圖標路徑pressedIcon: 'prohibit.png', // 按下狀態圖標路徑isplay: true,haveflag: false, //防止重復點擊// keyword: '',currentTab: 0, // 0:產品科普 1:科普圖文productList: [],},onLoad(){//識別語音this.initRecord();},cleanup() {if (manager) {// 停止錄音并移除所有監聽manager.stop();manager.onStart(null);manager.onStop(null);manager.onError(null);// manager = null;console.log('錄音管理器已銷毀');// 顯示Toast(3秒后自動關閉)this.setData({isPressed:false,islongPress:false,isFlag:false,msgText:1,keyword:"",resultStr:null,isplay:true,haveflag:false})}},//語音  點擊說話onMicTap() {// 判斷是否獲取錄音權限// console.log("是否關閉語音",this.data.haveflag)if (this.data.haveflag) { //true 請先結束語音wx.showToast({title: '請先關閉語音!',icon: 'none',duration: 2000})return false}// 當前正在識別語音,還沒結束上一次識別,請先關閉再進行錄音if (this.data.isFlag) { //true 請先結束語音wx.showToast({title: '請先關閉語音!',icon: 'none',duration: 2000})return false}this.setData({islongPress: true,isplay: true})// var flag = Number(e.currentTarget.dataset.flag);this.setData({// recordState: true, //錄音狀態// flag: true,// touchstart: true, //按下isPressed:true,msgText: 2, //初始化狀態})// 語音開始識別manager.start({lang: 'zh_CN', // 識別的語言})},//語音  --點擊結束closeOnMicTap() {if (!(this.data.islongPress)) { //如果是長按執行下面內容return false}wx.showLoading({title: '正在思考...',icon: 'none',})if (this.data.haveflag) { //true 請先結束語音wx.hideLoading();// wx.showToast({//   title: '請先關閉語音111!',//   icon: 'none',//   duration: 2000// })return false}this.setData({// touchstart: false,isPressed:false,// recordState: false,islongPress: false, //長按初始狀態isFlag: true, //判斷從松手到識別錄音期間狀態haveflag: true})// 語音結束識別manager.stop();},//識別語音 -- 初始化initRecord() {const that = this;// 有新的識別內容返回,則會調用此事件manager.onRecognize = function (res:any) {console.log("有新的識別內容返回,則會調用此事件")}// 正常開始錄音識別時會調用此事件manager.onStart = function (res:any) {console.log("成功開始錄音識別", res)that.setData({// annimationFlag:true})}//識別結束事件manager.onStop = function (res:any) {that.setData({resultStr:res})if(!res){//證明可能已經銷毀return false}if (!that.data.isplay) {wx.showToast({title: "請說話",icon: 'none',// image: 'no_voice.png',duration: 1000,success: function (res) {that.setData({haveflag: false,})},fail: function (res) {console.log(res);}});return false}// console.log("過來????")if (res.result == '') {wx.hideLoading();// wx.showToast({//   title: '聽不清楚,請重新說一遍!',//   icon: 'none',//   duration: 2000// })that.showRecordEmptyTip()return;} else {that.setData({keyword: res.result,msgText: 2, //正在對話// resultobj: {//   result: res.result,//   annimationFlag: true// }})// console.log("調用·接口",that.data.keyword)//  調用接口that.onSearch();}}// 識別錯誤事件manager.onError = function (res:any) {console.log("error msg", res);if(!res){return false}wx.hideLoading();// wx.showToast({//   icon: "none",//   title: '請重新開始~'// })that.setData({haveflag: false,msgText: 1,isPressed:false,// annimationFlag: false,isFlag: false, //當前錄制語音識別狀態})}},showRecordEmptyTip: function () {this.setData({msgText: 1, //初始化haveflag: false,isFlag: false,})if(!this.data.resultStr){return false}// console.log("進來了,啊",this.data.resultStr)wx.showToast({title: "請說話",icon: 'none',// image: 'no_voice.png',duration: 1000,success: function (res) {},fail: function (res) {console.log(res);}});},// 根據wx.getSetting判斷用戶是否打開了錄音權限,如果沒有打開,則通過wx.authorize,向用戶打開授權請求,如果用戶拒絕了,就給用戶打開授權設置頁面。getSeeting(type:any) {// wx.showLoading({//   title: '獲取錄音權限',//   icon: 'none',//   mask: true// })const _this = thiswx.getSetting({ //獲取用戶當前設置success: res => {// wx.hideLoading();// console.log('獲取權限', res);if (res.authSetting['scope.record']) { //查看是否授權了錄音設置// console.log('獲取權限1111');const authset = wx.setStorageSync('AUTHSETTING', true);_this.setData({authsetting: true})if (type == 2) {wx.showToast({title: '獲取錄音權限成功,點擊重新開始!',icon: 'none',duration: 2000})}} else {// 用戶還沒有授權,向 用戶發起授權請求wx.authorize({ //提前向用戶發起授權請求,調用后會立刻彈窗詢問用戶是否同意授權小程序使用某項功能或獲取用戶的某些數據,但不會實際調用對應接口scope: 'scope.record',success() { //用戶同意授權攝像頭// console.log("同意授權");// wx.showToast({//   title: '獲取錄音權限成功',//   icon: 'none',//   duration: 2000// })},fail() { //用戶不同意授權攝像頭_this.openSetting()}})}},fail() {// console.log('獲取用戶授權信息失敗');wx.showToast({title: '獲取權限失敗',icon: 'none',duration: 2000})}})},openSetting() {wx.openSetting({success(res) {console.log(res);if (res.authSetting['scope.record']) {console.log('用戶已經同意錄音權限');// 在這里可以再次執行錄音操作或者其他邏輯} else {console.log('用戶依然拒絕錄音權限');// 可以提示用戶繼續操作的限制或者做其他處理}},fail() {console.log('打開設置頁面失敗');},});},onNavigationBack(e:any) {console.log('返回按鈕被點擊',e);this.cleanup();// 執行自定義邏輯wx.navigateBack({delta: e.detail})},//==========================================================================onInput(e:any) {this.setData({ keyword: e.detail.value });if(e.detail.value){this.onSearch()}else{this.setData({productList:[]})}// console.log("拿到值",this.data.keyword)},onSearch() {// TODO: 搜索邏輯let cleanedText =this.data.keyword;if(cleanedText){cleanedText = cleanedText.replace(/[.,\/#!?;:,。、;:?!]/g, '');}get(`product/search`, {productKeyword:cleanedText}, { intercept: true }).then((res: any) => {wx.hideLoading();// 語音重置if(this.data.isplay){this.setData({isFlag: false,msgText: 1,haveflag:false})}console.log("沒有分頁",res);this.setData({productList: res.content,})})},// 產品列表點擊onsubCategoriesItemTap(e: any) {wx.navigateTo({ url: `/pages/product-detail/product-detail?id=${e.currentTarget.dataset.id}` });},
}); 

3.search.wxss

.search-page { width: 100%; min-height: 100vh; }
.search-bar { display: flex; align-items: center; background: #fff; border-radius: 30rpx; padding: 16rpx 24rpx; box-shadow: 0 2rpx 8rpx #f5e9c7; }
.search-input { flex: 1; border: none; background: transparent; font-size: 28rpx; color: #222; outline: none; }
.search-icon { width: 36rpx; height: 36rpx; margin-left: 16rpx; }
.search-result-placeholder { height: 400rpx; background: #f5f5f5; border-radius: 20rpx; margin-top: 40rpx; text-align: center; line-height: 400rpx; color: #bbb; } 
/* 搜索列表展示 */
.product-list { margin: 30rpx 10px; padding-bottom: 100rpx;  }
.product-card { display: flex; align-items:center; border-top: 3px solid #fff; border-radius: 20rpx;/* margin-bottom: 32rpx;  */padding: 24rpx 32rpx;    background: #FAF6E4; }
.product-img { width: 160rpx; height: 160rpx; border-radius: 12rpx; margin-right: 32rpx; background: #fff;  padding: 20rpx 10rpx; }
.product-info { flex: 1;display: flex;flex-direction: column;justify-content: center; }
.product-title { font-size: 36rpx; font-weight: bold; color: #222; margin-bottom: 12rpx; }
.product-tag {     display: inline-block; width: 110rpx; margin-top: -5rpx; }
.product-desc { font-size: 20rpx; color: #222; line-height: 1.6; word-break: break-all;  margin-top: 10rpx;}```
4.search.json```javascript
{"navigationBarTitleText": "搜索","navigationStyle": "custom"
} ```

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

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

相關文章

Wireshark安裝過程缺失vc_runtimeMinimum_x64.msi文件,安裝 Visual C++ Redistributable

一、我大意了 一開始是Npcap裝不上。 在這個網站下的&#xff1a; Wireshark (kafan58.com) 安裝程序&#xff1a; 安裝過程&#xff1a; 無語死了&#xff0c;感覺被騙了......外網下的才是最正版的。 二、外網正版 下載最新的4.4.8版本Wireshark重新安裝 2.1 vc_runtime…

高通平臺Wi-Fi Display學習-- 調試 Wi-Fi Display 問題

4.1 調試 WFD 性能 4.1.1 通過啟用調節器模式驗證 WFD 當系統設為調節器模式時,設備的運行時鐘將達到峰值。要在系統中啟用調節器模式,應 在序列中輸入以下命令: 1. adb shell stop mpdecision 2. adb shell echo 1→/sys/devices/system/cpu/cpu1/online 3. adb shell…

5G專網與SD-WAN技術融合:某飲料智能工廠網絡架構深度解析

隨著工業互聯網的快速發展&#xff0c;制造業正從傳統的生產模式向智能化、數字化方向轉型。某飲料智能工廠項目創新性地引入了5G專網與SD-WAN技術&#xff0c;形成了“連接-計算-應用-安全”的全鏈條網絡架構。本文將深入剖析這兩種技術在智能工廠中的應用場景、部署架構&…

Java項目:基于SSM框架實現的公益網站管理系統【ssm+B/S架構+源碼+數據庫+畢業論文+答辯PPT+遠程部署】

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本公益網站就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信息&#x…

向華為學習——IPD流程體系之IPD術語

第一章 IPD體系 1.1集成產品開發IPD Integrated Product Development,IPD是一種領先的、成熟的產品開發的管理思想和管理模式。它是根據大量成功的產品開發管理實踐總結出來的,并被大量實踐證明的高效的產品開發模式。通過IPD,可建立起基于市場和客戶需求驅動的集成產品開…

落霞歸雁:從自然之道到“存內計算”——用算法思維在芯片里開一條“數據高速航道”

作者 落霞歸雁&#xff08;CSDN首發&#xff0c;轉載請注明&#xff09; 段落一 現象&#xff1a;當“摩爾”老去&#xff0c;數據卻在狂奔 過去 30 年&#xff0c;CPU 頻率翻了 60 倍&#xff0c;而 DRAM 帶寬只翻了 20 倍。算力與帶寬的剪刀差&#xff0c;讓“計算”變成“等…

StyleX:Meta推出的高性能零運行時CSS-in-JS解決方案

簡介 StyleX 是由 Meta 開發的零運行時 CSS-in-JS 解決方案&#xff0c;在構建時將樣式編譯為靜態 CSS&#xff0c;消除運行時開銷。 核心特性 零運行時開銷 – 構建時編譯為靜態 CSS類型安全 – 完整的 TypeScript 支持原子化 CSS – 自動生成原子化類名&#xff0c;最小化…

LINUX 85 SHElL if else 前瞻 實例

問題 判斷用戶是否存在 id user id $user變量判斷vsftpd軟件包被安裝 rpm -q vsftpd rpm -ql vsftpd >& null[rootweb ~]# rpm -ql vsftpd >/dev/null 2>&1 您在 /var/spool/mail/root 中有郵件yum install vsftpd 內核主版本判斷 uname -rcut -d[rootweb ~]#…

2025 年非關系型數據庫全面指南:類型、優勢

非關系型數據庫的分類與特點隨著數據量呈指數級增長和數據類型日益多樣化&#xff0c;傳統關系型數據庫在處理海量非結構化數據時面臨著嚴峻挑戰。非關系型數據庫&#xff08;NoSQL&#xff09;應運而生&#xff0c;它摒棄了傳統關系模型的約束&#xff0c;采用更靈活的數據存儲…

深度殘差網絡ResNet結構

Deep Residual Learning for Image Recognition&#xff0c;由Kaiming He、Xiangyu Zhang、Shaoqing Ren和Jian Sun于2016年發表在CVPR上 1512.03385 (arxiv.org)https://arxiv.org/pdf/1512.03385 下圖中&#xff0c;左側為VGG19網絡&#xff0c;中間為34層的普通網絡&#xf…

python筆記--socket_TCP模擬瀏覽器實現

""" 1,導包 2,創建TCP套接字 3,建立連接 4,拼接客戶端請求報文 5,發送請求報文 6,接收響應報文 7,過濾出html頁面 8,保存為html文件 9,關閉套接字 """ # 1,導包 import socket # 2,創建TCP套接字 tcp_socketsocket.socket(socket.AF_INET,socket…

西門子PLC基礎指令4:置位指令 S、復位指令 R

布爾指令 1、置位指令 S Setbit 是要進行置位操作的地址的首地址&#xff0c;N 是從該首地址開始連續置位的位數 。 LD I0.0 // 裝載輸入繼電器I0.0的狀態&#xff08;當I0.0為ON時&#xff0c;執行后續指令&#xff09; S Q0.0, 3 // 從Q0.0開始&#xff0c;連續置位3…

2.3 子組件樣式沖突詳解

Vue2組件樣式沖突的成因與解決方案組件樣式沖突的根本原因在Vue單頁面應用中&#xff0c;所有組件的DOM結構最終都會合并到同一個index.html 頁面中。若子組件未使用scoped屬性&#xff0c;其樣式會默認全局生效&#xff0c;導致不同組件中相同選擇器&#xff08;如h1、.contai…

26-數據倉庫與Apache Hive

1.數據倉庫 是什么&#xff1f;解決什么&#xff1f;1.1 數據倉庫Data Warehouse 數倉 / DW 是一個用于存儲、分析、報告的數據系統.目的&#xff1a;構建面向分析的集成數據環境&#xff0c;分析結構為企業提供決策支持。數倉專注于分析數倉本身不“”生產“”數據&#xff0c…

前端開發技術教學(二)

書接上回&#xff1a;前端開發技術教學(一) -CSDN博客 必要資源&#xff1a;TRAE - The Real AI Engineer 目錄 一) 自定義函數 - function 二) DOM操控 DOM事件 a.) onclick b.) onkeydown 三) AI寫代碼 書接上回說到的前端3種主語言以及其用法&#xff0c;這期我們…

設計模式 - 組合模式:用樹形結構處理對象之間的復雜關系

文章目錄一、引言二、模式原理分析三、代碼示例四、核心要點五、使用場景分析六、案例七、為何使用組合模式&#xff1f;八、優缺點剖析九、最佳實踐建議十、總結一、引言 “組合模式”&#xff08;Composite Pattern&#xff09;常被誤解為“組合關系”。前者專注于將對象組合…

STM32U575低功耗調試

開啟了MSIK時鐘導致功耗變高在stop2模式下, 整體板子25.41uA; 如果在standby模式, 整體板子5uA;如果在stop2模式, 并且把LPTIM3,4選擇的時鐘是MSIK, 整體功耗53.59uA2.stanby模式板子整體5uA調試的時候, 可以讓板子進入standby模式, 如果電流很小, 可以證明板子沒有漏電(圖畫錯…

基于ARM+FPGA多通道超聲信號采集與傳輸系統設計

針對超聲信號采集系統在多通道同步采集和高速數據傳輸所面臨的挑戰,設計并實現了一種 基于 FPGA 的8通道超聲信號同步采集與傳輸系統。系統以FPGA 作為主控芯片,ADI公司的 AD9279作 為8通道超聲信號同步采集的模擬前端和模數轉換芯片,通過 DDR3SDRAM 及 USB3.0實現數據緩存和 高…

計算機網絡:為什么IPv6沒有選擇使用點分十進制

IPv6沒有采用點分十進制(如IPv4的192.168.1.1),核心原因是其地址長度、設計目標與表示需求和IPv4存在本質差異,而冒號分十六進制(如2001:0db8:85a3:0000:0000:8a2e:0370:7334)是更適配其特性的選擇。具體可從以下幾個角度分析: 一、地址長度差異:點分十進制無法適配12…

HBM Basic(VCU128)

目錄 1. 簡介 1.1 硬件平臺 1.2 圖片 2. 硬件信息 2.1 Vivado Basic 2.1.1 GPIO 2.1.2 Clock Sources 2.1.3 Reset 2.1.4 Flash 2.1.5 燒寫報錯 2.2 PCIe simple 2.2.1 Block Design 2.2.2 XDMA 2.3 PCIe HBM 2.3.1 Block Design 2.3.2 HBM IP 3. HBM 知識 3…