日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

方言听不懂,手把手教你用 Milvus 搭建方言翻译器!

發(fā)布時(shí)間:2024/1/18 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 方言听不懂,手把手教你用 Milvus 搭建方言翻译器! 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

坐在上海的公交車(chē)上,我有時(shí)會(huì)遇到這樣的煩惱:稍一分神,沒(méi)能聽(tīng)見(jiàn)普通話(huà)報(bào)站,支棱起耳朵,卻聽(tīng)不懂滬語(yǔ)報(bào)站。為了解決這個(gè)問(wèn)題,我決定——學(xué)習(xí)滬語(yǔ)?No, 作為一名數(shù)據(jù)工程師,我索性搭建了一個(gè)方言翻譯器,幫助大家輕松聽(tīng)懂地方方言,再也不會(huì)錯(cuò)過(guò)公交車(chē)站。

在本次的項(xiàng)目中,我會(huì)手把手教你使用 Milvus 搭建方言翻譯器。通過(guò)這個(gè)項(xiàng)目,你能收獲:

  • 熟悉開(kāi)源數(shù)據(jù)集,在日常的模型訓(xùn)練中應(yīng)用這些數(shù)據(jù)集

  • 親自動(dòng)手搭建 Demo,真正解決實(shí)際生活場(chǎng)景中問(wèn)題

  • 學(xué)會(huì)使用 Milvus 后,還有更多的可以結(jié)合 Milvus 的應(yīng)用場(chǎng)景等著你去發(fā)現(xiàn)

如果你是初次了解 Milvus 和 MagicHub 的小伙伴,我們?yōu)槟銣?zhǔn)備了一個(gè)簡(jiǎn)短的介紹:

Milvus

Milvus 是基于 FAISS、Annoy、HNSW 等向量搜索庫(kù)構(gòu)建,核心是解決稠密向量相似度檢索的問(wèn)題。最近, Milvus 2.0?版本已經(jīng)發(fā)布了,在向量檢索庫(kù)的基礎(chǔ)上,Milvus 支持了數(shù)據(jù)分區(qū)分片、持久化、增量數(shù)據(jù)攝取、標(biāo)量向量混合查詢(xún)、Time Travel 等功能,同時(shí)大幅優(yōu)化了向量檢索的性能。推薦用戶(hù)使用 Kubernetes 部署 Milvus ,以獲得最佳的可用性和彈性。

MagicHub?

MagicHub.com 是愛(ài)數(shù)智慧發(fā)布的一個(gè)開(kāi)源社區(qū)。愛(ài)數(shù)智慧為從事語(yǔ)音識(shí)別、語(yǔ)音合成、自然語(yǔ)言理解等人工智能領(lǐng)域研發(fā)與應(yīng)用研究的企業(yè)、科研機(jī)構(gòu)提供數(shù)據(jù)服務(wù)。MagicHub 開(kāi)源數(shù)據(jù)覆蓋多個(gè)場(chǎng)景、行業(yè)、語(yǔ)種。自 2021 年 4 月 15 日正式發(fā)布以來(lái),已經(jīng)覆蓋 3000+?全球開(kāi)發(fā)者,累計(jì)下載超過(guò) 15 萬(wàn)小時(shí)數(shù)據(jù)集。目前開(kāi)源 50?多種用于人工智能訓(xùn)練/測(cè)試的數(shù)據(jù)集,包括方言和小語(yǔ)種。數(shù)據(jù)集種類(lèi)包含 NLP、ASR、TTS 數(shù)據(jù)集和 LEX 發(fā)音詞典等。MagicHub 幫助 AI 開(kāi)發(fā)者快速找到適合自己模型的數(shù)據(jù)集,用開(kāi)源數(shù)據(jù)加速創(chuàng)新。

1. 數(shù)據(jù)準(zhǔn)備

本項(xiàng)目中,我們選擇了 MagicHub 社區(qū)中提供的上海話(huà)數(shù)據(jù)集(來(lái)源詳見(jiàn)文末鏈接[1]),你也可以根據(jù)自己的需要使用其他方言的數(shù)據(jù)集。

上海話(huà)朗讀音頻數(shù)據(jù)集-日常用語(yǔ)

此數(shù)據(jù)集包含了 4.23 個(gè)小時(shí)的上海話(huà)朗讀音頻和轉(zhuǎn)寫(xiě)文本,有 4,819 條由 10 名說(shuō)話(huà)人提供的日常用語(yǔ)語(yǔ)料。

