Java 语音转文字

最近变懒了,连做读书笔记都不想打字了,于是找了一下网上看看有木有语音转文字的工具,发现 windows 自家就有啊,但是准确率惊人啊,所以心血来潮就开搞了,这里用到了讯飞的语音转文字服务
1、到讯飞开放平台那边注册开发者账号
2、找到 “语音听写"
3、创建应用
4、填写完表单之后,会得到一个 appid
5、下载 SDK
6、下载的 SDK 一般都有三个 demo 项目,使用其中一个即可
7、加入下面的 class,运行

import com.iflytek.cloud.speech.RecognizerListener;
import com.iflytek.cloud.speech.RecognizerResult;
import com.iflytek.cloud.speech.SpeechConstant;
import com.iflytek.cloud.speech.SpeechError;
import com.iflytek.cloud.speech.SpeechRecognizer;
import com.iflytek.cloud.speech.SpeechUtility;

/**
 * @date 2018年8月20日 下午10:41:59
 */
public class Recoder {
    //讯飞开放平台语音听写 appid
    private static String APPID = "appid";
    //语音听写对象
    private SpeechRecognizer mIat = SpeechRecognizer.createRecognizer();
    //标志是否已经开始录音
    private boolean startRecordFlag = false;
    
    public Recoder() {
        setting();
    }
    
    public static void main(String[] args) {
        new Recoder().startRecord();
    }
    
    /**
     * 开始录音
     */
    public void startRecord() {
        startRecordFlag = true;
        if (!mIat.isListening()) {
            mIat.startListening(recognizerListener);
        }
    }
    
    /**
     * 停止录音
     */
    public void stopRecord() {
        startRecordFlag = false;
        mIat.stopListening();
    }
    
    /**
     * 听写监听器
     */
    private RecognizerListener recognizerListener = new RecognizerListener() {
        private StringBuffer sb = new StringBuffer();
        /**
         * 获取听写结果. 获取RecognizerResult类型的识别结果
         */
        @Override
        public void onResult(RecognizerResult results, boolean islast) {
            sb.append(results.getResultString());
            if (islast) {
                System.out.println("result: " + sb.toString());
                sb.setLength(0);
                //开始新一轮语音识别
                if (startRecordFlag) {
                    mIat.stopListening();
                    mIat.startListening(recognizerListener);
                } 
            }
        }

        @Override
        public void onError(SpeechError error) {
            System.out.println("onError enter");
            if (null != error) {
                System.out.print(" Code:" + error.getErrorDescription(true));
            }
            //出错直接重试,暂时不做什么处理,可能会有死循环的事情发生
            if (startRecordFlag) {
                mIat.stopListening();
                mIat.startListening(recognizerListener);
            } 
        }

        @Override
        public void onEvent(int eventType, int arg1, int agr2, String msg) {}
        
        @Override
        public void onVolumeChanged(int volume) {}
        
        @Override
        public void onBeginOfSpeech() {}

        @Override
        public void onEndOfSpeech() {}
    };

    /**
     * 初始化基本配置
     */
    private void setting() {
        //设置开发者信息 appid
        SpeechUtility.createUtility("appid=" + APPID);
        
        //配置参数
        mIat.setParameter(SpeechConstant.RESULT_TYPE, "plain");//返回结果类型  {json, xml, plain}, 默认值:json
        
//        mIat.setParameter(SpeechConstant.NET_TIMEOUT, "20000");//网络连接超时时间,[0, 30000],默认值:20000
//        mIat.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, "10000");//设置录取音频的最长时间,[0, 60000],默认值:60000
//        mIat.setParameter(SpeechConstant.DOMAIN, "iat");//应用领域用于听写和语音语义服务,{ "iat"(短信和日常用语), "video", "poi"(地图), "music" },默认值:"iat"
        mIat.setParameter(SpeechConstant.VAD_BOS, "1000");//开始录入音频后,音频前面部分最长静音时长,[1000, 10000], 默认值:5000
//        mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//语言,{ "zh_cn", "en_us" }, 默认值:"zh_cn"
//        mIat.setParameter(SpeechConstant.ACCENT, "mandarin");//语言区域 默认 mandarin:普通话 | cantonese:粤语 | lmz:四川话 | henanese:河南话
        mIat.setParameter(SpeechConstant.VAD_EOS, "1000");//后端点超时,开始录入音频后,音频后面部分最长静音时长,[0, 10000], 默认值:1800
//        mIat.setParameter(SpeechConstant.SAMPLE_RATE, "16000");//识别采样率,{8000,16000}, 默认值:16000
//        mIat.setParameter(SpeechConstant.ASR_NBEST, "1");//句子级多候选,有歧义的句子有多少个候选结果 ,[1, 5],默认值:1
//        mIat.setParameter(SpeechConstant.ASR_WBEST, "1");//词级多候选,有歧义的词有多少个候选结果 ,[1, 5],默认值:1
//        mIat.setParameter(SpeechConstant.ASR_PTT, "1");//设置是否有标点符号, { null, 0, 1}, 默认值:1
//        mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, null );//识别录音保存路径 当前识别支持未压缩的16位,单声道,采样率为16000或8000,字节顺序为 Little-Endian的Windows PCM音频。
    }
}

