Go-ole是一個用于在Go語言中操作OLE(Object Linking and Embedding)的庫。OLE是一種面向對象的技術,可以在Microsoft Windows作業系統中通過COM(Component Object Model)實作各種對象之間的連結和嵌入。
使用Go-ole,您可以使用Go語言來操作COM元件,包括通路OLE對象模型,調用OLE方法和屬性,以及實作OLE自動化用戶端和伺服器。
package main
import (
"fmt"
"github.com/go-ole/go-ole"
"github.com/go-ole/go-ole/oleutil"
)
const (
speechPath = "SAPI.SpVoice"
wavePath = "SAPI.SpFileStream"
filePath = "D:\\mygo\\aa.wav"
audioFlag = 3 // 0表示DefaultAudioFormat,1表示NoFormat,2表示Text,3表示Stream
waitTime = 1000000 // 以微秒為機關
speechRate = 1
volume = 100
)
func main() {
// 初始化COM庫
if err := ole.CoInitialize(0); err != nil {
fmt.Println("初始化COM庫時出錯:", err)
return
}
defer ole.CoUninitialize()
// 建立新的SAPI.SpVoice對象
unknown, err := oleutil.CreateObject(speechPath)
if err != nil {
fmt.Println("建立SAPI.SpVoice對象時出錯:", err)
return
}
defer unknown.Release()
// 查詢IDispatch接口
voice, err := unknown.QueryInterface(ole.IID_IDispatch)
if err != nil {
fmt.Println("查詢IDispatch接口時出錯:", err)
return
}
defer voice.Release()
// 建立新的SAPI.SpFileStream對象
// saveFile, err := oleutil.CreateObject(wavePath)
// if err != nil {
// fmt.Println("建立SAPI.SpFileStream對象時出錯", err)
// return
// }
// defer saveFile.Release()
// 查詢IDispatch接口
// ff, err := saveFile.QueryInterface(ole.IID_IDispatch)
// if err != nil {
// fmt.Println("查詢IDispatch接口時出錯:", err)
// return
// }
// defer ff.Release()
// 打開wave檔案
// if _, err := oleutil.CallMethod(ff, "Open", filePath, audioFlag, true); err != nil {
// fmt.Println("打開wave檔案時出錯:", err)
// return
// }
// 設定語音屬性
// 音頻輸出流
// if _, err := oleutil.PutPropertyRef(voice, "AudioOutputStream", ff); err != nil {
// fmt.Println("設定AudioOutputStream屬性時出錯:", err)
// return
// }
// 設定語速
if _, err := oleutil.PutProperty(voice, "Rate", speechRate); err != nil {
fmt.Println("設定Rate屬性時出錯:", err)
return
}
// 設定音量
if _, err := oleutil.PutProperty(voice, "Volume", volume); err != nil {
fmt.Println("設定Volume屬性時出錯:", err)
return
}
// 說出文本
if _, err := oleutil.CallMethod(voice, "Speak", "您有新工單,請及時處理!"); err != nil {
fmt.Println("說出文本時出錯:", err)
return
}