錄音環(huán)境 : 室內(nèi)
錄音語(yǔ)料 : 日常口語(yǔ)句子
文件格式 : WAV, TXT
語(yǔ)音參數(shù) : 16 kHz/16 bits
錄音設(shè)備 : 手機(jī)
適用領(lǐng)域 : 語(yǔ)音識(shí)別
版權(quán)所有者 : 愛(ài)數(shù)智慧

下載數(shù)據(jù)集,解壓完成后可以看到這幾個(gè)文件:WAV - 音頻文件夾,README.txt - 數(shù)據(jù)集版權(quán)介紹文件,SPKINFO.txt - 每個(gè)音頻的錄音設(shè)備,性別,年齡,區(qū)域,錄音頻道的介紹文件,UTTRANSINFO.txt - 音頻的文本內(nèi)容,包含普通話(huà)和上海話(huà)。這里我們主要用到的是音頻文本內(nèi)容普通話(huà)部分。這里將 UTTRANSINFO.txt 文件轉(zhuǎn)成了 CSV 的形式,有利于我們后續(xù)數(shù)據(jù)處理。

def loadDataSet(test_dir):f = open(test_dir,'r',encoding='utf-8')fname ='ts.csv'with open(fname,'w') as fine:for line in f.readlines():line1 =line.split()PROMPT=line1[3]linew = PROMPT+"\n"fine.write(linew)

2. 音頻檢索

音頻搜索項(xiàng)目中,首先,將音頻文件用 Panns-Inference 模型轉(zhuǎn)成特征向量存儲(chǔ)到 Milvus 2.0,并返回對(duì)應(yīng)的 ID;接著,在 MySQL 數(shù)據(jù)庫(kù)中存儲(chǔ) ID 、音頻文件的路徑?,以及文本內(nèi)容對(duì)應(yīng)關(guān)系;隨后,在 Milvus 2.0 中檢索得出與其相似的音頻文件,并返回最相似的前 N 個(gè)結(jié)果;最后,根據(jù)返回的 ID 結(jié)果,在數(shù)據(jù)庫(kù)中搜索到對(duì)應(yīng)的音頻文件和文本內(nèi)容。

使用 Milvus 2.0 最新音頻檢索項(xiàng)目,只需要修改少量代碼,就可以對(duì)上海話(huà)音頻進(jìn)行檢索,返回上海話(huà)的音頻和音頻內(nèi)容。

下面是音頻檢索項(xiàng)目中需要修改的代碼,在 load.py 中讀取 CSV 的數(shù)據(jù)

def do_load(table_name, audio_dir,text_dir, model, milvus_client, mysql_cli):if not table_name:table_name = DEFAULT_TABLEvectors, names = extract_features(audio_dir, model)ids = milvus_client.insert(table_name, vectors)loadDataSet(text_dir)data = pd.read_csv("ts.csv")text = data['PROMPT'].tolist()milvus_client.create_index(table_name)mysql_cli.create_mysql_table(table_name)mysql_cli.load_data_to_mysql(table_name, format_data(ids, names,text))return len(ids)

在 search.py 中需要修改以下的代碼部分:

def do_search(host,table_name, audio_path, model, milvus_client, mysql_cli):try:if not table_name:table_name = DEFAULT_TABLEfeat = get_audio_embedding(audio_path)vectors = milvus_client.search_vectors(table_name, [feat], TOP_K)vids = [str(x.id) for x in vectors[0]]paths,text = mysql_cli.search_by_milvus_ids(vids, table_name)distances = [x.distance for x in vectors[0]]for i in range(len(paths)):tmp = "http://" + str(host) + "/data?audio_path=" + str(paths[i])paths[i] = tmpreturn vids, paths, distances,textexcept Exception as e:LOGGER.error(" Error with search : {}".format(e))sys.exit(1)

在 mysql_helpers.py 文件中修改以下代碼:

def create_mysql_table(self, table_name):sql = "create table if not exists " + table_name + "(milvus_id TEXT, audio_path TEXT,text TEXT) ENGINE=InnoDB DEFAULT CHARSET=utf8;"try:self.cursor.execute(sql)LOGGER.debug("MYSQL create table: {} with sql: {}".format(table_name, sql))except Exception as e:LOGGER.error("MYSQL ERROR: {} with sql: {}".format(e, sql))sys.exit(1)def load_data_to_mysql(self, table_name, data):sql = "insert into " + table_name + " (milvus_id,audio_path,text) values (%s,%s,%s);"try:self.cursor.executemany(sql, data)self.conn.commit()LOGGER.debug("MYSQL loads data to table: {} successfully".format(table_name))except Exception as e:LOGGER.error("MYSQL ERROR: {} with sql: {}".format(e, sql))sys.exit(1)def search_by_milvus_ids(self, ids, table_name):str_ids = str(ids).replace('[', '').replace(']', '')sql = "select * from " + table_name + " where milvus_id in (" + str_ids + ") order by field (milvus_id," + str_ids + ");"try:self.cursor.execute(sql)results = self.cursor.fetchall()results_path=[res[1] for res in results]results_text=[res[2] for res in results]LOGGER.debug("MYSQL search by milvus id.")return results_path,results_textexcept Exception as e:LOGGER.error("MYSQL ERROR: {} with sql: {}".format(e, sql))sys.exit(1)

