📄 uspeech.pas
字号:
str_len: Integer;
num_char: Char;
speech_str_list: TStringList;
begin
speech_str_list := TStringList.Create;
str_len := Length(_str);
for i := 1 to str_len do
begin
num_char := _str[i];
if num_char in ['0'..'9'] then
begin
speech_str_list.Add(OneNumberToCHNSpeech(StrToInt(num_char)));
end
else if UpperCase(num_char)[1] in ['A'..'Z'] then
begin
speech_str_list.Add(OneCharToSpeech(num_char));
end;
end;
Result := speech_str_list.CommaText;
speech_str_list.Free;
end;
{: 从一个10000以下的数值生成中文语音串。
@param _number 指定的数值
@result 生成的语音串
}
function NumberToCHNSpeech(_number: Integer): string;
var
num_thous,
num_hunds,
num_tens,
num_ones: Integer;
speech_str_list: TStringList;
has_shi: Boolean;
has_bai: Boolean;
has_qian: Boolean;
has_lin: Boolean;
begin
speech_str_list := TStringList.Create;
if _number > 9999 then _number := 9999;
num_thous := Trunc(_number / 1000);
num_hunds := Trunc((_number mod 1000) / 100);
num_tens := Trunc((_number mod 100 ) / 10);
num_ones := _number mod 10;
has_lin := False;
if num_thous <> 0 then
begin
has_qian := True;
speech_str_list.Add(OneNumberToCHNSpeech(num_thous));
speech_str_list.Add(TAXI_VOICE_CHN_QIAN);
end
else begin
has_qian := False;
end;
if num_hunds <> 0 then
begin
has_bai := True;
has_lin := False;
speech_str_list.Add(OneNumberToCHNSpeech(num_hunds));
speech_str_list.Add(TAXI_VOICE_CHN_BAI);
end
else begin
has_bai := False;
if has_qian then
begin
speech_str_list.Add(TAXI_VOICE_CHN_LIN);
has_lin := True;
end;
end;
if num_tens <> 0 then
begin
has_shi := True;
has_lin := False;
if not has_qian and not has_bai and (num_tens = 1) then
speech_str_list.Add(TAXI_VOICE_CHN_SHI)
else begin
speech_str_list.Add(OneNumberToCHNSpeech(num_tens));
speech_str_list.Add(TAXI_VOICE_CHN_SHI);
end;
end
else begin
has_shi := False;
if (has_qian or has_bai) and (not has_lin) then
begin
speech_str_list.Add(TAXI_VOICE_CHN_LIN);
has_lin := True;
end;
end;
if num_ones <> 0 then
begin
speech_str_list.Add(OneNumberToCHNSpeech(num_ones));
end
else
if has_qian or has_bai or has_shi then
begin
if has_lin then
begin
speech_str_list.Delete(speech_str_list.Count - 1);
end;
end
else begin
speech_str_list.Add(TAXI_VOICE_CHN_LIN);
end;
Result := speech_str_list.CommaText;
speech_str_list.Free;
end;
//------------------------------------------------------------------------------
// 语音引擎类 -- 构造与析构
//------------------------------------------------------------------------------
{: 构造函数。
}
constructor TMediaFileSpeech.Create(AControl: TControl);
begin
Inherited Create;
FTaxiSpeechQueue := TStringList.Create;
FParent := TWinControl(AControl);
FMPSpeech := TMediaPlayer.Create(FParent);
FMPSpeech.Parent := FParent;
FMPSpeech.Visible := False;
FMPSpeech.OnNotify := DoOnMediaPlayerNotify;
end;
{: 析构函数。
}
destructor TMediaFileSpeech.Destroy;
begin
FMPSpeech.Close;
FTaxiSpeechQueue.Free;
inherited;
end;
//------------------------------------------------------------------------------
// 语音引擎类 -- 事件响应
//------------------------------------------------------------------------------
procedure TMediaFileSpeech.DoOnMediaPlayerNotify(Sender: TObject);
begin
// 播放完毕
if FMPSpeech.NotifyValue = nvSuccessful then
begin
// 播放下个文件
speechItem(FCurrentSpeechItemIndex);
end;
end;
//------------------------------------------------------------------------------
// 语音引擎类 -- 私有方法
//------------------------------------------------------------------------------
{: 处理发音列表中的单个语音串项目。
@param _index 语音串项目索引
}
procedure TMediaFileSpeech.speechItem(_index: Integer);
var
speech_file_name: string;
begin
if _index > FTaxiSpeechQueue.Count - 1 then
begin
FinishSpeech;
Exit;
end;
speech_file_name := FSoundFilePath + FTaxiSpeechQueue.Strings[_index];
if FileExists(speech_file_name) then
begin
FMPSpeech.FileName := speech_file_name;
FMPSpeech.Open;
FMPSpeech.Play;
FCurrentSpeechItemIndex := FCurrentSpeechItemIndex + 1;
end
else begin
FCurrentSpeechItemIndex := FCurrentSpeechItemIndex + 1;
speechItem(FCurrentSpeechItemIndex);
end;
end;
//------------------------------------------------------------------------------
// 语音引擎类 -- 公有方法
//------------------------------------------------------------------------------
{: 向发音列表中增加一个语音串。
@param _speech_str 要增加的语音串
}
procedure TMediaFileSpeech.AddSpeech(_speech_str: string);
var
speech_str_list: TStringList;
begin
if Pos(',', _speech_str) = 0 then
begin
FTaxiSpeechQueue.Add(_speech_str);
end
else begin
speech_str_list := TStringList.Create;
speech_str_list.CommaText := _speech_str;
FTaxiSpeechQueue.AddStrings(speech_str_list);
speech_str_list.Free;
end;
end;
{: 开始发音。
}
procedure TMediaFileSpeech.Speech;
begin
if FTaxiSpeechQueue.Count = 0 then Exit;
FMPSpeech.Close;
FCurrentSpeechItemIndex := 0;
if Assigned(FOnSpeechStart) then FOnSpeechStart(Self);
speechItem(FCurrentSpeechItemIndex);
end;
{: 结束发音。
}
procedure TMediaFileSpeech.FinishSpeech;
begin
FMPSpeech.Close;
FTaxiSpeechQueue.Clear;
if Assigned(FOnSpeechStop) then FOnSpeechStop(Self);
end;
{:
}
function IndexOfCityName(const CityName:String):Integer;
var
i:Integer;
begin
result := -1;
for i := 0 to 32 do
begin
if TAXI_CITYNAME[i] = CityName then
begin
Result := i;
break;
end;
end;
end;
{:
}
function GetCityNameVoice(const CityName: String):String;
var
i:integer;
begin
Result := '';
i := IndexOfCityName(CityName);
if i >=0 then
Result := TAXI_CITYNAME_VOICE[TCityVoiceName(i)];
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -