获得语音识别管理器实例没有问题。 但所有的回调函数都没有成功调用,很奇怪,会是什么问题?
plugin = requirePlugin('WechatSI')
manager = plugin.getRecordRecognitionManager()
console.log('✅ 语音识别插件加载成功')
// 立即注册回调
manager.onStart((res) => {
console.log('✅ onStart 回调触发, res:', res)
if (pageInstance) {
pageInstance.setData({ status: 'recording' })
}
})
manager.onStop((res) => {
console.log('✅ onStop 回调触发, res:', res)
})
manager.onRecognize((res) => {
console.log('✅ onRecognize 回调触发, res:', res)
console.log(' 识别结果:', res.result)
if (pageInstance && res.result) {
pageInstance.setData({ recognizedText: res.result })
}
})
manager.onError((err) => {
console.log('❌ onError 回调触发, err:', err)
if (pageInstance) {
pageInstance.stopTimer()
wx.showToast({
title: '识别失败: ' + (err.errMsg || err.msg || '未知错误'),
icon: 'none'
})
pageInstance.setData({ status: 'wait' })
}
})
console.log('✅ 回调注册完成')

还是要靠自己解决,应该使用赋值形式 // --- 修改为赋值形式 --- manager.onStart = function(res) { console.log('✅ onStart 回调触发, res:', res) if (pageInstance) { pageInstance.setData({ status: 'recording' }) } }const poemsUtil = require('../../utils/poems')
const storage = require('../../utils/storage')
const compare = require('../../utils/compare')
// 全局变量保存页面实例
let pageInstance = null
// 尝试加载语音识别插件并注册回调
let plugin = null
let manager = null
try {
plugin = requirePlugin('WechatSI')
manager = plugin.getRecordRecognitionManager()
console.log('✅ 语音识别插件加载成功')
// 立即注册回调
manager.onStart((res) => {
console.log('✅ onStart 回调触发, res:', res)
if (pageInstance) {
pageInstance.setData({ status: 'recording' })
}
})
manager.onStop((res) => {
console.log('✅ onStop 回调触发, res:', res)
})
manager.onRecognize((res) => {
console.log('✅ onRecognize 回调触发, res:', res)
console.log(' 识别结果:', res.result)
if (pageInstance && res.result) {
pageInstance.setData({ recognizedText: res.result })
}
})
manager.onError((err) => {
console.log('❌ onError 回调触发, err:', err)
if (pageInstance) {
pageInstance.stopTimer()
wx.showToast({
title: '识别失败: ' + (err.errMsg || err.msg || '未知错误'),
icon: 'none'
})
pageInstance.setData({ status: 'wait' })
}
})
console.log('✅ 回调注册完成')
} catch (e) {
console.log('❌ 语音识别插件加载失败:', e)
manager = null
}
Page({
data: {
mode: 'random',
poems: [],
currentPoem: null,
currentIndex: 0,
status: 'wait',
recognizedText: '',
result: null,
timerText: '00:00',
showResultModal: false,
resultSummary: { correct: 0, wrong: 0, avgScore: 0 },
usePlugin: false
},
timer: null,
startTime: 0,
results: [],
onLoad(options) {
console.log('=== 页面加载 ===')
// 保存页面实例
pageInstance = this
this.setData({
mode: options.mode || 'random',
usePlugin: !!manager
})
console.log('usePlugin:', this.data.usePlugin)
console.log('manager:', !!manager)
if (this.data.mode === 'random') {
const wrongPoems = storage.getWrongPoems()
this.setData({ poems: poemsUtil.selectPoemsForRecite(5, wrongPoems) })
} else if (options.ids) {
const ids = options.ids.split(',').map(id => parseInt(id))
const allPoems = poemsUtil.getAllPoems()
this.setData({ poems: ids.map(id => allPoems.find(p => p.id === id)).filter(Boolean) })
}
if (this.data.poems.length > 0) {
this.setData({ currentPoem: this.data.poems[0] })
}
},
onUnload() {
pageInstance = null
this.stopTimer()
if (manager) manager.stop()
},
startTimer() {
const self = this
this.timer = setInterval(() => {
const elapsed = Math.floor((Date.now() - self.startTime) / 1000)
self.setData({
timerText: `${Math.floor(elapsed / 60).toString().padStart(2, '0')}:${(elapsed % 60).toString().padStart(2, '0')}`
})
}, 1000)
},
stopTimer() {
if (this.timer) {
clearInterval(this.timer)
this.timer = null
}
},
startRecite() {
console.log('=== 开始背诵 ===')
this.startTime = Date.now()
this.setData({ status: 'recording', recognizedText: '' })
this.startTimer()
if (manager) {
console.log('调用 manager.start()...')
const options = {
lang: 'zh_CN'
}
console.log('start 参数:', options)
manager.start(options)
console.log('manager.start() 调用完成')
} else {
console.log('❌ manager 不存在')
}
},
stopRecite() {
console.log('=== 停止背诵 ===')
console.log('当前 recognizedText:', this.data.recognizedText)
this.stopTimer()
if (manager) {
console.log('调用 manager.stop()')
manager.stop()
}
this.setData({ status: 'processing' })
setTimeout(() => this.processResult(), 1500)
},
processResult() {
const { currentPoem, recognizedText } = this.data
const duration = Math.floor((Date.now() - this.startTime) / 1000)
console.log('=== 处理结果 ===')
console.log('识别文本:', recognizedText)
console.log('正确答案:', currentPoem.content)
const result = compare.comparePoem(recognizedText, currentPoem.sentences)
console.log('得分:', result.score)
storage.addReciteRecord({
poemId: currentPoem.id,
score: result.score,
duration,
recognizedText
})
this.results.push({ poemId: currentPoem.id, score: result.score, isCorrect: result.isCorrect })
this.setData({ status: 'result', result })
},
retryCurrent() {
this.results.pop()
this.setData({ status: 'wait' })
},
nextPoem() {
const { currentIndex, poems } = this.data
if (currentIndex < poems.length - 1) {
this.setData({
currentIndex: currentIndex + 1,
currentPoem: poems[currentIndex + 1],
status: 'wait',
result: null,
recognizedText: ''
})
} else {
this.showFinalResult()
}
},
showFinalResult() {
const results = this.results
this.setData({
showResultModal: true,
resultSummary: {
correct: results.filter(r => r.isCorrect).length,
wrong: results.filter(r => !r.isCorrect).length,
avgScore: results.length > 0 ? Math.round(results.reduce((s, r) => s + r.score, 0) / results.length) : 0
}
})
},
closeModal() {
this.setData({ showResultModal: false })
this.results = []
this.setData({ currentIndex: 0, currentPoem: this.data.poems[0], status: 'wait', result: null })
},
goHome() {
wx.navigateBack()
}
})
日志:
=== 页面加载 ===
recite.js? [sm]:87 usePlugin: true
recite.js? [sm]:88 manager: true
recite.js? [sm]:128 === 开始背诵 ===
recite.js? [sm]:134 调用 manager.start()...
recite.js? [sm]:138 start 参数: {lang: "zh_CN"}
recite.js? [sm]:140 manager.start() 调用完成
recite.js? [sm]:147 === 停止背诵 ===
recite.js? [sm]:148 当前 recognizedText:
recite.js? [sm]:152 调用 manager.stop()
Tue Feb 24 2026 09:38:46 GMT+0800 (China Standard Time) Recording file format description
The recording file format on the developer tool is different from the mobile terminal's.It can only be played and debugged on the tool for the time being.It cannot be played directly or played on the client.
recite.js? [sm]:165 === 处理结果 ===
recite.js? [sm]:166 识别文本:
recite.js? [sm]:167 正确答案: 千里黄云白日曛,北风吹雁雪纷纷。莫愁前路无知己,天下谁人不识君。
recite.js? [sm]:170 得分: 0
日志中没有一个回调函数被调用。
环境:
问题类型 插件 AppID 插件版本号 AppID 操作系统 微信版本 基础库版本
Bug wx069ba97219f66d99 0.3.5 wx802a389bf9014627 iOS 8.0.69 3.14.2