以及修改相關(guān)的接口,在 main.py 中修改以下代碼:

class Item(BaseModel):Table: Optional[str] = NoneFile:strText:str@app.post('/audio/load') async def load_audios(item: Item):# Insert all the audio files under the file path to Milvus/MySQLtry:total_num = do_load(item.Table, item.File,item.Text,MODEL, MILVUS_CLI, MYSQL_CLI)LOGGER.info("Successfully loaded data, total count: {}".format(total_num))return {'status': True, 'msg': "Successfully loaded data!"}except Exception as e:LOGGER.error(e)return {'status': False, 'msg': e}, 400@app.post('/audio/search') async def search_audio(request: Request,Table: str = None, audio: UploadFile = File(...)):# Search the uploaded audio in Milvus/MySQLtry:# Save the upload data to server.content = await audio.read()audio_path = os.path.join(UPLOAD_PATH, audio.filename)with open(audio_path, "wb+") as f:f.write(content)host = request.headers['host']ids, paths,text, distances= do_search(host,Table, audio_path, MODEL, MILVUS_CLI, MYSQL_CLI)names=[]names = textres = dict(zip(paths, zip(names, distances)))#res = sorted(res.items(), key=lambda item: item[1][1])LOGGER.info("Successfully searched similar audio!")return resexcept Exception as e:LOGGER.error(e)return {'status': False, 'msg': e}, 400

3. 測(cè)試運(yùn)行

現(xiàn)在,修改完上述代碼以后,參考 Github 中 Audio_similar_search 的 Readme 文檔(來(lái)源詳見(jiàn)文末鏈接[2])啟動(dòng) FastAPI ,從 FastAPI 中驗(yàn)證代碼是否成功運(yùn)行,在瀏覽器中輸入 localhost:8002/docs 可以看到如圖所示 FastAPI 的頁(yè)面, 在 Load API 中分別輸入 Table 的名稱(chēng),音頻文件的路徑,音頻對(duì)應(yīng)的文本的路徑,然后點(diǎn)擊 Excute 的按鈕,圖中顯示數(shù)據(jù)插入成功。

然后,在 Search API 中輸入對(duì)應(yīng)的 Table 名稱(chēng)和需要檢索的音頻路徑,點(diǎn)擊 Excute 按鈕進(jìn)行檢索。如下圖所示,就可以看到相應(yīng)的音頻和其對(duì)應(yīng)的文本內(nèi)容了。

最后,感謝愛(ài)數(shù)智慧 MagicHub 提供的開(kāi)源數(shù)據(jù)集,讓我們更好地結(jié)合模型與 Milvus 進(jìn)行多個(gè)領(lǐng)域的向量檢索。

在這個(gè)音頻檢索項(xiàng)目中,我們也可以使用其他的方言數(shù)據(jù)集,將數(shù)據(jù)集經(jīng)過(guò) AI 模型轉(zhuǎn)成特征向量,結(jié)合 Milvus 進(jìn)行相似檢索,就可以把任何你聽(tīng)不懂的方言翻譯成普通話(huà)啦!

動(dòng)手玩一把?

源碼鏈接就在下方!


[1] 愛(ài)數(shù)智慧 MagicHub 開(kāi)源社區(qū):

https://magichub.com/cn/category/datasets/

[2] 音頻檢索:

https://github.com/milvus-io/bootcamp/tree/master/solutions/audio_similarity_search


作者? |?賈晶晶

Zilliz 數(shù)據(jù)工程師,畢業(yè)于西安交通大學(xué)計(jì)算機(jī)系。加入Zilliz后,主要工作內(nèi)容為數(shù)據(jù)預(yù)處理、AI模型部署、Milvus 相關(guān)技術(shù)研究,以及幫助社區(qū)用戶(hù)實(shí)現(xiàn)應(yīng)用場(chǎng)景落地。資深動(dòng)漫粉,對(duì)社區(qū)溝通超級(jí)有耐心,平時(shí)比較關(guān)注自然語(yǔ)言處理領(lǐng)域的研究。

總結(jié)

以上是生活随笔為你收集整理的方言听不懂,手把手教你用 Milvus 搭建方言翻译器!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。