Remove unnecessary rescaling of voice waveforms
Fixes https://github.com/vector-im/element-web/issues/18364pull/21833/head
							parent
							
								
									24da0291a0
								
							
						
					
					
						commit
						1b9fe46733
					
				|  | @ -38,17 +38,9 @@ function makePlaybackWaveform(input: number[]): number[] { | |||
|     // First, convert negative amplitudes to positive so we don't detect zero as "noisy".
 | ||||
|     const noiseWaveform = input.map(v => Math.abs(v)); | ||||
| 
 | ||||
|     // Next, we'll resample the waveform using a smoothing approach so we can keep the same rough shape.
 | ||||
|     // We also rescale the waveform to be 0-1 for the remaining function logic.
 | ||||
|     const resampled = arrayRescale(arraySmoothingResample(noiseWaveform, PLAYBACK_WAVEFORM_SAMPLES), 0, 1); | ||||
| 
 | ||||
|     // Then, we'll do a high and low pass filter to isolate actual speaking volumes within the rescaled
 | ||||
|     // waveform. Most speech happens below the 0.5 mark.
 | ||||
|     const filtered = resampled.map(v => clamp(v, 0.1, 0.5)); | ||||
| 
 | ||||
|     // Finally, we'll rescale the filtered waveform (0.1-0.5 becomes 0-1 again) so the user sees something
 | ||||
|     // sensible. This is what we return to keep our contract of "values between zero and one".
 | ||||
|     return arrayRescale(filtered, 0, 1); | ||||
|     // Then, we'll resample the waveform using a smoothing approach so we can keep the same rough shape.
 | ||||
|     // We also rescale the waveform to be 0-1 so we end up with a clamped waveform to rely upon.
 | ||||
|     return arrayRescale(arraySmoothingResample(noiseWaveform, PLAYBACK_WAVEFORM_SAMPLES), 0, 1); | ||||
| } | ||||
| 
 | ||||
| export class Playback extends EventEmitter implements IDestroyable { | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ import React from "react"; | |||
| import { IRecordingUpdate, RECORDING_PLAYBACK_SAMPLES, VoiceRecording } from "../../../audio/VoiceRecording"; | ||||
| import { replaceableComponent } from "../../../utils/replaceableComponent"; | ||||
| import { arrayFastResample, arraySeed } from "../../../utils/arrays"; | ||||
| import { percentageOf } from "../../../utils/numbers"; | ||||
| import Waveform from "./Waveform"; | ||||
| import { MarkedExecution } from "../../../utils/MarkedExecution"; | ||||
| 
 | ||||
|  | @ -54,12 +53,8 @@ export default class LiveRecordingWaveform extends React.PureComponent<IProps, I | |||
| 
 | ||||
|     componentDidMount() { | ||||
|         this.props.recorder.liveData.onUpdate((update: IRecordingUpdate) => { | ||||
|             const bars = arrayFastResample(Array.from(update.waveform), RECORDING_PLAYBACK_SAMPLES); | ||||
|             // The incoming data is between zero and one, but typically even screaming into a
 | ||||
|             // microphone won't send you over 0.6, so we artificially adjust the gain for the
 | ||||
|             // waveform. This results in a slightly more cinematic/animated waveform for the
 | ||||
|             // user.
 | ||||
|             this.waveform = bars.map(b => percentageOf(b, 0, 0.50)); | ||||
|             // The incoming data is between zero and one, so we don't need to clamp/rescale it.
 | ||||
|             this.waveform = arrayFastResample(Array.from(update.waveform), RECORDING_PLAYBACK_SAMPLES); | ||||
|             this.scheduledUpdate.mark(); | ||||
|         }); | ||||
|     } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Travis Ralston
						Travis Ralston