设为首页 收藏本站
查看: 1424|回复: 0

[经验分享] 利用Meida Service的Java SDK来调用Azure Media Services的Index V2实现视频字幕自动识别

[复制链接]

尚未签到

发表于 2017-6-30 07:34:55 | 显示全部楼层 |阅读模式
  Azure Media Services新的Index V2 支持自动将视频文件中的语音自动识别成字幕文件WebVtt,非常方便的就可以跟Azure Media Player集成,将一个原来没字幕的视频文件自动配上一个对应语言的字幕。而且强大的语音识别功能支持识别多国语言包括:


  • English [EnUs]
  • Spanish [EsEs]
  • Chinese [ZhCn]
  • French [FrFr]
  • German [DeDe]
  • Italian [ItIt]
  • Portuguese [PtBr]
  • Arabic (Egyptian) [ArEg]
  从上面列表我们可以看到这个Index  V2是支持中文的识别,如果公司里已经存在了大量演讲或者课程视频但是又没有配上字幕的话,Media Services的Index V2功能,能够很好的帮上忙。
  下面我们试试用Java的代码来调用Media Services的这个功能:
  引用Media Service的相关SDK,我们需要在pom.xml增加几个dependency



<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure</artifactId>
<version>1.0.0-beta2</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-media</artifactId>
<version>0.9.4</version>
</dependency>
  首先我们准备好访问Media Service的基本资料,譬如账号和登录的Key



// Media Services account credentials configuration
private static String mediaServiceUri = "https://media.windows.net/API/";
private static String oAuthUri = "https://wamsprodglobal001acs.accesscontrol.windows.net/v2/OAuth2-13";
private static String clientId = "wingsample";
private static String clientSecret = "p8BDkk+kLYZzpnvP0B5KFy98uLTv7ALGuSX7F9LmHtk=";
private static String scope = "urn:WindowsAzureMediaServices";
  然后就是创建一个访问Media Service的Context



public static MediaContract getMediaService(){
Configuration configuration = MediaConfiguration.configureWithOAuthAuthentication(
mediaServiceUri, oAuthUri, clientId, clientSecret, scope);
MediaContract  mediaService = MediaService.create(configuration);
return mediaService;
}
  为了能够调用一个processor来执行index,我们需要一个获取处理起的方法:



public static MediaProcessorInfo getLatestProcessorByName(MediaContract mediaService,String processname){
ListResult<MediaProcessorInfo> mediaProcessors;
try {
mediaProcessors = mediaService
.list(MediaProcessor.list().set("$filter", String.format("Name eq '%s'", processname)));
// Use the latest version of the Media Processor
MediaProcessorInfo mediaProcessor = null;
for (MediaProcessorInfo info : mediaProcessors) {
if (null == mediaProcessor || info.getVersion().compareTo(mediaProcessor.getVersion()) > 0) {
mediaProcessor = info;
return mediaProcessor;
}
}
} catch (ServiceException e) {
// TODO Auto-generated catch block
            ;e.printStackTrace();
}
return null;
}
  当然我们好需要根据Asset的Id来获取到某个具体的Asset来进行处理



public static AssetInfo getAssetById(MediaContract mediaService,String assetName) throws ServiceException
{
AssetInfo    resultAsset = mediaService.get(Asset.get(assetName));
return resultAsset;
}
  有了AssetInfo,processor,和mediaserivce的Context,我们就可以执行Index V2



public static String index2(MediaContract mediaService,AssetInfo assetInfo)
{
try
{
logger.info("start index2: " + assetInfo.getName());
String config = "{"+
"\"version\":\"1.0\","+
"\"Features\":"+
"["+
"{"+
"\"Options\": {"+
"    \"Formats\":[\"WebVtt\",\"ttml\"],"+
"\"Language\":\"enUs\","+
"\"Type\":\"RecoOptions\""+
"},"+
"\"Type\":\"SpReco\""+
"}]"+
"}";
String taskXml = "<taskBody><inputAsset>JobInputAsset(0)</inputAsset>"
+ "<outputAsset assetCreationOptions=\"0\"" // AssetCreationOptions.None
+ " assetName=\"" + assetInfo.getName()+"index 2" + "\">JobOutputAsset(0)</outputAsset></taskBody>";
System.out.println("config: " + config);
MediaProcessorInfo indexerMP =
getLatestProcessorByName(mediaService,"Azure Media Indexer 2 Preview");
// Create a task with the Indexer Media Processor
Task.CreateBatchOperation task =
Task.create(indexerMP.getId(), taskXml)
.setConfiguration(config)
.setName(assetInfo.getName() + "_Indexing");
Job.Creator jobCreator = Job.create()
.setName(assetInfo.getName() + "_Indexing")
.addInputMediaAsset(assetInfo.getId())
.setPriority(2)
.addTaskCreator(task);
final JobInfo jobInfo;
final String jobId;
synchronized (mediaService)
{
jobInfo = mediaService.create(jobCreator);
jobId = jobInfo.getId();
}
//     checkJobStatus(jobId, assetInfo.getName());
return jobId;//downloadAssetFilesFromJob(jobInfo);
            }
catch (Exception e)
{
logger.error("Exception occured while running indexing job: "
+ e.getMessage());
}
return "";
}
  这些方法都写好了,我们就可以直接在Main函数里面执行它了



public static void main( String[] args )
{
try {
MediaContract mediaService=getMediaService();
AssetInfo asset;
asset = getAssetById(mediaService,"nb:cid:UUID:13144339-d09b-4e6f-a86b-3113a64dbabe");
String result=index2(mediaService,asset);
System.out.println( "Job:"+result );
} catch (ServiceException e) {
// TODO Auto-generated catch block
        e.printStackTrace();
}
}
  从Index2这个函数里面我们有两个东西是很重要的。一个是json格式preset结构,我们如果需要更改识别语言,生成的格式的话,只需要对这个Json文件进行更改就好了。



{
"version":"1.0",
"Features":
[
{
"Options": {
"Formats":["WebVtt","ttml"],
"Language":"enUs",
"Type":"RecoOptions"
},
"Type":"SpReco"
}]
}
  一个是Task的描述XML,这个XML是用来描述这个任务是处理那个Asset,处理完放到那个Asset里面。基本上跟Media Service相关的各种编码,识别都需要这个task的xml配合对应的preset文件来处理的。



<?xml version="1.0" encoding="utf-16"?>
<taskBody>
<inputAsset>JobInputAsset(0)</inputAsset>
<outputAsset assetCreationOptions="0" assetName="ep48_mid.mp4index 2">JobOutputAsset(0)</outputAsset>
</taskBody>
  Media Service的识别分析服务非常强大,它还包含了移动侦测、人脸识别、表情识别等等。
  https://azure.microsoft.com/zh-cn/documentation/articles/media-services-analytics-overview/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389546-1-1.html 上篇帖子: Automation监控Azure PaaS心跳 下篇帖子: Azure存储上传下载(断点续传)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表