当前位置:网站首页>Mini Program-Voice broadcast function
Mini Program-Voice broadcast function
2022-08-10 14:53:00 【Yin qiu yi】
功能需求
Implemented by passing in“Voice copy is automatically broadcast”,如:“Test broadcast”,Voice broadcast automatically“Test broadcast”
方案
使用wx.playVoice播放语音文件
优点:使用简单,Play recorded audio files directly
缺点:Only recorded voice files can be played
Third-party voice services + wx.createInnerAudioContext
优点:功能强大,可定制,Can meet complex scenarios;
缺点:Server connection is required,付费
小程序插件 + wx.createInnerAudioContext
优点:简单快捷,适用于简单场景;
缺点:功能单一,无法定制,Uppercase English is not recognized,Some lowercase English pronunciations are inaccurate
Third-party voice platforms
语音平台
服务端
对接第三方平台,Give the converted voice data to the applet.
小程序
1.添加请求
wx.request({
url: 'https://xxxx.com',
data: { data: "The speech data to be synthesized"},
method: "get",
header: {
'content-type': 'application/json' // 默认值
},
dataType: "json",
success: function (res) {
const innerAudioContext = wx.createInnerAudioContext();
innerAudioContext.src = res.filename;
innerAudioContext.play();
}
})
微信插件
添加 微信同声传译插件:Configured on the WeChat public platform,找到设置–第三方设置–插件管理–点击添加插件
搜索 微信同声传译,点击添加
引入插件:在项目根目录app.json文件中配置
"plugins": {
// 引入插件
"WechatSI": { // 自定义的名字
"version": "0.3.5", // 引入插件的版本号
"provider": "wx069ba97219f66d99" // 引入插件的appID
}
}
使用
const plugin = requirePlugin('WechatSI');
onReady() {
this.innerAudioContext = wx.createInnerAudioContext();
const that = this;
plugin.textToSpeech({
// 调用插件的方法
lang: 'zh_CN',
content: 'Test the voice broadcast',
success: function (res) {
that.playAudio(res.filename);
}
});
},
playAudio(e) {
this.innerAudioContext.src = e;
this.innerAudioContext.play();
},
封装优化
const plugin = requirePlugin('WechatSI');
import { trim, isLetter } from '@/shared/index';
class PluginService {
innerAudioContext;
audioBroadcast(content: string): Promise<any> {
return new Promise((resolve, reject) => {
this.innerAudioContext = wx.createInnerAudioContext();
plugin.textToSpeech({
// 调用插件的方法
lang: 'zh_CN',
content,
success: res => {
this.playAudio(res.filename, resolve, reject);
},
fail: reject
});
});
}
playAudio(e, resolve, reject) {
this.innerAudioContext.src = e;
this.innerAudioContext.play();
this.innerAudioContext.onStop(() => {
console.log('[ onStop ] >');
resolve({
type: 'stop'
});
});
this.innerAudioContext.onEnded(() => {
//播放结束,销毁该实例
this.innerAudioContext.destroy();
console.log('[ onEnded ] >');
resolve({
type: 'end'
});
});
this.innerAudioContext.onError(error => {
console.log('[ onError ] >', error);
this.innerAudioContext.destroy();
reject(error);
});
}
stopAudio() {
this.innerAudioContext.stop();
this.innerAudioContext.destroy();
}
}
export default new PluginService();
在shared/indexMedium utility function:
// 去掉字符串中所有空格(包括中间空格,需要设置第2个参数为:true)
export function trim(str: string, isGlobal = true) {
if (!str) {
return str;
}
const result = str.replace(/(^\s+)|(\s+$)/g, '');
return isGlobal ? result.replace(/\s/g, '') : result;
}
// 判断是否为字母
export function isLetter(str) {
const reg = /^[A-Za-z]+$/;
return reg.test(str);
}
// Alphabet to Chinese
export function translateAlphabet(letters) {
if (!letters || !(letters.length > 0)) {
return letters;
}
let tLetters = '';
for (const key of letters) {
tLetters += alphabetComparison(key);
}
return trim(tLetters);
}
// Alphabet Chinese reading
export function alphabetComparison(letter) {
if (!letter || !isLetter(letter)) {
return letter;
}
const letterCase = letter.toUpperCase();
const letterMap = {
A: '诶',
B: 'b',
C: '西',
D: '帝',
E: '伊',
F: 'f',
G: 'g',
H: 'h',
I: 'i',
J: 'j',
K: 'k',
L: 'l',
M: 'm',
N: 'n',
O: '欧',
P: 'p',
Q: 'q',
R: 'r',
S: '爱死',
T: 't',
U: '优',
V: 'v',
W: 'w',
X: 'x',
Y: '歪',
Z: 'z'
};
return letterMap[letterCase];
}
在页面中使用
import { pluginService, translateAlphabet } from '@util';
import { formatCabinetNo, getCacheCabinet } from '@/shared/index';
Page({
...
onLoad(e) {
// Get order result type
this.autoPlay();
},
onUnload() {
pluginService.stopAudio();
},
// Polling to play multiple times
autoPlay(timerCount = 0, maxCount = 100) {
const { address, lockerName } = this.data;
console.log('timerCount:', timerCount);
if (timerCount > maxCount) {
return;
}
const tAddress = translateAlphabet(address);
console.log('[ translateAlphabet ] >', tAddress);
// 'Check the cabinet door number before storing,Don't save the wrong door'
const message = `Your cabinet door number is${tAddress}${lockerName},Please check the cabinet door number for storage,Don't save the wrong door`;
pluginService
.audioBroadcast(message)
.then(res => {
if (res.type !== 'stop') {
this.autoPlay(++timerCount);
}
console.log('audioBroadcast.complete', res);
})
.catch(err => {
console.log('[ audioBroadcast.err ] >', err);
this.autoPlay(timerCount);
});
}
});
注意:
Voice input quota:每个小程序250条/分钟,3w条/天. Text translation quota:每个小程序500次/分钟,10w次/天. Speech synthesis quota:每个小程序100次/分钟,2w次/天.
问题归档
在小程序onHide,onUnload函数里调用 stop方法无效;需要同时调用destroy方法
this.innerAudioContext.stop();
this.innerAudioContext.destroy();
After testing, it was found that uppercase English letters in Chinese could not be recognized,Some lowercase English letters are pronounced incorrectly
参考
The mobile terminal quickly accesses the voice broadcast WeChat Simultaneous Interpretation applet plugin —— 机器翻译、智能语音
关注我
利用空闲时间免费兼职(无门槛,长期有效),请联系我(PS:关注公众号后,点击“联系我”获取联系方式)~ 
边栏推荐
- 字节终面:CPU 是如何读写内存的?
- 使用mysq语句操作数据库
- 符合信创要求的堡垒机有哪些?支持哪些系统?
- Summary of Force Buckle Solution 640 - Solving Equations
- 【MindSpore易点通机器人-02】设计与技术选型
- 波士顿房价预测
- 等保2.0一个中心三重防护指的是什么?如何理解?
- PHP judges whether the file has content, and if there is no content, copy another file to write
- Steam教育在新时代中综合学习论
- 线上线下课程教学培训小程序开发制作功能介绍
猜你喜欢

