从bing必应翻译获取英文单词或短语的音频文件

目标

从翻译网站获取单词或者短语的音频文件。用于自己练习单词听力。

背景

  1. 之前从某度获取的音频文件,部分单词感觉不准确。比如build这个单词,开头的b音,听着像是d。找朋友盲测了一下,也是觉得开头听着像d。给官方反馈之后,没有下文。影响单词听力的练习。所以想寻找新的单词音频来源。
  2. 首先想到了某歌翻译,但我没有找到获取音频文件的方法。
  3. 随后找到了某路词典,但它有个缺点,就是只提供了单词的音频,词组没有音频文件。
  4. 最后找到了必应翻译。音频文件质量高,且能给出词组的音频。
  5. 我推测这些做搜索的公司,它们提供的音频文件,是通过人工智能生成的。所以能应对所有情况。只做词典的公司,就只能提供单词的音频了

具体过程

必应翻译网站https://cn.bing.com/translator?ref=TThis&text=&from=en&to=zh-Hans


经过分析,音频文件是图中箭头所示的http请求获取的。但是查看预览,结果是下图这样。

之前没有见过这种情况。心想如果是mp3文件,预览的时候应该是文件的样子,但现在浏览器好像把文件流以文本形式展示出来了。没办法,只能硬着头皮试试了

于是打开Apifox,先看看在理论上能否成功把http模拟出来。

经过很长时间的调整测试,终于获得了预期结果。


下载之后试听,发现正是单词的音频文件。

接下来就要解决如何用代码批量获取的问题了。

点击查看代码
// 单词表开始单词与结束单词id,包含数字本身的id
let wordIdBetween = [1, 2198]
async function getVoice() {
    const res = await DuolingoWord1Info.findAll({
        attributes: ['id', 'name'],
        where: {
            id: {
                [Op.between]: wordIdBetween,
            }
        },
        raw: true
    });

    for (let i = 0; i < res.length; i++) {
        const item = res[i];
        const word1 = item.name.replace(/[ ]/g, '+')
        console.log(word1);

        var data = qs.stringify({
            'ssml': '<speak version=\'1.0\' xml:lang=\'en-US\'><voice xml:lang=\'en-US\' xml:gender=\'Female\' name=\'en-US-AriaNeural\'><prosody rate=\'-20.00%\'>' + item.name + '</prosody></voice></speak>',
            'token': 'mHIrzfqjATeMKgpwo_xbFJhIXK87LsTe',
            'key': '1696336869571'
        });
        var config = {
            responseType: 'stream',
            headers: {
                'Referer': 'https://cn.bing.com/translator?ref=TThis&text=&from=en&to=zh-Hans',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
                'Cookie': 'MUID=1DA0463E596F6B2E378F550358EB6AFF;SRCHD=AF:NOFORM;SRCHUID=V:2&GUID:2EF6E4AD64684C9892118B898CA8CE3A&dmnchg:1;SUID=M;MUIDB=1DA0463E596F6B2E378F550358EB6AFF;_EDGE_S=SID:364449479CF46B6625E75AD89D926A5D;_SS=SID:364449479CF46B6625E75AD89D926A5D;_tarLang=default:zh-Hans;_TTSS_IN=hist:WyJlbiIsImF1dG8tZGV0ZWN0Il0:&isADRU:0;_TTSS_OUT=hist:WyJ6aC1IYW5zIl0:;SRCHUSR=DOB:20230708&T:1696317715000&TPC:1696317715000;SRCHHPGUSR=SRCHLANG:zh-Hans&PV:10.0.0;ipv6=hit:1696321317382&t:4;btstkn=%252FmHctaWzg03urSdAan33ICNlponDE6tHTWzk6TJGjgcjQSKSPczfQfTkx0GZh55%252Fl%252BDraoon%252FfyiqVUIDn%252FWU2Uodzgkii%252F8Ir2mWpd5CYg%253D; SUID=M; MUID=25DC48BA752769C309635B257409685B; MUIDB=1DA0463E596F6B2E378F550358EB6AFF; _EDGE_S=SID:364449479CF46B6625E75AD89D926A5D&SID=16308431DC9C6E24132F97AEDDB26F2F; _EDGE_V=1; SRCHD=AF=NOFORM; SRCHUID=V=2&GUID=2CCC60CD17AA48C0B85B7B786A5D8682&dmnchg=1; SRCHUSR=DOB=20231003; SRCHHPGUSR=SRCHLANG=zh-Hans; _SS=SID=16308431DC9C6E24132F97AEDDB26F2F; btstkn=%252FmHctaWzg03urSdAan33ICNlponDE6tHTWzk6TJGjgcadR%252FLxO%252BbimWC8iNxREKUi0OL7iAitkvGgUW5BOCGWOK7NNuZRFUGBZmKYMWynMo%253D',
                'Accept': '*/*',
                'Host': 'cn.bing.com',
                'Connection': 'keep-alive',
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        };
        const response1 = await utils.post('https://cn.bing.com/tfettts?isVertical=1&IG=2228EE69BBA64E389A51DBD99168FB74&IID=translator.5024.3', data, config)
        response1.data.pipe(fs.createWriteStream('D:\\workspace\\nodeTest\\voice2\\en\\' + `${item.name}.mp3`));
        await utils.sleep(1000)
    }
}

60行,item.name修改为单词的字母拼写。
61-62行,token和key,可以从下图所示的http请求中获取。有效时间大概10分钟。
image

至于保存路径、文件名等其他问题,大家自行设置即可。

posted @ 2023-10-04 14:08  长空5  阅读(167)  评论(0编辑  收藏  举报