### Java 实现语音文字功能的解决方案 Java 语言可以通过调用第三方 API 或库来实现语音文字功能。以下是一些常见的实现方式和技术细节: #### 1. 使用百度 AI 开放平台的语音识别服务 百度 AI 开放平台提供了强大的语音识别和合成能力,可以通过其提供的 RESTful API 来实现语音文字的功能。具体步骤如下: - 注册并登录百度 AI 开放平台账号[^1]。 - 创建一个与语音服务相关的应用,并获取该应用的 `API Key` 和 `Secret Key`[^1]。 - 在 Java 程序中调用百度语音识别 API,将音频文件上传到服务器进行处理。 以下是使用百度语音识别 API 的 Java 示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; public class VoiceToText { private static final String API_KEY = "your_api_key"; private static final String SECRET_KEY = "your_secret_key"; public static void main(String[] args) throws Exception { // 获取 access_token String accessToken = getAccessToken(API_KEY, SECRET_KEY); System.out.println("Access Token: " + accessToken); // 调用语音识别接口 String result = recognizeSpeech(accessToken, "audio_file_path"); System.out.println("Recognition Result: " + result); } private static String getAccessToken(String apiKey, String secretKey) throws Exception { String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; String getAccessTokenUrl = authHost + "grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey; URL realUrl = new URL(getAccessTokenUrl); HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("GET"); connection.connect(); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String result = in.readLine(); return parseTokenFromResponse(result); } private static String parseTokenFromResponse(String response) { int start = response.indexOf("\"access_token\":\"") + "\"access_token\":\"".length(); int end = response.indexOf("\",", start); return response.substring(start, end); } private static String recognizeSpeech(String accessToken, String audioFilePath) throws Exception { String url = "https://vop.baidu.com/server_api"; String params = "cuid=123456&token=" + accessToken; // 将音频文件换为 Base64 编码 String audioBase64 = Base64.getEncoder().encodeToString(loadAudioFile(audioFilePath)); params += "&speech=" + audioBase64 + "&len=153600&channel=1&rate=16000&format=wav"; // 发送 POST 请求到百度语音识别接口 URL realUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.getOutputStream().write(params.getBytes()); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); return in.readLine(); } private static byte[] loadAudioFile(String filePath) throws Exception { return java.nio.file.Files.readAllBytes(java.nio.file.Paths.get(filePath)); } } ``` 此代码示例展示了如何通过百度语音识别 API 将本地音频文件换为文本。 #### 2. 使用科大 API 实现语音文字 科大是中国领先的智能语音技术提供商,其 API 支持多种语音识别场景。在 Java 中可以结合科大的 SDK 或 RESTful API 实现语音文字功能[^2]。以下是使用科大 API 的基本流程: - 注册科大开放平台账号并创建应用,获取 `AppId`、`ApiKey` 和 `ApiSecret`。 - 下载并配置科大 Java SDK。 - 编写代码调用语音识别接口。 #### 3. 其他开源工具和库 除了百度和科大外,还有一些开源工具可以用于语音文字功能的开发,例如: - **CMU Sphinx**:一个开源的语音识别系统,支持多种语言和平台。虽然主要基于 C++ 开发,但可以通过 JNI 调用到 Java 程序中[^2]。 - **Google Speech-to-Text API**:如果需要国际化支持,可以考虑使用 Google 提供的语音识别服务,但需要注意其收费模式。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值