怎么快速插入音频,并设置锚文本点击即播放?

在学外语,做笔记梳理时,想给句子加上音频,已经有句子文本和音频文件名的对应文本,怎么能快速将句子设置为音频的锚文本,并点击锚文本即播放呢?

直接插入音频后,会直接显示音频控件,占据的位置太大了,而且也没找到在哪里设置锚文本。

通过超链接设置句子为锚文本后,点击文本会在另一个标签弹出音频控件,然后再点击才能播放,而且要一句一句去设置填写,也比较麻烦。

想问问有没有能直接通过某种格式把我的句子和音频直接转换成点击即播放的形式吗?

Screenshot20241101162557org.b3log.siyuan.jpg

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    24941 引用 • 102738 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9491 引用 • 43247 回帖 • 107 关注

相关帖子

被采纳的回答
  • wilsons 1

    方法一,使用 HTML 块实现(编辑器输入 /html,把代码粘贴到对话框即可)

    需要开启 设置 》编辑器 》允许执行 HTML 块内脚本

    <!-- mp3 列表 --> <a onclick="playAudio(event,this.href);" href="file:///youpath/demo1.mp3" >demo1</a><br> <a onclick="playAudio(event,this.href);" href="file:///youpath/demo2.mp3">demo2</a><br> <!-- js 代码 --> <script> var audio; function playAudio(event,mp3) { event.preventDefault(); if(!audio){ audio = document.createElement('audio'); document.body.appendChild(audio); } audio.src = mp3; audio.play(); } </script>

    方法二,使用 SQL 查询块实现(编辑器输入 {{}},把代码粘贴到对话框即可)

    //!js return (async () => { // 这里配置mp3列表 const mp3List = { "demo1": "file:///youpath/demo1.mp3", "demo2": "file:///youpath/demo2.mp3", }; // 代码逻辑区 let list = []; for (let key in mp3List) { list.push(`<div><span data-type="a" data-mp3="${mp3List[key]}">${key}</span></div>`); } return render(`<div class="mp3List-wrapper">${list.join('')}</div>`, (embed) => { embed.querySelector('.mp3List-wrapper').addEventListener('click', (event) => { const mp3 = event.target?.dataset?.mp3; if (mp3) { playAudio(mp3); } }); }); var audio; function playAudio(mp3) { if(!audio){ audio = document.createElement('audio'); document.body.appendChild(audio); } audio.src = mp3; audio.play(); } function render(html, callback) { onRender('.b3-form__space--small').then((container) => { const wysiwygEmbed = container.parentElement; wysiwygEmbed.style.backgroundColor = 'transparent'; wysiwygEmbed.style.borderLeft='none'; container.outerHTML = html; if(callback) callback(wysiwygEmbed); }); return []; } function onRender(selector) { return new Promise(resolve => { const check = () => { let el = item.querySelector(selector); if (el) resolve(el); else requestAnimationFrame(check); }; check(); }); } })();

    效果

    image.png

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 目前没有专门为思源设计音频播放的控件,使用的是浏览器原生的控件,所以是这样的。

  • towfd via Android

    这个是创建时间戳,可是我的音频本身已经对照句子切割好了,我的需求是快速将文本和音频插入,并且点击文本可以直接播放音频。我翻了上面功能介绍:

    如果是在思源软件里点击时间戳,将会在一个新的窗口中打开目标音视频,并跳转到对应的时间点。

    这条说明好像和我原帖描述的也是一样的情况,点击会跳出控件,然后还需要再次点击播放,只是增加了个时间戳定位

  • wilsons 1

    方法一,使用 HTML 块实现(编辑器输入 /html,把代码粘贴到对话框即可)

    需要开启 设置 》编辑器 》允许执行 HTML 块内脚本

    <!-- mp3 列表 --> <a onclick="playAudio(event,this.href);" href="file:///youpath/demo1.mp3" >demo1</a><br> <a onclick="playAudio(event,this.href);" href="file:///youpath/demo2.mp3">demo2</a><br> <!-- js 代码 --> <script> var audio; function playAudio(event,mp3) { event.preventDefault(); if(!audio){ audio = document.createElement('audio'); document.body.appendChild(audio); } audio.src = mp3; audio.play(); } </script>

    方法二,使用 SQL 查询块实现(编辑器输入 {{}},把代码粘贴到对话框即可)

    //!js return (async () => { // 这里配置mp3列表 const mp3List = { "demo1": "file:///youpath/demo1.mp3", "demo2": "file:///youpath/demo2.mp3", }; // 代码逻辑区 let list = []; for (let key in mp3List) { list.push(`<div><span data-type="a" data-mp3="${mp3List[key]}">${key}</span></div>`); } return render(`<div class="mp3List-wrapper">${list.join('')}</div>`, (embed) => { embed.querySelector('.mp3List-wrapper').addEventListener('click', (event) => { const mp3 = event.target?.dataset?.mp3; if (mp3) { playAudio(mp3); } }); }); var audio; function playAudio(mp3) { if(!audio){ audio = document.createElement('audio'); document.body.appendChild(audio); } audio.src = mp3; audio.play(); } function render(html, callback) { onRender('.b3-form__space--small').then((container) => { const wysiwygEmbed = container.parentElement; wysiwygEmbed.style.backgroundColor = 'transparent'; wysiwygEmbed.style.borderLeft='none'; container.outerHTML = html; if(callback) callback(wysiwygEmbed); }); return []; } function onRender(selector) { return new Promise(resolve => { const check = () => { let el = item.querySelector(selector); if (el) resolve(el); else requestAnimationFrame(check); }; check(); }); } })();

    效果

    image.png

    2 回复
  • towfd via Android

    感谢 🙏

  • towfd via Linux

    安卓是不能外部引用吗?

    href="file:///storage/emulated/0/AnkiDroid/collection.media/1A_2_listenAndSpeaking_2_00.16.014-00.18.066.mp3"

    我这么写,点击似乎播放不了。

    导入思源自己的的 assets 倒是可以播放,不过还有一点疑问。思源似乎不能像其他 markdown 笔记那样直接渲染 HTML,复制粘贴只被当作纯文本块,这样句子之间如果还想加入其他块描述,只能单独一个一个去单独建立 html 块吗?不然就只能把所有描述内容一起写进 html?但是这样所有内容都会被视作一个块,内部排版也不能像 md 那样直接书写了,点击某个句子也会整个一起闪屏。

    如果像其他 md 笔记,我可以提前把文本都替换成你上面给出的对应格式,然后再在句子间插入其他块描述就行了,也不会影响排版。思源似乎好些内容块只能主动去选择触发,没法像 md 那样以某种书写格式直接告诉软件应该按照什么渲染,这样想通过直接替换完成批量修改成某种模式似乎就没办法了,只能一个一个去主动选择吗?

    1 回复
  • 你的理解没错,思源的 HTML 没有其他笔记的那么直观,虽然思源不支持手动输入 HTML 代码,但粘贴 HTML 代码是可以的,所以建议你在外部编辑好后直接粘贴到文档里。

    但要注意思源的 HTML 代码必须以一个 div 标签包裹才行,比如

    <div> <p>hello world</p> <p>hello world</p> </div>

    这样粘贴就没问题,不会转换为实体

    但下面这种粘贴就会转换为 HTML 实体

    <p>hello world</p> <p>hello world</p><ul> <li>hello world</li> <li>hello world</li> </ul>

    解决办法就是在他们前面添加 div 包裹就没问题了,比如改成

    <div> <p>hello world</p> <p>hello world</p> </div><div> <ul> <li>hello world</li> <li>hello world</li> </ul> </div>

    有了上面的知识,那么批量修改你的代码就很方便了,比如修改成下面这样,然后再粘贴

    <div> <div>英语学习</div> <script> var audio; function playAudio(event,mp3) { event.preventDefault(); if(!audio){ audio = document.createElement('audio'); document.body.appendChild(audio); } audio.src = mp3; audio.play(); } </script> </div> 描述1 <div><a onclick="playAudio(event,this.href);" href="file:///yourpath/demo1.mp3" >demo1</a></div> 描述2 <div><a onclick="playAudio(event,this.href);" href="file:///yourpath/demo2.mp3" >demo2</a></div>

    这里的 <script> 标签页可以放到任意一个链接的 HTML 代码块中,这样就不用单独的占一个块了。

    如果你的版本不支持,也可以安装 vscode 插件,然后使用源码粘贴。

    当然,还有好的方法,比如通过插件或 js 片段魔改 audio 块等,太过复杂,仅供兴趣研究。

    1 回复
  • towfd via Linux

    太感谢你了,彻底解决了我的问题。

请输入回帖内容 ...

推荐标签 标签

  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 7 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 250 关注
  • Outlook
    1 引用 • 5 回帖 • 1 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 3 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    366 引用 • 1842 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 652 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 344 关注
  • OneDrive
    2 引用
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 611 关注
  • 印象笔记
    3 引用 • 16 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 298 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    169 引用 • 595 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    159 引用 • 306 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 677 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 3 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 2 关注
  • Word
    13 引用 • 40 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 140 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 134 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 654 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖 • 1 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    57 引用 • 25 回帖 • 10 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 9 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 533 关注