Feat(AI):TTS功能实现

This commit is contained in:
lifizer
2025-06-11 18:00:02 +08:00
parent db554f0dbc
commit 491aa8d0a3
4 changed files with 79 additions and 3 deletions
+60 -1
View File
@@ -10,6 +10,8 @@ import settings from '@/config/baseSetting.js'
import { formatAiMsgContent } from '../utils/aiChat'
import cookie from '@/utils/store/cookie'
import { handleLoginFailure } from '@/utils'
const plugin = requirePlugin('WechatSI')
const removeMarkdown = require('remove-markdown')
export const chatMixins = {
data() {
return {
@@ -46,7 +48,9 @@ export const chatMixins = {
}
*/
],
errorMsg: Object.freeze('您提的问题未能理解,云灵思想跑偏啦,重新整理一下问题或者重新提问,让云灵再试试!')
errorMsg: Object.freeze('您提的问题未能理解,云灵思想跑偏啦,重新整理一下问题或者重新提问,让云灵再试试!'),
audioAyy: [],
isPlayAudio: false
}
},
computed: {
@@ -402,6 +406,61 @@ export const chatMixins = {
} catch (err) {
console.log('send failed (' + err.code + ')')
}
},
ttsHandle(item) {
this.isPlayAudio = false
this.audioAyy = []
this.splitAndSynthesize(removeMarkdown(item.content).replace(/[\n\t\s]/g, ''))
},
splitAndSynthesize(text) {
const _this = this
if (text) {
const textLength = text.length
const chunkSize = 100
const chunk = text.slice(0, textLength > chunkSize ? chunkSize : textLength)
plugin.textToSpeech({
// 语言
lang: 'zh_CN',
tts: true,
// 要转换的文字
content: chunk,
success: function(res) {
console.log("语音文件路径:", res.filename)
_this.audioAyy.push(res.filename)
// 首次就立即播放,增强体验
if (!_this.isPlayAudio) {
_this.playNextChunk()
}
if (textLength > chunkSize) {
// 递归调用,播放一定要按照文本分割顺序
_this.splitAndSynthesize(text.substr(chunkSize, textLength))
} else {
// 最后一条合成,没有正在播放则立即播放
if (!_this.isPlayAudio) {
_this.playNextChunk()
}
}
},
fail: function(err) {
console.log("转换失败:", err)
}
})
} else {
if (!_this.isPlayAudio) {
_this.playNextChunk()
}
}
},
playNextChunk() {
if (this.audioAyy.length > 0) {
this.isPlayAudio = true
const audioContext = uni.createInnerAudioContext()
audioContext.src = this.audioAyy.shift()
audioContext.onEnded(() => this.playNextChunk())
audioContext.play()
} else {
this.isPlayAudio = false
}
}
}
}
+11
View File
@@ -233,6 +233,17 @@
/>
重新生成
</view>
<view
class="item"
@click="ttsHandle(item)"
>
<image
:src="webUrl + '/aiChat/icon-04.png'"
class="icon"
mode="widthFix"
/>
播放
</view>
<view class="item item2" @click="copyMoreInfoHandle(item)">拷贝</view>
</view>
</view>
+7 -2
View File
@@ -146,11 +146,16 @@
"plugins" : {
"live-player-plugin" : {
"version" : "1.3.5",
//最新直播组件版本号
// 最新直播组件版本号
"provider" : "wx2b03c6e691cd7370"
},
"WechatSI" : {
"version" : "0.3.6",
// TTS版本号
"provider" : "wx069ba97219f66d99"
}
},
//直播appid
// 直播appid
"optimization" : {
"subPackages" : true
}
+1
View File
@@ -79,6 +79,7 @@
"miniapp-color-thief": "^1.0.5",
"number-precision": "^1.5.2",
"regenerator-runtime": "^0.12.1",
"remove-markdown": "^0.6.2",
"uview-ui": "2.0.36",
"vconsole": "^3.14.6",
"vue": "^2.6.11",