blender 4.3.0 產生字幕 python 程式
Blender 4.3.0 → Video Editing
+ → General → Layout
把 3D Viewport 改成 Text Editor
按下 "+ New",貼上程式碼,執行(Run Script)。
切回 "Video Editing" 頁籤,看 Sequencer 的區塊,應該可以看到許多字幕才對。
# frame rate 與 seconds 之間的轉換,再請自行修改。
import bpy
oScene=bpy.context.scene
oFont=bpy.data.fonts.load("c:/windows/fonts/kaiu.ttf")
# 確保 VSE 存在
if not oScene.sequence_editor:
oScene.sequence_editor_create()
oSE=oScene.sequence_editor
for iFrame in range(1, 246, 4):
oTextStrip=oSE.sequences.new_effect(
name="textStrip", # blender 會自動變換名字為流水號,不用怕衝突。
type='TEXT',
channel=2,
frame_start=iFrame,
frame_end=iFrame+3 # not included
)
oTextStrip.text=f"買變壓器~~~{iFrame}"
oTextStrip.font=oFont
oTextStrip.font_size=60
oTextStrip.color=(1, 1, 1, 1) # RGBA,白色
oTextStrip.align_x='CENTER'
oTextStrip.align_y='CENTER'
oTextStrip.location[0]=0.5
oTextStrip.location[1]=0.1
ollama cloud + local 使用經驗
請從底下文字抓出客戶名稱,產品名稱,數量,單價,備註。
回答請簡潔乾淨不加星號,未提供者請留空,照舊代表數量、單價都跟上次相同。
我是彰化基督教醫院,我要叫貨,zolnox照舊,謝謝。
ollama run ministral-3:3b-cloud (不穩定)
ollama run gemma3:4b-cloud (穩定,但多嘴,備註誤判)
ollama run gemma3:12b-cloud (穩定)
ollama run llama3.2:1b (慘不忍睹)
ollama,從前端的 javascript 執行 (part2)
file:/// 可以存取 http://,而 https:// 可以存取 https://
<!doctype html>
<html lang="zh-Hant-TW">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>測試LLM</title>
<style>
#inpUrl
{
width: 40em;
}
textarea
{
width: 80vw;
height: 13em;
}
</style>
</head>
<body>
<div>
<table>
<tr>
<td>url</td>
<td><input type="text" name="inpUrl" id="inpUrl" value="http://192.168.1.10:11434/api/generate"></td>
</tr>
<tr>
<td>model</td>
<td>
<select name="selModel" id="selModel">
<option>llama3.2:1b</option>
<option>gemma3:1b</option>
<option selected>gemma3:12b</option>
<option>deepseek-r1:1.5b</option>
</select>
</td>
</tr>
<tr>
<td>prompt</td>
<td>
<textarea name="taInput" id="taInput">請把下面的句子拆分成 客戶名稱,產品名稱,數量,單價。沒有提到的部分請留白。
屏東衛生所訂破傷風疫苗20盒,價格照舊,請備註明天上午到貨,謝謝。
</textarea>
</td>
</tr>
<tr>
<td rowspan="2"><button type="button" onclick="gototest();">送出</button></td>
<td><textarea id="divResult"></textarea></td>
</tr>
<tr>
<td><textarea id="divConversation"></textarea></td>
</tr>
</table>
</div>
<script>
// 執行函式 - 注意同源政策(CORS)的限制!
async function gototest()
{
var strPrompt=document.getElementById("taInput").value;
var strUrl=document.getElementById("inpUrl").value;
var strModel=document.getElementById("selModel").value;
//var strPrompt="請幫我說明一下下面的敘述。\n\n佛以此願行。與眾生莊嚴四種淨土。\n又以此願行。莊嚴成一句洪名。 ";
var oJsonInput={ model: strModel, prompt: strPrompt, stream: false };
var strText=await fetchOllamaResponseSync(strUrl, oJsonInput);
document.getElementById("divResult").value=strText;
var oJson=JSON.parse(strText);
document.getElementById("divConversation").value=oJson.response;
}
async function fetchOllamaResponseSync(strUrl, oJsonInput)
{
document.getElementById("divResult").value="please wait...";
document.getElementById("divConversation").value="please wait...";
try
{
const oResponse=await fetch(
strUrl,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(oJsonInput)
}
);
if(!oResponse.ok)
{
throw new Error(`HTTP error! Status: ${oResponse.status}`);
}
const strText=await oResponse.text();
return strText;
}
catch(oError)
{
return "Error fetching Ollama response:"+oError;
}
}
</script>
</body>
</html>
在 ubuntu 底下,設定 ollama 的參數
ubuntu 的 terminal 底下
sudo systemctl edit ollama
加入
[Service]
Environment="OLLAMA_KEEP_ALIVE=-1"
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_ORIGINS=*"
存檔後
sudo systemctl daemon-reexec
sudo systemctl restart ollama
顏先生(yen),月曆業績報表
// 顏先生(yen),月曆業績報表 2025-12-19
// 在 excel 中
// 1.合併儲存格的部分先整列刪除
// 2.用 Ctrl+H ,[Ctrl+J]CHR(10)→"_",然後全部取代。(將換行的可能消除)
// 3.再全選,用 Ctrl+1 ,改為通用格式。(讓逗號消失,小數點浮現)
// 4.選取需要的範圍,複製
// 貼到 文字處理器 中
// 執行下方的程式碼
var str1=gebi("ta1_htm").value.split(",").join("").split(" ").join("");
var stra1=getStraByCrLf(str1);
var straItem=stra1[0].split("\t");
var iColIdx推薦人=straItem.indexOf("推薦人");
var iColIdx數量=straItem.indexOf("數量");
var iColIdx金額=straItem.indexOf("金額");
console.log(iColIdx推薦人, iColIdx數量, iColIdx金額);
var oObj1={};
for(var i=1;i<stra1.length;i++)
{
var straItem=stra1[i].split("\t");
if(straItem.length<3) { continue; }
var str推薦人=straItem[iColIdx推薦人];
var str數量=straItem[iColIdx數量];
var str金額=straItem[iColIdx金額];
if(str推薦人=="") { str推薦人="(空)"; }
if(str數量=="" || str數量=="-") { str數量="0"; }
if(str金額=="" || str金額=="-") { str金額="0"; }
var d數量=parseFloat(str數量);
var d金額=parseFloat(str金額);
if(oObj1.hasOwnProperty(str推薦人)==false)
{
oObj1[str推薦人]={};
oObj1[str推薦人].d數量=d數量;
oObj1[str推薦人].d金額=d金額;
}
else
{
oObj1[str推薦人].d數量+=d數量;
oObj1[str推薦人].d金額+=d金額;
}
}
var straResult=["推薦人\t數量\t金額"];
var straKey=Object.keys(oObj1);
straKey.sort();
for(var iK=0; iK<straKey.length; iK++)
{
var strKey=straKey[iK];
straResult.push(strKey+"\t"+oObj1[strKey].d數量+"\t"+oObj1[strKey].d金額);
}
gebi("ta1_htm").value=straResult.join("\r\n");
alert("請全選貼回EXCEL,並排序後,看看有無名字相近者。");