目录
前言
现在很多产品都加入了智能化的特性,比如在进行搜索的时候不需要手敲键盘而是直接通过语音就可以搜索,这大大减少了用户操作的复杂性。这里我将搭建一个语音听写系统部署在服务器上,由于海外的服务器在国内访问会加大延迟率,国内服务器层出不穷,鉴于成本、操作、性能等方面,最终我选择了方便、快捷的天翼云弹性云主机进行部署。
一、服务器选择
对比国内天翼云和国外的亚马逊云服务器 EC2的一些特点,比如:登录注册、成本、部署速度等,进行分析
亚马逊云服务器 EC2 | 天翼云 | |
---|---|---|
成本 | 成本高,按小时计费,灵活但长期使用成本较高 ①T4g.nano 0.5核0.5G内存,约444元/年 ②C6i.xlarge(4核8G内存),约1.7万元/年 | 活动频繁,价格适中,国内部署高性价比① S3通用型云主机1核2G 免费试用一个月 ② S7通用型云主机2核4G 88元/年 |
注册 | 注册复杂,需绑定 VISA/信用卡,流程繁琐 | 手机号注册+实名认证 |
部署速度 | 控制台复杂,部署耗时10-20分钟,适合有经验用户 | 部署流程清晰,控制台友好,5分钟内完成部署 |
适用人群 | 适合跨境企业、科研团队 | 适合中小企业、政企单位、本地应用部署 |
二、搭建语音听写系统
主要技术:天翼云弹性主机+科大讯飞语音听写。
天翼云的弹性云主机的开通和使用非常便捷、高效,只需要指定CPU、内存、镜像等配置信息。可以像使用本地PC或物理服务器一样在云上使用弹性云主机,同时也可以按需随时调整弹性云主机的规格配置。
特别吸引我的还有一点就是可以按需选择弹性云主机计费方式,可选按量计费。
无需自建机房 | |
---|---|
无需自建机房 | 告别了繁琐的硬件设施采购和配置,节省了大量时间和资金 |
多样化选择 | 提供GPU云主机、x86和ARM架构的多种主机,满足不同工作负载的需求。 |
快速部署 | 分钟级交付让我能快速上线应用,缩短了开发和测试周期。 |
按需扩展 | 能够根据业务波动随时调整资源,避免了资源浪费和成本超支。 |
强大安全保障 | 内置安全组、ACL、权限控制等多重防护,确保了数据和应用的安全。 |
主动监控与运维 | 性能监控和运维支持,让云主机的稳定性和高效性得到了保障。 |
易用性 | 标准API接口提高了开发和运维的便利性,适应了不同的行业需求。 |
1、创建云主机
打开天翼云免费试用中心,选择个人认证的S3通用型云主机1核2G,点击立即试用
在弹出框中点击立即试用
随后就开通了云主机服务
在我的控制台中可以看到创建的主机信息,点击远程登录
即可连接服务器
它支持分钟级别批量创建,实例和带宽随时升降配,云盘可扩容,单实例可用性达 99.975%,多可用区多实例可用性达 99.995%,支持监控告警、漏洞修复、云盘加密,通过可信云认证、国标测评,单实例性能最高可达3000万PPS、100Gbps、100万IOPS。功能性和实用性非常强!
2、创建语音转写项目
下载科大讯飞官方语音转写demo
javascript
yarn creat vite 'project-name'
或者
npm init vite@latest 'project-name'

