2025年3月4日 星期二

Dify + Whisper Asr Webservice

Dify + Whisper Asr Webservice

這邊假設你已經成功啟動dify的服務

Whisper Asr Webservice

Whisper Asr Webservice是一個很方便的工具,因為作者已經幫忙把語音轉文字的服務API化,對於應用端來說只要做常規的API呼叫就可以滿足應用上的需求。

啟動Whisper Asr Webservice

啟動服務最快的方法就是docker:

docker run -d -p 9000:9000 -e ASR_MODEL=base -e ASR_ENGINE=openai_whisper onerahmet/openai-whisper-asr-webservice:latest
docker run -d --gpus all -p 9000:9000 -e ASR_MODEL=base -e ASR_ENGINE=openai_whisper onerahmet/openai-whisper-asr-webservice:latest-gpu

不過要注意自己的cuda版本是否有對應,如果最新版的無法啟動的話就要降版,這取決於你的硬體設備。

Openapi設置

成功啟動docker container之後,可以直接連接到應網頁,http://你的ip:9000/docs 沒意外的話你會看到下圖:
image

點擊上圖紅框處的openapi.json,系統會開立一個新的視窗,一堆的json格式的字串,複製出來之後,拿到你喜歡的平台去做排版,排版之後我們要做兩個處理,這樣才能成功在dify中引用:

  1. infopath的中間加入servers
    image

  2. 修正requestBody中的content-type,原本是multipart/form-data,修正為multipart/form-data; boundary=----WebKitFormBoundarydzemBAPhdeDfTCfR
    image

更多關於模型的選擇與細部配置請自行參考Whisper Asr Webservice官方文件說明。

Dify - 自定義工具設置

進入Dify之後,我們就可以自定義工具,首先點擊工具:
image

點擊自定義之後,點擊建立自定義工具:
image

自己定義名稱,然後將剛剛調整的openapi貼上,就可以成功建立一個自定義工具:
image

Dify - 應用流程開發

現在,你已經可以直接在dify的workflow中取用自定義的語音轉文字的工具:
image

把一些參數設置一下:
image

測試應用:
image

把取到的文字再弄成問答集:

問題:客戶在聯絡退稅服務時需要提供哪些信息?
答案:當客戶聯繫退稅服務時,他們需要先將退稅輔導單的背面展示給客服人員。這是因為背面上有重要的信息如退稅編號,而該編號是核實和處理退稅事宜的關鍵資訊之一。此外,客戶還需告知他們想將退稅款轉入的帳戶號碼,以便在核准退稅後正確地入帳。

問題:退稅作業需要多久時間?
答案:退稅的整個作業過程大約需要一個星期的時間。這段時間內,相關部門會處理客戶提供的信息,完成核對和審批程序。

問題:退稅款入帳後會如何通知客戶?
答案:一旦退稅款成功入帳到客戶指定的帳戶中,相關單位將透過簡訊的方式向客戶發出通知。這樣可以讓客戶即時了解退稅款項處理的情況。

問題:如果客戶需要查詢或提供退稅相關信息,應如何聯繫?
答案:客戶若需查詢或提供退稅相關資訊時,可以直接致電服務中心。在通話過程中,客服人員會引導客戶展示退稅輔導單的背面以取得所需信息,並記錄下客戶想要轉入的帳戶號碼等詳細資料。

問題:客服人員在接獲退稅請求時通常會有何反應?
答案:根據提供的文本內容,客服人員表現出專業且友善的態度。他們會告知客戶如何取得退稅編號,需求收集轉入帳戶的信息,並確認已記錄下所有必要資料後表示感謝。此外,客服人員也會鼓勵客戶耐心等待退稅作業完成,並祝願他們一切順利。

有興趣的話,可以再把問答集轉成主持人與來賓的對話,那就是一個podcast了。

如果是公司會議記錄,就可以讓與會人員每天聽聽老闆愛的盯寧了。

2025年1月2日 星期四

告別2024~迎接2025

告別2024~迎接2025

2024年總計讀了八篇的論文:

  1. Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks(CycleGAN)
  2. ArcFace: Additive Angular Margin Loss for Deep Face Recognition(翻譯)
  3. Perceptual Losses for Real-Time Style Transfer and Super-Resolution(翻譯)
  4. Image-to-Image Translation with Conditional Adversarial Networks(翻譯)
  5. Analyzing and Improving the Image Quality of StyleGAN
  6. Instance Normalization: The Missing Ingredient for Fast Stylization
  7. Distilling the knowledge in a neural network
  8. Attention Is All You Need
    以及三個系列課程:
  9. Applied LLMs Mastery 2024
  10. 李宏毅_生成式導論 2024
  11. Mathematics for Machine Learning and Data Science

