The VoiceBasePlayer is available either as a React component designed to display and play transcripts and media, or as a Tableau Dashboard Extension available to customers as a manifest (.trex) file.


Speaker separated transcript

With dual channel audio recordings and the stereo feature enabled in the configuration when the recording with submitted, the player is able to display the speaker separated transcript along with timestamps.

For more information on the stereo feature, read the documentation here:

Category, Keyword and Topic highlighting

If categories are loaded in the account, the player can highlight each category's hits and jump to that point in the recording to further analyze and also listen.

This can also be done with keyword spotting groups and auto-generated keywords and topics.

More can be read about each feature here:
Categories -
Keywords and Topics -
Keyword and Phrase Spotting -

Conversation Metrics

With Conversation Metrics enabled on the recording, the calculated results for each metric will be displayed in the metrics tabs where the user can view data on Overtalk, Sentiment, Talk-time, Tone and Volume

Read more about enabling Conversation Metrics here:

Integrating the Player

React Component

The full README and npm installation information are available here.

Once installed, populate the "/src/index.js" file in your React app with the JavaScript code below:

import React, { Component } from 'react';
import VoiceBasePlayer, { getVoicebaseMediaUrl, getVoicebaseAnalytics } from '@voicebase/react-player';
import _ from 'lodash-core';
import ReactDOM from 'react-dom';

const centerText = {
  textAlign: 'center',
  fontSize: '1rem',

class PlayerWrapper extends Component {
  constructor(props) {
    this.state = {"token":"*VB_TOKEN*", "mediaId": ""};

  static getDerivedStateFromProps(props) {
    return props;

  componentDidMount() {
    if (this.state.token && this.state.mediaId) {
      getVoicebaseMediaUrl(this.state.token, this.state.mediaId)
        .then(( url ) => {
          this.setState({ mediaUrl: url });
        .catch((mediaUrlLoadError) => {
          this.setState({ mediaUrlLoadError });

      getVoicebaseAnalytics(this.state.token, this.state.mediaId, this.state.apiSuffix)
        .then((analytics) => {
          this.setState({ analytics });
        .catch((analyticsLoadError) => {
          this.setState({ analyticsLoadError });
    } else {
      console.log('no token/media id:', this.state);

  render() {
    if (this.state.mediaUrlLoadError || this.state.analyticsLoadError) {
      return (
        <VoiceBasePlayer error={true}>
          {this.state.mediaUrlLoadError && (
            <p style={centerText}>
              {_.get(this, 'state.mediaUrlLoadError.message', 'Error loading Media')}
          {this.state.analyticsLoadError && (
            <p style={centerText}>
              {_.get(this, 'state.analyticsLoadError.message', 'Error loading Analytics')}
    } else if (this.state.mediaUrl && {
      return <VoiceBasePlayer {...this.state} />;
    return (

  <PlayerWrapper  />,

Please note that the line "this.state = {"token":"VB_TOKEN", "mediaId": ""};" contains the "token" and "mediaId" fields as an example only.

Once the Player is loaded, the "token" and "mediaId" fields may be added to the browser:

localhost:3000/#token=<jwt or vb token>#mediaId=<mediaId>

Tableau Dashboard Extension

Download the manifest file for the Tableau Dashboard Extension here.