一,下载SDK,获取.pcm格式的语音文件


java 音频转文字 java语音转文字技术实现_java

这里需要将服务接口认证信息保存在开始时需要使用

java 音频转文字 java语音转文字技术实现_讯飞_02

下载完sdk如图所示解压

 

java 音频转文字 java语音转文字技术实现_Java_03

 解压完成后,直接用idea打开

\Java_iat1021_03e05010\sample\MscDemo

打开项目后运行程序

java 音频转文字 java语音转文字技术实现_Java_04

运行程序的主要目的是录取一段PCM格式的录音,用于我们自己的项目。运行完的结果如下:

java 音频转文字 java语音转文字技术实现_ide_05

先设置保存音频的开关为开,然后点击“开始听写”,进行录音。这里是需要通过设备“前端点超时”和“后端点的超时”我的分别是5000,10000.这里设置他们,相当于是设置停顿时间,目的是在听写时根据停顿在转换为文字。在我们的程序中也要设置这两项,且要和这里设置的一样,不然会出现一次可以完全转换完,一次又出现未知错误的情况。如图所示:

java 音频转文字 java语音转文字技术实现_讯飞_06

java 音频转文字 java语音转文字技术实现_java_07

前期准备工作完成,也有了PCM文件可以开始我们的代码开发了。

二、语音转文字的代码

创建项目,在项目的路径下,创建lib文件,将SDK中的json-jena-1.0.jar和Msc.jar贴过来。

java 音频转文字 java语音转文字技术实现_java_08

 在项目路径下再将SDK中的以下4个文件也粘贴过来。

java 音频转文字 java语音转文字技术实现_java 音频转文字_09

创建pom依赖

<!--科大讯飞语音听写的sd依赖-->
<dependency>
    <groupId>com.hp.hpl.jena</groupId>
    <artifactId>json-jena</artifactId>
    <version>1.0</version>
</dependency>
<dependency>
    <groupId>com.iflytek</groupId>
    <artifactId>msc</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/Msc.jar</systemPath>
</dependency>

 下面时具体的代码

package com.example.xhydome1.util.speechRecognition;

import com.iflytek.cloud.speech.*;
import org.apache.http.entity.ContentType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;

public class IatTool {
    private static Logger LOGGER = LoggerFactory.getLogger(IatTool.class);

    private StringBuilder curRet;

    private SpeechRecognizer recognizer;

    private Object lock = new Object();

    public IatTool(String appId){
        LOGGER.info("------Speech Utility init iat------");
        SpeechUtility.createUtility(SpeechConstant.APPID + "=" + appId);
    }

    public String RecognizePcmfileByte(MultipartFile audioFile) {

        curRet = new StringBuilder();

        try {
            if (recognizer == null) {
                //以下设置转换参数
                recognizer = SpeechRecognizer.createRecognizer();
                recognizer.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");
                recognizer.setParameter( SpeechConstant.RESULT_TYPE, "plain" );
                recognizer.setParameter(SpeechConstant.VAD_BOS,"5000");//前端点超时,
                recognizer.setParameter(SpeechConstant.VAD_EOS,"10000");//后端点超时要与运行SDK时配置的一样
            }

            recognizer.startListening(recListener);

            byte[] buffer = audioFile.getBytes();
            if (buffer == null || buffer.length == 0) {
                LOGGER.error("no audio avaible!");
                recognizer.cancel();
            } else {

                int lenRead = buffer.length;
                System.out.println("文件长度"+buffer.length);
                recognizer.writeAudio( buffer, 0, lenRead );
                recognizer.stopListening();
                synchronized (lock) {
                    lock.wait();//主线程等待
                }
                System.out.println(curRet.toString());
                return curRet.toString();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private RecognizerListener recListener = new RecognizerListener() {
        @Override
        public void onBeginOfSpeech() {
            LOGGER.info( "onBeginOfSpeech enter" );
        }
        @Override
        public void onEndOfSpeech() {
            LOGGER.info( "onEndOfSpeech enter" );
        }
        /**
         * 获取听写结果
         */
        @Override
        public void onResult(RecognizerResult results, boolean islast) {
            LOGGER.info( "onResult enter" );
//可以用json解析器解析为json格式,,参考AsrSpeechView中inResult函数
            String text = results.getResultString();
            curRet.append(text);
            //System.out.println("解析结果"+curRet.toString());
            if( islast ) {
                synchronized (lock) {
                    lock.notify();//子线程唤醒
                }
            }
        }
        @Override
        public void onVolumeChanged(int volume) {
            LOGGER.info( "onVolumeChanged volume=" + volume);
        }

        @Override
        public void onError(SpeechError error) {
            LOGGER.error( "onError enter" );
            if (null != error) {
                LOGGER.error("onError Code:" + error.getErrorCode() + "," + error.getErrorDescription(true));
            }
        }
        @Override
        public void onEvent(int eventType, int arg1, int agr2, String msg) {
            LOGGER.info( "onEvent enter" );
            //以下代码用于调试,如果出现问题可以将sid提供给讯飞开发者,用于问题定位排查
			/*if(eventType == SpeechEvent.EVENT_SESSION_ID) {
				DebugLog.Log("sid=="+msg);
			}*/
        }
    };
    public static void main(String args[]) throws IOException {
        IatTool iatTool=new IatTool("03e05010");

        File file = new File("D://0_JAVA_program//xhydome1//xhydome1//iat_test.pcm");
        FileInputStream fileInputStream = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile(file.getName(), file.getName(),
                ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
        iatTool.RecognizePcmfileByte(multipartFile);

        }
}

运行结果如下:

java 音频转文字 java语音转文字技术实现_java_10