NO IMAGE

1.百度ai官網,下載sdk包,連線:http://ai.baidu.com/docs#/ASR-Online-Java-SDK/top

2.官網有demo,可以參考,下面是在下的util類,
import org.apache.log4j.Logger;
import org.json.JSONObject;

import com.baidu.aip.speech.AipSpeech;
import com.baidu.aip.util.Util;

public class BaiduAipUtils {

protected static Logger logger = Logger.getLogger(BaiduAipUtils.class);

//設定APPID/AK/SK
    public static final String APP_ID = “”;
    public static final String API_KEY = “”;
    public static final String SECRET_KEY = “”;

    
    public static String getBaiduAipResult(String saveUrt,String type){
    logger.info(“百度aip————->BaiduAipUtils:url=” saveUrt);
    // 初始化一個FaceClient
        AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);

        // 可選:設定網路連線引數
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);
       
        if(type == null)
        type = “wav”;
        
        if(saveUrt == null)
        return null;
 
        JSONObject res = client.asr(saveUrt, type, 16000, null);
        String works = “”;
        if(“0”.equals(res.get(“err_no”).toString()) && “success.”.equals(res.get(“err_msg”).toString())){
        works = res.getJSONArray(“result”).getString(0);
        }
        logger.info(res.toString(2));
        logger.info(works);
        return works;
   
    }
    /**
     * @param client
     * @throws Throwable
     */
    
    public void synthesis(AipSpeech client) throws Throwable
    {
        // 對本地語音檔案進行識別
        String path = “D:\\code\\java-sdk\\speech_sdk\\src\\test\\resources\\16k_test.pcm”;
        JSONObject asrRes = client.asr(path, “pcm”, 16000, null);
        System.out.println(asrRes);

        // 對語音二進位制資料進行識別
        byte[] data = Util.readFileByBytes(path);     //readFileByBytes僅為獲取二進位制資料示例
        JSONObject asrRes2 = client.asr(data, “pcm”, 16000, null);
        System.out.println(asrRes);

        // 對網路上音訊進行識別
        String url = “http://somehost/res/16k_test.pcm”;
        String callback = “http://callbackhost/aip/dump”;
        JSONObject res = client.asr(url, callback, “pcm”, 16000, null);
        System.out.println(res);
    }

}

