Files
BeWoPlaner/Service/ai/TranscriptionService.cs
2026-02-26 11:51:09 +01:00

228 lines
7.6 KiB
C#

using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Data.Security;
using BeWo.Service.OwnChat;
using BS.Shared.DataContracts;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BeWo.Service.AI
{
public class TranscriptionService
{
public AiVoiceData StartTranskription(String tenant, String sprache = "de")
{
AiVoiceData avd = null;
try
{
#if DEBUG
avd = new AiVoiceData();
avd.StatusMessage = "1";
DAOFactory.GenericDAO.Update(avd);
return avd;
#endif
avd = GetTranskriptionToken(tenant, sprache);
if (!String.IsNullOrEmpty(avd.Token))
{
var url = String.Format("ownchat://voice/?token={0}", avd.Token);
var msg = String.Format("Bitte klicken Sie auf folgenden Link um die Aufnahme zu starten:\n\n{0}", url);
OwnChatHelper.SendOwnChatMessage(msg, UserRightHelper.GetLoggedInUser().Employee);
}
return avd;
}
catch (Exception e)
{
if (avd == null)
{
avd = new AiVoiceData();
}
avd.Error = e.Message;
return avd;
}
}
public AiVoiceData GetTranskription(AiVoiceData avd)
{
try
{
#if DEBUG
if (!String.IsNullOrEmpty(avd.StatusMessage) && Int32.TryParse(avd.StatusMessage, out var test))
{
test++;
avd.StatusMessage = String.Format("{0}", test);
}
#endif
if (!String.IsNullOrEmpty(avd.ResultUrl))
{
if (CheckValidUrl(avd.ResultUrl))
{
WebRequest request = WebRequest.Create(avd.ResultUrl);
request.Credentials = CredentialCache.DefaultCredentials;
using (var response = request.GetResponse())
{
var responseString = ReadStringFromResponse(response);
var jsonDef = new { result = "", token = "", transcription = "", transcription_started_at = "", transcription_finished_at = "", state = "", callback_result = "" };
var json = JsonConvert.DeserializeAnonymousType(responseString, jsonDef);
avd.Result = json.result;
avd.Token = json.token;
avd.TranskriptionText = json.transcription;
avd.Status = json.state;
if (json.result == "20" && json.state == "0")
{
avd.StatusMessage = "Um die Aufnahme zu starten, klicken Sie auf den Link, den wir an Ihren ownChat Account gesendet haben.";
}
else if (json.result == "0" && json.state == "10")
{
avd.StatusMessage = "Die Aufnahme wurde erfolgreich hochgeladen und wird gerade transkribiert";
}
else if (json.result == "0" && json.state == "20")
{
avd.StatusMessage = "Die Transkription läuft gerade";
}
else if (json.result == "0" && json.state == "30")
{
avd.StatusMessage = "Transkription erfolgreich abgeschlossen";
DAOFactory.GenericDAO.Update(avd);
}
else
{
avd.StatusMessage = String.Format("Es ist leider ein Fehler aufgetreten: Result = {0}, Status = {1}", json.result, json.state);
DAOFactory.GenericDAO.Update(avd);
}
}
}
}
return avd;
}
catch (Exception e)
{
avd.Error = e.Message;
return avd;
}
}
private bool CheckValidUrl(String url)
{
string pattern = @"^https:\/\/.{1,3}\.ownsoft\.de\/.*$";
return Regex.IsMatch(url, pattern);
}
private AiVoiceData GetTranskriptionToken(String tenant, String sprache)
{
try
{
var serverUrl = OwnChatHelper.ErmittleServerURL("4", tenant);
if (!String.IsNullOrEmpty(serverUrl))
{
var endurl = String.Format("{0}/api/token/{1}/{2}", serverUrl, sprache, tenant);
WebRequest request = WebRequest.Create(endurl);
request.Credentials = CredentialCache.DefaultCredentials;
using (var response = request.GetResponse())
{
var responseString = ReadStringFromResponse(response);
var jsonDef = new { result = "", token = "", upload_url = "", result_url = "" };
var json = JsonConvert.DeserializeAnonymousType(responseString, jsonDef);
var avd = new AiVoiceData();
avd.Result = json.result;
avd.Token = json.token;
avd.UploadUrl = json.upload_url;
avd.ResultUrl = json.result_url;
return avd;
}
}
return null;
}
catch (Exception e)
{
return null;
}
}
private string ReadStringFromResponse(WebResponse response)
{
try
{
using (Stream dataStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(dataStream))
{
string responseFromServer = reader.ReadToEnd();
return responseFromServer;
}
}
}
catch (Exception e)
{
return null;
}
}
public AiVoiceDataDC MapAiVoiceDataDC(AiVoiceData data)
{
return new AiVoiceDataDC
{
Error = data.Error,
Result = data.Result,
ResultUrl = data.ResultUrl,
Status = data.Status,
StatusMessage = data.StatusMessage,
Token = data.Token,
TranskriptionText = data.TranskriptionText,
UploadUrl = data.UploadUrl
};
}
public AiVoiceData MapAiVoiceData(AiVoiceDataDC data)
{
return new AiVoiceData
{
Error = data.Error,
Result = data.Result,
ResultUrl = data.ResultUrl,
Status = data.Status,
StatusMessage = data.StatusMessage,
Token = data.Token,
TranskriptionText = data.TranskriptionText,
UploadUrl = data.UploadUrl
};
}
}
}