当前位置:网站首页>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:关注公众号后,点击“联系我”获取联系方式)~
边栏推荐
- 自定义picker滚动选择器样式
- DB2查询2个时间段之间的所有月份,DB2查询2个时间段之间的所有日期
- 王学岗————直播推流(软便)03x264集成与camera推流
- pm2之静态文件服务
- In the second half of 2012 system architecture designers afternoon paper II
- fatal error C1083 Unable to open include file 'io.h' No such file
- Azure IoT Partner Technology Empowerment Workshop: IoT Dev Hack
- 解读STEAM教育中的表现性评价
- 无线网络、HTTP缓存、IPv6
- 使用Uiautomator2进行APP自动化测试
猜你喜欢
Azure IoT Partner Technology Empowerment Workshop: IoT Dev Hack
MySQL Principle and Optimization: Update Optimization
SWIG教程《一》
Send a post request at the front desk can't get the data
易观分析联合中小银行联盟发布海南数字经济指数,敬请期待!
正则表达式(包含各种括号,echo,正则三剑客以及各种正则工具)
写不完的数学试卷-----试卷生成器(Qt含源码)
Appium进行APP自动化测试
富爸爸穷爸爸之读书笔记
Lack of comparators, op amps come to the rescue!(Op amp is recorded as a comparator circuit)
随机推荐
每个月工资表在数据库如何存储?求一个设计思路
IT小白怎么系统的php学习
面试面到了一个腾讯30k出来的,有见识到何为精通MySQL调优
【剑指offer】---数组中的重复数字
Summary of Force Buckle Solution 640 - Solving Equations
快速了解大端模式和小端模式
写不完的数学试卷-----试卷生成器(Qt含源码)
Pagoda panel open Redis to specify the network machine
从洞察到决策,一文解读标签画像体系建设方法论
网络安全(加密技术、数字签名、证书)
@RequestBody的使用[通俗易懂]
静态变量存储在哪个区
易观分析联合中小银行联盟发布海南数字经济指数,敬请期待!
力扣解法汇总640-求解方程
关于已拦截跨源请求CORS 头缺少 ‘Access-Control-Allow-Origin‘问题解决
1W字详解线程本地存储 ThreadLocal
字节终面:CPU 是如何读写内存的?
TestLink导出用例转换工具
BFT机器人带你走进智慧生活 ——探索遨博机器人i系列的多种应用
串口服务器调试助手使用教程,串口调试助手使用教程【操作方式】