diff --git a/README.md b/README.md
index cdee148..6e1bb6e 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,7 @@ LiteLoaderQQNT的OneBot11协议插件
 - [x] 图片
 - [x] 引用消息
 - [x] @群成员
-- [x] 语音
+- [x] 语音(支持mp3、wav等多种音频格式直接发送)
 - [x] json消息(只上报)
 - [x] 转发消息记录(目前只能发不能收)
 - [ ] 红包
diff --git a/src/common/config.ts b/src/common/config.ts
index 9356999..366011c 100644
--- a/src/common/config.ts
+++ b/src/common/config.ts
@@ -33,7 +33,7 @@ export class ConfigUtil {
             ob11: ob11Default,
             heartInterval: 60000,
             token: "",
-            enableBase64: false,
+            enableLocalFile2Url: false,
             debug: false,
             log: false,
             reportSelfMessage: false
diff --git a/src/common/types.ts b/src/common/types.ts
index 1952099..0cc5a35 100644
--- a/src/common/types.ts
+++ b/src/common/types.ts
@@ -13,7 +13,7 @@ export interface Config {
     ob11: OB11Config
     token?: string
     heartInterval?: number  // ms
-    enableBase64?: boolean
+    enableLocalFile2Url?: boolean  // 开启后,本地文件路径图片会转成http链接, 语音会转成base64
     debug?: boolean
     reportSelfMessage?: boolean
     log?: boolean
diff --git a/src/main/main.ts b/src/main/main.ts
index 1b955fd..be20be2 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -82,7 +82,7 @@ function onLoad() {
     })
 
 
-    function postRawMsg(msgList: RawMessage[]) {
+    function postReceiveMsg(msgList: RawMessage[]) {
         const {debug, reportSelfMessage} = getConfigUtil().getConfig();
         for (let message of msgList) {
             // log("收到新消息", message)
@@ -107,7 +107,7 @@ function onLoad() {
     async function start() {
         registerReceiveHook<{ msgList: Array<RawMessage> }>(ReceiveCmd.NEW_MSG, (payload) => {
             try {
-                postRawMsg(payload.msgList);
+                postReceiveMsg(payload.msgList);
             } catch (e) {
                 log("report message error: ", e.toString());
             }
@@ -152,7 +152,7 @@ function onLoad() {
             }
             // log("reportSelfMessage", payload)
             try {
-                postRawMsg([payload.msgRecord]);
+                postReceiveMsg([payload.msgRecord]);
             } catch (e) {
                 log("report self message error: ", e.toString());
             }
diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts
index 70d90cb..9628427 100644
--- a/src/onebot11/constructor.ts
+++ b/src/onebot11/constructor.ts
@@ -1,4 +1,12 @@
-import {OB11Group, OB11GroupMember, OB11GroupMemberRole, OB11Message, OB11MessageDataType, OB11User} from "./types";
+import {
+    OB11Group,
+    OB11GroupMember,
+    OB11GroupMemberRole,
+    OB11Message,
+    OB11MessageData,
+    OB11MessageDataType,
+    OB11User
+} from "./types";
 import {AtType, ChatType, Group, GroupMember, IMAGE_HTTP_HOST, RawMessage, SelfInfo, User} from '../ntqqapi/types';
 import {getFriend, getGroupMember, getHistoryMsgBySeq, selfInfo} from '../common/data';
 import {file2base64, getConfigUtil, log} from "../common/utils";
@@ -8,7 +16,7 @@ import {NTQQApi} from "../ntqqapi/ntcall";
 export class OB11Constructor {
     static async message(msg: RawMessage): Promise<OB11Message> {
 
-        const {enableBase64} = getConfigUtil().getConfig()
+        const {enableLocalFile2Url} = getConfigUtil().getConfig()
         const message_type = msg.chatType == ChatType.group ? "group" : "private";
         const resMsg: OB11Message = {
             self_id: parseInt(selfInfo.uin),
@@ -47,7 +55,7 @@ export class OB11Constructor {
         }
 
         for (let element of msg.elements) {
-            let message_data: any = {
+            let message_data: OB11MessageData | any = {
                 data: {},
                 type: "unknown"
             }
@@ -78,11 +86,11 @@ export class OB11Constructor {
                 message_data["data"]["file_id"] = element.picElement.fileUuid
                 message_data["data"]["path"] = element.picElement.sourcePath
                 message_data["data"]["file"] = element.picElement.sourcePath
+                message_data["data"]["http_file"] = IMAGE_HTTP_HOST + element.picElement.originImageUrl
                 try {
                     await NTQQApi.downloadMedia(msg.msgId, msg.chatType, msg.peerUid,
                         element.elementId, element.picElement.thumbPath.get(0), element.picElement.sourcePath)
                 } catch (e) {
-                    message_data["data"]["http_file"] = IMAGE_HTTP_HOST + element.picElement.originImageUrl
                 }
             } else if (element.replyElement) {
                 message_data["type"] = "reply"
@@ -96,7 +104,8 @@ export class OB11Constructor {
                 message_data["type"] = OB11MessageDataType.voice;
                 message_data["data"]["file"] = element.pttElement.filePath
                 message_data["data"]["file_id"] = element.pttElement.fileUuid
-                // console.log("收到语音消息", message.raw.msgId, message.peer, element.pttElement)
+
+                // log("收到语音消息", msg)
                 // window.LLAPI.Ptt2Text(message.raw.msgId, message.peer, messages).then(text => {
                 //     console.log("语音转文字结果", text);
                 // }).catch(err => {
@@ -105,21 +114,24 @@ export class OB11Constructor {
             } else if (element.arkElement) {
                 message_data["type"] = OB11MessageDataType.json;
                 message_data["data"]["data"] = element.arkElement.bytesData;
-            } else if (element.faceElement){
+            } else if (element.faceElement) {
                 message_data["type"] = OB11MessageDataType.face;
                 message_data["data"]["id"] = element.faceElement.faceIndex.toString();
             }
-            if (message_data.data.http_file) {
-                message_data.data.file = message_data.data.http_file
-            } else if (message_data.data.file) {
+            if (message_data.data.file) {
                 let filePath: string = message_data.data.file;
-                message_data.data.file = "file://" + filePath
-                if (enableBase64) {
-                    let {err, data} = await file2base64(filePath);
-                    if (err) {
-                        console.log("文件转base64失败", err)
+                if (!enableLocalFile2Url) {
+                    message_data.data.file = "file://" + filePath
+                } else { // 不使用本地路径
+                    if (message_data.data.http_file) {
+                        message_data.data.file = message_data.data.http_file
                     } else {
-                        message_data.data.file = "base64://" + data
+                        let {err, data} = await file2base64(filePath);
+                        if (err) {
+                            log("文件转base64失败", filePath, err)
+                        } else {
+                            message_data.data.file = "base64://" + data
+                        }
                     }
                 }
             }
diff --git a/src/onebot11/types.ts b/src/onebot11/types.ts
index f20c6f8..4ed879b 100644
--- a/src/onebot11/types.ts
+++ b/src/onebot11/types.ts
@@ -102,7 +102,8 @@ export interface OB11MessageText {
 
 interface OB11MessageFileBase {
     data: {
-        file: string
+        file: string,
+        http_file?: string;
     }
 }
 
diff --git a/src/renderer.ts b/src/renderer.ts
index b1a01fa..4814403 100644
--- a/src/renderer.ts
+++ b/src/renderer.ts
@@ -108,10 +108,10 @@ async function onSettingWindowCreated(view: Element) {
             <setting-panel>
                 <setting-item data-direction="row" class="hostItem vertical-list-item">
                     <div>
-                        <div>上报文件进行base64编码</div>
-                        <div class="tips">不开启时,上报文件将以本地路径形式发送</div>
+                        <div>上报文件不采用本地路径</div>
+                        <div class="tips">开启后,上报图片为http连接,语音为base64编码</div>
                     </div>
-                    <setting-switch id="switchBase64" ${config.enableBase64 ? "is-active" : ""}></setting-switch>
+                    <setting-switch id="switchFileUrl" ${config.enableLocalFile2Url ? "is-active" : ""}></setting-switch>
                 </setting-item>
                 <setting-item data-direction="row" class="hostItem vertical-list-item">
                     <div>
@@ -208,7 +208,7 @@ async function onSettingWindowCreated(view: Element) {
     switchClick("websocket", "enableWs", config.ob11);
     switchClick("websocketReverse", "enableWsReverse", config.ob11);
     switchClick("debug", "debug");
-    switchClick("switchBase64", "enableBase64");
+    switchClick("switchFileUrl", "enableLocalFile2Url");
     switchClick("reportSelfMessage", "reportSelfMessage");
     switchClick("log", "log");