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/

利用Meida Service的Java SDK来调用Azure Media Services的Index V2实现视频字幕自动识别的更多相关文章

  1. 利用Azure Media Services Explorer发布VOD视频

    1.连接Media Services账号, 填入Media Services的账号以及Account Key 如果使用中国的Azure的话,需要在Endpoint节上更改一下,因为国内的Azure的接 ...

  2. 【Azure Developer】使用Java SDK代码创建Azure VM (包含设置NSG,及添加数据磁盘SSD)

    在参考Azure官方文档进行VM创建时,发现其中没有包含如何设置NSG的内容,以及如何在创建时就添加数据磁盘的代码(设置磁盘为SSD类型).本文的内容以"使用 Java 创建和管理 Azur ...

  3. 利用回调实现Java的异步调用

    异步是指调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通知调用者,或通过回调函数处理这个调用. 回调简单地说就是B中有一个A,这样A在调用B的某个方法时实际上是调用到了自己的方法. 利 ...

  4. 手把手:使用service principal连接Azure Media Service

    在简书中查看,请点击我. 关于相关内容解释,请参考docs文档 https://docs.microsoft.com/en-us/azure/media-services/previous/media ...

  5. Android(java)学习笔记229:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)

    1.接口 接口可以隐藏代码内部的细节,只暴露程序员想暴露的方法 2.利用上面的思想优化之前的案例:服务(service)之绑定服务调用服务里面的方法,如下: (1)这里MainActivity.jav ...

  6. Android(java)学习笔记172:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)

    1. 接口 接口可以隐藏代码内部的细节,只暴露程序员想暴露的方法 2. 利用上面的思想优化之前的案例:服务(service)之绑定服务调用服务里面的方法,如下: (1)这里MainActivity.j ...

  7. 解决Java调用Azure SDK证书错误javax.net.ssl.SSLHandshakeException

    Azure作为微软的公有云平台,提供了非常丰富的SDK和API让开发人员可以非常方便的调用的各项服务,目前除了自家的.NET, Java, Python, nodeJS, Ruby,PHP等语言都提供 ...

  8. Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)

    当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...

  9. 解决 Java 调用 Azure SDK 证书错误 javax.net.ssl.SSLHandshakeException

    Azure 作为微软的公有云平台,提供了非常丰富的 SDK 和 API 让开发人员可以非常方便的调用的各项服务,目前除了自家的 .NET.Java.Python. nodeJS.Ruby,PHP 等语 ...

随机推荐

  1. ab压测参数说明

    ab是apache自带的压力测试工具,非常实用.ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也 ...

  2. Thinkpad X240修改bios引导方式

    来源:http://blog.csdn.net/jsship/article/details/19121149 修改笔记本的BIOS设置!这是非常重要的步骤之一.否则,你的U盘不能引导手提电脑进入PE ...

  3. POJ3318--Matrix Multiplication 随机化算法

    Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? In ...

  4. mvc 权限管理 demo

    http://blog.csdn.net/zht666/article/details/8529646 new http://www.cnblogs.com/fengxing/archive/2012 ...

  5. storm的数据源编程单元Spout学习整理

    Spout呢,是Topology中数据流的源头,也是Storm针对数据源的编程单元.一般数据的来源,是通过外部数据源来读取数据项(Tuple),并读取的数据项传输至作业的其他组件.编程人员一般可通过O ...

  6. AD9 笔记:

    1 丝印压焊盘违反规则:关闭规则中的Manufacturing(制造规则)分类 >>> Silkscreen Over Component Pads Clearence(丝印与焊盘间 ...

  7. jQuery图片延迟加载插件jQuery.lazyload

      插件描述:jQuery图片延迟加载插件jQuery.lazyload,使用延迟加载在可提高网页下载速度.在某些情况下,它也能帮助减轻服务器负载. 使用方法 引用jquery和jquery.lazy ...

  8. 播放wav聲音格式

    1. #import <AudioToolbox/AudioToolbox.h> 2.聲明 成員变量 SystemSoundID soundID; 3.播放 - (void)playSou ...

  9. PDF按模板出力,多个PDF合并

                 const string   TEMP_PREXFIX = "Temp_";                                       ...

  10. NAND FLASH均衡算法笔记(转)

    转来一篇关于NAND FLASH均衡算法的文章,加上一点思考和笔记,认为这种思考有助于更深刻的理解,更好的记忆,所以也算半原创了吧,最起码笔记是原创的.有意思的是,帖子提起这个算法并不是因为嵌入式开发 ...