不過在git上的實作記錄就偏少了,這是2025年必需要改進的部份。

當然除了讀書之外在公司內也帶著同仁一起做了幾個案子,也確認自己的方向是正確的,人工智慧對於企業有絕對的幫助。 所謂的學習是在學習一種模式(pattern),企業的資料是不斷重覆的生成,一定也存在著某種的模式可以學習。

沒有達成的部份就是Rust、Vue、Pytorch都沒有動靜,這也是要檢討的部份。

所以,我要再立下2025年新的目標:

  1. 讀10篇論文(將yolov5~v11的論文補完,擴散模型、llm相關關鍵議題論文)
  2. 三個系列課程
  3. 放棄Rust,改學C++(參考C++ Primer Plus自學)
  4. Vue3
  5. 重新復習Hello演算法中的所有演算法
  6. 公司內成功建置人臉辨識考勤系統
  7. 讀完Build a Large Language Model (From Scratch),並且自己手刻一發
  8. 熟悉幾個llm框架(dify)
  9. 補完強化學習聖經第二部中文翻譯
    滾動式增加,要讓2025更充實。

2024年4月9日 星期二

Oracle的預儲程序參數與資料表名稱相同時的異常

Oracle的預儲程序參數與資料表名稱相同時的異常

最近踩了一個坑,主要是一個預儲程序利用給定的參數來做查詢,再將查詢到的資料寫入變數,原本都還很正常,但是突然失效,偏偏單獨的查詢都很正常,遍尋不著,後來同事協助之後終於脫坑。

create or replace procedure test_proc(p_a varchar2) is
begin
	select column into v_column from table where column_a = p_a;	
end

上面是一個示意的範例,test_proc這個預儲程序在得到p_a之後就會去資料表查詢,然後將資料寫入v_column,但不知道什麼時候,資料表中被加入一個同名欄位,也就是p_a,這導致了參數中的p_a就失效了。

這可能就代表著在oracle的預儲程序中,整個上下文還是會以查詢資料表為主,查詢資料表沒有對應欄位名稱的時候才會以變數做為條件?

這很頭痛的是,這是無聲異常,而且還可能造成大量異常,不得不防,以後預儲函數的參數必需要設置的非常怪異,才不會有機會跟未來人命名欄位名稱相同。

2024年3月26日 星期二

Roland F701開箱

ROLAND F701(白色)電鋼琴

自從搬出老家之後,喵小姐一直心心唸唸著想要一台電鋼琴,終於在今年的年初,也就是過年的時候,趁著活動帶著她去一趟竹北鴻韻,雖然這已經是第n次去了。

原本預算是20k,打算買台基本的能在家過過乾癮就好,不過實際到現場按壓幾次之後,喵小姐還是決定把預算突破天際,就買了F701,常言道,捏一下就上去了,這一捏簡直是蛋破小鳥死。但是為了喵小姐的夢想我還是捏上去了。

其實最一開始是希望老泡先生可以學鋼琴,但是他從小就愛敲敲打打,所以最後選擇學習爵士鼓。現在多了一個安咕咕先生,希望他會愛上鋼琴。

購買的時候因為是要安置在三樓,多了樓層費,來的師父在安裝上也非常熟門熟路的,很辛苦,到我家已經是晚上八點多,離開的時候說他還有另外兩家要送,看來在台灣熱愛學習音樂的人真的不少。

F701在DEMO的時候有特別提到可以搭配APP,算是蠻方便的,壓下去的聲音也會隨著手指的力度而有所不同,這是當初喵小姐捨棄初階機的最主要原因。搭配耳機就可以在不擾人清夢的情況下好好練習。而且架子本身也提供一個吊掛耳機的地方,非常方便。

總之,好機,白色更是美的西哩花拉的,搭配活動送了一個升降椅,值得入手。



2024年2月27日 星期二

利用tailwind css設計一個簡易側導覽

最近在嚐試利用前端搭配flask寫網頁,幾個小功能,但是需要一個連結給使用者,所以就想要做一個側導覽功能,初始結構是20美元小助理給的,自己微調一下,符合使用比較重要,大致就是拆成html跟javascript,css的部份直接採用tailwind套版,直觀又快速。

首先是html,版面的部份要切出左側一個區域來給側導覽,然後一個按鈕,側導覽的初始狀態是整個隱藏,經過按鈕點擊來做顯示與隱藏的切換:

