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

ReactJS集成AssemblyAI:如何在情感分析应用中显示说话人标签

解决AssemblyAI开启speaker_labels后无法显示说话人标签的问题

你已经在API请求中开启了speaker_labels: true,但当前代码没有处理AssemblyAI返回的说话人数据,也没有在UI中渲染这部分信息。以下是具体的解决步骤和代码修改:

问题分析

当开启speaker_labels参数后,AssemblyAI的返回结果中会包含utterances数组,每个元素对应一个说话人的连续发言片段,包含speaker(说话人标识,如Speaker 0)、text等字段。而你当前的Result组件只渲染了sentiment_analysis_results(情感分析片段),没有关联或展示说话人信息。

解决方案

我们需要修改Result组件,将说话人信息与情感分析结果结合展示。这里提供两种实现方式:

方式1:按说话人段落展示,同时标注对应情感

这种方式先按说话人分组展示完整发言,再匹配对应段落的情感并高亮:

修改Result.js:

import { Box, Text, HStack } from '@chakra-ui/react'
import Highlighted from './Highlighted'

// 辅助函数:通过时间戳匹配说话人与对应情感片段
const getSentimentForUtterance = (utterance, sentimentResults) => {
  const matched = sentimentResults.find(sentiment => 
    sentiment.start <= utterance.end && sentiment.end >= utterance.start
  )
  return matched ? matched.sentiment : 'NEUTRAL'
}

const Result = ({ transcript }) => {
  return (
    <div>
      <Box width={{ base: '300px', md: '700px', lg:'1000px'}} textAlign='justify'>
        <Text fontSize={{ base: '15px', md: '20px', lg: '25px'}}>
          {transcript.utterances?.map((utterance, index) => {
            const sentiment = getSentimentForUtterance(utterance, transcript.sentiment_analysis_results)
            return (
              <HStack key={index} align="flex-start" mb="4">
                <Text fontWeight="bold" color="blue.600" minW="100px">
                  {utterance.speaker}:
                </Text>
                <Highlighted text={utterance.text} sentiment={sentiment} />
              </HStack>
            )
          })}
        </Text>
      </Box>
    </div>
  )
}   

export default Result 

方式2:按情感片段展示,同时标注说话人

这种方式保留原有的情感高亮逻辑,同时在每个情感片段前标注对应的说话人:

修改Result.js:

import { Box, Text, HStack } from '@chakra-ui/react'
import Highlighted from './Highlighted'

// 辅助函数:通过时间戳找到情感片段对应的说话人
const getSpeakerForSentiment = (sentiment, utterances) => {
  const matched = utterances.find(utterance => 
    utterance.start <= sentiment.end && utterance.end >= sentiment.start
  )
  return matched ? matched.speaker : 'Unknown Speaker'
}

const Result = ({ transcript }) => {
  return (
    <div>
      <Box width={{ base: '300px', md: '700px', lg:'1000px'}} textAlign='justify'>
        <Text fontSize={{ base: '15px', md: '20px', lg: '25px'}}>
          {transcript.sentiment_analysis_results.map((result, index) => {
            const speaker = getSpeakerForSentiment(result, transcript.utterances || [])
            return (
              <HStack key={index} align="flex-start" mb="2">
                <Text fontWeight="bold" color="blue.600" minW="100px">
                  {speaker}:
                </Text>
                <Highlighted text={result.text} sentiment={result.sentiment} />
              </HStack>
            )
          })}
        </Text>
      </Box>
    </div>
  )
}   

export default Result 

额外检查

  1. 确认API返回包含utterances:可以在useEffect中添加console.log(transcriptData),查看返回结果是否包含该字段。若未返回,检查请求是否正确开启speaker_labels: true,音频是否有效(单说话人也会返回该字段)。
  2. 空值处理:代码中使用了可选链?.,避免数据未加载完成时的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:45:26