You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6录音播放应用:点击播放同步展示录音文本实现咨询

一、修正并优化后端接口

你的现有接口存在拼写错误、未正确赋值识别文本、未支持流式传输等问题,以下是优化后的实现:

1. 普通文本返回接口(适用于小体积文本)

[HttpPost]
public ActionResult GetRecording(string recKey)
{
    var pathObj = new GetRecordingPath();
    string filePath = pathObj.GetPath(recKey);

    var speechService = new SpeechRecognisation();
    string recognizedText = speechService.GetData(filePath);

    // 正确赋值文本内容给实体类
    var recordingText = new RecordingText { Text = recognizedText };          
    return Ok(recordingText); // 依托ASP.NET自动序列化,无需手动调用JsonConvert
}

2. 流式传输接口(适用于大体积文本)

如果文本内容极大,用流式返回可避免内存占用过高,需要先修改SpeechRecognisation类,新增流式读取识别结果的方法:

[HttpPost]
public async IAsyncEnumerable<string> GetRecordingStream(string recKey)
{
    var pathObj = new GetRecordingPath();
    string filePath = pathObj.GetPath(recKey);

    var speechService = new SpeechRecognisation();
    // 假设GetDataStream是新增的流式识别方法,逐段返回文本块
    await foreach (var textChunk in speechService.GetDataStream(filePath))
    {
        yield return textChunk;
    }
}

二、前端页面调整

无需修改原视图模型,直接在页面中添加文本展示区域和音频控件,并编写交互逻辑:

1. 添加页面元素

在表格所在视图中插入以下HTML:

<!-- 音频播放控件 -->
<audio id="recordingPlayer" controls style="display:none; margin:10px 0;"></audio>

<!-- 录音文本展示容器 -->
<div id="recordingTextContainer" style="padding:10px; border:1px solid #eee;">
    <h4>录音转写文本</h4>
    <div id="recordingText" style="white-space:pre-wrap; max-height:300px; overflow-y:auto;"></div>
</div>

2. 编写点击交互逻辑

给表格中的播放按钮绑定点击事件,同时实现录音播放和文本加载:

// 遍历所有播放按钮,绑定点击事件
document.querySelectorAll('.play-btn').forEach(btn => {
    btn.addEventListener('click', async function() {
        const recKey = this.dataset.recKey; // 假设按钮通过data-rec-key存储录音标识
        const player = document.getElementById('recordingPlayer');
        const textDisplay = document.getElementById('recordingText');

        // 1. 启动录音播放(需新增播放接口,见下方补充)
        player.src = `/api/Recording/Play?recKey=${recKey}`;
        player.style.display = 'block';
        player.play();

        // 2. 加载文本(小文本用普通接口,大文本切换为流式接口)
        textDisplay.textContent = ''; // 清空历史内容
        // --- 普通文本加载 ---
        // const res = await fetch('/api/Recording/GetRecording', {
        //     method: 'POST',
        //     headers: { 'Content-Type': 'application/json' },
        //     body: JSON.stringify({ recKey })
        // });
        // const data = await res.json();
        // textDisplay.textContent = data.text;

        // --- 流式文本加载 ---
        const res = await fetch('/api/Recording/GetRecordingStream', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ recKey })
        });
        const reader = res.body.getReader();
        const decoder = new TextDecoder('utf-8');
        
        while (true) {
            const { done, value } = await reader.read();
            if (done) break;
            textDisplay.textContent += decoder.decode(value, { stream: true });
        }
    });
});

三、补充必要接口

如果还没有录音文件播放接口,新增以下后端方法:

[HttpGet]
public IActionResult Play(string recKey)
{
    var pathObj = new GetRecordingPath();
    string filePath = pathObj.GetPath(recKey);
    // 根据录音实际格式修改MIME类型(比如audio/wav、audio/mp3)
    return PhysicalFile(filePath, "audio/mpeg");
}

同时确保播放按钮添加data-rec-key属性:

<button class="play-btn" data-rec-key="@item.RecKey">播放</button>

内容的提问来源于stack exchange,提问作者Dnyati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:35:51