3.視訊轉碼外掛 ffmpeg

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FFMpegUtil implements IStringGetter {

private int runtime = 0;

private String ffmpegUri;//ffmpeg的全路徑 如e:/ffmpeg/ffmpeg.exe 或 /root/ffmpeg/bin/ffmpeg

private String originFileUri; // 視訊原始檔地址

private enum FFMpegUtilStatus {
Empty, CheckingFile, GettingRuntime
};

private FFMpegUtilStatus status = FFMpegUtilStatus.Empty;

/**
*  執行命令組合
*/
private List<String> cmd = new ArrayList<String>();

/**
* 建構函式

* @param ffmpegUri
*            ffmpeg的全路徑 如e:/ffmpeg/ffmpeg.exe 或 /root/ffmpeg/bin/ffmpeg
* @param originFileUri
*            所操作視訊檔案的全路徑 如e:/upload/temp/test.wmv
*/
public FFMpegUtil(String ffmpegUri,String originFileUri) {
this.ffmpegUri = ffmpegUri;
this.originFileUri = originFileUri;
}

/**
* 獲取視訊時長

* @return
*/
public int getRuntime() {
runtime = 0;
status = FFMpegUtilStatus.GettingRuntime;
cmd.clear();
cmd.add(ffmpegUri);
cmd.add(“-i”);
cmd.add(originFileUri);
CmdExecuter.exec(cmd, this);
return runtime;
}

/**
* 檢測檔案是否是支援的格式 將檢測視訊檔案本身,而不是副檔名

* @return
*/
public boolean isSupported() {
isSupported = true;
status = FFMpegUtilStatus.CheckingFile;
cmd.clear();
cmd.add(ffmpegUri);
cmd.add(“-i”);
cmd.add(originFileUri);
CmdExecuter.exec(cmd, this);
return isSupported;
}

private boolean isSupported;

/**
* 生成視訊截圖

* @param imageSavePath
*            截圖檔案儲存全路徑
* @param screenSize
*            截圖大小 如640×480
*/
public void makeScreenCut(String imageSavePath) {
cmd.clear();
cmd.add(ffmpegUri);
cmd.add(“-i”);//設定輸入流
cmd.add(originFileUri);
cmd.add(“-q:v”);//質量為基礎的VBR
cmd.add(“2”);
cmd.add(“-y”);//覆蓋輸出檔案
cmd.add(“-f”);//設定輸出格式
cmd.add(“image2”);//格式
//cmd.add(“-ss”);//開始時間
//cmd.add(“8”);
//cmd.add(“-t”);//設定紀錄時間
//cmd.add(“0.001”);
//cmd.add(“-s”);//設定畫面的寬與高
//cmd.add(screenSize);//暫時不要截圖大小
cmd.add(imageSavePath);
CmdExecuter.exec(cmd, null);
}

/**
* 視訊轉換

* @param fileSavePath
*            檔案儲存全路徑(包括副檔名)如 e:/abc/test.flv
* @param screenSize
*            視訊解析度 如640×480
* @param audioByte
*            音訊位元率
* @param audioCollection
*            音訊取樣率
* @param quality
*            視訊質量(0.01-255)越低質量越好
* @param fps
*            每秒幀數(15或29.97)
*/
public void videoTransfer(String fileSavePath, String screenSize, int audioByte, int audioCollection,
double quality, double fps) {
cmd.clear();
cmd.add(ffmpegUri);
cmd.add(“-i”);
cmd.add(originFileUri);
cmd.add(“-y”);
cmd.add(“-ab”);
cmd.add(Integer.toString(audioByte));
cmd.add(“-ar”);
cmd.add(Integer.toString(audioCollection));
cmd.add(“-qscale”);
cmd.add(Double.toString(quality));
cmd.add(“-r”);
cmd.add(Double.toString(fps));
cmd.add(“-s”);
cmd.add(screenSize);
cmd.add(fileSavePath);
CmdExecuter.exec(cmd, null);
}

/**
* 視訊轉換

* @param fileSavePath
*            檔案儲存全路徑(包括副檔名)如 e:/abc/test.flv
* @param screenSize
*            視訊解析度 如640×480
* @param audioByte
*            音訊位元率
* @param audioCollection
*            音訊取樣率
* @param quality
*            視訊質量(0.01-255)越低質量越好
* @param fps
*            每秒幀數(15或29.97)
*/
public void videoTransfer(String fileSavePath) {
cmd.clear();
cmd.add(ffmpegUri);
cmd.add(“-i”);
cmd.add(originFileUri);
cmd.add(“-y”);
cmd.add(fileSavePath);
CmdExecuter.exec(cmd, null);
}

@Override
public void dealString(String str) {

switch (status) {
case Empty:
break;
case CheckingFile: {
Matcher m = Pattern.compile(“Unknown format”).matcher(str);
if (m.find())
this.isSupported = false;
break;
}
case GettingRuntime: {
Matcher m = Pattern.compile(“Duration: //w ://w ://w “).matcher(str);
while (m.find()) {
String msg = m.group();
msg = msg.replace(“Duration: “, “”);
runtime = msg.length();
}
break;
}
}// switch
}

/**
* 轉成pcm
* @param fileSavePath
*/
public void videoTransferPcm(String fileSavePath) {
cmd.clear();
cmd.add(ffmpegUri);
cmd.add(“-i”);
cmd.add(originFileUri);
cmd.add(“-f”);
cmd.add(“s16le”);  //16 位有符號數
cmd.add(“-ar”);
cmd.add(“16000”);    //16000 Hz 取樣率
cmd.add(“-ac”);
cmd.add(“1”);    // 單聲道
cmd.add(fileSavePath);
CmdExecuter.exec(cmd, null);
}
}

 4.執行linux命令,util類

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;

public class CmdExecuter {
/**
* 執行指令

* @param cmd
*            執行指令
* @param getter
*            指令返回處理介面,若為null則不處理輸出
*/
static public void exec(List<String> cmd, IStringGetter getter) {
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(cmd);
builder.redirectErrorStream(true);
Process proc = builder.start();
BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = stdout.readLine()) != null) {
if (getter != null)
getter.dealString(line);
}
proc.waitFor();
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

5.

package com.sinaif.common.utils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
public class CmdExecuter {
/**
* 執行指令

* @param cmd
*            執行指令
* @param getter
*            指令返回處理介面,若為null則不處理輸出
*/
static public void exec(List<String> cmd, IStringGetter getter) {
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(cmd);
builder.redirectErrorStream(true);
Process proc = builder.start();
BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = stdout.readLine()) != null) {
if (getter != null)
getter.dealString(line);
}
proc.waitFor();
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

6.ffmpeg  相關操作命令,參考官網:

https://ffmpeg.org/ffmpeg.html,也可以百度別人總結,這裡就不贅述了

7.解決ffmpeg   comman not found 問題

[[email protected] bin]# ffmpeg  -i /usr/local/ffmpeg/15023354983067356.mp4  -y /usr/local/ffmpeg/aa.wav
-bash: ffmpeg: command not found

寫全路徑,從根目錄開始

[[email protected] bin]# /usr/local/ffmpeg/bin/ffmpeg -i /usr/local/ffmpeg/15023352284504711.mp4  -f s16le -ar 8000 -ac 1 /usr/local/ffmpeg/dd.pcm