电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

vue + node如何通過(guò)一個(gè)Txt文件批量生成MP3并壓縮成Zip

瀏覽:26日期:2023-01-16 16:41:31

看看效果叭

vue + node如何通過(guò)一個(gè)Txt文件批量生成MP3并壓縮成Zip

解壓的文件

vue + node如何通過(guò)一個(gè)Txt文件批量生成MP3并壓縮成Zip

上傳的文件格式

測(cè)試1|||測(cè)試1的文字測(cè)試2|||測(cè)試2的文字測(cè)試3|||測(cè)試3的文字測(cè)試4|||測(cè)試4的文字測(cè)試5|||測(cè)試5的文字

實(shí)現(xiàn)的邏輯如下

上傳文件 解析txt 發(fā)送內(nèi)容至百度語(yǔ)音合成 生成文件夾放置本次合成的mp3文件,并壓縮成zip 發(fā)送zip的地址給前端

使用了 element-ui 的 el-upload 組件

<el-upload v-loading='loading' drag ref='upload' action='#' accept='.txt' :before-upload='onBeforeUploadImage' :http-request='UploadImage' :on-change='fileChange' :file-list='fileList' > <i class='el-icon-upload'></i> <div class='el-upload__text'> 將文件拖到此處,或 <em>點(diǎn)擊上傳</em> </div> <div slot='tip'>只能上傳txt文件,且不超過(guò)1M</div></el-upload>

在上傳之前判斷上傳的文件是否符合要求

onBeforeUploadImage(file) { const isTxt = file.type === 'text/plain'; const isLt1M = file.size / 1024 / 1024 < 1; if (!isTxt) { this.$message.error('上傳文件只能是txt格式!'); } if (!isLt1M) { this.$message.error('上傳文件大小不能超過(guò) 1MB!'); } return isTxt && isLt1M;}

一次只上傳一個(gè)文件,在文件列表更新時(shí)先清除之前的文件

fileChange(file) { let obj = this.onBeforeUploadImage(file.raw); if (obj) { this.$refs.upload.clearFiles(); this.fileList = [{ name: file.name, url: file.url }]; }}

上傳的主要函數(shù)

UploadImage(param) { this.loading = true; const formData = new FormData(); formData.append('file', param.file); this.$axios({ url: process.env.VUE_APP_BASE_API + 'api/txtToMp3', method: 'post', data: formData }) .then(response => { if (response.data.code == 0) { this.loading = false; this.dialogVisible = true; this.url = response.data.data.url; } }) .catch(error => { console.log(error); });}

node代碼

用到的依賴項(xiàng)

const formidable = require('formidable'); //獲取上傳的txt,并保存const path = require('path'); const AipSpeech = require('baidu-aip-sdk').speech; //百度語(yǔ)音合成sdkconst fs = require('fs'); const compressing = require('compressing'); //壓縮文件夾用

接口代碼

router.post('/txtToMp3', async function (req, res, next) { let form = new formidable.IncomingForm(); form.encoding = 'utf-8'; //編碼 form.uploadDir = path.join(__dirname + '/../txt'); //保存上傳文件地址 form.keepExtensions = true; //保留后綴 form.parse(req, function (err, fields, files) { let filename; filename = files.file.name; let nameArray = filename.split('.'); //分割 let type = nameArray[nameArray.length - 1]; let name = ''; for (let i = 0; i < nameArray.length - 1; i++) { name = name + nameArray[i]; } let date = new Date(); let time = '_' + date.getTime(); let avatarName = name + time + '.' + type; let newPath = form.uploadDir + '/' + avatarName; fs.renameSync(files.file.path, newPath); //移動(dòng)文件 fs.readFile(newPath, 'utf-8', function (err, data) { if (err) { console.log(err); new Result(null, '讀取失敗').fail(res); } else { let client = new AipSpeech( 0, '百度語(yǔ)音合成key', '百度語(yǔ)音合成secret' ); let resultData = data.split('n'); let number = resultData.length; let formTime = new Date().getTime(); let mp3FileDir = path.join(__dirname + '/../mp3_' + formTime); fs.mkdirSync(mp3FileDir); for (let i in resultData) { setTimeout(function(){if (resultData[i].indexOf('|||') != -1) {let text = resultData[i].split('|||')[1];// 語(yǔ)音合成,保存到本地文件client.text2audio(text, { spd: 4, per: 4 }).then( function (result) { if (result.data) { let time = resultData[i].split('|||')[0] + '_voice'; let avatarName_mp3 = mp3FileDir + '/' + time + '.mp3'; fs.writeFileSync(avatarName_mp3, result.data); number--; if (number == 0) { let zipFileName = 'zip/mp3_' + formTime + '.zip'; compressing.zip .compressDir(mp3FileDir, zipFileName) .then(() => { let item = { url: zipFileName, }; new Result(item, '壓縮成功').success(res); }) .catch((err) => { new Result(null, '壓縮失敗').fail(res); }); } } else { // 合成服務(wù)發(fā)生錯(cuò)誤 new Result(null, '合成失敗').fail(res); } }, function (err) { console.log(err); }); } else {new Result(null, '文件格式錯(cuò)誤').fail(res); }},i * 20) } } }); });});

PS:

在node部分,在判斷需要合成的文件是否全部完成時(shí),我是通過(guò)number的值等于0判斷完成,不知道大佬們有啥好方法不?

到此這篇關(guān)于vue + node如何通過(guò)一個(gè)Txt文件批量生成MP3并壓縮成Zip的文章就介紹到這了,更多相關(guān)vue node批量生成MP3內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 福兰德PVC地板|PVC塑胶地板|PVC运动地板|PVC商用地板-中国弹性地板系统专业解决方案领先供应商! 福建成考网-福建成人高考网 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 科客,主见不成见| 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 诗词大全-古诗名句 - 古诗词赏析| 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 杭州ROHS检测仪-XRF测试仪价格-百科 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 顶呱呱交易平台-行业领先的公司资产交易服务平台 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 微动开关厂家-东莞市德沃电子科技有限公司 | 博莱特空压机|博莱特-阿特拉斯独资空压机品牌核心代理商 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 转子泵_凸轮泵_凸轮转子泵厂家-青岛罗德通用机械设备有限公司 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 南京租车,南京汽车租赁,南京包车,南京会议租车-南京七熹租车 | 动力配电箱-不锈钢配电箱-高压开关柜-重庆宇轩机电设备有限公司 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 新疆散热器,新疆暖气片,新疆电锅炉,光耀暖通公司 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 中细软知识产权_专业知识产权解决方案提供商 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | EPDM密封胶条-EPDM密封垫片-EPDM生产厂家 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 奥运星-汽车性能网评-提供个性化汽车资讯 | 耐驰泵阀管件制造-耐驰泵阀科技(天津)有限公司 | 免费B2B信息推广发布平台 - 推发网 | wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 |