⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uspeech.pas

📁 a voice guide client ,it is the second part of voice guide center
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  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 + -