起因

用Anki背单词,Android手机上面用AnkiHelp往AnkiDroid添加单词的时候,发音用的是有道的api

之前在PC/MacOS/Android三端都可以正常使用,正常发音。之后各端分别更新了几个版本之后,渐渐发音不好用了。发现只有保存了mp3附件的单词才能够正常发音。
当然首先我是去修改anki卡片,改了半天终于能够让PC端的Anki调用有道api发音了,但是到Android手机上面又不能发音了,手机上面还不好调试。又去官网看了看。
Anki官网Api


大意是说,Anki只是部分支持JavaScript,由于JavaScript太丰富了,Anki不保证现在能用JavaScript实现的功能,在未来Anki更新后还能继续使用,所以建议避免使用JavaScript。

So,PC能发音,Android不能发音大概就是这个锅了。既然用Mp3音频的能够正常发音,那就手动全都修改成Mp3的音频吧!

下载准备

  • 首先,有道的Api:

    api仅有两个参数,就是发音类型和单词,在audio=后面加上单词就ok了,type=0为美国发音,type=1为英国发音。

    例子,美音 king 发音(点击链接):
    http://dict.youdao.com/dictvoice?type=0&audio=king

    例子,英音 king 发音(点击链接):
    http://dict.youdao.com/dictvoice?type=1&audio=king

    由于主要语言用的是Java,就用参考了网上部分的代码,改了改。
    参考:
    https://blog.csdn.net/sinat_42483341/article/details/96342364
    https://blog.csdn.net/humanking7/article/details/88630856

  • 从Anki导出需要下载的单词列表


第三步:可以发现每一行的第一个单词就是我们需要的单词,后面都是不需要的内容。我们可以用正则表达式(匹配单词或者短语),筛选出我们要的单词。

^\b(\w+((\s\w+)+)?)\b

解释一下这个正则表达式:匹配字符串开头,单词开头,匹配字母数字无数个,单词结尾

Java代码

