/// <summary>Wavs the file extract.</summary> /// <param name="InputFullFilename">The input full filename.</param> /// <param name="OutputFullFilename">The output full filename.</param> /// <param name="tStartTimeOffset">The t start time offset.</param> /// <param name="tDuration">Duration of the t.</param> /// <exception cref="Exception"> /// input file '" + InputFullFilename + "' was not created successfully /// or /// Start Time is greater than the Call Duration /// or /// output file '" + OutputFullFilename + "' was not created successfully /// </exception> public void WavFileExtract(string InputFullFilename, string OutputFullFilename, TimeSpan tStartTimeOffset, TimeSpan tDuration) { DateTime BeginTimeUTC = DateTime.UtcNow; string arguments = string.Empty; try { // Check Input file exists if (System.IO.File.Exists(InputFullFilename) == false) { throw new Exception("input file '" + InputFullFilename + "' was not created successfully"); } // Delete any pre-existing output file. if (System.IO.File.Exists(OutputFullFilename) == true) { System.IO.File.SetAttributes(OutputFullFilename, System.IO.FileAttributes.Normal); System.IO.File.Delete(OutputFullFilename); } var oHeader = new WavHeaderClass(); // Read the header of the input file. So we can check if it is in stereo format. oHeader.Load(InputFullFilename); // Check Call Duration int iCallDurationMilliseconds = oHeader.GetDurationInMilliseconds(); // Check StartTime if (tStartTimeOffset.TotalMilliseconds > iCallDurationMilliseconds) { throw new Exception("Start Time is greater than the Call Duration"); } // Check Duration if (tDuration.TotalMilliseconds > iCallDurationMilliseconds - tStartTimeOffset.TotalMilliseconds) { tDuration = TimeSpan.FromMilliseconds(iCallDurationMilliseconds - tStartTimeOffset.TotalMilliseconds); } // Setup arguments to create beep file arguments = "\"" + InputFullFilename + "\" \"" + OutputFullFilename + "\" trim " + Convert.ToDecimal(tStartTimeOffset.TotalMilliseconds / 1000).ToString("######.000") + " " + Convert.ToDecimal(tDuration.TotalMilliseconds / 1000).ToString("######.000"); // Check if running in Docker Container if (InDocker) { ShellHelper.ExecBashProcess("sox", arguments, _logger); } else { ShellHelper.ExecWindowsProcess(CURRENTAPPLICATIONPATH + @"\Executables\sox.exe", arguments); } // Throw an exception, if no output file was created. if (System.IO.File.Exists(OutputFullFilename) == false) { throw new Exception("output file '" + OutputFullFilename + "' was not created successfully"); } // The audio file was converted successfully. _logger.LogInformation($"WavFileExtract .Converted file '" + InputFullFilename + "' to '" + OutputFullFilename + "' successfully. (" + (DateTime.UtcNow - BeginTimeUTC).TotalMilliseconds.ToString("###,##0") + " ms)"); return; } catch (Exception Ex) { _logger.LogInformation($"WavFileExtract Exception {Ex.Message}"); throw; } }
/// <summary>Redacts the audio.</summary> /// <param name="InputFullFilename">The input full filename.</param> /// <param name="OutputFullFilename">The output full filename.</param> /// <param name="lStartTimeOffsetMilliseconds">The l start time offset milliseconds.</param> /// <param name="lRedactionLengthMilliseconds">The l redaction length milliseconds.</param> /// <exception cref="Exception"> /// input file '" + InputFullFilename + "' was not created successfully /// or /// Start Time Offset is greater than the Call Duration /// or /// output file '" + OutputFullFilename + "' was not created successfully /// </exception> public void RedactWavAudio(string InputFullFilename, string OutputFullFilename, long lStartTimeOffsetMilliseconds, long lRedactionLengthMilliseconds) { DateTime BeginTimeUTC = DateTime.UtcNow; string arguments = string.Empty; string sTempStartFile = Utilities.GetTempFilenameSafe(".wav"); string sTempEndFile = Utilities.GetTempFilenameSafe(".wav"); string sBeepFile = Utilities.GetTempFilenameSafe(".wav"); string sTempFinalLocalFileName = Utilities.GetTempFilenameSafe(".wav"); try { // Check Input file exists if (System.IO.File.Exists(InputFullFilename) == false) { throw new Exception("input file '" + InputFullFilename + "' was not created successfully"); } // Delete any pre-existing output file. if (System.IO.File.Exists(OutputFullFilename) == true) { System.IO.File.SetAttributes(OutputFullFilename, System.IO.FileAttributes.Normal); System.IO.File.Delete(OutputFullFilename); } //Convert incoming file to sample rate this.WavConverter(InputFullFilename, sTempFinalLocalFileName, "wav", 8000, 16, 2); // Check sTempFinalLocalFileName file exists if (System.IO.File.Exists(sTempFinalLocalFileName) == false) { throw new Exception("sTempFinalLocalFileName file '" + sTempFinalLocalFileName + "' was not created successfully"); } var oHeader = new WavHeaderClass(); // Read the header of the input file. So we can check if it is in stereo format. oHeader.Load(sTempFinalLocalFileName); // Check Call Duration int iCallDurationMilliseconds = oHeader.GetDurationInMilliseconds(); // Add extra 10 milliseconds to redaction start offset to bring offset to the start of the next word lStartTimeOffsetMilliseconds += 10; // Check StartTimeOffset if (lStartTimeOffsetMilliseconds > iCallDurationMilliseconds) { throw new Exception("Start Time Offset is greater than the Call Duration"); } if (lStartTimeOffsetMilliseconds + lRedactionLengthMilliseconds > iCallDurationMilliseconds) { lRedactionLengthMilliseconds = iCallDurationMilliseconds - lStartTimeOffsetMilliseconds; } // Setup arguments to create beep file arguments = " -r 8000 -c 2 -b 16 -n " + sBeepFile + " synth " + Convert.ToDecimal(lRedactionLengthMilliseconds / 1000.00).ToString("######.000") + " sine 270.0"; // Check if running in Docker Container if (InDocker) { ShellHelper.ExecBashProcess("sox", arguments, _logger); } else { ShellHelper.ExecWindowsProcess(CURRENTAPPLICATIONPATH + @"\Executables\sox.exe", arguments); } // Throw an exception, if no output file was created. if (System.IO.File.Exists(sBeepFile) == false) { throw new Exception("BeepFile file '" + sBeepFile + "' was not created successfully"); } // Setup arguments to create start file arguments = "\"" + sTempFinalLocalFileName + "\" \"" + sTempStartFile + "\" trim 0 " + Convert.ToDecimal(lStartTimeOffsetMilliseconds / 1000.00).ToString("######.000"); // Check if running in Docker Container if (InDocker) { ShellHelper.ExecBashProcess("sox", arguments, _logger); } else { ShellHelper.ExecWindowsProcess(CURRENTAPPLICATIONPATH + @"\Executables\sox.exe", arguments); } // Setup arguments to create end file arguments = "\"" + sTempFinalLocalFileName + "\" \"" + sTempEndFile + "\" trim " + Convert.ToDecimal(lStartTimeOffsetMilliseconds / (double)1000 + lRedactionLengthMilliseconds / (double)1000).ToString("######.000") + " =" + Convert.ToDecimal(iCallDurationMilliseconds / (double)1000).ToString("######.000"); // Check if running in Docker Container if (InDocker) { ShellHelper.ExecBashProcess("sox", arguments, _logger); } else { ShellHelper.ExecWindowsProcess(CURRENTAPPLICATIONPATH + @"\Executables\sox.exe", arguments); } // Throw an exception, if no output file was created. if (System.IO.File.Exists(sTempEndFile) == false) { throw new Exception("TempEndFile file '" + sTempEndFile + "' was not created successfully"); } // Setup arguments to combine the 3 files arguments = "\"" + sTempStartFile + "\" \"" + sBeepFile + "\" \"" + sTempEndFile + "\" \"" + OutputFullFilename + "\""; // Check if running in Docker Container if (InDocker) { ShellHelper.ExecBashProcess("sox", arguments, _logger); } else { ShellHelper.ExecWindowsProcess(CURRENTAPPLICATIONPATH + @"\Executables\sox.exe", arguments); } // Throw an exception, if no output file was created. if (System.IO.File.Exists(OutputFullFilename) == false) { throw new Exception("output file '" + OutputFullFilename + "' was not created successfully"); } // The audio file was converted successfully. _logger.LogInformation($"RedactAudio .Converted file '" + InputFullFilename + "' to '" + OutputFullFilename + "' successfully. (" + (DateTime.UtcNow - BeginTimeUTC).TotalMilliseconds.ToString("###,##0") + " ms)"); return; } catch (Exception Ex) { _logger.LogInformation($"RedactAudio Exception {Ex.Message}"); throw; } finally { // Delete any temporary file. if (sTempStartFile.Length > 0 && System.IO.File.Exists(sTempStartFile) == true) { try { System.IO.File.Delete(sTempStartFile); } catch (Exception ex) { // Ignore any error. } } if (sTempEndFile.Length > 0 && System.IO.File.Exists(sTempEndFile) == true) { try { System.IO.File.Delete(sTempEndFile); } catch (Exception ex) { // Ignore any error. } } if (sBeepFile.Length > 0 && System.IO.File.Exists(sBeepFile) == true) { try { System.IO.File.Delete(sBeepFile); } catch (Exception ex) { // Ignore any error. } } if (sTempFinalLocalFileName.Length > 0 && System.IO.File.Exists(sTempFinalLocalFileName) == true) { try { System.IO.File.Delete(sTempFinalLocalFileName); } catch (Exception ex) { // Ignore any error. } } } }