package.json配置项具体如下,我们需要安装一些依赖来支持语音识别demo适应vue3环境,不然会遇到很多问题:
javascript
"dependencies": {
"@originjs/vite-plugin-commonjs": "^1.0.3",
"@rollup/plugin-inject": "^5.0.3",
"ant-design-vue": "^3.2.15",
"jquery": "^3.6.2",
"vue": "^3.2.45",
"vue-router": "^4.1.6"
},
"devDependencies": {
"@types/node": "^18.11.17",
"@vitejs/plugin-vue": "^4.0.0",
"crypto-js": "4.0.0",
"typescript": "^4.9.3",
"unplugin-auto-import": "^0.12.1",
"vconsole": "^3.15.0",
"vite": "^4.0.0",
"vue-tsc": "^1.0.11"
}
在科大讯飞的js-demo中,并没有用到vue或者vite,我们实际开发时都会遇到let transWorker = new TransWorker()
代码报错,比如:
报错1:TypeError:TransWorker is not a constructor
报错2:Uncaught SyntaxError: The requested module '/src/until/transcode.worker.js?t=1671455993687' does not provide an export named 'default'
为什么会报错呢?
import TransWorker from 'js/transcode.worker.js
引入了webWorker文件,webWorker相当于js中的线程,在主线程中启动一个子线程不影响ui。
web worker 是运行在后台的 JavaScript,不会影响页面的性能。 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。
web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行
在iat_ws.js(本人自定义的文件)文件里面const transWorker = new TransWorker()
报错,原因是vue里面不能直接使用原生的new Worker,vite中有专门关于webworker的配置项,详细请前往
javascript
const worker = new Worker(new URL('./worker.js', import.meta.url))
所以需要将以下代码
javascript
import TransWorker from './until/transcode.worker.js'
let transWorker = new TransWorker()
改为如下
javascript
const transWorker = new Worker(new URL('./until/transcode.worker.js', import.meta.url))
并且transcode.worker.js文件需要修改为如下所示:
javascript
self.onmessage = function(e){
transAudioData.transcode(e.data)
}
let transAudioData = {
transcode(audioData) {
let output = transAudioData.to16kHz(audioData)
output = transAudioData.to16BitPCM(output)
output = Array.from(new Uint8Array(output.buffer))
self.postMessage(output)
},
to16kHz(audioData) {
var data = new Float32Array(audioData)
var fitCount = Math.round(data.length * (16000 / 44100))
var newData = new Float32Array(fitCount)
var springFactor = (data.length - 1) / (fitCount - 1)
newData[0] = data[0]
for (let i = 1; i < fitCount - 1; i++) {
var tmp = i * springFactor
var before = Math.floor(tmp).toFixed()
var after = Math.ceil(tmp).toFixed()
var atPoint = tmp - before
newData[i] = data[before] + (data[after] - data[before]) * atPoint
}
newData[fitCount - 1] = data[data.length - 1]
return newData
},
to16BitPCM(input) {
var dataLength = input.length * (16 / 8)
var dataBuffer = new ArrayBuffer(dataLength)
var dataView = new DataView(dataBuffer)
var offset = 0
for (var i = 0; i < input.length; i++, offset += 2) {
var s = Math.max(-1, Math.min(1, input[i]))
dataView.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true)
}
return dataView
},
}
3、部署
语音听写项目已经创建好之后,接下来就是部署了。
可以通过远程登录来进行操作,也可以通过其他客户端操作服务器。
(1)安装wget
javascript
yum install -y wget
(2)安装nginx
javascript
wget -c http://nginx.org/download/nginx-1.24.0.tar.gz
(3)安装nginx所需要的依赖包
javascript
yum install -y gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel
(4)解压安装包
javascript
tar -zxvf nginx-1.24.0.tar.gz
(5)执行配置脚本,--prefix是指定安装目录
javascript
#执行配置脚本 --prefix是指定安装目录
./configure --prefix=/usr/local/nginx
(6)对nginx编译和安装
javascript
#对nginx编译和安装
make & make install
(7)启动nginx
javascript
cd /usr/local/nginx/
ll
显示下图,那么nginx启动成功
(8)配置nginx
javascript
server {
listen 8070;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /root/dist/html;
index index.html index.htm;
}
}
(9)更改安全组
首先查看选用的是哪个安全组,
可以看到是default
安全组
(10)设置安全组
选择安全组规则配置
对defalut 安全组进行配置,点击"配置规则"
点击添加规则
,填写优先级、端口、源地址,随后点击确定
此时可以看到安全组添加成功
(11)打包项目
生成dist文件
javascript
yarn run build
(12)项目部署服务器
这里我将项目部署到服务器的/root路径下
(13)访问
浏览器地址输入http://ip:8070
,这里ip替换成你自己的
点击开始识别
到这里语音听写系统就完成了,整个过程让我体验感非常好,服务器创建到项目部署,流程简单,耗费了很短时间,真的很nice
三、数据安全无忧
此外,系统上线到服务器之后,必须要保证系统的安全性以及数据的安全性,这是非常重要的,然而天翼云拥有云灾备服务、DDoS防护以及等保护合规,将系统的安全性能大大提高,安全感十足。
1、云灾备服务
云灾备服务确保了我的数据在任何情况下都可以得到恢复。无论是因误删还是因病毒攻击导致的数据丢失,天翼云的自动备份功能都能够让我随时恢复到最近的正常状态,极大地减少了数据丢失的风险。
2、DDoS防护
此外,天翼云还提供了免费DDoS防护,有效抵御了外部恶意攻击,确保了我的实验数据和用户隐私的安全。
3、等保合规
天翼云通过全面的网络架构安全、边界防护、入侵防范、访问控制及安全审计等功能,确保了云环境的高安全性和合规性,有效防止外部攻击、数据泄露和非法访问,满足国内等保合规要求,提供了一个全方位的安全防护体系。
总结
在语音听写系统开发以及部署的过程中,整个过程没有昂贵的硬件开销,开发效率还非常高,并且通过灵活的资源管理和多重安全保障,让系统开发能够顺利进行,可以随时根据我的需求进行弹性扩展,不再担心计算资源不足带来的影响。更重要的是,天翼云的价格非常透明,能够根据实际使用情况按需付费,大大降低了成本,这点确实很吸引我。
对于还未体验过天翼云的新朋友,不必担心高门槛的技术难度或成本压力,它可以让你以极低的成本尝试其高性价比的服务,比如:VPN连接、镜像服务、一站式智算服务平台、S3通用型云主机1核2G等服务,有的首次体验可免费试用一个月,有的甚至有的服务可以长期使用。操作上也完全不用担心,10分钟开通教程让你可以轻松完成账户注册与云服务器配置,免去繁琐的步骤。