SpringMVC調(diào)用訊飛語音合成WebApi示例

最近訊飛開放了語音合成的WebAPI牺氨,相對于之前SDK的方式方便了很多孔轴,下面使用SpringMVC寫了一個示例筋现,調(diào)用訊飛的合成API矾睦。

  • XFHelper.java
    負(fù)責(zé)調(diào)用訊飛WebAPI接口掉奄,處理HTTP頭和參數(shù)规个,解析結(jié)果
public class XFAiHelper {

    private static final String APP_ID = "你的APP_ID";
    private static final String TTS_APP_KEY = "你的APP_KEY";

    private static final String API_DOMAIN = "http://api.xfyun.cn";
    private static final String TTS_PATH = "/v1/service/v1/tts";
    private static final byte[] TTS_PARAM = "{\"auf\":\"audio/L16;rate=16000\",\"aue\":\"lame\",\"voice_name\":\"xiaoyan\",\"engine_type\":\"aisound\"}".getBytes();
    private static final String CHARSET = "UTF-8";

    public static byte[] tts(String text) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            HttpPost httpPost = new HttpPost(API_DOMAIN + TTS_PATH);
            addFormData(httpPost, "text", text);
            String param = Base64.getEncoder().encodeToString(TTS_PARAM);
            addAiHeader(httpPost, param, TTS_APP_KEY);

            CloseableHttpResponse httpResponse = httpclient.execute(httpPost);
            if (httpResponse.getStatusLine().getStatusCode() == 200
                    && StringUtils.equals(httpResponse.getFirstHeader("Content-Type").getValue(), "audio/mpeg")) {
                InputStream inputStream = httpResponse.getEntity().getContent();
                return IOUtils.toByteArray(inputStream);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    private static void addAiHeader(HttpPost httpPost, String param, String appKey, String key, String body) {
        httpPost.setHeader("X-Appid", APP_ID);
        httpPost.setHeader("X-Param", param);

        String curTime = String.valueOf(System.currentTimeMillis() / 1000);
        httpPost.setHeader("X-CurTime", curTime);

        String checkStr = appKey + curTime + param;
        String checkSum = new Md5PasswordEncoder().encodePassword(checkStr, null);
        httpPost.setHeader("X-CheckSum", checkSum);
    }

    private static void addFormData(HttpPost httpPost, String key, String body) throws UnsupportedEncodingException {
        List<NameValuePair> nameValuePairArrayList = new ArrayList<>();
        nameValuePairArrayList.add(new BasicNameValuePair(key, body));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairArrayList, CHARSET));
    }
  • AIController.java
    負(fù)責(zé)對外提供Web接口
@RequestMapping("/tts")
    public ResponseEntity tts(String text, HttpServletResponse response) throws IOException {
        byte[] audio = XFAiHelper.tts(text);
        if (audio != null && audio.length > 0) {
            final HttpHeaders headers = new HttpHeaders();
            // 如需直接播放音頻,需添加對應(yīng)的ContentType和ContentLength
            headers.setContentType(new MediaType("audio", "mpeg"));
            headers.setContentLength(audio.length);
            // 如需下載音頻姓建,添加如下header
            // headers.setContentDispositionFormData("attchement", fileName);
            return new ResponseEntity<>(audio, headers, HttpStatus.OK);
        } else {
            return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诞仓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子速兔,更是在濱河造成了極大的恐慌墅拭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣狗,死亡現(xiàn)場離奇詭異谍婉,居然都是意外死亡,警方通過查閱死者的電腦和手機屑柔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門屡萤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掸宛,你說我怎么就攤上這事死陆。” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵措译,是天一觀的道長别凤。 經(jīng)常有香客問我,道長领虹,這世上最難降的妖魔是什么规哪? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮塌衰,結(jié)果婚禮上诉稍,老公的妹妹穿的比我還像新娘。我一直安慰自己最疆,他們只是感情好杯巨,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著努酸,像睡著了一般服爷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上获诈,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天仍源,我揣著相機與錄音,去河邊找鬼舔涎。 笑死笼踩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的终抽。 我是一名探鬼主播戳表,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昼伴!你這毒婦竟也來了匾旭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤圃郊,失蹤者是張志新(化名)和其女友劉穎价涝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體持舆,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡色瘩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逸寓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片居兆。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竹伸,靈堂內(nèi)的尸體忽然破棺而出泥栖,到底是詐尸還是另有隱情簇宽,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布吧享,位于F島的核電站魏割,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钢颂。R本人自食惡果不足惜钞它,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殊鞭。 院中可真熱鬧遭垛,春花似錦、人聲如沸操灿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牲尺。三九已至,卻和暖如春幌蚊,著一層夾襖步出監(jiān)牢的瞬間谤碳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工溢豆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜒简,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓漩仙,卻偏偏與公主長得像搓茬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子队他,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • 現(xiàn)代人的生活越來越離不開手機卷仑,但我們總會遇到一些時候不方便用手去操作,比如開車麸折,玩游戲的時候锡凝。智能語音時代這種情況...
    yml7822閱讀 353評論 0 0
  • 人生或許各自相安無事地過下去是最好的吧,就連父母兄弟也是一樣的垢啼,他們都不是你窜锯,不會說:“你走吧,這一路風(fēng)景怎...
    卅良女子閱讀 161評論 0 0
  • 天氣預(yù)報顯示芭析,周末的深圳會降溫至5度左右锚扎,還可能伴有少量雨夾雪,看來馁启,深圳朝著真正入冬邁出了更結(jié)實的一步驾孔。 有朋友...
    南風(fēng)知我意Zzzzz閱讀 365評論 0 0