過春風十里,盡薺麥青青。春天總是讓人舒坦,而今年的三月,也因爲與媳婦結婚十年,顯得格外不同。兩人奢侈的請了一天假,瞞着孩子,重遊西湖,去尋找13年前的冰棍店(給當時還是同事的她買了最貴的一個雪糕-8元),去尋找13年前賣紅豆鑰匙扣的大爺(她送我了一個綠豆的鑰匙扣-純潔的友誼),去坐一坐13年前坐過的那條凳子... 正當沉浸在浪漫的回憶中時,一個許久未曾聯繫的好友,突然來了消息,相約安吉大竹海。以前覺得老家的房前屋後都是竹子已是清幽之至,原來漫山遍野的竹子亦是別有一番風味。一羣娃在草地上盡情的踢球,瞧,娃玩得多開心。
過春風十里,盡薺麥青青。春天總是讓人舒坦,而今年的三月,也因爲與媳婦結婚十年,顯得格外不同。兩人奢侈的請了一天假,瞞着孩子,重遊西湖,去尋找13年前的冰棍店(給當時還是同事的她買了最貴的一個雪糕-8元),去尋找13年前賣紅豆鑰匙扣的大爺(她送我了一個綠豆的鑰匙扣-純潔的友誼),去坐一坐13年前坐過的那條凳子... 正當沉浸在浪漫的回憶中時,一個許久未曾聯繫的好友,突然來了消息,相約安吉大竹海。以前覺得老家的房前屋後都是竹子已是清幽之至,原來漫山遍野的竹子亦是別有一番風味。一羣娃在草地上盡情的踢球,瞧,娃玩得多開心。
閒聊之餘,好友展示一個叫輕抖的小程序,裏面一個視頻文案提取的功能吸引了我。隨便複製一條抖音,快手之類的短視頻的鏈接就可以提取視頻的文案。好奇心驅使之下,開始了一段探索之路。沒曾想,開始容易,放下難。
經過一番簡單的思索確定了大概流程,分三個步驟:
提取視頻文件 -> 音頻分離 -> 音頻轉文字。而後就興高采烈的編碼起來了。很快現實就給當頭一棒,應驗了那句伴隨30年的四川老諺語:說得輕巧,是根燈草(四川話念來就有味兒了)。第一個難點就是:如何根據分享的鏈接下載視頻,還能支持各種通用平臺。嘗試好一會兒後放棄了,畢竟”志不在此“嘛,後來偶然發現有不少這樣的平臺,專門提供根據url 下載視頻的接口,就直接用三方的接口了。
有了視頻鏈接,下載到本地就簡單了(然則,簡單的地方可能會有坑),直接上代碼,返回文件生成的InputStream。
然後使用javacv 分離音頻,這個沒什麼特別的地方, 通過FFmpegFrameRecorder 蒐集分離的音頻。也直接上代碼。
寫到這裏時,我以爲勝利就如東方紅霞之下呼之欲出的紅日,已然無限接近,測試一個用例完美,二個用例完美,正當準備進行一個語音轉文字的階段時,最後一個單測失敗。爲此,開始了一輪曠日持久的調試路。
1, http下載保存文件-解析失敗- avformat_find_stream_info() error : Could not find stream information;
2.瀏覽器保存文件也失敗;
3, 迅雷下載解析也失敗;
...
我已經開始懷疑三方接口返回的視頻編碼有問題了;當抖音保存文件解析成功時,更加印證了我的懷疑。但是使用微信小程序 saveVideoToPhotosAlbum 保存的文件居然可以解析成功...我開始懷疑自己了。於是各種參數開始胡亂一通調整。失敗了無數次後,有了一個大膽的想法,我下載的你不能解析,那javaCV你自己下載的你總能解析了吧。 果然如此。上面的代碼就修改了一行。
接下來就是根據提取的音頻文件,調用騰訊雲的ars 接口。之前使用Openai 的接口實現內部財務機器人時,有寫過通過語音輸入轉文字的接口,直接拿過來放上就ok了。 一句話接口調用如下,如果是超過一分鐘的,調用長語音接口就可以了。(注:一句話接口同步返回,長語音是異步回調)
長語音轉文本也差不多。代碼如下
一開始只是憑着對文案提取好奇,沒曾想,一寫就停不下來;後端實現了,如果沒有一個前端的呈現又感覺略有遺憾;於是又讓媳婦幫忙搞了一套UI;又搞了一個簡單的小程序...一頓操作之後,終於上線了。有興趣的同學可以掃碼體驗下。
小程序名稱 :智能配音實用工具;
小程序二維碼 :