Application


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 爬取指定链接的一组MP3 文件** 放入指定的目录中** @author XuDong**/
public class Application {public static void main(String[] args) {System.out.println("请输入需要的单词发音类型:0-美式  1-英式");Scanner scanner = new Scanner(System.in);String targetType = scanner.next();if(targetType.equals("1") && targetType.equals("0")){System.out.println("您输入的是"+ targetType +",请输入0或1,不支持其他类型!");return;}//有道api  美式:type=0   英式:type=0String baseUrl = "http://dict.youdao.com/dictvoice?type=" + targetType + "&audio=";System.out.println("请输入单词txt地址,如: E:\\YouDaoDownload\\ankiword.txt");scanner = new Scanner(System.in);String targetWordTxt = scanner.next();File file = new File(targetWordTxt);if(!file.exists()){System.out.println(targetWordTxt + "\t 文件目录不存在,请重新确认!");return;}if(!file.getName().endsWith(".txt")){System.out.println(targetWordTxt + "\t 不是txt结尾,请重新确认");return;}//获取单词列表BufferedReader reader = null;String lineWord = null;int line =1;try {System.out.println("以行为单位读取文件内容,一次读一整行:");reader = new BufferedReader(new FileReader(file));while ((lineWord = reader.readLine()) != null) {System.out.print("Line"+ line);String word = "";//正则表达式  匹配每行的第一个单词String patt = "^\\b\\w*\\b";Pattern pattern = Pattern.compile(patt);Matcher matcher = pattern.matcher(lineWord);while (matcher.find()){word = matcher.group();//返回匹配的字符串}//匹配每行的单词if(word.equals("")){System.out.print("\t \t \t单词匹配失败");continue;}System.out.print("\t" + word);String wordUrl = baseUrl+ word;DownloadUtils downloadUtils  = new DownloadUtils(wordUrl, word, "mp3",file.getParent()+"\\words");try {downloadUtils.httpDownload();System.out.print("\t \t \t下载成功");} catch (Exception e) {System.out.print("\t \t \t下载失败");e.printStackTrace();}System.out.println();line ++ ;}reader.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{if(reader != null){try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}
}

DownloadUtils

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class DownloadUtils {// 目标链接字符串private String wordUrl;// 单词字符串private String wordString;// 目标文件的格式private String targetType;// 存放文件路径private File rootDir;public DownloadUtils(String wordUrl, String wordString, String targetType, File rootDir) {super();this.wordUrl = wordUrl;this.wordString = wordString;this.targetType = targetType;this.rootDir = rootDir;}public DownloadUtils(String wordUrl, String wordString, String targetType, String rootDir) {super();this.wordUrl = wordUrl;this.wordString = wordString;this.targetType = targetType;this.rootDir = new File(rootDir);}public DownloadUtils() {super();}/*** 开始下载** @throws Exception*/public void httpDownload() throws Exception {validate();final String urls = wordUrl;HttpURLConnection urlConnection;urlConnection = (HttpURLConnection) new URL(urls).openConnection();// 开启链接urlConnection.connect();InputStream inputStream = urlConnection.getInputStream();if(!rootDir.exists()){rootDir.mkdirs();}File temp = new File(rootDir,wordString + "." + targetType);//if (!temp.exists()) {temp.createNewFile();//}FileOutputStream fileOutputStream = new FileOutputStream(temp, true);int tem;while (-1 != (tem = inputStream.read())) {fileOutputStream.write(tem);fileOutputStream.flush();}fileOutputStream.close();inputStream.close();}private void validate() throws Exception {if (wordUrl == null || wordUrl.equals("")) {throw new Exception("下载路径不能为空!");}if (null == rootDir ) {throw new Exception("目标文件夹不存在!");}}}

运行


运行步骤

  1. 输入需要的发音类型
  2. 输入刚刚导出的txt文件地址

运行结果

单词与Anki匹配

参考:
https://blog.csdn.net/weixin_30933531/article/details/96396564

  1. 将下载的音频复制到:C:\Users\User\AppData\Roaming\Anki2\Anki用户名\collection.media

  2. 选中所有需要匹配的单词,进行查找替换

  3. 把有道的url替换成本地音频,分两步

  4. 先替换前面的,注意限定替换的字段,不勾选"以正则表达式"

  5. 替换后面的,用正则表达式 &type=\d ,试了半天发现这里面的查找居然是用的html的转义字符,不能直接用 & 查找。

  6. 再用正常的 & 替换一下,似乎字段里面有的是html标记的,有的就是正常的&,头大!

  7. 替换完成后,确保字段里面的内容在 C:\Users\XuDong\AppData\Roaming\Anki2\用户名\collection.media 中能够匹配。
    C:\Users\XuDong\AppData\Roaming\Anki2\用户名\collection.mediaps:沙拉查词导出的内容,选中想要的单词部分的正则是:

\d{13}.*?"<

最后试一下发音,完美!


懒人jar包

为了方便不会Java的人,这里附上一个可以直接使用的jar包

链接:https://pan.baidu.com/s/1_3Q2exgvDlcO3HgUzyB7ow
提取码:cpp1

懒人jar包使用方法

  1. Win+R ,打开cmd窗口

  2. 输入 java -jar (-jar后面需要一个空格),然后拖入jar包

  3. 选择发音

  4. 输入txt文本地址

Java批量下载有道单词发音+与Anki卡片整合相关推荐

  1. java批量下载多个文件并压缩

    java批量下载多个文件并压缩 本段代码的功能主要是实现通过文件主键,循环遍历下载各种格式的文件,下载后由java数据流处理压缩成一个zip格式的压缩包返回给前端页面. 后端实现控制层(Control ...

  2. java批量下载文件为zip包

    批量下载文件为zip包的工具类 package com.meeno.trainsys.util;import javax.servlet.http.HttpServletRequest; import ...

  3. Java批量下载并打成压缩包zip格式

    @ApiOperation("批量下载并打成压缩包zip格式")@Log(title = "批量下载并打成压缩包zip格式", businessType = B ...

  4. java批量下载生成zip压缩包

    设计思路: 1.本地先创建一个zip文件 2.将批量下载的文件依次放入zip文件中 3.将zip文件返回给前端 //一.本地先生成zip文件//要批量下载的文件id数组 String[] ids = ...

  5. java批量下载demo_Java批量入库Demo

    java中往数据库批量插入数据Demo java代码: //入库数据是需要批量入库的List int len =入库数据.size(); //每次循环10条 int incremnet = 10; / ...

  6. java批量下载demo_OBS JAVA SDK 实践8:批量下载文件(e.g 下载文件夹)

    1背景介绍& 效果展示 通过OBS JAVA SDK可以实现批量下载文件,如下载文件夹,效果如下. 注:有关标准存储.低频访问.归档存储三种存储类型的更多信息,参考链接:https://sup ...

  7. java批量下载为zip

    前言: 1.前端: 在这里插入代码片 2.后端 /** 批量下载为 zip **/ import org.apache.tools.zip.ZipEntry; import org.apache.to ...

  8. JAVA 批量下载文件

    最近项目有个需求,用户想对挂有附件的数据记录 实现一键下载全部附件(目前项目仅支持每次点击单条记录进行附件下载),下面记录我实现的解决方案. 项目框架基于SSM service业务实现层(impl): ...

  9. java 批量下载图片,批量打包文件并下载

    1.批量下载网页上,动态生成的图片到服务器上指定的目录中 2.将目录中的所有的图片打包成zip包 3.删除原来的目录 4.下载zip包 1:由于网页上的图片是全部都是连接动态生成的,所以同事在网上找了 ...

  10. 用Java批量下载人教网电子课本和教师用书

    手工下载人教网(www.pep.com.cn)的课本实在太麻烦,自己动手写了个批量下载小程序(java版), 一次下载一整本电子书,并且按顺序存放.代码需要 jsoup-1.7.2.jar 库支持, ...

最新文章

  1. 如何对phpcms v9的首页列表进行分页?
  2. SSM整合——Spring+SpringMVC+MyBatis整合
  3. android沉浸式 字体,全面解析android沉浸式状态栏
  4. openssl不是内部或外部命令_OpenSSL新架构蓝图
  5. 嵌套字典|python_Python | 如果不是,则使用嵌套,根据销售额计算折扣
  6. 外表加载oracle,opengauss外部表插件——oracle_fdw
  7. micro 和 macro F1 值 的区别?
  8. BeautifulSoup实现博文简介与过滤恶意标签(xxs攻击)
  9. Oracle基础查询
  10. 百度seo排名点击器app_手机端百度搜索排名seo优化_百度移动端整站关键词排名优化...
  11. Win 开机自动启动 WSL 服务
  12. 网页打开显示无法访问
  13. R语言入门——常用函数50个
  14. 业务复习-微信登录/第三方登录实现
  15. java后端处理Apple Pay流程
  16. 四川铺管家:拼多多产品布局怎么做
  17. 本地调试微信之内网穿透 ngrok/frp
  18. allegro等长规则设定中的Delta-Tolerance
  19. 大脑52分区功能及位置_位置功能
  20. 产品设计:《室内设计》

热门文章

  1. 《Git 教程 - 廖雪峰》
  2. 图书馆管理系统(数据库版)
  3. 软件定义 硬件驱动,云计算的Hybrid时代
  4. 深度学习入门_对ORL数据集进行特征提取降维后SVM分类
  5. 安卓 视频直播二:推流端代码
  6. js实现实时的时间显示
  7. 扫普通二维码打开小程序配置详情
  8. 中文手写输入法闪退问题
  9. 系统安全中主要风险有哪些,弱密码怎么解决?
  10. Illustrator CC从入门到精通 精装版-李发展-专题视频课程