音频转文本

This commit is contained in:
zhonghua1
2026-01-05 21:45:37 +08:00
parent b4f38ebd34
commit 99d644d082

View File

@@ -83,7 +83,15 @@
</view>
<view class="audio-item-info">
<text class="audio-item-text" v-if="item.recordingText">{{ truncateText(item.recordingText, 30) }}</text>
<text class="audio-item-text audio-item-text--empty" v-else>暂无录音文本</text>
<view class="audio-item-transcribe" v-else>
<view
class="transcribe-btn"
:class="{ 'transcribe-btn--loading': transcribingIds.includes(item.id || item.segmentId) }"
@click.stop="transcribeAudio(item, index)">
<text v-if="!transcribingIds.includes(item.id || item.segmentId)">转文本</text>
<text v-else>处理中...</text>
</view>
</view>
</view>
<view class="audio-item-meta">
<text class="audio-meta-item" v-if="item.endTime">{{ formatDateTime(item.endTime) }}</text>
@@ -466,6 +474,7 @@
currentAudioUrl: null, // 当前音频URL用于清理Blob URL
showTextModal: false, // 是否显示文本内容弹框
currentRecordingText: '', // 当前显示的录音文本内容
transcribingIds: [], // 正在转文本的录音ID列表
customerList: [
{
name: '李女士',
@@ -1048,6 +1057,106 @@
});
}
},
// 转文本
async transcribeAudio(item, index) {
try {
// 获取录音ID可能是 id 或 segmentId
const audioId = item.id || item.segmentId;
if (!audioId) {
uni.showToast({
title: '无法获取录音ID',
icon: 'none'
});
return;
}
// 如果正在转文本,则不再处理
if (this.transcribingIds.includes(audioId)) {
return;
}
// 添加到转文本列表
this.transcribingIds.push(audioId);
// 调用转文本接口:/api/audioManagementSegments/transcribe/{id}
const url = getApiUrl(`/api/audioManagementSegments/transcribe/${audioId}`);
// 获取认证信息
let tenantId = '';
let token = '';
try {
tenantId = uni.getStorageSync('backend-tenant-id') || '';
token = uni.getStorageSync('backend-token') || '';
} catch (e) {
console.error('获取认证信息失败:', e);
}
// 构建请求头
const headers = {
'Content-Type': 'application/json'
};
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
if (tenantId) {
headers['X-Tenant-Id'] = tenantId;
}
const res = await uni.request({
url: url,
method: 'POST',
header: headers,
timeout: 30000 // 转文本可能需要较长时间
});
// 从转文本列表中移除
const idIndex = this.transcribingIds.indexOf(audioId);
if (idIndex > -1) {
this.transcribingIds.splice(idIndex, 1);
}
if (res.statusCode === 200 && res.data && res.data.success) {
uni.showToast({
title: res.data.message || '转文本请求已提交',
icon: 'success',
duration: 2000
});
// 如果返回了更新后的数据,更新列表中的该项
if (res.data.data) {
// 更新列表中的该项
this.$set(this.audioSegmentsList, index, {
...item,
...res.data.data
});
} else {
// 如果没有返回数据,可以刷新整个列表
// 或者等待用户手动刷新
// 这里先不自动刷新,因为转文本是后台处理
}
} else {
uni.showToast({
title: res.data?.message || '转文本请求失败',
icon: 'none',
duration: 2000
});
}
} catch (error) {
// 从转文本列表中移除
const audioId = item.id || item.segmentId;
const idIndex = this.transcribingIds.indexOf(audioId);
if (idIndex > -1) {
this.transcribingIds.splice(idIndex, 1);
}
console.error('转文本失败:', error);
uni.showToast({
title: `转文本失败: ${error.errMsg || error.message || '未知错误'}`,
icon: 'none',
duration: 2000
});
}
},
// 格式化时长(秒转换为时分秒)
formatDuration(seconds) {
if (!seconds) return '00:00:00';
@@ -3254,6 +3363,38 @@
font-style: italic;
}
.audio-item-transcribe {
display: flex;
align-items: center;
}
.transcribe-btn {
padding: 12rpx 24rpx;
background-color: #007AFF;
border-radius: 8rpx;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background-color 0.2s, opacity 0.2s;
}
.transcribe-btn:active {
background-color: #0056CC;
}
.transcribe-btn--loading {
opacity: 0.6;
background-color: #999;
cursor: not-allowed;
}
.transcribe-btn text {
font-size: 26rpx;
color: #FFFFFF;
font-weight: 500;
}
.audio-item-meta {
display: flex;
flex-wrap: nowrap;