SQL学习(基础)

Flask框架——MongoEngine使用MongoDB数据库

Unfinished mathematics test paper ----- test paper generator (Qt includes source code)

JS入门到精通完整版

产品使用说明书小程序开发制作说明

数学建模学习视频及资料集(2022.08.10)

机器学习总结(一)

IT小白怎么系统的php学习

fatal error C1083 Unable to open include file 'io.h' No such file

DB2查询2个时间段之间的所有月份,DB2查询2个时间段之间的所有日期
随机推荐
SWIG教程《二》
How to code like a pro in 2022 and avoid If-Else
等保2.0一个中心三重防护指的是什么?如何理解?
易观分析联合中小银行联盟发布海南数字经济指数,敬请期待!
data product manager
【MindSpore易点通机器人-02】设计与技术选型
leetcode 739. Daily Temperatures 每日温度(中等)
TestLink导出用例转换工具
使用决策树对鸢尾花进行分类
PHP judges whether the file has content, and if there is no content, copy another file to write
AWS Security Fundamentals
池化技术有多牛?来,告诉你阿里的Druid为啥如此牛逼!
Summary of tensorflow installation stepping on the pit
Existing in the rain of PFAS chemical poses a threat to the safety of drinking water
EVE模拟器的使用-带图超详细(学网络用)「建议收藏」
$‘\r‘: command not found
IT小白怎么系统的php学习
Azure IoT Partner Technology Empowerment Workshop: IoT Dev Hack
640. 求解方程 : 简单模拟题
vue 怎么清除tab 切换缓存问题 ?