<div id="sidebar" class="fixed top-0 left-0 h-full bg-gray-800 transition-transform duration-300 ease-in-out -translate-x-full z-10">  
 <div class="mt-16">  
 <ul class="text-white">  
 <li class="p-4 hover:bg-gray-700"><a href="{{ url_for('Router1') }}">Router1</a></li>  
 <li class="p-4 hover:bg-gray-700"><a href="{{ url_for('Router2') }}">Router2</a></li>  
 <li class="p-4 hover:bg-gray-700"><a href="{{ url_for('Router3') }}">Router3</a></li>  
 <li class="p-4 hover:bg-gray-700"><a href="{{ url_for('Router4') }}">Router4</a></li>  
 </ul> </div></div>  
<button id="toggleNav" class="fixed top-0 left-0 mt-10 p-2 text-white bg-blue-500 rounded z-20 transition-transform duration-300 ease-in-out">  
  MenuBar  
</button>

接著在按扭地方加入一個監聽器,主要是偵測到點擊的時候就做sidebar屬性-translate-x-full的切換,然後按鈕的屬性再隨著sidebar的屬性做變化的判斷

document.addEventListener('DOMContentLoaded', function() {  
    const toggleNavButton = document.getElementById('toggleNav');  
  toggleNavButton.addEventListener('click', function() {  
        const sidebar = document.getElementById('sidebar');  
  sidebar.classList.toggle('-translate-x-full');  
  
 if(sidebar.classList.contains('-translate-x-full')){  
            toggleNavButton.style.transform = 'translateX(0px)';  
  } else {  
            toggleNavButton.style.transform = `translateX(${sidebar.offsetWidth}px)`;  
  }  
    });  
});

2024年1月30日 星期二

Graph disconnected: cannot obtain value for tensor KerasTensor

Graph disconnected: cannot obtain value for tensor KerasTensor

TensorFlow版本:2.4.0

最近在嚐試寫PGGAN,參考來源程式碼在過程中做了轉型:

input_img = tf.keras.layers.Input(shape=(4, 4, 3))
input_img = tf.cast(input_img, tf.float32)
x1 = tf.keras.layers.AveragePooling2D()(input_img)

這種情況下每次都會跳出異常訊息:

Graph disconnected: cannot obtain value for tensor KerasTensor

搞了三天三夜,不管怎麼改變寫法,改成lambda、或是tf.dtypes.cast都不行:

input_img = tf.dtypes.cast(input_img, tf.float32)

結果我就很生氣的把變數名稱改了…

input_img = tf.keras.layers.Input(shape=(4, 4, 3))
input_img2 = tf.cast(input_img, tf.float32)
x1 = tf.keras.layers.AveragePooling2D()(input_img2)

就好了,對,沒錯,就好了。恭喜我自己,怪了,那他是怎麼訓練完成的。

2024年1月25日 星期四

PyGWalker

Python Tool: PyGWalker

python pygwalker data visualization

機器學習的一個重要過程就是資料分析,在做資料分析的時候最需要的就是一個方便的資料可視化軟體,AI總是需要有BI的伴隨。BI工具著名的有QLIK、Tableau、PowerBI,如果是Python的可視化套件就更是百家爭鳴。

不過最近看到一個讓我驚豔的套件,那就是PyGWalker,簡單幾段程式就讓我擁有類似於Tableau的界面,這讓我在資料分析上多了不少便利性。

官方Github連結

安裝

這次的測試是在conda,所以記得先建立一個虛擬環境:

conda create --name PyGWalkers

確定一下環境有沒有建立:

conda env list

然後轉入虛擬環境:

activate PyGWalkers

安裝:

conda install -c conda-forge pygwalker

安裝ipykernel:

conda install ipykernel

註冊kernel(要記得註冊,不然在執行中就無法選擇對應的kernel):

python -m ipykernel install --user --name PyGWalkers --display-name "Python (PyGWalkers)"

安裝確認:

conda list

啟動:

jupyter notebook

實作測試

從官方範例來看,就是簡單的兩步:

  1. 載入資料(csv -> dataframe)
  2. 執行
# 載入需求套件
import pandas as pd
import pygwalker as pyg
# 指定資料來源路徑
file_path = r'your file path'
# 載入dataframe
df = pd.read_csv(file_path)
# 確認資料是否確實載入
df.head()
# johnnie walker
pyg.walk(df)

image for PyGWalker

執行之後就會進入一個互動式的UI介面,是不是很讓人驚豔?剩下的就只是拖拖拉拉來觀察資料之間的關聯性了,這對小眾資料處理人員來說是非常便利的工具。