This commit is contained in:
parent
154abe3887
commit
a95ef0427a
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name" : "农业咨询",
|
"name" : "情感咨询",
|
||||||
"appid" : "__UNI__3A527D1",
|
"appid" : "__UNI__8080F14",
|
||||||
"description" : "",
|
"description" : "",
|
||||||
"versionName" : "1.0.0",
|
"versionName" : "1.0.0",
|
||||||
"versionCode" : "100",
|
"versionCode" : "100",
|
||||||
|
@ -17,11 +17,7 @@
|
||||||
"delay" : 0
|
"delay" : 0
|
||||||
},
|
},
|
||||||
/* 模块配置 */
|
/* 模块配置 */
|
||||||
"modules" : {
|
"modules" : {},
|
||||||
"Record" : {},
|
|
||||||
"Speech" : {},
|
|
||||||
"Camera" : {}
|
|
||||||
},
|
|
||||||
/* 应用发布信息 */
|
/* 应用发布信息 */
|
||||||
"distribute" : {
|
"distribute" : {
|
||||||
/* android打包配置 */
|
/* android打包配置 */
|
||||||
|
@ -51,9 +47,7 @@
|
||||||
},
|
},
|
||||||
/* SDK配置 */
|
/* SDK配置 */
|
||||||
"sdkConfigs" : {
|
"sdkConfigs" : {
|
||||||
"ad" : {},
|
"ad" : {}
|
||||||
"speech" : {},
|
|
||||||
"share" : {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -61,7 +55,7 @@
|
||||||
"quickapp" : {},
|
"quickapp" : {},
|
||||||
/* 小程序特有相关 */
|
/* 小程序特有相关 */
|
||||||
"mp-weixin" : {
|
"mp-weixin" : {
|
||||||
"appid" : "wx3267f87bc81f2890",
|
"appid" : "",
|
||||||
"setting" : {
|
"setting" : {
|
||||||
"urlCheck" : false
|
"urlCheck" : false
|
||||||
},
|
},
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<view class="" style="position: absolute;left: 30rpx;"><i class="iconfont icon-xiangzuo"
|
<view class="" style="position: absolute;left: 30rpx;"><i class="iconfont icon-xiangzuo"
|
||||||
style="font-size: 40rpx;text-align: left;"></i></view>
|
style="font-size: 40rpx;text-align: left;"></i></view>
|
||||||
<view class="" style="font-size: 30rpx;">
|
<view class="" style="font-size: 30rpx;">
|
||||||
教育咨询
|
农业咨询
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view style="padding-top:var(--status-bar-height);padding-bottom: 30rpx; margin-bottom: 30rpx;"></view>
|
<view style="padding-top:var(--status-bar-height);padding-bottom: 30rpx; margin-bottom: 30rpx;"></view>
|
||||||
|
@ -22,20 +22,20 @@
|
||||||
您好!
|
您好!
|
||||||
</view>
|
</view>
|
||||||
<view class="talk-list-con-title1">
|
<view class="talk-list-con-title1">
|
||||||
您可以和我说任何有关教育的问题。<br />
|
您可以和我说任何有关情感的问题。<br />
|
||||||
例如下面的问题,赶快试试吧!
|
例如下面的问题,赶快试试吧!
|
||||||
</view>
|
</view>
|
||||||
<view class="talk-list-con-title2">
|
<view class="talk-list-con-title2">
|
||||||
<text style="margin-top: 15rpx;"> 下方输入:</text>
|
<text style="margin-top: 15rpx;"> 下方输入:</text>
|
||||||
<view class="" @click="sendDetail('如何教育孩子')">
|
<view class="" @click="sendDetail('当我被爱情伤害时,我该如何重新振作起来?')">
|
||||||
如何教育孩子
|
当我被爱情伤害时,我该如何重新振作起来?
|
||||||
<image src="../../static/icon/airight.png" mode=""></image>
|
<image src="../../static/icon/airight.png" mode=""></image>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
<view v-for="(item,index) in talkList" :key="index" :id="`msg-${item.id}`">
|
<view v-for="(item,index) in talkList" :key="index" :id="`msg-${item.id}`">
|
||||||
<view class="item flex_col" :class=" item.type == 1 ? 'push':'pull' ">
|
<view class="item flex_col" :class="item.type == 1 ? 'push':'pull' ">
|
||||||
<image :src="item.type==1?avatar:item.pic" mode="aspectFill" class="pic" v-if="item.pic">
|
<image :src="item.type==1?avatar:item.pic" mode="aspectFill" class="pic" v-if="item.pic">
|
||||||
</image>
|
</image>
|
||||||
|
|
||||||
|
@ -60,10 +60,10 @@
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="contenta" v-if="c_content!=''&&index==nums">
|
<view class="contenta" v-if="c_content!=''&&index==nums">
|
||||||
<view class="contenta-img" v-if='palystatus' @click="palyaudio(item)">
|
<view class="contenta-img" v-if='palystatus' @click="palyaudio(item,index)">
|
||||||
<image src="@/static/icon/ai7.png" mode="aspectFit"></image>
|
<image src="@/static/icon/ai7.png" mode="aspectFit"></image>
|
||||||
</view>
|
</view>
|
||||||
<view class="contenta-img" v-else @click="palyaudio(item)">
|
<view class="contenta-img" v-else @click="palyaudio(item,index)">
|
||||||
<image src="@/static/icon/ai8.png" mode="aspectFit"></image>
|
<image src="@/static/icon/ai8.png" mode="aspectFit"></image>
|
||||||
</view>
|
</view>
|
||||||
<view class="contenta-ai" v-show="palystatus==false">
|
<view class="contenta-ai" v-show="palystatus==false">
|
||||||
|
@ -112,8 +112,7 @@
|
||||||
</view>
|
</view>
|
||||||
<view class="flex_c_txt" v-else>
|
<view class="flex_c_txt" v-else>
|
||||||
|
|
||||||
<view class="con" @touchend="end" @touchmove="move" @touchstart="start" @longpress="longpress"
|
<view class="con" @touchend="end" @touchmove="move" @touchstart="start">
|
||||||
@click="longclick">
|
|
||||||
{{btnStatus==0? "按住说话":btnStatus==1? "说话中...": btnStatus==2? "松开手指发送录音": "上划取消"}}
|
{{btnStatus==0? "按住说话":btnStatus==1? "说话中...": btnStatus==2? "松开手指发送录音": "上划取消"}}
|
||||||
</view>
|
</view>
|
||||||
<!-- <view :class=" btnStatus==0? 'footerBtn': btnStatus==1?'footerBtn_star':'footerBtn_move'">
|
<!-- <view :class=" btnStatus==0? 'footerBtn': btnStatus==1?'footerBtn_star':'footerBtn_move'">
|
||||||
|
@ -182,8 +181,7 @@
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</uni-popup>
|
</uni-popup>
|
||||||
<qiqbshare ref="child" ></qiqbshare>
|
<qiqbshare ref="child"></qiqbshare>
|
||||||
|
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
@ -194,7 +192,9 @@
|
||||||
iatWss,
|
iatWss,
|
||||||
debounce,
|
debounce,
|
||||||
throttle,
|
throttle,
|
||||||
ttWss
|
fileToBase64,
|
||||||
|
dataURLtoBlob,
|
||||||
|
ttWss,
|
||||||
} from "@/api/api.js"
|
} from "@/api/api.js"
|
||||||
import {
|
import {
|
||||||
HTTP_REQUEST_URL
|
HTTP_REQUEST_URL
|
||||||
|
@ -214,7 +214,8 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const recorderManager = uni.getRecorderManager()
|
// 获取 module
|
||||||
|
const sr = uni.requireNativePlugin("YL-SpeechRecognition")
|
||||||
const innerAudioContext = uni.createInnerAudioContext()
|
const innerAudioContext = uni.createInnerAudioContext()
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
@ -226,8 +227,8 @@
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
wssType: 'nongye', // 网络连接类型
|
wssType: 'qinggan', // 网络连接类型
|
||||||
avatarType: "/static/icon/ny.png", // AI头像类型
|
avatarType: "/static/icon/qg.png", // AI头像类型
|
||||||
talkList: [],
|
talkList: [],
|
||||||
ajax: {
|
ajax: {
|
||||||
rows: 15, //每页数量
|
rows: 15, //每页数量
|
||||||
|
@ -273,16 +274,15 @@
|
||||||
touchMoveX: 0, // x轴方向移动的距离
|
touchMoveX: 0, // x轴方向移动的距离
|
||||||
touchMoveY: 0, // y轴方向移动的距离
|
touchMoveY: 0, // y轴方向移动的距离
|
||||||
risshow: false,
|
risshow: false,
|
||||||
|
|
||||||
touchT: null,
|
|
||||||
touchE: null,
|
|
||||||
islong: false,
|
islong: false,
|
||||||
// 是否开始绘制
|
// 是否开始绘制
|
||||||
isDraw: false,
|
isDraw: false,
|
||||||
imageSize: {
|
imageSize: {
|
||||||
|
|
||||||
}
|
},
|
||||||
|
audio_file: [],
|
||||||
|
currentIndex: 0,
|
||||||
|
wv: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -302,7 +302,20 @@
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
//初始化
|
||||||
|
sr.init("2eda6c2e");
|
||||||
|
//创建文字转语音对象
|
||||||
|
sr.createTts(code => {});
|
||||||
|
//创建语音转文字对象
|
||||||
|
sr.createIat(code => {
|
||||||
|
console.log(code, '1111111111')
|
||||||
|
});
|
||||||
|
|
||||||
|
sr.setVadBos(10 * 1000); //设置语音听写前端点超时时间ms(最大10s,一般按默认即可)
|
||||||
|
sr.setVadEos(10 * 1000); //设置语音听写后端点超时时间ms(最大10s,一般按默认即可)
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
sr.destroy();
|
||||||
},
|
},
|
||||||
onLoad() {
|
onLoad() {
|
||||||
let avatar = uni.getStorageSync('avatar');
|
let avatar = uni.getStorageSync('avatar');
|
||||||
|
@ -311,6 +324,9 @@
|
||||||
this.avatar = e.avatar;
|
this.avatar = e.avatar;
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
// #ifdef APP-PLUS
|
// #ifdef APP-PLUS
|
||||||
|
@ -322,24 +338,7 @@
|
||||||
this.getHistoryMsg();
|
this.getHistoryMsg();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
|
||||||
|
|
||||||
// 为了防止苹果手机静音无法播放
|
|
||||||
// uni.setInnerAudioOption({
|
|
||||||
// obeyMuteSwitch: false
|
|
||||||
// })
|
|
||||||
let that = this;
|
|
||||||
recorderManager.onStop(function(res) {
|
|
||||||
// 解决第一次录音,挂实例挂载问题
|
|
||||||
that.$nextTick(() => {
|
|
||||||
// console.log('recorder stop' + JSON.stringify(res));
|
|
||||||
that.audioDuration = res.duration;
|
|
||||||
that.voicePath = res.tempFilePath;
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
this.list()
|
|
||||||
},
|
|
||||||
watch: {
|
watch: {
|
||||||
n_content(n, o) {
|
n_content(n, o) {
|
||||||
|
|
||||||
|
@ -373,18 +372,19 @@
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
|
//海报计算
|
||||||
cavshare(data) {
|
cavshare(data) {
|
||||||
|
|
||||||
let arry = []
|
let arry = []
|
||||||
let arry1 = []
|
let arry1 = []
|
||||||
let a;
|
let a;
|
||||||
let b;
|
let b;
|
||||||
if(data.length>2){
|
if (data.length > 2) {
|
||||||
a=data.length-2
|
a = data.length - 2
|
||||||
b=data.length-1
|
b = data.length - 1
|
||||||
}else{
|
} else {
|
||||||
a=0
|
a = 0
|
||||||
b=1
|
b = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i in data[a].content) {
|
for (let i in data[a].content) {
|
||||||
|
@ -402,9 +402,9 @@
|
||||||
}
|
}
|
||||||
// console.log(arry1.length,arry.length)
|
// console.log(arry1.length,arry.length)
|
||||||
|
|
||||||
this.imageSize.height=(arry1.length*20)+(arry.length*20)+100+150
|
this.imageSize.height = (arry1.length * 20) + (arry.length * 20) + 100 + 150
|
||||||
|
|
||||||
this.$refs.child.refresh(this.talkList,this.imageSize.height,(arry.length*20)+100);
|
this.$refs.child.refresh(this.talkList, this.imageSize.height, (arry.length * 20) + 100);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
@ -524,12 +524,7 @@
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
//获取讯飞地址
|
|
||||||
list() {
|
|
||||||
iatWss().then((res) => {
|
|
||||||
this.audioUrl = res.data.iat_wss
|
|
||||||
})
|
|
||||||
},
|
|
||||||
//功能展开
|
//功能展开
|
||||||
addgn() {
|
addgn() {
|
||||||
|
|
||||||
|
@ -541,69 +536,7 @@
|
||||||
this.$refs.popup.close()
|
this.$refs.popup.close()
|
||||||
},
|
},
|
||||||
|
|
||||||
//语音转文字
|
|
||||||
uploadFile(tempFilePath) {
|
|
||||||
|
|
||||||
let that = this
|
|
||||||
// console.log(tempFilePath)
|
|
||||||
uni.uploadFile({
|
|
||||||
url: HTTP_REQUEST_URL + '/api/xun_fei/iat', // 上传地址
|
|
||||||
filePath: tempFilePath, // 要上传的文件路径
|
|
||||||
name: 'audio', // 上传文件对应的 key 值
|
|
||||||
header: {
|
|
||||||
'content-type': 'multipart/form-data'
|
|
||||||
},
|
|
||||||
success: function(res) {
|
|
||||||
// console.log(res)
|
|
||||||
|
|
||||||
let data = JSON.parse(res.data)
|
|
||||||
if (data.code == 1) {
|
|
||||||
uni.showToast({
|
|
||||||
title: '语音识别成功'
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
that.talkList = that.talkList.filter(item => item.id !== '@');
|
|
||||||
if (data.data.words.length > 0) {
|
|
||||||
that.content = data.data.words
|
|
||||||
that.send1()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// console.log( that.talkList)
|
|
||||||
// if (that.talkList.length > 0) {
|
|
||||||
// that.talkList.splice(that.talkList.length - 1, 1)
|
|
||||||
// } else {
|
|
||||||
// that.talkList.splice(0, 1)
|
|
||||||
// }
|
|
||||||
|
|
||||||
that.voicePath = ''
|
|
||||||
// if (that.content.length > 0) {
|
|
||||||
// that.send()
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
} else {
|
|
||||||
that.talkList = that.talkList.filter(item => item.id !== '@');
|
|
||||||
uni.showToast({
|
|
||||||
title: '语音识别失败'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
},
|
|
||||||
fail: function(error) {
|
|
||||||
// 上传失败处理逻辑
|
|
||||||
that.deletespeech()
|
|
||||||
console.log(error, 11);
|
|
||||||
uni.hideLoading();
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
//振动
|
//振动
|
||||||
onFeedTap() {
|
onFeedTap() {
|
||||||
let platform = uni.getSystemInfoSync().platform
|
let platform = uni.getSystemInfoSync().platform
|
||||||
|
@ -628,169 +561,174 @@
|
||||||
}
|
}
|
||||||
// #endif
|
// #endif
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
//文字转语音
|
//文字转语音
|
||||||
txtspeech(val, i) {
|
txtspeech(val, i) {
|
||||||
|
|
||||||
// xuiat({
|
xuiat({
|
||||||
// text: val
|
text: val
|
||||||
// }).then(res => {
|
|
||||||
// if (res.code == 1) {
|
|
||||||
// this.talkList[i].audio_file = res.data.audio_file
|
|
||||||
// this.nums = this.talkList.length - 1
|
|
||||||
// // this.palyaudio(res.data)
|
|
||||||
// }
|
|
||||||
// }).catch((err) => {
|
|
||||||
// console.log(err)
|
|
||||||
// })
|
|
||||||
|
|
||||||
ttWss({
|
|
||||||
data: val
|
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (res.code == 0) {
|
if (res.code == 1) {
|
||||||
this.talkList[i].audio_file = res.data.mp3
|
this.talkList[i].audio_file = res.data.audio_file
|
||||||
this.nums = this.talkList.length - 1
|
|
||||||
this.nums = this.talkList.length - 1
|
this.nums = this.talkList.length - 1
|
||||||
|
// this.palyaudio(res.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 暂时不用
|
||||||
|
// let arry1;
|
||||||
|
// if (val.indexOf(',') == -1) {
|
||||||
|
// arry1 = val.split(',')
|
||||||
|
// } else if (val.indexOf(',') == -1) {
|
||||||
|
// arry1 = val.split(',')
|
||||||
|
// } else {
|
||||||
|
// arry1.push(val)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const temp = []
|
||||||
|
// for (let i = 0; i < arry1.length; i++) {
|
||||||
|
// temp.push(
|
||||||
|
// // 使用Promise用于异步计算
|
||||||
|
// new Promise((resolve, reject) => {
|
||||||
|
|
||||||
|
// ttWss({
|
||||||
|
// data: arry1[i]
|
||||||
|
// }).then(res => {
|
||||||
|
|
||||||
|
// return resolve(res.data.mp3)
|
||||||
|
// }).catch(err => {
|
||||||
|
// return reject(err)
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
// )
|
||||||
|
// }
|
||||||
|
// Promise.all(temp).then(res => {
|
||||||
|
// // console.log(res,'2222222')
|
||||||
|
// this.audio_file = res
|
||||||
|
|
||||||
|
// this.ScanAudio(res, this.currentIndex, 0)
|
||||||
|
// })
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
//点击事件
|
//语音分段 数组 条数 延时
|
||||||
longclick() {
|
ScanAudio(urls, currentIndex, delayInSeconds) {
|
||||||
if (this.touchE - this.touchT < 1000) {
|
|
||||||
console.log('点击');
|
if (currentIndex >= urls.length) {
|
||||||
|
this.palystatus = true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
const music = uni.createInnerAudioContext();
|
||||||
longpress(e) {
|
music.src = urls[currentIndex];
|
||||||
// console.log(e.touches[0].pageX)
|
console.log(urls[currentIndex])
|
||||||
this.onFeedTap()
|
|
||||||
this.touchT = new Date().getTime();
|
console.log('播放成功', this.palystatus)
|
||||||
this.islong = true
|
if (this.palystatus) {
|
||||||
this.risshow = false
|
this.palystatus = false
|
||||||
this.$refs.popup.open('center')
|
music.play();
|
||||||
// 限制时长
|
|
||||||
this.timer = setInterval(() => {
|
} else {
|
||||||
this.num++
|
|
||||||
}, 1000)
|
music.pause();
|
||||||
this.btnStatus = 1
|
|
||||||
recorderManager.start({
|
}
|
||||||
//时长5分钟,单位毫秒
|
|
||||||
duration: 300000
|
music.onEnded(() => {
|
||||||
|
|
||||||
|
music.destroy();
|
||||||
|
setTimeout(() => {
|
||||||
|
this.ScanAudio(urls, currentIndex + 1, delayInSeconds);
|
||||||
|
}, delayInSeconds * 1000);
|
||||||
});
|
});
|
||||||
this.touchStartX = e.touches[0].pageX; // 获取触摸时的原点
|
|
||||||
this.touchStartY = e.touches[0].pageY; // 获取触摸时的原点
|
},
|
||||||
|
|
||||||
|
|
||||||
|
//开始录音
|
||||||
|
voiceToText() {
|
||||||
|
let that = this;
|
||||||
|
|
||||||
|
sr.voiceToText(data => {
|
||||||
|
// console.log(JSON.stringify(data));
|
||||||
|
if (data.code == 1001) {
|
||||||
|
// that.toTextStatus = "倾听中,请说话..."
|
||||||
|
} else if (data.code == 1006) {
|
||||||
|
// this.toTextStatus = "倾听完毕"
|
||||||
|
//文件地址
|
||||||
|
// sr.getIatPath(path => {
|
||||||
|
// that.path = path;
|
||||||
|
// });
|
||||||
|
} else if (data.code == 1007) {
|
||||||
|
// this.toTextStatus = "停止倾听"
|
||||||
|
} else if (data.code == 1008) {
|
||||||
|
// this.volume = data.msg;
|
||||||
|
} else if (data.code == 1009) { //结果
|
||||||
|
//语音识别是分段的,你说一个词语或者一个句子识别一次,返回一次,再说再返回,不是一次性的,islast代表是否是最后一句话,可以理解为本次识别是否已结束
|
||||||
|
// this.transText = data.msg;
|
||||||
|
if (data.isLast) {
|
||||||
|
|
||||||
|
if (data.msg.length > 0 && this.risshow == false) {
|
||||||
|
this.content = data.msg
|
||||||
|
this.send()
|
||||||
|
} else {
|
||||||
|
this.content = ''
|
||||||
|
this.stopVoiceToText()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (data.code == 1010) { //error信息
|
||||||
|
//如果data.msg不为空,则属于报错
|
||||||
|
if (data.msg) {
|
||||||
|
this.transText = data.msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
//结束录音
|
||||||
|
stopVoiceToText() {
|
||||||
|
//你调这个方法后,安卓的回调会先1007,再1009 ios是 1007 1006 1009 1010
|
||||||
|
sr.stopListening();
|
||||||
},
|
},
|
||||||
start(e) {
|
start(e) {
|
||||||
// console.log(e.touches[0].pageX)
|
// console.log(e.touches[0].pageX)
|
||||||
this.touchStartX = e.touches[0].pageX; // 获取触摸时的原点
|
this.touchStartX = e.touches[0].pageX; // 获取触摸时的原点
|
||||||
this.touchStartY = e.touches[0].pageY; // 获取触摸时的原点
|
this.touchStartY = e.touches[0].pageY; // 获取触摸时的原点
|
||||||
|
clearTimeout(this.timer); //再次清空定时器,防止重复注册定时器
|
||||||
|
let that=this
|
||||||
|
this.timer = setTimeout(function() {
|
||||||
|
//执行的代码块
|
||||||
|
// alert("执行了一次长按事件!!!")
|
||||||
|
that.onFeedTap()
|
||||||
|
|
||||||
|
that.islong = true
|
||||||
|
that.risshow = false
|
||||||
|
that.$refs.popup.open('center')
|
||||||
|
that.btnStatus = 1
|
||||||
|
that.voiceToText()
|
||||||
|
|
||||||
|
}.bind(this), 1500);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
end() {
|
end() {
|
||||||
|
|
||||||
this.touchE = new Date().getTime();
|
|
||||||
|
|
||||||
if (this.islong) {
|
if (this.islong) {
|
||||||
this.closePop()
|
this.closePop()
|
||||||
// clearInterval(this.timer1)
|
|
||||||
// this.btnStatus = 0
|
|
||||||
// // 暂停播放
|
|
||||||
// innerAudioContext.stop()
|
|
||||||
// //异步,解决录音结束后,路径没赋值就传值,导致的路径为空
|
|
||||||
// setTimeout(() => {
|
|
||||||
// let obj = {
|
|
||||||
// status: false,
|
|
||||||
// path: [{
|
|
||||||
// src: this.voicePath,
|
|
||||||
// switchStatus: false,
|
|
||||||
// soundTime: this.num
|
|
||||||
// }]
|
|
||||||
// }
|
|
||||||
// console.log(1111, this.voicePath)
|
|
||||||
// // if (this.voicePath.length > 0) {
|
|
||||||
// // uni.$u.throttle(this.uploadFile(this.voicePath), 500)
|
|
||||||
// // }
|
|
||||||
// this.num = 0
|
|
||||||
// // pathToBase64(this.voicePath)
|
|
||||||
// // .then(base64 => {
|
|
||||||
// // const arrayBuffer = new Uint8Array(base64)
|
|
||||||
// // const base1 = uni.arrayBufferToBase64(arrayBuffer)
|
|
||||||
// // let params = {
|
|
||||||
// // common: {
|
|
||||||
// // app_id: '2eda6c2e',
|
|
||||||
// // },
|
|
||||||
// // business: {
|
|
||||||
// // language: "zh_cn",
|
|
||||||
// // domain: "iat",
|
|
||||||
// // accent: "mandarin",
|
|
||||||
// // vad_eos: 5000,
|
|
||||||
// // dwa: "wpgs",
|
|
||||||
// // },
|
|
||||||
// // data: {
|
|
||||||
// // status: 2,
|
|
||||||
// // format: "audio/L16;rate=16000",
|
|
||||||
// // encoding: "raw",
|
|
||||||
// // audio: base64.split(',')[1]
|
|
||||||
// // },
|
|
||||||
// // };
|
|
||||||
// // this.audioTxt = JSON.stringify(params)
|
|
||||||
// // this.audiosckt()
|
|
||||||
// // })
|
|
||||||
// // .catch(error => {
|
|
||||||
// // console.error(error)
|
|
||||||
// // })
|
|
||||||
|
|
||||||
// // this.socketaudio.send(JSON.stringify(params))
|
|
||||||
|
|
||||||
// }, 500)
|
|
||||||
|
|
||||||
|
|
||||||
this.islong = false
|
this.islong = false
|
||||||
clearInterval(this.timer)
|
clearInterval(this.timer) //清空定时器,防止重复注册定时器
|
||||||
this.btnStatus = 0
|
this.btnStatus = 0;
|
||||||
recorderManager.stop();
|
this.stopVoiceToText()
|
||||||
// console.log(this.voicePath, "888");
|
|
||||||
// this.closePop()
|
|
||||||
if (this.risshow == false && this.touchE - this.touchT > 3000) {
|
|
||||||
let data = {
|
|
||||||
"id": '@',
|
|
||||||
"content": '加载完毕',
|
|
||||||
"type": 2,
|
|
||||||
"pic": this.avatarType
|
|
||||||
}
|
|
||||||
this.talkList.push(data);
|
|
||||||
// 异步,解决录音结束后,路径没赋值就传值,导致的路径为空
|
|
||||||
setTimeout(() => {
|
|
||||||
let obj = {
|
|
||||||
status: false,
|
|
||||||
path: [{
|
|
||||||
src: this.voicePath,
|
|
||||||
switchStatus: false,
|
|
||||||
soundTime: this.num
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.voicePath.length > 0 && this.risshow == false) {
|
|
||||||
// this.huashow=true
|
|
||||||
this.TabItemTap()
|
|
||||||
throttle(this.uploadFile(this.voicePath), 1000)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.num = 0
|
this.num = 0
|
||||||
}, 500)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (!this.risshow) {
|
|
||||||
uni.showModal({
|
|
||||||
title: "录音时长不超过3s"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -799,36 +737,7 @@
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
toBase64() {
|
|
||||||
pathToBase64(this.voicePath)
|
|
||||||
.then(base64 => {
|
|
||||||
const arrayBuffer = new Uint8Array(base64)
|
|
||||||
const base1 = uni.arrayBufferToBase64(arrayBuffer.split(0, 1280))
|
|
||||||
let params = {
|
|
||||||
common: {
|
|
||||||
app_id: '2eda6c2e',
|
|
||||||
},
|
|
||||||
business: {
|
|
||||||
language: "zh_cn",
|
|
||||||
domain: "iat",
|
|
||||||
accent: "mandarin",
|
|
||||||
vad_eos: 5000,
|
|
||||||
dwa: "wpgs",
|
|
||||||
},
|
|
||||||
data: {
|
|
||||||
status: 2,
|
|
||||||
format: "audio/L16;rate=16000",
|
|
||||||
encoding: "raw",
|
|
||||||
audio: base1
|
|
||||||
},
|
|
||||||
};
|
|
||||||
this.audioTxt = JSON.stringify(params)
|
|
||||||
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
console.error(error)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
//删除本地录音文件
|
//删除本地录音文件
|
||||||
deletespeech() {
|
deletespeech() {
|
||||||
|
@ -873,9 +782,31 @@
|
||||||
},
|
},
|
||||||
//音频播放
|
//音频播放
|
||||||
|
|
||||||
palyaudio(item) {
|
palyaudio1(item, i) {
|
||||||
this.palystatus = !this.palystatus
|
this.palystatus = !this.palystatus
|
||||||
|
console.log(this.audio_file, '111')
|
||||||
|
if (!this.palystatus) {
|
||||||
|
|
||||||
|
this.ScanAudio(this.audio_file, this.currentIndex, 0)
|
||||||
|
} else {
|
||||||
|
this.ScanAudio(this.audio_file, this.currentIndex, 0)
|
||||||
|
// this.txtspeech(item.content, i)
|
||||||
|
}
|
||||||
|
// innerAudioContext.onError((res) => {
|
||||||
|
// console.log(res.errMsg);
|
||||||
|
// console.log(res.errCode);
|
||||||
|
// this.palystatus = true
|
||||||
|
// });
|
||||||
|
|
||||||
|
innerAudioContext.onEnded((res) => {
|
||||||
|
this.palystatus = true
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
//音频播放
|
||||||
|
|
||||||
|
palyaudio(item, i) {
|
||||||
|
this.palystatus = !this.palystatus
|
||||||
if (!this.palystatus) {
|
if (!this.palystatus) {
|
||||||
innerAudioContext.src = item.audio_file;
|
innerAudioContext.src = item.audio_file;
|
||||||
innerAudioContext.play()
|
innerAudioContext.play()
|
||||||
|
@ -1051,6 +982,18 @@
|
||||||
let that = this;
|
let that = this;
|
||||||
let moveX = this.touchMoveX - e.touches[0].pageX;
|
let moveX = this.touchMoveX - e.touches[0].pageX;
|
||||||
let moveY = this.touchMoveY - e.touches[0].pageY;
|
let moveY = this.touchMoveY - e.touches[0].pageY;
|
||||||
|
// console.log(-115 > moveX && -240 < moveX,moveY)
|
||||||
|
let platform = uni.getSystemInfoSync().platform;
|
||||||
|
if (platform === 'ios') {
|
||||||
|
if (-115 > moveX && -240 < moveX && moveY < -620 && moveY > -730) {
|
||||||
|
this.risshow = true
|
||||||
|
this.deletespeech()
|
||||||
|
|
||||||
|
} else {
|
||||||
|
this.risshow = false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
|
||||||
if (-115 > moveX && -240 < moveX && moveY < -359 && moveY > -480) {
|
if (-115 > moveX && -240 < moveX && moveY < -359 && moveY > -480) {
|
||||||
|
|
||||||
|
@ -1060,240 +1003,7 @@
|
||||||
} else {
|
} else {
|
||||||
this.risshow = false
|
this.risshow = false
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
|
||||||
audiosckt() {
|
|
||||||
this.socketaudio = uni.connectSocket({
|
|
||||||
//url: encodeURI(encodeURI(myUrl).replace(/\+/g, '%2B')),
|
|
||||||
url: this.audioUrl,
|
|
||||||
method: 'GET',
|
|
||||||
token: '',
|
|
||||||
success: res => {
|
|
||||||
console.log(res, "ws成功连接...")
|
|
||||||
}
|
}
|
||||||
})
|
|
||||||
// 消息的发送和接收必须在正常连接打开中,才能发送或接收【否则会失败】
|
|
||||||
this.socketaudio.onOpen((res) => {
|
|
||||||
console.log("WebSocket连接正常打开中...!");
|
|
||||||
|
|
||||||
//第一帧
|
|
||||||
|
|
||||||
|
|
||||||
let params = {
|
|
||||||
common: {
|
|
||||||
app_id: '2eda6c2e',
|
|
||||||
},
|
|
||||||
business: {
|
|
||||||
language: "zh_cn",
|
|
||||||
domain: "iat",
|
|
||||||
accent: "mandarin",
|
|
||||||
vad_eos: 5000,
|
|
||||||
dwa: "wpgs",
|
|
||||||
},
|
|
||||||
data: {
|
|
||||||
status: 0,
|
|
||||||
format: "audio/L16;rate=16000",
|
|
||||||
encoding: "raw",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
this.socketaudio.send({
|
|
||||||
data: JSON.stringify(params),
|
|
||||||
async success(res) {
|
|
||||||
console.log("消息发送成功", '1');
|
|
||||||
that.audioTxt = ''
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//第二帧
|
|
||||||
|
|
||||||
this.handlerInterval = setInterval(() => {
|
|
||||||
// 中间帧
|
|
||||||
console.log(this.audioTxt)
|
|
||||||
let that = this
|
|
||||||
this.socketaudio.send({
|
|
||||||
data: JSON.stringify({
|
|
||||||
data: {
|
|
||||||
status: 1,
|
|
||||||
format: 'audio/L16;rate=16000',
|
|
||||||
encoding: 'raw',
|
|
||||||
audio: this.audioTxt
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
async success(res) {
|
|
||||||
console.log("消息发送成功", that.audioTxt, '2');
|
|
||||||
that.audioTxt = ''
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (this.audioTxt.length === 0) {
|
|
||||||
this.socketaudio.send({
|
|
||||||
data: JSON.stringify({
|
|
||||||
data: {
|
|
||||||
status: 2,
|
|
||||||
format: 'audio/L16;rate=16000',
|
|
||||||
encoding: 'raw',
|
|
||||||
audio: ''
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
async success(res) {
|
|
||||||
console.log("消息发送成功", '3');
|
|
||||||
clearInterval(that.handlerInterval);
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
}, 40);
|
|
||||||
|
|
||||||
|
|
||||||
// 注:只有连接正常打开中 ,才能正常成功发送消息
|
|
||||||
// this.socketaudio.send({
|
|
||||||
// data: JSON.stringify(params),
|
|
||||||
// async success(res) {
|
|
||||||
// console.log("消息发送成功", res);
|
|
||||||
// },
|
|
||||||
// });
|
|
||||||
|
|
||||||
// 注:只有连接正常打开中 ,才能正常收到消息
|
|
||||||
|
|
||||||
})
|
|
||||||
// 这里仅是事件监听【如果socket关闭了会执行】
|
|
||||||
// this.socketaudio.onClose(() => {
|
|
||||||
// console.log("已经被关闭了")
|
|
||||||
// })
|
|
||||||
this.socketaudio.onMessage((res) => {
|
|
||||||
console.log("收到服务器内容:" + res.data);
|
|
||||||
});
|
|
||||||
|
|
||||||
},
|
|
||||||
send1() {
|
|
||||||
|
|
||||||
this.showStop = true;
|
|
||||||
// 将当前发送信息 添加到消息列表。
|
|
||||||
let data = {
|
|
||||||
"id": new Date().getTime(),
|
|
||||||
"content": this.content,
|
|
||||||
"type": 1,
|
|
||||||
"pic": this.avatar
|
|
||||||
}
|
|
||||||
this.TEXT = this.content,
|
|
||||||
this.talkList.push(data);
|
|
||||||
this.talkList.push({
|
|
||||||
"id": new Date().getTime(),
|
|
||||||
"content": '',
|
|
||||||
"type": 2,
|
|
||||||
"pic": this.avatarType
|
|
||||||
});
|
|
||||||
this.n_content = '';
|
|
||||||
this.c_content = '';
|
|
||||||
this.socketing = true;
|
|
||||||
// return ;
|
|
||||||
this.$nextTick(() => {
|
|
||||||
// 清空内容框中的内容
|
|
||||||
this.content = '';
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
this.sendToSpark1();
|
|
||||||
|
|
||||||
},
|
|
||||||
async sendToSpark1() {
|
|
||||||
this.tempRes = "";
|
|
||||||
let realThis = this;
|
|
||||||
this.socketTask = uni.connectSocket({
|
|
||||||
//url: encodeURI(encodeURI(myUrl).replace(/\+/g, '%2B')),
|
|
||||||
url: `wss://chat.lihaink.cn/chat?type=${this.wssType}×tamp=${Date.now()}`,
|
|
||||||
method: 'GET',
|
|
||||||
token: '',
|
|
||||||
success: res => {
|
|
||||||
console.log(res, "ws成功连接...")
|
|
||||||
realThis.wsLiveFlag = true;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
realThis.socketTask.onError((res) => {
|
|
||||||
console.log("连接发生错误,请检查appid是否填写", res)
|
|
||||||
})
|
|
||||||
realThis.socketTask.onOpen((res) => {
|
|
||||||
|
|
||||||
this.historyTextList.push({
|
|
||||||
"role": "user",
|
|
||||||
"content": this.TEXT
|
|
||||||
})
|
|
||||||
// 第一帧..........................................
|
|
||||||
console.log('连接成功...')
|
|
||||||
|
|
||||||
if (this.historyTextList.length > 9) this.params = JSON.parse(JSON.stringify(this
|
|
||||||
.historyTextList
|
|
||||||
.splice(-9)));
|
|
||||||
else this.params = JSON.parse(JSON.stringify(this.historyTextList));
|
|
||||||
this.isSurpass();
|
|
||||||
realThis.socketTask.send({ // 发送消息,,都用uni的官方版本
|
|
||||||
data: JSON.stringify(this.params),
|
|
||||||
success() {
|
|
||||||
console.log('第一帧发送成功');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// 接受到消息时
|
|
||||||
realThis.socketTask.onMessage((res) => {
|
|
||||||
// console.log('收到API返回的内容:', res.data);
|
|
||||||
let obj = JSON.parse(res.data)
|
|
||||||
// console.log("我打印的"+obj.payload);
|
|
||||||
if (!realThis.wsLiveFlag) return;
|
|
||||||
let dataArray = obj.payload.choices.text;
|
|
||||||
for (let i = 0; i < dataArray.length; i++) {
|
|
||||||
this.talkList[this.talkList.length - 1].content += dataArray[i].content;
|
|
||||||
this.n_content = this.talkList[this.talkList.length - 1].content;
|
|
||||||
realThis.tempRes = realThis.tempRes + dataArray[i].content
|
|
||||||
}
|
|
||||||
let temp = JSON.parse(res.data)
|
|
||||||
// console.log("0726",temp.header.code)
|
|
||||||
if (temp.header.code !== 0) {
|
|
||||||
this.socketing = false;
|
|
||||||
console.log(`${temp.header.code}:${temp.message}`);
|
|
||||||
realThis.socketTask.close({
|
|
||||||
success(res) {
|
|
||||||
console.log('关闭成功', res)
|
|
||||||
realThis.wsLiveFlag = false;
|
|
||||||
},
|
|
||||||
fail(err) {
|
|
||||||
console.log('关闭失败', err)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if (temp.header.code === 0) {
|
|
||||||
if (res.data && temp.header.status === 2) {
|
|
||||||
this.socketing = false;
|
|
||||||
this.historyTextList.push({
|
|
||||||
"role": "assistant",
|
|
||||||
"content": this.tempRes
|
|
||||||
})
|
|
||||||
setTimeout(() => {
|
|
||||||
let that = this
|
|
||||||
realThis.socketTask.close({
|
|
||||||
success(res) {
|
|
||||||
console.log('关闭成功', res)
|
|
||||||
that.nums = that.talkList.length - 1
|
|
||||||
|
|
||||||
that.txtspeech(that.n_content, that.talkList.length -
|
|
||||||
1)
|
|
||||||
|
|
||||||
realThis.wsLiveFlag = false;
|
|
||||||
},
|
|
||||||
fail(err) {
|
|
||||||
// console.log('关闭失败', err)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}, 1000)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
// 发送信息
|
// 发送信息
|
||||||
|
@ -1311,7 +1021,8 @@
|
||||||
"id": new Date().getTime(),
|
"id": new Date().getTime(),
|
||||||
"content": this.content,
|
"content": this.content,
|
||||||
"type": 1,
|
"type": 1,
|
||||||
"pic": this.avatar
|
// "pic": this.avatar
|
||||||
|
"pic": this.avatarType
|
||||||
}
|
}
|
||||||
// console.log(data);
|
// console.log(data);
|
||||||
this.TEXT = this.content;
|
this.TEXT = this.content;
|
||||||
|
@ -1427,15 +1138,15 @@
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": this.tempRes
|
"content": this.tempRes
|
||||||
})
|
})
|
||||||
|
this.nums = this.talkList.length - 1
|
||||||
|
this.txtspeech(this.n_content, this.talkList.length -
|
||||||
|
1)
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
let that = this
|
let that = this
|
||||||
realThis.socketTask.close({
|
realThis.socketTask.close({
|
||||||
success(res) {
|
success(res) {
|
||||||
console.log('关闭成功', res)
|
console.log('关闭成功', res)
|
||||||
that.nums = that.talkList.length - 1
|
|
||||||
|
|
||||||
that.txtspeech(that.n_content, that.talkList.length -
|
|
||||||
1)
|
|
||||||
realThis.wsLiveFlag = false;
|
realThis.wsLiveFlag = false;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1513,7 +1224,7 @@
|
||||||
page {
|
page {
|
||||||
// background-color: #f5f5f5;
|
// background-color: #f5f5f5;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
background: url('@/static/icon/bg1.png') no-repeat;
|
// background: url('@/static/icon/bg1.png') no-repeat;
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
|
@ -1630,7 +1341,7 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding-top: var(--status-bar-height);
|
padding-top: var(--status-bar-height);
|
||||||
padding-bottom: 30rpx;
|
padding-bottom: 30rpx;
|
||||||
background: url('@/static/icon/bg1.png');
|
// background: url('@/static/icon/bg1.png');
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
|
|
Loading…
Reference in New Issue