完整的 OCR 字幕识别与翻译功能配置和使用指南。
OrangePlayer 支持识别视频画面中的硬字幕(嵌入在视频中的字幕),并使用 ML Kit 进行翻译。
适用场景:
- 视频中嵌入了硬字幕(无法关闭的字幕)
- 需要翻译外语硬字幕
- 学习外语时需要双语对照
- Android 5.0 (API 21) 或更高版本
- 至少 100MB 可用存储空间(用于语言包)
- 建议 2GB 以上内存
在 app/build.gradle 中添加:
dependencies {
// OCR 文字识别
implementation 'cz.adaptech.tesseract4android:tesseract4android:4.7.0'
// 文字翻译
implementation 'com.google.mlkit:translate:17.0.2'
}Tesseract OCR 需要语言包文件才能工作。语言包文件需要放在应用的 assets 目录或外部存储。
| 语言 | 文件 | 大小 | 下载地址 |
|---|---|---|---|
| 简体中文 | chi_sim.traineddata | 2.35 MB | 下载 |
| 繁体中文 | chi_tra.traineddata | 2.26 MB | 下载 |
| 英语 | eng.traineddata | 3.92 MB | 下载 |
| 日语 | jpn.traineddata | 2.36 MB | 下载 |
| 韩语 | kor.traineddata | 1.60 MB | 下载 |
| 法语 | fra.traineddata | 2.19 MB | 下载 |
| 德语 | deu.traineddata | 1.99 MB | 下载 |
| 西班牙语 | spa.traineddata | 2.18 MB | 下载 |
| 俄语 | rus.traineddata | 2.84 MB | 下载 |
| 阿拉伯语 | ara.traineddata | 1.87 MB | 下载 |
更多语言请访问:https://github.com/tesseract-ocr/tessdata
app/src/main/assets/
└── tessdata/
├── chi_sim.traineddata
├── eng.traineddata
└── jpn.traineddata
优点:
- 打包在 APK 中,无需下载
- 首次使用即可用
缺点:
- 增加 APK 体积
- 无法动态更新
/sdcard/Android/data/your.package/files/tessdata/
├── chi_sim.traineddata
├── eng.traineddata
└── jpn.traineddata
优点:
- 不增加 APK 体积
- 可按需下载
- 可动态更新
缺点:
- 首次使用需要下载
- 需要网络连接
import com.orange.playerlibrary.ocr.LanguagePackManager;
// 创建管理器
LanguagePackManager manager = new LanguagePackManager(context);
// 检查语言包是否已安装
if (manager.isLanguageInstalled("chi_sim")) {
// 已安装简体中文
startOcr();
} else {
// 下载语言包
downloadLanguagePack();
}
// 下载语言包
private void downloadLanguagePack() {
ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("下载语言包");
dialog.setMessage("正在下载简体中文语言包...");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMax(100);
dialog.show();
manager.downloadLanguage("chi_sim", new LanguagePackManager.DownloadCallback() {
@Override
public void onProgress(int progress, long downloaded, long total) {
dialog.setProgress(progress);
String text = String.format("下载中... %d%% (%s / %s)",
progress,
formatFileSize(downloaded),
formatFileSize(total));
dialog.setMessage(text);
}
@Override
public void onSuccess() {
dialog.dismiss();
Toast.makeText(MainActivity.this, "下载成功", Toast.LENGTH_SHORT).show();
startOcr();
}
@Override
public void onError(String error) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "下载失败:" + error, Toast.LENGTH_LONG).show();
}
});
}
// 格式化文件大小
private String formatFileSize(long bytes) {
if (bytes < 1024) return bytes + " B";
if (bytes < 1024 * 1024) return String.format("%.2f KB", bytes / 1024.0);
return String.format("%.2f MB", bytes / (1024.0 * 1024.0));
}List<String> installed = manager.getInstalledLanguages();
for (String langCode : installed) {
String displayName = LanguagePackManager.getLanguageDisplayName(langCode);
Log.d(TAG, "已安装:" + displayName + " (" + langCode + ")");
}new AlertDialog.Builder(this)
.setTitle("删除语言包")
.setMessage("确定要删除简体中文语言包吗?")
.setPositiveButton("删除", (dialog, which) -> {
if (manager.deleteLanguage("chi_sim")) {
Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "删除失败", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("取消", null)
.show();import com.orange.playerlibrary.ocr.OcrAvailabilityChecker;
if (OcrAvailabilityChecker.isOcrTranslateAvailable()) {
// OCR 功能可用
startOcrTranslate();
} else {
// 显示缺少的依赖
String message = OcrAvailabilityChecker.getMissingDependenciesMessage();
new AlertDialog.Builder(this)
.setTitle("OCR 功能不可用")
.setMessage(message)
.setPositiveButton("查看文档", (dialog, which) -> {
// 打开文档链接
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://github.com/706412584/orangeplayer/blob/main/docs/OCR_GUIDE.md"));
startActivity(intent);
})
.show();
}最简单的方式是通过播放器的 UI 启动 OCR:
// 用户操作流程:
// 1. 点击字幕按钮
// 2. 选择 "OCR 翻译字幕"
// 3. 设置识别区域(拖动调整)
// 4. 选择源语言和目标语言
// 5. 点击开始识别import com.orange.playerlibrary.VideoEventManager;
VideoEventManager eventManager = videoView.getVideoController().getVideoEventManager();
if (eventManager != null) {
// 检查语言包
LanguagePackManager manager = new LanguagePackManager(this);
if (!manager.isLanguageInstalled("chi_sim")) {
// 下载语言包
downloadLanguagePack();
} else {
// 启动 OCR
eventManager.startOcrTranslate();
}
}OCR 支持自定义识别区域,只识别画面中的特定部分:
// 通过 UI 设置(推荐)
// 用户可以拖动调整识别区域的位置和大小
// 或通过代码设置
// eventManager.setOcrRegion(left, top, right, bottom);// 源语言(视频字幕的语言)
String[] sourceLangs = {"简体中文", "英语", "日语", "韩语"};
String[] sourceCodes = {"chi_sim", "eng", "jpn", "kor"};
// 目标语言(翻译成的语言)
String[] targetLangs = {"简体中文", "英语", "日语", "韩语"};
String[] targetCodes = {"zh", "en", "ja", "ko"};
// 通过 UI 选择(推荐)
// 用户可以在设置界面选择源语言和目标语言- ✅ 硬字幕识别:识别嵌入在视频中的字幕
- ✅ 实时翻译:使用 ML Kit 翻译识别结果
- ✅ 区域选择:可自定义识别区域,提高准确率
- ✅ 多语言支持:支持中文、英语、日语、韩语等多种语言
- ✅ 离线识别:Tesseract OCR 支持离线识别
- ✅ 在线翻译:ML Kit 首次需要下载模型,之后可离线使用
⚠️ 性能影响:OCR 识别会占用较多 CPU 资源⚠️ 识别准确率:受字幕清晰度、字体、背景影响⚠️ 识别延迟:每次识别需要 0.5-2 秒⚠️ 内存占用:语言包会占用 50-100 MB 内存
影响识别准确率的因素:
- 字幕清晰度:模糊的字幕识别率低
- 字体大小:太小的字幕识别率低
- 背景干扰:复杂背景会降低识别率
- 字体类型:艺术字体识别率低
提高识别率的方法:
- 调整识别区域,只包含字幕部分
- 选择正确的源语言
- 暂停视频进行识别
- 使用高清视频源
OCR 识别会占用较多 CPU 资源,建议:
- 不要在低端设备上长时间使用
- 识别时降低视频分辨率
- 适当增加识别间隔
- 不需要时及时关闭 OCR
ML Kit 翻译功能首次使用时需要下载语言模型:
- 每个语言模型约 30-50 MB
- 需要网络连接
- 下载后可离线使用
- 模型会自动更新
语言包会占用存储空间:
- 每个 OCR 语言包:1-4 MB
- 每个翻译模型:30-50 MB
- 建议预留至少 100 MB 空间
原因: 缺少 Tesseract 或 ML Kit 依赖
解决方案:
dependencies {
implementation 'cz.adaptech.tesseract4android:tesseract4android:4.7.0'
implementation 'com.google.mlkit:translate:17.0.2'
}可能原因:
- 语言包未安装或损坏
- 识别区域设置不正确
- 字幕太小或太模糊
- 选择的源语言不正确
解决方案:
- 重新下载语言包
- 调整识别区域,只包含字幕
- 使用高清视频源
- 确认源语言设置正确
可能原因:
- 设备性能较低
- 识别区域太大
- 视频分辨率太高
解决方案:
- 缩小识别区域
- 降低视频分辨率
- 增加识别间隔
- 暂停视频进行识别
可能原因:
- 翻译模型未下载
- 网络连接失败
- 存储空间不足
解决方案:
- 检查网络连接
- 手动下载翻译模型
- 清理存储空间
- 查看 Logcat 日志
可能原因:
- 选择的语言包不正确
- 字幕编码问题
- 字体不支持
解决方案:
- 确认源语言设置正确
- 尝试其他语言包
- 检查字幕字体
如有问题或建议,欢迎联系:
- QQ: 706412584
- GitHub Issues: https://github.com/706412584/orangeplayer/issues